diff --git a/docs/eints.md b/docs/eints.md index 1fbdbf1d45..0e49d56a22 100644 --- a/docs/eints.md +++ b/docs/eints.md @@ -25,6 +25,10 @@ The translators will decide whether, where and how to apply your suggestion. Sorry, we don't offer this option. +Only when there is a consistency problem that needs addressing, this can be done via a PR. +We are very strict about this, and in general all PRs making translation changes will be closed. +But if it is really needed, and the change is not a revert of any older change, a PR can be created to do mass changes to a translation. + ### I want to change the language definition (plural form, genders, cases) of a translation. Please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for this. diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 2ce1bd52ce..d4248ca275 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -401,6 +401,7 @@ verify_name:; if (cc->name_1 == str && cc->name_2 == strp) goto bad_town_name; } + SetDParam(0, strp); GetString(buffer, str, lastof(buffer)); if (Utf8StringLength(buffer) >= MAX_LENGTH_COMPANY_NAME_CHARS) goto bad_town_name; diff --git a/src/company_func.h b/src/company_func.h index 5093ad92ab..ac471f5e9c 100644 --- a/src/company_func.h +++ b/src/company_func.h @@ -27,8 +27,8 @@ void UpdateLandscapingLimits(); void UpdateCompanyLiveries(Company *c); bool CheckCompanyHasMoney(CommandCost &cost); -void SubtractMoneyFromCompany(const CommandCost& cost); -void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost& cost); +void SubtractMoneyFromCompany(const CommandCost &cost); +void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost &cost); CommandCost CheckOwnership(Owner owner, TileIndex tile = 0); CommandCost CheckTileOwnership(TileIndex tile); diff --git a/src/core/overflowsafe_type.hpp b/src/core/overflowsafe_type.hpp index d446ec5485..73d669dfcc 100644 --- a/src/core/overflowsafe_type.hpp +++ b/src/core/overflowsafe_type.hpp @@ -33,8 +33,8 @@ private: public: constexpr OverflowSafeInt() : m_value(0) { } - constexpr OverflowSafeInt(const OverflowSafeInt& other) : m_value(other.m_value) { } - constexpr OverflowSafeInt(const int64 int_) : m_value(int_) { } + constexpr OverflowSafeInt(const OverflowSafeInt &other) : m_value(other.m_value) { } + constexpr OverflowSafeInt(const T int_) : m_value(int_) { } inline constexpr OverflowSafeInt& operator = (const OverflowSafeInt& other) { this->m_value = other.m_value; return *this; } diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index df954dcdcf..d4ba9ccab2 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -144,8 +144,8 @@ struct Pool : PoolBase { template struct PoolIterator { typedef T value_type; - typedef T* pointer; - typedef T& reference; + typedef T *pointer; + typedef T &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; @@ -188,8 +188,8 @@ struct Pool : PoolBase { template struct PoolIteratorFiltered { typedef T value_type; - typedef T* pointer; - typedef T& reference; + typedef T *pointer; + typedef T &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; diff --git a/src/core/span_type.hpp b/src/core/span_type.hpp index a76fb7bc0f..5f6fb5525a 100644 --- a/src/core/span_type.hpp +++ b/src/core/span_type.hpp @@ -39,7 +39,7 @@ template struct is_compatible_container : std::bool_constant < has_size_and_data::value - && is_compatible_element::value + && is_compatible_element::value >{}; /** diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index 69b7a58e88..801040dfca 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -355,8 +355,8 @@ static bool DisasterTick_Ufo(DisasterVehicle *v) v->state = 1; uint n = 0; // Total number of targetable road vehicles. - for (const RoadVehicle *u : RoadVehicle::Iterate()) { - if (u->IsFrontEngine()) n++; + for (const Company *c : Company::Iterate()) { + n += c->group_all[VEH_ROAD].num_vehicle; } if (n == 0) { diff --git a/src/economy.cpp b/src/economy.cpp index ac04e178a8..ff4527f7c6 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1919,7 +1919,7 @@ static void ReserveConsist(Station *st, Vehicle *u, CargoArray *consist_capleft, */ static void UpdateLoadUnloadTicks(Vehicle *front, const Station *st, int ticks, int platform_length_left) { - if (front->type == VEH_TRAIN) { + if (front->type == VEH_TRAIN && _settings_game.order.station_length_loading_penalty) { /* Each platform tile is worth 2 rail vehicles. */ int overhang = -platform_length_left; if (overhang > 0) { diff --git a/src/engine.cpp b/src/engine.cpp index 845a2759f0..64d967dc32 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1164,7 +1164,7 @@ static void NewVehicleAvailable(Engine *e) } else if (e->type == VEH_ROAD) { /* maybe make another road type available */ assert(e->u.road.roadtype < ROADTYPE_END); - for (Company* c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date); + for (Company *c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, _date); } /* Only broadcast event if AIs are able to build this vehicle type. */ diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 8f426a7700..f95d1bcab3 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -81,7 +81,7 @@ bool GetFontAAState(FontSize size, bool check_blitter) return GetFontCacheSubSetting(size)->aa; } -void SetFont(FontSize fontsize, const std::string& font, uint size, bool aa) +void SetFont(FontSize fontsize, const std::string &font, uint size, bool aa) { FontCacheSubSetting *setting = GetFontCacheSubSetting(fontsize); bool changed = false; diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 1df5869697..e0a91d941f 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -983,7 +983,7 @@ public: case GB_SHARED_ORDERS: { if (!VehicleClicked(vehgroup)) { - const Vehicle* v = vehgroup.vehicles_begin[0]; + const Vehicle *v = vehgroup.vehicles_begin[0]; if (vindex == v->index) { if (vehgroup.NumVehicles() == 1) { ShowVehicleViewWindow(v); diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index a6e0e679c4..61beca23ec 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1740,7 +1740,7 @@ static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int t /* On a large map with many industries, it may be faster to check an area. */ static const int dmax = 14; if (Industry::GetNumItems() > (size_t) (dmax * dmax * 2)) { - const Industry* i = nullptr; + const Industry *i = nullptr; TileArea tile_area = TileArea(tile, 1, 1).Expand(dmax); for (TileIndex atile : tile_area) { if (GetTileType(atile) == MP_INDUSTRY) { diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index e73af9446d..a40e74a38b 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1606,6 +1606,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Gedeaktiveer STR_CONFIG_SETTING_NOSERVICE :Sper diens wanneer komplikasies is na geen gestel: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :As dit geaktiveerd is, word voertuie nie gediens as hulle nie kan onklaar raak nie + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Laat wa spoed beperkings toe: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :As dit geaktiveer is bepaal die spoedbeperking van treinwaens ook die maksimum spoed van die hele trein diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index c6bb6d2ffa..3634effa6c 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -1485,6 +1485,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT ::مدة فحص STR_CONFIG_SETTING_NOSERVICE :الغاء الصيانة عندما يكون التعطيل للمركبات غير مفعل: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :السماح بتحديد سرعة العربات: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :تعطيل سكة القطار الكهربائي: {STRING} diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 8b22e53b74..9068607591 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1538,6 +1538,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desgaitua STR_CONFIG_SETTING_NOSERVICE :Mantenimendua desgaitu ibilgailuen matxurak kenduta daudenean: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Gaitua dagoenean, ibilgailuek ez dute mantenimendurik jasoko ezin badira matxuratu + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Bagoiaren abiadura mugak aktibatu: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Gaitua dagoenean, bagoien gehienezko abiadura erabili trenen geheienezko abiadura zehazteko diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 740fedb542..7e7673d499 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1925,6 +1925,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :адключа STR_CONFIG_SETTING_NOSERVICE :Адключыць абслугоўваньне, калі скасаваны паломкі: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Калі ўключана, транспарт не абслугоўваецца ўвогуле, калі адключаны паломкі. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Уключыць абмежаваньне хуткасьці ваґонаў: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Калі ўключана, выкарыстоўваць таксама й ліміты хуткасьці ў асобных ваґонаў для вызначэньня максымальнай хуткасьці ўсяго цягніка. diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 6acd1b88dc..916c8842b8 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desativado STR_CONFIG_SETTING_NOSERVICE :Desativar manutenção quando as quebras estão desativadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quando ativado, veículos não sofrem manutenção se não puderem quebrar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limite de velocidade dos vagões: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ativado, usa limites de velocidade para vagões para decidir a velocidade máxima de um trem diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index d92af42511..55fcc51ffe 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -1570,6 +1570,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Изключе STR_CONFIG_SETTING_NOSERVICE :Без сервиз когато повредите са изключени: {STRING.n} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ако тази опция бъде активирана, превозните средсва няма да бъдат обслужвани, ако не могат да се повредят + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Вагоните имат ограничение на скоростта: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ако тази опция бъде активирана, максималната скорост на вагоните ще се взима впредвид при изчисляването на максималната скорост на влака diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 6ea013392b..8bdd1b8712 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desactivat STR_CONFIG_SETTING_NOSERVICE :Desactiva les revisions quan les avaries s'estableixen a cap: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quan està activat, els vehicles no són revisats si no es poden espatllar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activa límits de velocitat per als vagons: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quan està activat, també utilitza els límits de velocitat dels vagons per decidir la velocitat màxima del tren diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 6447e31e9f..fd5d776dc1 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -767,6 +767,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31 + STR_CONFIG_SETTING_NEWS_SUBSIDIES :Грантсем: {STRING} ###length 3 diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index e21092b4aa..4779595bf5 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1721,6 +1721,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Isključeno STR_CONFIG_SETTING_NOSERVICE :Isključi servisiranje kada su kvarovi postavljeni na nula: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kada je uključeno, vozila se ne servisiraju kada se ne mogu pokvariti + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Omogući ograničenje brzine za vagone: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kada je uključeno, koristiti će se i limit brzine vagona kod određivanja najveće brzine nekog vlaka diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 24dd12f1fd..6562313f20 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1816,6 +1816,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Vypnuto STR_CONFIG_SETTING_NOSERVICE :Vypnout servisy, když jsou vypnuty poruchy: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pokud je zapnuto a zároveň jsou vypnuty poruchy, vozidla nebudou vůbec jezdit do servisu, protože se nemohou nikdy porouchat + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Zapnout omezení rychlosti vagonů: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pokud zapnuto, použije rychlostní omezení vagónů při stanovení maximální rychlosti vlaku diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 0cfccb6724..54ebd30077 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiveret STR_CONFIG_SETTING_NOSERVICE :Slå service fra, når nedbrud er sat til ingen: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Når tilladt, bliver køretøjer ikke serviceret, hvis de ikke kan bryde ned + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver hastighedsbegrænsning for vogne: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Når tilladt, brug også fartgrænse på vogne, for at bestemme makshastigheden på tog diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 7a485a9b37..8378439d44 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Uitgeschakeld STR_CONFIG_SETTING_NOSERVICE :Onderhoud uitschakelen wanneer defecten uit staan: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Als deze optie is ingeschakeld worden voertuigen niet onderhouden als ze niet kapot kunnen gaan. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Snelheidslimieten voor wagons inschakelen: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Wanneer ingeschakeld, ook gebruik maken van snelheidsbeperkingen van wagons voor het bepalen van de maximale snelheid van een trein diff --git a/src/lang/english.txt b/src/lang/english.txt index 7c1c6ae2e6..09aac5258a 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1777,6 +1777,9 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable servicing when breakdowns set to none: {STRING2} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get serviced if they cannot break down +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Loading speed penalty for trains that are longer than the station: {STRING2} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :When enabled, trains which are too long for the station load more slowly than a train which fits the station. This setting does not affect pathfinding. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable wagon speed limits: {STRING2} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index eb94bd140d..ee769426e4 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable servicing when breakdowns set to none: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get serviced if they cannot break down + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable wagon speed limits: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index d22d9b13a1..74250054b7 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable maintenance when breakdowns are set to none: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get maintained if they cannot break down + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable railroad car speed limits: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train @@ -4475,9 +4476,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}How to c STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not equal to STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is less than -STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :is more than -STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :is true STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 8ecbd2b36f..d0102ce46e 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -1784,6 +1784,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Malaktiva STR_CONFIG_SETTING_NOSERVICE :Malŝaltu prizorgadon se rompiĝoj ne okazas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kiam tiu ĉi agordo estas aktiva, veturiloj kiuj ne povas panei ne estos priservataj + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktivigu vagonajn rapideclimojn: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiam ebligita, ankaŭ uzu rapideco-limigojn de vagonoj por decidi la maksimuman rapidecon de trajno diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index ebc583b3ea..ba9ab0b61c 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -1765,6 +1765,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Väljas STR_CONFIG_SETTING_NOSERVICE :Hoolduse keelamine rikete väljalülitamisel: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kui on aktiveeritud, siis ei teostata hooldust sõidukitele mille tõrkumine ei ole võimalik + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Vagunite kiiruspiirangud: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kui on aktiveeritud siis kasutatakse rongi maksimaalse kiiruse arvutamiseks ka vagunite kiiruse piirangut diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 160492fa9d..ac67a9797f 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1519,6 +1519,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Ikki sligi til STR_CONFIG_SETTING_NOSERVICE :Ógilda eftirlit tá maskinskaðar eru ásettir til eingir: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Um gilda fáa flutningstól einki eftirlit um tey ikki kunnu fáa maskinskaða + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Gilda hámarksferð fyri vognar: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Um gilda, verður hámarksferðin hjá vognum eisini nýtt fyri at avgerða mest loydu ferðina á tokum diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 72aff10a6b..2ddc8e6817 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöst STR_CONFIG_SETTING_NOSERVICE :Poista huollot käytöstä kun kulkuneuvojen rikkoutuminen on poistettu käytöstä: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Mikäli käytössä, kulkuneuvoja ei huolleta, jos ne eivät voi rikkoutua + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ota käyttöön vaunujen nopeusrajoitukset: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Mikäli käytössä, vaunujen nopeusrajoitusta käytetään junan maksiminopeuden määrittämisessä diff --git a/src/lang/french.txt b/src/lang/french.txt index 19dded592e..cb5aaecec3 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Désactivé STR_CONFIG_SETTING_NOSERVICE :Désactiver l'entretien quand les pannes sont inactives{NBSP}: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Lorsqu'il est activé, les véhicules ne sont pas entretenus s'ils ne peuvent pas tomber en panne + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activer la vitesse limite des wagons{NBSP}: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Lorsqu'il est activé, utiliser la vitesse limite des wagons pour déterminer la vitesse maximum d'un train diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 65dff9170c..4125619292 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -1592,6 +1592,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Útskeakele STR_CONFIG_SETTING_NOSERVICE :Gjin ûnderhald as stikken gean út steat: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :By ynskeakeljen sille fiertugen gjin ûnderhâld krije at sy net kapot gean kinne + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Wagon snelheids limiet: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :By ynskeakeljen sille de faasjelimyten fan de weinen meinaam wurde by it bepalen fan de maksimale faasje foar in trein diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index ae306ddbb6..f34f62f314 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1785,6 +1785,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :À comas STR_CONFIG_SETTING_NOSERVICE :Cuir obair-chàraidh à comas ma chaidh briseadh a chur gu “Cha tachair seo idir”: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ma tha seo air, chan fhaigh carbadan obair-chàraidh mur urrainn dhaibh briseadh + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Cuir crìochan-luaiths nan carbadan-rèile an comas: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ma tha seo air, cleachd crìochan-luaiths nan carbadan cuideachd gus an luaths as motha aig trèan a shuidheachadh diff --git a/src/lang/galician.txt b/src/lang/galician.txt index a3e5aa123f..db14242498 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1771,6 +1771,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desactivado STR_CONFIG_SETTING_NOSERVICE :Deshabilita-lo mantemento cando as avarías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Cando estea activado, os vehículos non teñen mantemento no caso de que non poidan ter avarías + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activa-los límites de velocidade dos vagóns: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Cando estea activado, usar tamén os límites de velocidade dos vagóns para decidir a máxima velocidade do tren diff --git a/src/lang/german.txt b/src/lang/german.txt index 2bab17f3fd..8a2d526e59 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1768,6 +1768,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiviert STR_CONFIG_SETTING_NOSERVICE :Wartung deaktivieren, wenn Pannen abgeschaltet: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Schicke Fahrzeuge nicht zur Wartung, wenn Pannen ausgeschaltet sind + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Berücksichtige Waggonhöchstgeschwindigkeit: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Begrenze die Höchstgeschwindigkeit eines Zuges durch die jeweiligen Höchstgeschwindigkeiten der mitgeführten Waggons diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 95c0e1b74b..bb929eb169 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1813,6 +1813,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Απενεργ STR_CONFIG_SETTING_NOSERVICE :Απενεργοποίηση επισκευών όταν οι καταρρεύσεις είναι απενεργοποιημένες: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Όταν είναι ενεργοποιημένη, τα οχήματα δεν συντηρούνται όταν δεν είναι δυνατό να χαλάσουν + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ενεργοποίηση ορίων ταχύτητας βαγονιών: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Όταν είναι ενεργοποιημένο, χρησιμοποιούνται και τα όρια ταχύτητας των βαγονιών όταν αποφασίζεται η μέγιστη ταχύτητα ενός τρένου diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 2c55687f70..134cccbe51 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1624,6 +1624,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :מבוטל STR_CONFIG_SETTING_NOSERVICE :{STRING} :בטל טיפולים כאשר האפשרות לביטול תקלות נבחרה STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :כאשר מאופשר, כלי רכב אינם מתוחזקים אם הם אינם יכולים להתקלקל + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :{STRING} :אפשר הגבלת מהירות עבור קרונות רכבת STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :כאשר מאופשר, השתמש גם במגבלות מהירות של קרונות לצורך קביעות המהירות המירבית של רכבת diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 6e926b758f..d81895bd71 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -551,6 +551,7 @@ STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :कंप्य + STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :दुर्घटनायें / आपदायें : {STRING} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 79bf30e8ee..71f3ad3d87 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1830,6 +1830,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :kikapcsolva STR_CONFIG_SETTING_NOSERVICE :Ne legyen javítás ha lerobbanások sincsenek: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Bekapcsolva a járművek nem kerülnek javításra, ha nem tudnak lerobbanni + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :A vagonok sebessége korlátozható: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Bekapcsolva a szerelvényben lévő vasúti kocsik maximális sebessége is korlátozza a vonat maximális sebességét diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index e29370908b..e18f171616 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1518,6 +1518,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Óvirkt STR_CONFIG_SETTING_NOSERVICE :Sleppa viðhaldi þegar bilanir eru óvirkar: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ef þessi stilling er virk eru farartæki ekki þjónustuð ef þau geta ekki bilað + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Leyfa hraðatakmarkanir vagna: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ef þessi stilling er virk er hámarkshraði á vögnum einnig notaður til að ákvarða hámarks hraða á járnbrautalestum diff --git a/src/lang/ido.txt b/src/lang/ido.txt index b69b47d0e6..589f3223aa 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -734,6 +734,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora + ###length 3 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 6498f2bfe7..c1b0371f5e 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -1767,6 +1767,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Di non-aktifkan STR_CONFIG_SETTING_NOSERVICE :Tidak perlu perbaikan jika tidak pernah mogok: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Jika diaktifkan, kendaraan tidak akan diperbaiki jika tidak pernah mogok + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktifkan batas kecepatan gerbong: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Jika diaktifkan, batas kecepatan gerbong juga digunakan untuk menentukan kecepatan maksimum kereta diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 7dbd840afa..96ac944b66 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1671,6 +1671,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Díchumasaithe STR_CONFIG_SETTING_NOSERVICE :Díchumasaigh seirbhísiú nuair nach mbíonn aon bhriseadh síos: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Má tá sé cumasaithe, ní dhéantar feithiclí a sheirbhísí má rud é nach féidir leo briseadh síos + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Cumasaigh teorainneacha luais vaigíní: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Má tá sé cumasaithe, úsáid teorainneacha luais na vaigíní freisin chun luas uasta traenacha a shocrú diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 6d300ac363..b8d49fb313 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1812,6 +1812,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabilitato STR_CONFIG_SETTING_NOSERVICE :Disabilita manutenzione con i guasti veicoli disattivati: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Se abilitata, non vengono manutenuti i veicoli che non possono guastarsi. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Abilita limiti di velocità dei vagoni: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando abilitata, tiene conto anche dei limiti di velocità dei vagoni per determinare la velocità massima di un treno. diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 6cd76eec69..bcb1ad78ca 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1728,6 +1728,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :点検なし STR_CONFIG_SETTING_NOSERVICE :故障切ならば点検無効化: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :有効にすると、故障が起こらない設定の時には点検も行わなくなります + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :貨車の上限速度: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :有効にすると、上限速度が設定されている貨車を使用した場合、列車はその速度以上出せなくなります diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 8d61fd2bef..40d16f1f64 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :사용 안 함 STR_CONFIG_SETTING_NOSERVICE :차량 고장 설정을 껐으면 점검을 하지 않음: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :이 설정을 켜면, 차량이 고장나지 않도록 설정되어 있는 경우 차량이 자동으로 점검을 하러 가지 않습니다 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :화물차 속력 제한 적용: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :이 설정을 켜면, 화물차의 속력 제한값에 따라 열차의 최대 속력을 제한합니다. diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 5ded827f24..fc74f15697 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1783,6 +1783,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Neglectum STR_CONFIG_SETTING_NOSERVICE :Neglegere ministrationem cum nullae sunt defectiones vehiculorum: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Electa, vehicula non ministrantur defectionibus vetatis + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Annuere currus ferriviarios habere velocitates maximas: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Electa, velocitates maximae curruum afficiunt velocitatem maximam traminis diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 98db1f65a8..ab350142d4 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1779,6 +1779,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :izslēgts STR_CONFIG_SETTING_NOSERVICE :Aizliegt apkopi, kad bojāšanās ir izslēgta: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ja ieslēgts, transportlīdzekļiem netiek veikta apkope. Jo tie nebojājas + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ieslēgt vagonu ātruma ierobežojumus: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ja ieslēgts, var izmantot vagonu ātruma ierobežojumus, lai lemtu par vilcienu maksimālo ātrumu diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 0a0f383213..03d1b45f7a 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1896,6 +1896,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Išjungta STR_CONFIG_SETTING_NOSERVICE :Atjungti techninę apžiūrą, jei gedimai nenaudojami: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Jeigu įjungta, tada automobiliams nebus atliekama techninė apžiūra, jeigu jie negalės sugesti + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktyvinti vagonų greičio apribojimą: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Įgalinus šią nuostatą, vagonų didžiausias leistinas greitis įtakos viso traukinio greitį diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 75bd422bab..ffb6784765 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -1709,6 +1709,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Ausgeschalt STR_CONFIG_SETTING_NOSERVICE :Revisiounen ausschalten wann Pannen op "Keng" gestallt sinn: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Wann ugeschalt, ginn Gefierer net an d'Revisioun geschéckt, wann se keng Pann kënne kréien + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Geschwindegkeetsbegrenzungen fir Waggonen: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Wann ugeschalt, benotz och Geschwindegkeetslimitatiounen fir Waggonen fir d'maximal Geschwindegkeet vun engem Zuch ze definéiren diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 0fb16f81bf..997f282c7b 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1024,6 +1024,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#ОПкодов + STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Пристигнување на првото возило на станицата на играчот: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Пристигнување на прво возило на конкурентска станица: {STRING} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index fd0ce2af4b..7937c49f0c 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1452,6 +1452,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Dilumpuhkan STR_CONFIG_SETTING_NOSERVICE :Servis tidak diperlukan apabila kerosakan kenderaan ditetapkan kepada tiada: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Benarkan had kelajuan untuk gerabak: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :Tiada landasan elektrik: {STRING} diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 7ffdb59539..ac991bd2ed 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -665,6 +665,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uz + ###length 3 diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index b48c25162e..dd33138a51 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -971,6 +971,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :सर्व + ###length 3 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index faddec4575..358a7355cb 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1682,6 +1682,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktivert STR_CONFIG_SETTING_NOSERVICE :Deaktiver vedlikehold når havarier er slått av: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Når aktivert, vil kjøretøy ikke bli vedlikeholdt hvis de ikke kan bryte sammen + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver fartsgrenser for vogner: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Når aktivert, brukes også fartsgrenser til vogner for å avgjøre den maksimale hastigheten til et tog diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 46353cb279..b8d4a7d35a 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1526,6 +1526,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktivert STR_CONFIG_SETTING_NOSERVICE :Deaktiver vedlikehald når havari er slått av: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver fartsgrenser for vogner: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :Deaktiver elektriske tog: {STRING} diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 674f798758..5dc92ee66c 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -1412,6 +1412,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :درصد زما STR_CONFIG_SETTING_NOSERVICE :غیرفعال کردن تعمیر/بازنگری کلیه وسایل نقلیه وقتی که طبق تنظیمات بازی خودرو ها خراب نشوند : {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :فعال کردن حد برای سرعت واگن: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :غیر فعال کردن ریل برقی: {STRING} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index adebb77f20..230b340408 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -634,6 +634,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}d{P zień ni ni} +STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P a y ""} +STR_UNITS_TICKS :{COMMA}{NBSP}tyknię{P cie cia ć} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtr: @@ -1098,6 +1101,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kliknij STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kliknij na ścieżce muzycznej aby usunąć ją z wybranego programu (Wlasny1 lub Wlasny2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Najlepsze firmy STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Biznesmen STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Przedsiębiorca @@ -1915,6 +1919,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Jazda po lewej STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Jazda po prawej STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Obrót mapy wysokości: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Wybierz kierunek obrotu mapy wysokości, aby dopasować ją do świata gry ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Przeciwnie do wsk. zegara STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Zgodnie ze wsk. zegara @@ -2035,7 +2040,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Wlącz obsług STR_CONFIG_SETTING_LOADING_INDICATORS :Pokazuj wskaźniki załadunku: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Wybierz, czy wskaźnik załadunku pokazuje się nad ładowanym/rozładowywanym pojazdem +STR_CONFIG_SETTING_TIMETABLE_MODE :Jednostki czasu w rozkładach jazdy: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Wybierz jednostki czasu używane w rozkładach jazdy pojazdów ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dni +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekundy +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tyknięcia STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Pokazuj przyjazdy i odjazdy w rozkładach: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Wyświetlanie przewidywanego przyjazdu i odjazdu w rozkładach @@ -2147,6 +2157,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Wyłączone STR_CONFIG_SETTING_NOSERVICE :Wyłącz serwisowanie jeśli awarie pojazdów są wyłączone: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kiedy włączone, pojazdy nie są serwisowane, jeśli nie mogą się popsuć + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Włącz limity prędkości wagonów: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiedy włączone, użyj także ograniczenia prędkości dla wagonów do obliczenia maksymalnej prędkości pociągu @@ -3579,11 +3590,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Rozmiar STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Wybierz rozmiar mapy w kwadratach. Liczba dostępnych kwadratów będzie nieco mniejsza STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Liczba miast: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Wybierz gęstość rozmieszczenia miast lub podaj ich określoną liczbę STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nazwy miast: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wybierz styl nazw miast STR_MAPGEN_DATE :{BLACK}Data: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Wybierz datę początkową STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Liczba przedsiębiorstw: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Wybierz gęstość rozmieszczenia przedsiębiorstw lub podaj ich określoną liczbę STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najwyższy szczyt: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Wybierz najwyższy szczyt, który gra spróbuje utworzyć, mierzony wysokością nad poziomem wody STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Zwiększ wysokość najwyższego szczytu na mapie o jeden poziom STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Zmniejsz wysokość najwyższego szczytu na mapie o jeden poziom STR_MAPGEN_SNOW_COVERAGE :{BLACK}Pokrycie śniegiem: @@ -3596,10 +3611,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Zmniejsz STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ terenu: STR_MAPGEN_SEA_LEVEL :{BLACK}Poziom wody: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Określ wysokość poziomu wody STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Liczba rzek: STR_MAPGEN_SMOOTHNESS :{BLACK}Gładkość: STR_MAPGEN_VARIETY :{BLACK}Różnorodność: STR_MAPGEN_GENERATE :{WHITE}Stwórz +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Stwórz świat i graj w OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI @@ -3632,6 +3649,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalońskie # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Krańce mapy: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Wybierz obrzeża świata gry STR_MAPGEN_NORTHWEST :{BLACK}Płn.-zach. STR_MAPGEN_NORTHEAST :{BLACK}Płn.-wsch. STR_MAPGEN_SOUTHEAST :{BLACK}Płd.-wsch. @@ -3644,7 +3662,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Użytkow STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Obrót mapy wysokości: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nazwa mapy wysokosci: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Nazwa pliku obrazu mapy wysokości STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Rozmiar: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Rozmiar źródłowego obrazu mapy wysokości. Aby uzyskać najlepsze wyniki, każda krawędź powinna odpowiadać dostępnej długości krawędzi mapy w OpenTTD, takiej jak 256, 512, 1024 itd. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Żądana wysokość najwyższego szczytu @@ -3659,6 +3679,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Płaski STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Stwórz płaski świat STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Losowy teren STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Wysokość płaskiego świata: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Wybierz wysokość terenu nad poziomem morza STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Obniż wysokość terenu o jeden w dół STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Podnieś wysokość terenu o jeden w górę @@ -4958,8 +4979,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ten poja STR_TIMETABLE_STATUS_LATE :{BLACK}Ten pojazd jest teraz spóźniony o {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ten pojazd spieszy się teraz o {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ten rozkład jazdy jeszcze się nie rozpoczął +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Ten rozkład jazdy rozpocznie się {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Ten rozkład jazdy rozpocznie się za {COMMA} sekund{P ę y ""} +STR_TIMETABLE_START :{BLACK}Początek rozkładu +STR_TIMETABLE_START_TOOLTIP :{BLACK}Wybierz moment rozpoczęcia tego rozkładu jazdy. Ctrl+klik rozłoży równomiernie momenty startu wszystkich pojazdów współdzielących te polecenia w oparciu o ich względną kolejność, o ile rozkład jest w pełni zaplanowany +STR_TIMETABLE_START_SECONDS_QUERY :Sekundy do uruchomienia rozkładu jazdy STR_TIMETABLE_CHANGE_TIME :{BLACK}Zmień czas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zmień ilość czasu, jaką powinno zająć zaznaczone polecenie. Ctrl+klik ustala czas dla wszystkich poleceń @@ -4983,6 +5009,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Wymagany STR_TIMETABLE_SCHEDULED :{BLACK}Zaplanowany STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Przełącz między spodziewanymi i zaplanowanymi +STR_TIMETABLE_ARRIVAL_DATE :P: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :O: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :P: {COLOUR}{COMMA} s +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :O: {COLOUR}{COMMA} s # Date window (for timetable) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 936f9e80d9..31bb788205 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desativado STR_CONFIG_SETTING_NOSERVICE :Não fazer manutenção quando não há avarias: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quando ativo, os veículos não farão manutenção se não puderem avariar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limites de velocidade para vagões: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando ativo, aplica também os limites de velocidade dos vagões para decidir a velocidade máxima do comboio diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 69b59b0420..03663b1d6d 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1771,6 +1771,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Dezactivat STR_CONFIG_SETTING_NOSERVICE :Deactivare service când defecțiunile nu sunt active: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Dacă este activată, vehiculele nu vor întreținute dacă nu se pot defecta + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activează limite de viteză pentru vagoane: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Dacă este activată, folosește și limita de viteză a vagoanelor pentru a stabili viteza maximă a trenului diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 1b9cf46733..dfe2f4cebe 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1928,6 +1928,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :отключе STR_CONFIG_SETTING_NOSERVICE :Не обслуживать транспорт, если отключены поломки: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Отключение технического обслуживания транспортных средств, если отключены поломки. (Если транспорт не заходит в депо, автозамена не работает). + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Учитывать ограничение скорости у вагонов: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :При наличии в составе вагонов с ограничением скорости учитывать это ограничение при определении максимальной скорости состава diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index b92d562f13..34b2a1ec13 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1902,6 +1902,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Onemogućeno STR_CONFIG_SETTING_NOSERVICE :Isključeno servisiranje kada ne postoje kvarovi: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kada je uključeno, vozila se ne servisiraju ako ne mogu da se pokvare + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Uključeno ograničenje brzine kod vagona: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kada je omogućeno, takođe upotrebi ograničenje brzine vagona za određivanje maksimalne brzine voza diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 4768d82107..097adccb0c 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -349,7 +349,7 @@ STR_SORT_BY_POWER_VS_RUNNING_COST :功率/运行 STR_SORT_BY_CARGO_CAPACITY :运载能力 STR_SORT_BY_RANGE :航行距离 STR_SORT_BY_POPULATION :人口 -STR_SORT_BY_RATING :等级 +STR_SORT_BY_RATING :评价 STR_SORT_BY_NUM_VEHICLES :交通工具数量 STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :去年总利润 STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :今年总利润 @@ -367,7 +367,7 @@ STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}打开 # Tooltips for the main toolbar ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}暂停游戏 -STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}快速游戏模式 +STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}快进游戏 STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}选项和设置 STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}保存游戏、读取游戏、放弃游戏、退出 STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}显示地图、附加视点、客货流或标志列表 @@ -378,8 +378,8 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}显示 STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}显示公司综合信息 STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}显示公司历史纪录 STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}显示游戏目标选单 -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}显示图表和货物运费表 -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}显示公司名次表 +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}显示公司图表和货物运费表 +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}显示公司排行榜 STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}查看工业设施或投资工业设施建设 STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}显示公司的火车列表。按住 Ctrl 键单击可以切换组群和车辆列表。 STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}显示公司的汽车列表。按住 Ctrl 键单击可以切换组群和汽车列表。 @@ -388,10 +388,10 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}显示 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}放大视图 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}缩小视图 STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}显示铁路建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}显示公路建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车道 -STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}显示水运建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}显示机场建设工具 +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}建设道路 +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车轨道 +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}建设码头 +STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}建设机场 STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}打开景观美化工具栏{}以修改地形、设置地貌等 STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}显示 声音/音乐 控制菜单 STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}显示最新消息、新闻,消息历史或删除所有消息 @@ -717,7 +717,7 @@ STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLA STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}清除 STR_PLAYLIST_CHANGE_SET :更改设置 STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}清除当前列表中曲目{}(仅限自定义1或自定义2) -STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}选择另一种已安装的音乐 +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}选择其他已安装的音乐包 STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击音乐曲目以加入当前播放列表{}(仅限自定义1或自定义2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2) @@ -809,7 +809,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}地图 # Status bar messages STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}显示最后一条消息或新闻 STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - -STR_STATUSBAR_PAUSED :{YELLOW}* * 暂停中 * * +STR_STATUSBAR_PAUSED :{YELLOW}* * 已暂停 * * STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * 已暂停 (等待货物分配图更新) * * STR_STATUSBAR_AUTOSAVE :{RED}自动保存 STR_STATUSBAR_SAVING_GAME :{RED}* * 保存游戏中 * * @@ -842,7 +842,7 @@ STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLAC STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}汽车被 'UFO' 炸毁! STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}在 {TOWN} 附近的炼油厂泄漏! STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}在 {TOWN} 附近的工厂神秘被毁! -STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}'UFO' 在 {TOWN} 附近降落! +STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}UFO 在 {TOWN} 附近降落! STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}在 {TOWN} 附近的煤矿发生塌方! STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}洪水!{}至少 {COMMA} 人失踪,据推测凶多吉少! @@ -1172,7 +1172,7 @@ STR_TERRAIN_TYPE_CUSTOM :自定义高度 STR_TERRAIN_TYPE_CUSTOM_VALUE :自定义高度 ({NUM}) ###length 4 -STR_CITY_APPROVAL_LENIENT :宽容的 +STR_CITY_APPROVAL_LENIENT :宽容 STR_CITY_APPROVAL_TOLERANT :隐忍 STR_CITY_APPROVAL_HOSTILE :对立 STR_CITY_APPROVAL_PERMISSIVE :宽容(对公司行为没有影响 ) @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :关闭 STR_CONFIG_SETTING_NOSERVICE :在无故障模式下禁用保养周期:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :“打开”时,在无故障模式下,车辆禁用保养周期 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :启动车辆限速:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :“打开“时,还要根据车辆的限速来决定一列火车的最高速度 @@ -1923,8 +1924,8 @@ STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :移动一个窗 STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} 像素 ###setting-zero-is-special STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :关闭 -STR_CONFIG_SETTING_SOFT_LIMIT :窗口软性限制(非粘滞): {STRING} -STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :设置为腾出位置显示新的窗口,在打开多少个窗口后自动关闭非锁定窗口 +STR_CONFIG_SETTING_SOFT_LIMIT :窗口数量上限: {STRING} +STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :设定窗口数量上限。超出此限值时游戏会自动关闭最早打开的窗口。已固定的窗口不受此项限制。 STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :关闭 @@ -2196,12 +2197,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}显示 STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}显示汽车配色方案 STR_LIVERY_SHIP_TOOLTIP :{BLACK}显示船只配色方案 STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}显示飞机配色方案 +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}显示列车分组配色 +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}显示汽车分组配色 +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}显示船只分组配色 +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}显示飞机分组配色 STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}为选定的配色方案指定主色调 STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}为选定的配色方案指定副色调 STR_LIVERY_PANEL_TOOLTIP :{BLACK}选择一个或多个(CTRL+单击){}要更改的配色方案{}点击方块可以切换不同的方案 +STR_LIVERY_TRAIN_GROUP_EMPTY :尚未为列车分组 +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :尚未为汽车分组 +STR_LIVERY_SHIP_GROUP_EMPTY :尚未为船只分组 +STR_LIVERY_AIRCRAFT_GROUP_EMPTY :尚未为飞机分组 ###length 23 -STR_LIVERY_DEFAULT :标准外观 +STR_LIVERY_DEFAULT :默认配色 STR_LIVERY_STEAM :蒸汽机车 STR_LIVERY_DIESEL :内燃机车 STR_LIVERY_ELECTRIC :电力机车 @@ -2861,10 +2870,10 @@ STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}配置 { STR_AIRPORT_SMALL :小型机场 STR_AIRPORT_CITY :城市机场 -STR_AIRPORT_METRO :国内机场 +STR_AIRPORT_METRO :都会机场 STR_AIRPORT_INTERNATIONAL :国际机场 STR_AIRPORT_COMMUTER :通勤机场 -STR_AIRPORT_INTERCONTINENTAL :全球机场 +STR_AIRPORT_INTERCONTINENTAL :洲际机场 STR_AIRPORT_HELIPORT :直升机停机楼 STR_AIRPORT_HELIDEPOT :直升机专用机场 STR_AIRPORT_HELISTATION :直升机小型机场 @@ -3325,7 +3334,7 @@ STR_GENERATION_PREPARING_GAME :{BLACK}准备 STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置 STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}NewGRF 详细信息 STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}已激活 NewGRF -STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}停用 NewGRF +STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}已停用 NewGRF STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设 STR_NEWGRF_FILTER_TITLE :{ORANGE}关键字词搜索: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}装载选定的预定义 @@ -3337,8 +3346,8 @@ STR_NEWGRF_SETTINGS_ADD :{BLACK}增加 STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}将选定的 NewGRF 文件添加到你的配置中 STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}重新检索文件 STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}刷新可用的 NewGRF 文件列表 -STR_NEWGRF_SETTINGS_REMOVE :{BLACK}删除 -STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}从列表中删除一个 NewGRF 文件 +STR_NEWGRF_SETTINGS_REMOVE :{BLACK}停用 +STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}从列表中停用选定的 NewGRF 文件 STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}上移 STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}将选定的 NewGRF 文件向上移动 STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}下移 @@ -3350,7 +3359,7 @@ STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}已经 STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}设置参数 STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}显示参数 STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}切换调色板 -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}切换选定GRF的调色.{}本功能用于游戏使用时GRF呈粉色 +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}切换选定GRF的调色盘。{}如果该GRF在游戏中看起来是一片粉色,您可以尝试调整此项以解决问题。若没有问题,请不要调整此项 STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}应用 STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}在线查找缺失的扩展包 @@ -3362,10 +3371,10 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}版本: STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}最低兼容版本: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5 码:{SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}调色板: {SILVER}{STRING} -STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :默认 (D) -STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :默认 (D) / 32 bpp -STR_NEWGRF_SETTINGS_PALETTE_LEGACY :传统 (W) -STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :传统 (W) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :默认 (DOS) +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :默认 (DOS) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_LEGACY :传统 (Windows) +STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :传统 (Windows) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}参数:{SILVER}{STRING} STR_NEWGRF_SETTINGS_PARAMETER_NONE :无 @@ -3661,7 +3670,7 @@ STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOI STR_STATION_LIST_NONE :{YELLOW}- 没有 - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}选择全部运输工具种类 STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}选择所有货物类型{}(包括不在等待列表中的) -STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}选择无等待货物车站 +STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}无任何货物等待运送 # Station view window STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} @@ -4277,7 +4286,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}当前 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}装载/卸货 STR_VEHICLE_STATUS_LEAVING :{LTBLUE}发车 -STR_VEHICLE_STATUS_CRASHED :{RED}撞毁! +STR_VEHICLE_STATUS_CRASHED :{RED}已撞毁! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}抛锚 STR_VEHICLE_STATUS_STOPPED :{RED}停运 STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}正在停止,{VELOCITY} @@ -4288,11 +4297,11 @@ STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}距离 STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}正在前往 {STATION},{VELOCITY} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}没有目标,{VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正在前往{WAYPOINT},{VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正前往 {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正在前往 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}正在服务于 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}不能到达 {STATION}, {VELOCITY} -STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达路点 {WAYPOINT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达 {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}不能到达 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}不能到达 {DEPOT}, {VELOCITY} @@ -4653,9 +4662,9 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}符合 STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}切换对比AI 记录信息是否与断点字符串相符时是否要符合大小写 STR_AI_DEBUG_CONTINUE :{BLACK}继续 STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}取消暂停AI -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}查看此AI的调试输出 +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}查看此AI的调试输出。按住Ctrl键点选以打开新窗口 STR_AI_GAME_SCRIPT :{BLACK}游戏脚本 -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}查看脚本记录 +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}检查游戏脚本日志。按住Ctrl键点选以打开新窗口 STR_ERROR_AI_NO_AI_FOUND :找不到可用的AI。{}本AI是一个演示AI,并不会在游戏中做任何动作,{}您可以通过“在线查找扩展包”功能下载新的AI。 STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}您使用的一个AI崩溃了。请附上一张AI调试窗口的截图,将此错误通报AI作者。 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 7a01b41ad6..2761d26018 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -1815,6 +1815,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :vypnuté STR_CONFIG_SETTING_NOSERVICE :Vypnúť servisy, ak sú vypnuté poruchy: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ak je zapnuté, vozidlá nebudú servisované ak sú vypnuté poruchy. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Obmedzenie rýchlosti pre vagóny: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ak je zapnuté, použijú sa tiež rýchlostné obmedzenia pre vagóny na obmedzenie celkovej rýchlosti vlakov. diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 7c28205376..ff6849addd 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1735,6 +1735,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Onemogočeno STR_CONFIG_SETTING_NOSERVICE :Onemogoči servisiranje, če so onemogočene okvare: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Če je omogočeno, se vozila ne servisirajo, če ni okvar. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Omogoči omejitve hitrosti vagonov: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Če je omogočeno, se upošteva tudi omejitve hitrosti posameznih vagonov pri najvišji hitrosti vlaka. diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 1c27e5fd52..2307048bfe 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1710,6 +1710,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento cuando las averías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Cuando se activa, los vehículos no reciben mantenimiento si no pueden averiarse + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad en vagones: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Si se activa, se tienen en cuenta los límites de velocidad de los vagones a la hora de establecer la velocidad máxima de un tren diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index c73c53cd4e..b85e3c8682 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -1710,6 +1710,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento si las averías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Al activarse, los vehículos no recibirán mantenimiento si no pueden averiarse + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad para vagones: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Al activarse, se tienen en cuenta los límites de velocidad de los vagones para decidir la máxima velocidad de un tren diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 8749a84be0..e20e3d46be 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1762,6 +1762,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Inaktiverat STR_CONFIG_SETTING_NOSERVICE :Inaktivera service när motorstopp är av: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :När det är aktiverat servas inte fordon om de inte kan få motorstopp + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Använd hastighetsbegränsningar för tågvagnar: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :När det är aktiverat tas även hänsyn till vagnarnas hastighetsbegränsningar när ett tågs maxhastighet beräknas diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 577a6f955e..ce0e573aae 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1549,6 +1549,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :செயலி STR_CONFIG_SETTING_NOSERVICE :பழுதுகள் இல்லையெனில் பழுதுபார்த்தலினை செயலிழக்கவும்: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :இயக்கப்படும் போது, வாகனங்கள் உடைக்க முடியாவிட்டால் சேவை செய்யப்படாது + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :பெட்டி வேக கட்டுப்பாட்டினை செயல்படுத்தவும்: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :மின்சார இரயில்களை அனுமதிக்காதே: {STRING} diff --git a/src/lang/thai.txt b/src/lang/thai.txt index cb5798c642..876b6cf246 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1596,6 +1596,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :ไม่ตั STR_CONFIG_SETTING_NOSERVICE :ไม่ใช้งานการซ่อมบำรุงเมื่อตั้งเป็นไม่มีการขัดข้อง: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :เมื่อเปิดใช้งาน ยานพาหนะจะไม่เข้ารับการซ่อมบำรุงหากตั้งค่าไว้ไม่ให้มีการชำรุด + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :จำกัดความเร็วของรถจักร/รถพ่วง: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :เมื่อเปิดใช้งาน จะทำให้มีจำกัดความเร็วสูงสุดของยานพาหนะและรถพ่วงต่างๆ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 03e036c28a..af6d24f501 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1755,6 +1755,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :停用 STR_CONFIG_SETTING_NOSERVICE :如果停用故障,車輛不會進行自動維護:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :如啟用此選項,而且車輛設定為不故障,它們將不會進入機廠接受維護。 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :開啟列車車廂速限:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :如啟用此選項,無動力車廂的限速會影響列車的最高速度。 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index eecec8e4e7..056a8b07f1 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Etkisiz STR_CONFIG_SETTING_NOSERVICE :Bozulmalar kapalıysa sevisler kapalı olsun: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Etkinleştirildiğinde, araçlar bozulmuyorlarsa bakıma gönderilmezler + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Vagonların treni yavaşlatması izinli: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Etkinleştirildiğinde, bir trenin azami hızına karar verirken vagonların hız limitleri de göz önünde bulundurulur diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 3e9de47466..ea6f39c4a3 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1857,6 +1857,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Відключ STR_CONFIG_SETTING_NOSERVICE :Не відправляти на техогляд, якщо відключені аварії: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Включення цієї опції дозволяє не проводити автоматичний техогляд у разі, якщо поломки транспорту вимкнено. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Враховувати обмеження швидкості вагонів: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :При включенні максимальна швидкість потяга враховує обмеження швидкості вагонів. diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index afa61cebac..d6a8d6db9a 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1336,6 +1336,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :مرمتی وق STR_CONFIG_SETTING_NOSERVICE :گاڑیوں کی خرابی غیر فعال ہونے کی صورت میں مرمت بھی غیر فعال کر دیں: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :مال گاڑی کی حد رفتار فعال کریں: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :الیلٹرک ریل گاڑیاں غیر فعال کریں: {STRING} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index d29cbb867c..0cbd17a0bb 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :tắt STR_CONFIG_SETTING_NOSERVICE :Tắt bảo trì khi đặt tắt tuỳ chọn hỏng hóc: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Nếu bật, phương tiện sẽ không cần bảo trì nếu chúng không thể bị hỏng + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Bật giới hạn tốc độ toa tàu: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Nếu bật, sử dụng giới hạn tốc độ của toa xe để hạn chế tốc độ của cả đoàn tàu diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index c50e759abb..8f291f18b8 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -1627,6 +1627,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Analluogwyd STR_CONFIG_SETTING_NOSERVICE :Analluogi gwasanaethau pan fydd torri i lawr wedi ei osod i Ddim: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pan y galluogir, ni wasanaethir cerbydau os na allent dorri i lawr + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Galluogi terfynau cyflymder wagenni: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pan y galluogir, fe ddefnyddir terfynnau cyflymder pob cerbyd mewn trên pan yn cyfrifo ei gyflymder uchafsymol diff --git a/src/misc/array.hpp b/src/misc/array.hpp index aea58aba42..38e791edf6 100644 --- a/src/misc/array.hpp +++ b/src/misc/array.hpp @@ -28,7 +28,7 @@ protected: SuperArray data; ///< array of arrays of items /** return first sub-array with free space for new item */ - inline SubArray& FirstFreeSubArray() + inline SubArray &FirstFreeSubArray() { uint super_size = data.Length(); if (super_size > 0) { diff --git a/src/misc/dbg_helpers.h b/src/misc/dbg_helpers.h index b807ef25f1..610b6ab09b 100644 --- a/src/misc/dbg_helpers.h +++ b/src/misc/dbg_helpers.h @@ -126,7 +126,7 @@ struct DumpTarget { : m_indent(0) {} - static size_t& LastTypeId(); + static size_t &LastTypeId(); std::string GetCurrentStructName(); bool FindKnownName(size_t type_id, const void *ptr, std::string &name); diff --git a/src/misc/fixedsizearray.hpp b/src/misc/fixedsizearray.hpp index a36a810f27..7a2c97b58b 100644 --- a/src/misc/fixedsizearray.hpp +++ b/src/misc/fixedsizearray.hpp @@ -39,25 +39,25 @@ protected: T *data; /** return reference to the array header (non-const) */ - inline ArrayHeader& Hdr() + inline ArrayHeader &Hdr() { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } /** return reference to the array header (const) */ - inline const ArrayHeader& Hdr() const + inline const ArrayHeader &Hdr() const { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } /** return reference to the block reference counter */ - inline uint& RefCnt() + inline uint &RefCnt() { return Hdr().reference_count; } /** return reference to number of used items */ - inline uint& SizeRef() + inline uint &SizeRef() { return Hdr().items; } diff --git a/src/misc/hashtable.hpp b/src/misc/hashtable.hpp index 13dadc01ac..45df183d69 100644 --- a/src/misc/hashtable.hpp +++ b/src/misc/hashtable.hpp @@ -216,7 +216,7 @@ public: } /** non-const item search & removal */ - Titem_& Pop(const Tkey &key) + Titem_ &Pop(const Tkey &key) { Titem_ *item = TryPop(key); assert(item != nullptr); diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index d1488db02a..0bf1cc974b 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -37,9 +37,9 @@ static const int MS_TO_REFTIME = 1000 * 10; ///< DirectMusic time base is 100 ns static const int MIDITIME_TO_REFTIME = 10; ///< Time base of the midi file reader is 1 us. -#define FOURCC_INFO mmioFOURCC('I','N','F','O') -#define FOURCC_fmt mmioFOURCC('f','m','t',' ') -#define FOURCC_data mmioFOURCC('d','a','t','a') +#define FOURCC_INFO mmioFOURCC('I', 'N', 'F', 'O') +#define FOURCC_fmt mmioFOURCC('f', 'm', 't', ' ') +#define FOURCC_data mmioFOURCC('d', 'a', 't', 'a') /** A DLS file. */ struct DLSFile { diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index f6844f3e1e..39e9f17c1f 100644 --- a/src/music/midifile.cpp +++ b/src/music/midifile.cpp @@ -377,7 +377,7 @@ static bool FixupMidiData(MidiFile &target) while (cur_block < target.blocks.size()) { MidiFile::DataBlock &block = target.blocks[cur_block]; MidiFile::TempoChange &tempo = target.tempos[cur_tempo]; - MidiFile::TempoChange &next_tempo = target.tempos[cur_tempo+1]; + MidiFile::TempoChange &next_tempo = target.tempos[cur_tempo + 1]; if (block.ticktime <= next_tempo.ticktime) { /* block is within the current tempo */ int64 tickdiff = block.ticktime - last_ticktime; @@ -792,12 +792,12 @@ struct MpsMachine { /* Always reset percussion channel to program 0 */ this->target.blocks.push_back(MidiFile::DataBlock()); - AddMidiData(this->target.blocks.back(), MIDIST_PROGCHG+9, 0x00); + AddMidiData(this->target.blocks.back(), MIDIST_PROGCHG + 9, 0x00); /* Technically should be an endless loop, but having * a maximum (about 10 minutes) avoids getting stuck, * in case of corrupted data. */ - for (uint32 tick = 0; tick < 100000; tick+=1) { + for (uint32_t tick = 0; tick < 100000; tick += 1) { this->target.blocks.push_back(MidiFile::DataBlock()); auto &block = this->target.blocks.back(); block.ticktime = tick; diff --git a/src/network/core/host.cpp b/src/network/core/host.cpp index 9fd362110e..d324ec7591 100644 --- a/src/network/core/host.cpp +++ b/src/network/core/host.cpp @@ -57,7 +57,7 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // Wi memcpy(&address, &ifo[j].iiAddress.Address, sizeof(sockaddr)); ((sockaddr_in*)&address)->sin_addr.s_addr = ifo[j].iiAddress.AddressIn.sin_addr.s_addr | ~ifo[j].iiNetmask.AddressIn.sin_addr.s_addr; NetworkAddress addr(address, sizeof(sockaddr)); - if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const& elem) -> bool { return elem == addr; })) broadcast->push_back(addr); + if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const &elem) -> bool { return elem == addr; })) broadcast->push_back(addr); } free(ifo); @@ -77,7 +77,7 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) if (ifa->ifa_broadaddr->sa_family != AF_INET) continue; NetworkAddress addr(ifa->ifa_broadaddr, sizeof(sockaddr)); - if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const& elem) -> bool { return elem == addr; })) broadcast->push_back(addr); + if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const &elem) -> bool { return elem == addr; })) broadcast->push_back(addr); } freeifaddrs(ifap); } diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index d8bf73fe18..1c5c796aaa 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -233,8 +233,10 @@ void HttpThread() request->callback.OnFailure(); } - /* Wait till the callback tells us all data is dequeued. */ - request->callback.WaitTillEmpty(); + /* Wait till the callback tells us all data is dequeued, or _http_thread_exit has been set. */ + request->callback.WaitTillEmptyOrCondition([]() -> bool { + return _http_thread_exit; + }); } curl_easy_cleanup(curl); @@ -277,10 +279,13 @@ void NetworkHTTPInitialize() void NetworkHTTPUninitialize() { - curl_global_cleanup(); - _http_thread_exit = true; + /* Queues must be cleared (and the queue CV signalled) after _http_thread_exit is set to ensure that the HTTP thread can exit */ + for (auto &callback : _http_callbacks) { + callback->ClearQueue(); + } + { std::lock_guard lock(_http_mutex); _http_cv.notify_one(); @@ -289,4 +294,6 @@ void NetworkHTTPUninitialize() if (_http_thread.joinable()) { _http_thread.join(); } + + curl_global_cleanup(); } diff --git a/src/network/core/http_shared.h b/src/network/core/http_shared.h index ce32c0ab8a..bc86290998 100644 --- a/src/network/core/http_shared.h +++ b/src/network/core/http_shared.h @@ -74,13 +74,15 @@ public: } /** - * Wait till the queue is dequeued. + * Wait till the queue is dequeued, or a condition is met. + * @param condition Condition functor. */ - void WaitTillEmpty() + template + void WaitTillEmptyOrCondition(T condition) { std::unique_lock lock(this->mutex); - while (!queue.empty()) { + while (!(queue.empty() || condition())) { this->queue_cv.wait(lock); } } @@ -94,6 +96,20 @@ public: return this->queue.empty(); } + + /** + * Clear everything in the queue. + * + * Should be called from the Game Thread. + */ + void ClearQueue() + { + std::lock_guard lock(this->mutex); + + this->queue.clear(); + this->queue_cv.notify_all(); + } + HTTPThreadSafeCallback(HTTPCallback *callback) : callback(callback) {} ~HTTPThreadSafeCallback() diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 6726a60de8..8704675260 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1107,7 +1107,7 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_PLAY_HEIGHTMAP: if (!CheckServerName()) return; _is_network_server = true; - ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); + ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break; } } diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 4d0d097692..b87ca94eb1 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1494,7 +1494,7 @@ struct SpriteAlignerWindow : Window { DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, SpriteAlignerWindow::zoom); Rect outline = {0, 0, UnScaleByZoom(spr->width, SpriteAlignerWindow::zoom) - 1, UnScaleByZoom(spr->height, SpriteAlignerWindow::zoom) - 1}; - outline = outline.Translate(x + UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom),y + UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); + outline = outline.Translate(x + UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom), y + UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); DrawRectOutline(outline.Expand(1), PC_LIGHT_BLUE, 1, 1); if (SpriteAlignerWindow::crosshair) { diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index 49850881a6..9e9db4ebc4 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -292,7 +292,7 @@ RoadStopResolverObject::~RoadStopResolverObject() delete this->town_scope; } -TownScopeResolver* RoadStopResolverObject::GetTown() +TownScopeResolver *RoadStopResolverObject::GetTown() { if (this->town_scope == nullptr) { Town *t; diff --git a/src/newgrf_roadstop.h b/src/newgrf_roadstop.h index 24776f56ec..7e14f66119 100644 --- a/src/newgrf_roadstop.h +++ b/src/newgrf_roadstop.h @@ -90,7 +90,7 @@ struct RoadStopScopeResolver : public ScopeResolver { uint8 view; ///< Station axis. RoadType roadtype; ///< Road type (used when no tile) - RoadStopScopeResolver(ResolverObject& ro, BaseStation* st, const RoadStopSpec *roadstopspec, TileIndex tile, RoadType roadtype, StationType type, uint8 view = 0) + RoadStopScopeResolver(ResolverObject &ro, BaseStation *st, const RoadStopSpec *roadstopspec, TileIndex tile, RoadType roadtype, StationType type, uint8 view = 0) : ScopeResolver(ro), tile(tile), st(st), roadstopspec(roadstopspec), type(type), view(view), roadtype(roadtype) { @@ -115,7 +115,7 @@ struct RoadStopResolverObject : public ResolverObject { RoadStopScopeResolver roadstop_scope; ///< The stop scope resolver. TownScopeResolver *town_scope; ///< The town scope resolver (created on the first call). - RoadStopResolverObject(const RoadStopSpec* roadstopspec, BaseStation* st, TileIndex tile, RoadType roadtype, StationType type, uint8 view, CallbackID callback = CBID_NO_CALLBACK, uint32 param1 = 0, uint32 param2 = 0); + RoadStopResolverObject(const RoadStopSpec *roadstopspec, BaseStation *st, TileIndex tile, RoadType roadtype, StationType type, uint8 view, CallbackID callback = CBID_NO_CALLBACK, uint32 param1 = 0, uint32 param2 = 0); ~RoadStopResolverObject(); ScopeResolver* GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, VarSpriteGroupScopeOffset relative = 0) override { diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 10fa226f6c..ef6ae577a2 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -246,7 +246,7 @@ uint32 EvaluateDeterministicSpriteGroupAdjust(DeterministicSpriteGroupSize size, } } -static bool RangeHighComparator(const DeterministicSpriteGroupRange& range, uint32 value) +static bool RangeHighComparator(const DeterministicSpriteGroupRange &range, uint32_t value) { return range.high < value; } diff --git a/src/newgrf_townname.cpp b/src/newgrf_townname.cpp index ce394be77e..69324f241b 100644 --- a/src/newgrf_townname.cpp +++ b/src/newgrf_townname.cpp @@ -90,7 +90,7 @@ void InitGRFTownGeneratorNames() } } -const std::vector& GetGRFTownNameList() +const std::vector &GetGRFTownNameList() { return _grf_townname_names; } diff --git a/src/newgrf_townname.h b/src/newgrf_townname.h index c2fc94a53b..69b18b8d91 100644 --- a/src/newgrf_townname.h +++ b/src/newgrf_townname.h @@ -53,6 +53,6 @@ uint32 GetGRFTownNameId(uint16 gen); uint16 GetGRFTownNameType(uint16 gen); StringID GetGRFTownNameName(uint16 gen); -const std::vector& GetGRFTownNameList(); +const std::vector &GetGRFTownNameList(); #endif /* NEWGRF_TOWNNAME_H */ diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 38ed50db61..c5b689bbc3 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -208,7 +208,7 @@ static WindowDesc _small_news_desc(__FILE__, __LINE__, /** * Window layouts for news items. */ -static WindowDesc* _news_window_layout[] = { +static WindowDesc *_news_window_layout[] = { &_thin_news_desc, ///< NF_THIN &_small_news_desc, ///< NF_SMALL &_normal_news_desc, ///< NF_NORMAL @@ -216,7 +216,7 @@ static WindowDesc* _news_window_layout[] = { &_company_news_desc, ///< NF_COMPANY }; -WindowDesc* GetNewsWindowLayout(NewsFlag flags) +WindowDesc *GetNewsWindowLayout(NewsFlag flags) { uint layout = GB(flags, NFB_WINDOW_LAYOUT, NFB_WINDOW_LAYOUT_COUNT); assert(layout < lengthof(_news_window_layout)); diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index a8e16b140a..5b19fad793 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -26,10 +26,10 @@ extern "C" { typedef const struct __CTRunDelegate * CTRunDelegateRef; - typedef void (*CTRunDelegateDeallocateCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetAscentCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetDescentCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetWidthCallback) (void* refCon); + typedef void (*CTRunDelegateDeallocateCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetAscentCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetDescentCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetWidthCallback) (void *refCon); typedef struct { CFIndex version; CTRunDelegateDeallocateCallback dealloc; @@ -45,7 +45,7 @@ extern "C" { extern const CFStringRef kCTRunDelegateAttributeName AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; - CTRunDelegateRef CTRunDelegateCreate(const CTRunDelegateCallbacks* callbacks, void* refCon) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; + CTRunDelegateRef CTRunDelegateCreate(const CTRunDelegateCallbacks *callbacks, void *refCon) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; } #endif /* HAVE_OSX_109_SDK */ @@ -62,7 +62,7 @@ class CoreTextParagraphLayout : public ParagraphLayouter { private: const CoreTextParagraphLayoutFactory::CharType *text_buffer; ptrdiff_t length; - const FontMap& font_map; + const FontMap &font_map; CFAutoRelease typesetter; diff --git a/src/pathfinder/yapf/nodelist.hpp b/src/pathfinder/yapf/nodelist.hpp index c589a0d370..70ea293c19 100644 --- a/src/pathfinder/yapf/nodelist.hpp +++ b/src/pathfinder/yapf/nodelist.hpp @@ -132,7 +132,7 @@ public: } /** remove and return the open node specified by a key */ - inline Titem_& PopOpenNode(const Key &key) + inline Titem_ &PopOpenNode(const Key &key) { Titem_ &item = m_open.Pop(key); uint idxPop = m_open_queue.FindIndex(item); @@ -161,7 +161,7 @@ public: } /** Get a particular item. */ - inline Titem_& ItemAt(int idx) + inline Titem_ &ItemAt(int idx) { return m_arr[idx]; } diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 18d66601e8..dce0af92d5 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -85,14 +85,14 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } public: /** return current settings (can be custom - company based - but later) */ - inline const YAPFSettings& PfGetSettings() const + inline const YAPFSettings &PfGetSettings() const { return _settings_game.pf.yapf; } @@ -167,7 +167,7 @@ public: * Calls NodeList::CreateNewNode() - allocates new node that can be filled and used * as argument for AddStartupNode() or AddNewNode() */ - inline Node& CreateNewNode() + inline Node &CreateNewNode() { Node &node = *m_nodes.CreateNewNode(); return node; diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp index c7590869ce..1a08b9a6b2 100644 --- a/src/pathfinder/yapf/yapf_common.hpp +++ b/src/pathfinder/yapf/yapf_common.hpp @@ -24,7 +24,7 @@ protected: TrackdirBits m_orgTrackdirs; ///< origin trackdir mask /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { /* use two lines to avoid false-positive Undefined Behavior Sanitizer warnings when alignof(Tpf) > alignof(*this) and *this does not meet alignof(Tpf) */ Tpf *p = static_cast(this); @@ -70,7 +70,7 @@ protected: bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { /* use two lines to avoid false-positive Undefined Behavior Sanitizer warnings when alignof(Tpf) > alignof(*this) and *this does not meet alignof(Tpf) */ Tpf *p = static_cast(this); diff --git a/src/pathfinder/yapf/yapf_costcache.hpp b/src/pathfinder/yapf/yapf_costcache.hpp index b0e78666d6..60501126be 100644 --- a/src/pathfinder/yapf/yapf_costcache.hpp +++ b/src/pathfinder/yapf/yapf_costcache.hpp @@ -63,7 +63,7 @@ protected: LocalCache m_local_cache; /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -138,7 +138,7 @@ struct CSegmentCostCacheT : public CSegmentCostCacheBase { m_heap.Clear(); } - inline Tsegment& Get(Key &key, bool *found) + inline Tsegment &Get(Key &key, bool *found) { Tsegment *item = m_map.Find(key); if (item == nullptr) { @@ -174,12 +174,12 @@ protected: inline CYapfSegmentCostCacheGlobalT() : m_global_cache(stGetGlobalCache()) {}; /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } - inline static Cache& stGetGlobalCache() + inline static Cache &stGetGlobalCache() { static int last_rail_change_counter = 0; static Cache C; diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 7badaa657a..f08d32a20f 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -79,7 +79,7 @@ protected: } /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index ae50fdfd36..3b5a2fb58b 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -40,7 +40,7 @@ public: typedef typename Node::Key Key; ///< key to hash tables /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -83,7 +83,7 @@ public: typedef typename Types::TrackFollower TrackFollower; ///< TrackFollower. Need to typedef for gcc 2.95 /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -131,7 +131,7 @@ protected: bool m_any_depot; /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_node.hpp b/src/pathfinder/yapf/yapf_node.hpp index ce4ba3b289..55d47c0a59 100644 --- a/src/pathfinder/yapf/yapf_node.hpp +++ b/src/pathfinder/yapf/yapf_node.hpp @@ -97,7 +97,7 @@ struct CYapfNodeT { return m_key.m_td; } - inline const Tkey_& GetKey() const + inline const Tkey_ &GetKey() const { return m_key; } diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index adfa693664..1cbcc43d1b 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -82,7 +82,7 @@ struct CYapfRailSegment , m_hash_next(nullptr) {} - inline const Key& GetKey() const + inline const Key &GetKey() const { return m_key; } diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index bc9521c803..a5fe6aa9d8 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -73,7 +73,7 @@ public: protected: /** to access inherited pathfinder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -273,7 +273,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -384,7 +384,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -471,7 +471,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 8fc5323a0c..cd867b1859 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -41,7 +41,7 @@ protected: CYapfCostRoadT() : m_max_cost(0) {}; /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { /* use two lines to avoid false-positive Undefined Behavior Sanitizer warnings when alignof(Tpf) > alignof(*this) and *this does not meet alignof(Tpf) */ Tpf *p = static_cast(this); @@ -231,7 +231,7 @@ public: typedef typename Node::Key Key; ///< key to hash tables /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -308,7 +308,7 @@ public: protected: /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -410,7 +410,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 51a4484fa4..cc07cfb974 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -47,14 +47,14 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } public: /** Called by YAPF to detect if node ends in the desired destination */ - inline bool PfDetectDestination(Node& n) + inline bool PfDetectDestination(Node &n) { return PfDetectDestinationTile(n.m_segment_last_tile, n.m_segment_last_td); } @@ -72,7 +72,7 @@ public: * Called by YAPF to calculate cost estimate. Calculates distance to the destination * adds it to the actual cost from origin and stores the sum to the Node::m_estimate */ - inline bool PfCalcEstimate(Node& n) + inline bool PfCalcEstimate(Node &n) { static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0}; static const int dg_dir_to_y_offs[] = {0, 1, 0, -1}; @@ -111,7 +111,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -254,7 +254,7 @@ public: protected: /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index ecbba63f50..23ed5184b4 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1984,7 +1984,7 @@ void DrawRoadTypeCatenary(const TileInfo *ti, RoadType rt, RoadBits rb) if (CountBits(rb_new) >= 2) rb = rb_new; } - const RoadTypeInfo* rti = GetRoadTypeInfo(rt); + const RoadTypeInfo *rti = GetRoadTypeInfo(rt); SpriteID front = GetCustomRoadSprite(rti, ti->tile, ROTSG_CATENARY_FRONT); SpriteID back = GetCustomRoadSprite(rti, ti->tile, ROTSG_CATENARY_BACK); @@ -2454,7 +2454,7 @@ void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt) { PaletteID palette = COMPANY_SPRITE_COLOUR(_local_company); - const RoadTypeInfo* rti = GetRoadTypeInfo(rt); + const RoadTypeInfo *rti = GetRoadTypeInfo(rt); int relocation = GetCustomRoadSprite(rti, INVALID_TILE, ROTSG_DEPOT); bool default_gfx = relocation == 0; if (default_gfx) { diff --git a/src/road_gui.cpp b/src/road_gui.cpp index f428743118..d418f54f76 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -858,7 +858,7 @@ struct BuildRoadToolbarWindow : Window { Window *CreateRoadTramToolbarForRoadType(RoadType roadtype, RoadTramType rtt) { - Window* w = nullptr; + Window *w = nullptr; switch (_game_mode) { case GM_NORMAL: w = ShowBuildRoadToolbar(roadtype); @@ -883,7 +883,7 @@ Window *CreateRoadTramToolbarForRoadType(RoadType roadtype, RoadTramType rtt) */ static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build, RoadTramType rtt) { - Window* w = CreateRoadTramToolbarForRoadType(last_build, rtt); + Window *w = CreateRoadTramToolbarForRoadType(last_build, rtt); if (w == nullptr) return ES_NOT_HANDLED; return w->OnHotkey(hotkey); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a2da218641..c6ab0ad65f 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1466,7 +1466,7 @@ bool AfterLoadGame() } } - for (Vehicle* v : Vehicle::Iterate()) { + for (Vehicle *v : Vehicle::Iterate()) { if (!v->IsGroundVehicle()) continue; if (IsBridgeTile(v->tile)) { DiagDirection dir = GetTunnelBridgeDirection(v->tile); @@ -2808,7 +2808,7 @@ bool AfterLoadGame() * 'default' names, after that we can assign the names. */ for (Depot *d : Depot::Iterate()) d->town_cn = UINT16_MAX; - for (Depot* d : Depot::Iterate()) MakeDefaultName(d); + for (Depot *d : Depot::Iterate()) MakeDefaultName(d); } if (IsSavegameVersionBefore(SLV_142)) { @@ -2909,7 +2909,7 @@ bool AfterLoadGame() if (!wp->name.empty()) wp->town_cn = UINT16_MAX; } - for (Waypoint* wp : Waypoint::Iterate()) { + for (Waypoint *wp : Waypoint::Iterate()) { if (!wp->name.empty()) MakeDefaultName(wp); } } diff --git a/src/script/api/script_depotlist.cpp b/src/script/api/script_depotlist.cpp index 2e1dc6fc98..d7f3eb5ad3 100644 --- a/src/script/api/script_depotlist.cpp +++ b/src/script/api/script_depotlist.cpp @@ -27,8 +27,10 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) case ScriptTile::TRANSPORT_AIR: { /* Hangars are not seen as real depots by the depot code. */ + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Station *st : Station::Iterate()) { - if (st->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) { + if (is_deity || st->owner == owner) { for (uint i = 0; i < st->airport.GetNumHangars(); i++) { this->AddItem(st->airport.GetHangarTile(i)); } @@ -39,7 +41,9 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) } /* Handle 'standard' depots. */ + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Depot *depot : Depot::Iterate()) { - if ((::GetTileOwner(depot->xy) == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && ::IsTileType(depot->xy, tile_type)) this->AddItem(depot->xy); + if ((is_deity || ::GetTileOwner(depot->xy) == owner) && ::IsTileType(depot->xy, tile_type)) this->AddItem(depot->xy); } } diff --git a/src/script/api/script_enginelist.cpp b/src/script/api/script_enginelist.cpp index 9ba725dfd0..e7c38f840b 100644 --- a/src/script/api/script_enginelist.cpp +++ b/src/script/api/script_enginelist.cpp @@ -16,7 +16,9 @@ ScriptEngineList::ScriptEngineList(ScriptVehicle::VehicleType vehicle_type) { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Engine *e : Engine::IterateType((::VehicleType)vehicle_type)) { - if (ScriptCompanyMode::IsDeity() || HasBit(e->company_avail, ScriptObject::GetCompany())) this->AddItem(e->index); + if (is_deity || HasBit(e->company_avail, owner)) this->AddItem(e->index); } } diff --git a/src/script/api/script_grouplist.cpp b/src/script/api/script_grouplist.cpp index 3fb9358e8d..7fa93e8099 100644 --- a/src/script/api/script_grouplist.cpp +++ b/src/script/api/script_grouplist.cpp @@ -17,7 +17,8 @@ ScriptGroupList::ScriptGroupList() { EnforceCompanyModeValid_Void(); + CompanyID owner = ScriptObject::GetCompany(); for (const Group *g : Group::Iterate()) { - if (g->owner == ScriptObject::GetCompany()) this->AddItem(g->index); + if (g->owner == owner) this->AddItem(g->index); } } diff --git a/src/script/api/script_railtypelist.cpp b/src/script/api/script_railtypelist.cpp index 7bf55dca4b..3cdc9b83c6 100644 --- a/src/script/api/script_railtypelist.cpp +++ b/src/script/api/script_railtypelist.cpp @@ -17,7 +17,9 @@ ScriptRailTypeList::ScriptRailTypeList() { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - if (ScriptCompanyMode::IsDeity() || ::HasRailTypeAvail(ScriptObject::GetCompany(), rt)) this->AddItem(rt); + if (is_deity || ::HasRailTypeAvail(owner, rt)) this->AddItem(rt); } } diff --git a/src/script/api/script_roadtypelist.cpp b/src/script/api/script_roadtypelist.cpp index 0bb8df8efc..a290e17b6c 100644 --- a/src/script/api/script_roadtypelist.cpp +++ b/src/script/api/script_roadtypelist.cpp @@ -16,9 +16,10 @@ ScriptRoadTypeList::ScriptRoadTypeList(ScriptRoad::RoadTramTypes rtts) { EnforceDeityOrCompanyModeValid_Void(); + CompanyID owner = ScriptObject::GetCompany(); for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { if (!HasBit(rtts, GetRoadTramType(rt))) continue; - if (::HasRoadTypeAvail(ScriptObject::GetCompany(), rt) && + if (::HasRoadTypeAvail(owner, rt) && !HasBit(GetRoadTypeInfo(rt)->extra_flags, RXTF_NOT_AVAILABLE_AI_GS)) { this->AddItem(rt); } diff --git a/src/script/api/script_stationlist.cpp b/src/script/api/script_stationlist.cpp index ffaff959da..0c644a2002 100644 --- a/src/script/api/script_stationlist.cpp +++ b/src/script/api/script_stationlist.cpp @@ -19,8 +19,10 @@ ScriptStationList::ScriptStationList(ScriptStation::StationType station_type) { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (Station *st : Station::Iterate()) { - if ((st->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && (st->facilities & station_type) != 0) this->AddItem(st->index); + if ((is_deity || st->owner == owner) && (st->facilities & station_type) != 0) this->AddItem(st->index); } } diff --git a/src/script/api/script_vehiclelist.cpp b/src/script/api/script_vehiclelist.cpp index 870ce6a9b6..5a06e81aef 100644 --- a/src/script/api/script_vehiclelist.cpp +++ b/src/script/api/script_vehiclelist.cpp @@ -51,8 +51,10 @@ ScriptVehicleList::ScriptVehicleList(HSQUIRRELVM vm) } AutoRestoreBackup ops_error_threshold_backup(vm->_ops_till_suspend_error_threshold, new_ops_error_threshold); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner != ScriptObject::GetCompany() && !ScriptCompanyMode::IsDeity()) continue; + if (v->owner != owner && !is_deity) continue; if (!v->IsPrimaryVehicle() && !(v->type == VEH_TRAIN && ::Train::From(v)->IsFreeWagon())) continue; if (nparam < 1) { @@ -107,8 +109,10 @@ ScriptVehicleList_Station::ScriptVehicleList_Station(StationID station_id) EnforceDeityOrCompanyModeValid_Void(); if (!ScriptBaseStation::IsValidBaseStation(station_id)) return; + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if ((v->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && v->IsPrimaryVehicle()) { + if ((v->owner == owner || is_deity) && v->IsPrimaryVehicle()) { for (const Order *order : v->Orders()) { if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT)) && order->GetDestination() == station_id) { this->AddItem(v->index); @@ -156,8 +160,10 @@ ScriptVehicleList_Depot::ScriptVehicleList_Depot(TileIndex tile) return; } + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if ((v->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && v->IsPrimaryVehicle() && v->type == type) { + if ((v->owner == owner || is_deity) && v->IsPrimaryVehicle() && v->type == type) { for (const Order *order : v->Orders()) { if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == dest) { this->AddItem(v->index); @@ -182,8 +188,9 @@ ScriptVehicleList_Group::ScriptVehicleList_Group(GroupID group_id) EnforceCompanyModeValid_Void(); if (!ScriptGroup::IsValidGroup((ScriptGroup::GroupID)group_id)) return; + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner == ScriptObject::GetCompany() && v->IsPrimaryVehicle()) { + if (v->owner == owner && v->IsPrimaryVehicle()) { if (v->group_id == group_id) this->AddItem(v->index); } } @@ -194,8 +201,9 @@ ScriptVehicleList_DefaultGroup::ScriptVehicleList_DefaultGroup(ScriptVehicle::Ve EnforceCompanyModeValid_Void(); if (vehicle_type < ScriptVehicle::VT_RAIL || vehicle_type > ScriptVehicle::VT_AIR) return; + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner == ScriptObject::GetCompany() && v->IsPrimaryVehicle()) { + if (v->owner == owner && v->IsPrimaryVehicle()) { if (v->type == (::VehicleType)vehicle_type && v->group_id == ScriptGroup::GROUP_DEFAULT) this->AddItem(v->index); } } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 402706c284..72e8bae6fe 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -96,10 +96,10 @@ static void ShowCustCurrency(); /** Window for displaying the textfile of a BaseSet. */ template struct BaseSetTextfileWindow : public TextfileWindow { - const TBaseSet* baseset; ///< View the textfile of this BaseSet. + const TBaseSet *baseset; ///< View the textfile of this BaseSet. StringID content_type; ///< STR_CONTENT_TYPE_xxx for title. - BaseSetTextfileWindow(TextfileType file_type, const TBaseSet* baseset, StringID content_type) : TextfileWindow(file_type), baseset(baseset), content_type(content_type) + BaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, StringID content_type) : TextfileWindow(file_type), baseset(baseset), content_type(content_type) { const char *textfile = this->baseset->GetTextfile(file_type); this->LoadTextfile(textfile, BASESET_DIR); @@ -121,7 +121,7 @@ struct BaseSetTextfileWindow : public TextfileWindow { * @param content_type STR_CONTENT_TYPE_xxx for title. */ template -void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet* baseset, StringID content_type) +void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, StringID content_type) { CloseWindowById(WC_TEXTFILE, file_type); new BaseSetTextfileWindow(file_type, baseset, content_type); @@ -727,7 +727,7 @@ struct GameOptionsWindow : Window { case WID_GO_BASE_GRF_DROPDOWN: if (_game_mode == GM_MENU) { CloseWindowByClass(WC_GRF_PARAMETERS); - auto* set = BaseGraphics::GetSet(index); + auto set = BaseGraphics::GetSet(index); BaseGraphics::SetSet(set); this->reload = true; this->InvalidateData(); @@ -736,7 +736,7 @@ struct GameOptionsWindow : Window { case WID_GO_BASE_SFX_DROPDOWN: if (_game_mode == GM_MENU) { - auto* set = BaseSounds::GetSet(index); + auto set = BaseSounds::GetSet(index); BaseSounds::ini_set = set->name; BaseSounds::SetSet(set); this->reload = true; @@ -2291,6 +2291,7 @@ static SettingsContainer &GetSettingsTree() limitations->Add(new SettingEntry("construction.crossing_with_competitor")); limitations->Add(new SettingEntry("construction.convert_town_road_no_houses")); limitations->Add(new SettingEntry("vehicle.disable_elrails")); + limitations->Add(new SettingEntry("order.station_length_loading_penalty")); limitations->Add(new SettingEntry("construction.maximum_signal_evaluations")); limitations->Add(new SettingEntry("construction.enable_build_river")); limitations->Add(new SettingEntry("construction.enable_remove_water")); diff --git a/src/settings_type.h b/src/settings_type.h index f6c7017f95..c86ca03f20 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -662,6 +662,7 @@ struct OrderSettings { bool selectgoods; ///< only send the goods to station if a train has been there bool no_servicing_if_no_breakdowns; ///< don't send vehicles to depot when breakdowns are disabled bool serviceathelipad; ///< service helicopters at helipads automatically (no need to send to depot) + bool station_length_loading_penalty; ///< make trains longer than the station load more slowly bool nonstop_only; ///< allow non-stop orders only uint8 old_occupancy_smoothness; ///< moved to company settings: percentage smoothness of occupancy measurement changes diff --git a/src/sl/waypoint_sl.cpp b/src/sl/waypoint_sl.cpp index 4368da9238..3e9c777904 100644 --- a/src/sl/waypoint_sl.cpp +++ b/src/sl/waypoint_sl.cpp @@ -84,7 +84,7 @@ void MoveWaypointsToBaseStations() /* As of version 17, we recalculate the custom graphic ID of waypoints * from the GRF ID / station index. */ for (OldWaypoint &wp : _old_waypoints) { - StationClass* stclass = StationClass::Get(STAT_CLASS_WAYP); + StationClass *stclass = StationClass::Get(STAT_CLASS_WAYP); for (uint i = 0; i < stclass->GetSpecCount(); i++) { const StationSpec *statspec = stclass->GetSpec(i); if (statspec != nullptr && statspec->grf_prop.grffile->grfid == wp.grfid && statspec->grf_prop.local_id == wp.localidx) { diff --git a/src/sortlist_type.h b/src/sortlist_type.h index 1fa5d806a8..4ebc077ad7 100644 --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -98,7 +98,7 @@ public: /* If sort parameters are used then we require a reference to the params. */ template >* = nullptr> - GUIList(const P& params) : + GUIList(const P ¶ms) : sort_func_list(nullptr), filter_func_list(nullptr), flags(VL_NONE), diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp index 3ef30bc461..0984e4f016 100644 --- a/src/sound/xaudio2_s.cpp +++ b/src/sound/xaudio2_s.cpp @@ -36,7 +36,7 @@ using Microsoft::WRL::ComPtr; #include "../safeguards.h" // Definition of the "XAudio2Create" call used to initialise XAudio2 -typedef HRESULT(__stdcall *API_XAudio2Create)(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags, XAUDIO2_PROCESSOR XAudio2Processor); +typedef HRESULT(__stdcall *API_XAudio2Create)(_Outptr_ IXAudio2 **ppXAudio2, UINT32 Flags, XAUDIO2_PROCESSOR XAudio2Processor); static FSoundDriver_XAudio2 iFSoundDriver_XAudio2; @@ -51,7 +51,7 @@ private: char *buffer; public: - IXAudio2SourceVoice* SourceVoice; + IXAudio2SourceVoice *SourceVoice; StreamingVoiceContext(int bufferLength) { @@ -112,10 +112,10 @@ public: }; static HMODULE _xaudio_dll_handle; -static IXAudio2SourceVoice* _source_voice = nullptr; -static IXAudio2MasteringVoice* _mastering_voice = nullptr; +static IXAudio2SourceVoice *_source_voice = nullptr; +static IXAudio2MasteringVoice *_mastering_voice = nullptr; static ComPtr _xaudio2; -static StreamingVoiceContext* _voice_context = nullptr; +static StreamingVoiceContext *_voice_context = nullptr; /** Create XAudio2 context with SEH exception checking. */ static HRESULT CreateXAudio(API_XAudio2Create xAudio2Create) diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 81185ef7f7..0cc8fea4d4 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -537,7 +537,7 @@ protected: * Internal event handler for when a page element is clicked. * @param pe The clicked page element. */ - void OnPageElementClick(const StoryPageElement& pe) + void OnPageElementClick(const StoryPageElement &pe) { switch (pe.type) { case SPET_TEXT: diff --git a/src/strings.cpp b/src/strings.cpp index 488ef7dcfa..ca6406c36e 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -83,15 +83,13 @@ StringParameter *StringParameters::GetNextParameterPointer() { assert(this->next_type == 0 || (SCC_CONTROL_START <= this->next_type && this->next_type <= SCC_CONTROL_END)); if (this->offset >= this->parameters.size()) { - DEBUG(misc, 0, "Trying to read invalid string parameter"); - return nullptr; + throw std::out_of_range("Trying to read invalid string parameter"); } auto ¶m = this->parameters[this->offset++]; if (param.type != 0 && param.type != this->next_type) { - DEBUG(misc, 0, "Trying to read string parameter with wrong type"); this->next_type = 0; - return nullptr; + throw std::out_of_range("Trying to read string parameter with wrong type"); } param.type = this->next_type; this->next_type = 0; @@ -1101,908 +1099,912 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters &arg str_stack.push(str_arg); for (;;) { - while (!str_stack.empty() && (b = Utf8Consume(&str_stack.top())) == '\0') { - str_stack.pop(); - } - if (str_stack.empty()) break; - const char *&str = str_stack.top(); - - if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) { - /* We need to pass some stuff as it might be modified. */ - StringParameters remaining = args.GetRemainingParameters(); - b = RemapNewGRFStringControlCode(b, buf_start, &buff, &str, remaining, dry_run); - if (b == 0) continue; - } - - if (b < SCC_CONTROL_START || b > SCC_CONTROL_END) { - if (buff + Utf8CharLen(b) < last) buff += Utf8Encode(buff, b); - continue; - } + try { + while (!str_stack.empty() && (b = Utf8Consume(&str_stack.top())) == '\0') { + str_stack.pop(); + } + if (str_stack.empty()) break; + const char *&str = str_stack.top(); + + if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) { + /* We need to pass some stuff as it might be modified. */ + StringParameters remaining = args.GetRemainingParameters(); + b = RemapNewGRFStringControlCode(b, buf_start, &buff, &str, remaining, dry_run); + if (b == 0) continue; + } - args.SetTypeOfNextParameter(b); - switch (b) { - case SCC_ENCODED: { - ArrayStringParameters<20> sub_args; + if (b < SCC_CONTROL_START || b > SCC_CONTROL_END) { + if (buff + Utf8CharLen(b) < last) buff += Utf8Encode(buff, b); + continue; + } - char *p; - uint32 stringid = std::strtoul(str, &p, 16); - if (*p != ':' && *p != '\0') { - while (*p != '\0') p++; - str = p; - buff = strecpy(buff, "(invalid SCC_ENCODED)", last); - break; - } - if (stringid >= TAB_SIZE_GAMESCRIPT) { - while (*p != '\0') p++; - str = p; - buff = strecpy(buff, "(invalid StringID)", last); - break; - } + args.SetTypeOfNextParameter(b); + switch (b) { + case SCC_ENCODED: { + ArrayStringParameters<20> sub_args; + + char *p; + uint32 stringid = std::strtoul(str, &p, 16); + if (*p != ':' && *p != '\0') { + while (*p != '\0') p++; + str = p; + buff = strecpy(buff, "(invalid SCC_ENCODED)", last); + break; + } + if (stringid >= TAB_SIZE_GAMESCRIPT) { + while (*p != '\0') p++; + str = p; + buff = strecpy(buff, "(invalid StringID)", last); + break; + } - int i = 0; - while (*p != '\0' && i < 20) { - uint64 param; - const char *s = ++p; - - /* Find the next value */ - bool instring = false; - bool escape = false; - for (;; p++) { - if (*p == '\\') { - escape = true; - continue; - } - if (*p == '"' && escape) { + int i = 0; + while (*p != '\0' && i < 20) { + uint64 param; + const char *s = ++p; + + /* Find the next value */ + bool instring = false; + bool escape = false; + for (;; p++) { + if (*p == '\\') { + escape = true; + continue; + } + if (*p == '"' && escape) { + escape = false; + continue; + } escape = false; - continue; - } - escape = false; - if (*p == '"') { - instring = !instring; - continue; - } - if (instring) { - continue; - } + if (*p == '"') { + instring = !instring; + continue; + } + if (instring) { + continue; + } - if (*p == ':') break; - if (*p == '\0') break; - } + if (*p == ':') break; + if (*p == '\0') break; + } - if (*s != '"') { - /* Check if we want to look up another string */ - WChar l; - size_t len = Utf8Decode(&l, s); - bool lookup = (l == SCC_ENCODED); - if (lookup) s += len; - - param = std::strtoull(s, &p, 16); - - if (lookup) { - if (param >= TAB_SIZE_GAMESCRIPT) { - while (*p != '\0') p++; - str = p; - buff = strecpy(buff, "(invalid sub-StringID)", last); - break; + if (*s != '"') { + /* Check if we want to look up another string */ + WChar l; + size_t len = Utf8Decode(&l, s); + bool lookup = (l == SCC_ENCODED); + if (lookup) s += len; + + param = std::strtoull(s, &p, 16); + + if (lookup) { + if (param >= TAB_SIZE_GAMESCRIPT) { + while (*p != '\0') p++; + str = p; + buff = strecpy(buff, "(invalid sub-StringID)", last); + break; + } + param = MakeStringID(TEXT_TAB_GAMESCRIPT_START, param); } - param = MakeStringID(TEXT_TAB_GAMESCRIPT_START, param); - } - sub_args.SetParam(i++, param); - } else { - s++; // skip the leading \" - sub_args.SetParam(i++, std::string(s, p - s - 1)); // also skip the trailing \". + sub_args.SetParam(i++, param); + } else { + s++; // skip the leading \" + sub_args.SetParam(i++, std::string(s, p - s - 1)); // also skip the trailing \". + } } + /* If we didn't error out, we can actually print the string. */ + if (*str != '\0') { + str = p; + buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), sub_args, last, true); + } + break; } - /* If we didn't error out, we can actually print the string. */ - if (*str != '\0') { - str = p; - buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), sub_args, last, true); - } - break; - } - case SCC_NEWGRF_STRINL: { - StringID substr = Utf8Consume(&str); - str_stack.push(GetStringPtr(substr)); - break; - } + case SCC_NEWGRF_STRINL: { + StringID substr = Utf8Consume(&str); + str_stack.push(GetStringPtr(substr)); + break; + } - case SCC_NEWGRF_PRINT_WORD_STRING_ID: { - StringID substr = args.GetNextParameter(); - str_stack.push(GetStringPtr(substr)); - case_index = next_substr_case_index; - next_substr_case_index = 0; - break; - } + case SCC_NEWGRF_PRINT_WORD_STRING_ID: { + StringID substr = args.GetNextParameter(); + str_stack.push(GetStringPtr(substr)); + case_index = next_substr_case_index; + next_substr_case_index = 0; + break; + } - case SCC_GENDER_LIST: { // {G 0 Der Die Das} - /* First read the meta data from the language file. */ - size_t offset = orig_offset + (byte)*str++; - int gender = 0; - if (!dry_run && args.GetTypeAtOffset(offset) != 0) { - /* Now we need to figure out what text to resolve, i.e. - * what do we need to draw? So get the actual raw string - * first using the control code to get said string. */ - char input[4 + 1]; - char *p = input + Utf8Encode(input, args.GetTypeAtOffset(offset)); - *p = '\0'; - - /* Now do the string formatting. */ - char buf[256]; - bool old_sgd = _scan_for_gender_data; - _scan_for_gender_data = true; - StringParameters tmp_params = args.GetRemainingParameters(offset); - p = FormatString(buf, input, tmp_params, lastof(buf)); - _scan_for_gender_data = old_sgd; - *p = '\0'; - - /* And determine the string. */ - const char *s = buf; - WChar c = Utf8Consume(&s); - /* Does this string have a gender, if so, set it */ - if (c == SCC_GENDER_INDEX) gender = (byte)s[0]; + case SCC_GENDER_LIST: { // {G 0 Der Die Das} + /* First read the meta data from the language file. */ + size_t offset = orig_offset + (byte)*str++; + int gender = 0; + if (!dry_run && args.GetTypeAtOffset(offset) != 0) { + /* Now we need to figure out what text to resolve, i.e. + * what do we need to draw? So get the actual raw string + * first using the control code to get said string. */ + char input[4 + 1]; + char *p = input + Utf8Encode(input, args.GetTypeAtOffset(offset)); + *p = '\0'; + + /* Now do the string formatting. */ + char buf[256]; + bool old_sgd = _scan_for_gender_data; + _scan_for_gender_data = true; + StringParameters tmp_params = args.GetRemainingParameters(offset); + p = FormatString(buf, input, tmp_params, lastof(buf)); + _scan_for_gender_data = old_sgd; + *p = '\0'; + + /* And determine the string. */ + const char *s = buf; + WChar c = Utf8Consume(&s); + /* Does this string have a gender, if so, set it */ + if (c == SCC_GENDER_INDEX) gender = (byte)s[0]; + } + str = ParseStringChoice(str, gender, &buff, last); + break; } - str = ParseStringChoice(str, gender, &buff, last); - break; - } - /* This sets up the gender for the string. - * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */ - case SCC_GENDER_INDEX: // {GENDER 0} - if (_scan_for_gender_data) { - buff += Utf8Encode(buff, SCC_GENDER_INDEX); - *buff++ = *str++; - } else { - str++; + /* This sets up the gender for the string. + * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */ + case SCC_GENDER_INDEX: // {GENDER 0} + if (_scan_for_gender_data) { + buff += Utf8Encode(buff, SCC_GENDER_INDEX); + *buff++ = *str++; + } else { + str++; + } + break; + + case SCC_PLURAL_LIST: { // {P} + int plural_form = *str++; // contains the plural form for this string + size_t offset = orig_offset + (byte)*str++; + int64 v = args.GetParam(offset); // contains the number that determines plural + str = ParseStringChoice(str, DeterminePluralForm(v, plural_form), &buff, last); + break; } - break; - - case SCC_PLURAL_LIST: { // {P} - int plural_form = *str++; // contains the plural form for this string - size_t offset = orig_offset + (byte)*str++; - int64 v = args.GetParam(offset); // contains the number that determines plural - str = ParseStringChoice(str, DeterminePluralForm(v, plural_form), &buff, last); - break; - } - case SCC_ARG_INDEX: { // Move argument pointer - args.SetOffset(orig_offset + (byte)*str++); - break; - } + case SCC_ARG_INDEX: { // Move argument pointer + args.SetOffset(orig_offset + (byte)*str++); + break; + } - case SCC_SET_CASE: { // {SET_CASE} - /* This is a pseudo command, it's outputted when someone does {STRING.ack} - * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */ - next_substr_case_index = (byte)*str++; - break; - } + case SCC_SET_CASE: { // {SET_CASE} + /* This is a pseudo command, it's outputted when someone does {STRING.ack} + * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */ + next_substr_case_index = (byte)*str++; + break; + } - case SCC_SWITCH_CASE: { // {Used to implement case switching} - /* <0x9E> - * Each LEN is printed using 2 bytes in big endian order. */ - uint num = (byte)*str++; - while (num) { - if ((byte)str[0] == case_index) { - /* Found the case, adjust str pointer and continue */ - str += 3; - break; + case SCC_SWITCH_CASE: { // {Used to implement case switching} + /* <0x9E> + * Each LEN is printed using 2 bytes in big endian order. */ + uint num = (byte)*str++; + while (num) { + if ((byte)str[0] == case_index) { + /* Found the case, adjust str pointer and continue */ + str += 3; + break; + } + /* Otherwise skip to the next case */ + str += 3 + (str[1] << 8) + str[2]; + num--; } - /* Otherwise skip to the next case */ - str += 3 + (str[1] << 8) + str[2]; - num--; + break; } - break; - } - case SCC_REVISION: // {REV} - buff = strecpy(buff, _openttd_revision, last); - break; + case SCC_REVISION: // {REV} + buff = strecpy(buff, _openttd_revision, last); + break; - case SCC_RAW_STRING_POINTER: { // {RAW_STRING} - const char *raw_string = args.GetNextParameterString(); - /* raw_string can be(come) nullptr when the parameter is out of range and 0 is returned instead. */ - if (raw_string == nullptr) { - buff = strecpy(buff, "(invalid RAW_STRING parameter)", last); + case SCC_RAW_STRING_POINTER: { // {RAW_STRING} + const char *raw_string = args.GetNextParameterString(); + /* raw_string can be nullptr. */ + if (raw_string == nullptr) { + buff = strecpy(buff, "(invalid RAW_STRING parameter)", last); + break; + } + buff = FormatString(buff, raw_string, args, last); break; } - buff = FormatString(buff, raw_string, args, last); - break; - } - case SCC_STRING: {// {STRING} - StringID string_id = args.GetNextParameter(); - if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; - /* WARNING. It's prohibited for the included string to consume any arguments. - * For included strings that consume argument, you should use STRING1, STRING2 etc. - * To debug stuff you can set argv to nullptr and it will tell you */ - StringParameters tmp_params(args, 0); - buff = GetStringWithArgs(buff, string_id, tmp_params, last, next_substr_case_index, game_script); - next_substr_case_index = 0; - break; - } + case SCC_STRING: {// {STRING} + StringID string_id = args.GetNextParameter(); + if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; + /* It's prohibited for the included string to consume any arguments. */ + StringParameters tmp_params(args, game_script ? args.GetDataLeft() : 0); + buff = GetStringWithArgs(buff, string_id, tmp_params, last, next_substr_case_index, game_script); + next_substr_case_index = 0; + break; + } - case SCC_STRING1: - case SCC_STRING2: - case SCC_STRING3: - case SCC_STRING4: - case SCC_STRING5: - case SCC_STRING6: - case SCC_STRING7: - case SCC_STRING8: { // {STRING1..8} - /* Strings that consume arguments */ - StringID string_id = args.GetNextParameter(); - if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; - uint size = b - SCC_STRING1 + 1; - if (size > args.GetDataLeft()) { - buff = strecpy(buff, "(too many parameters)", last); - } else { - StringParameters sub_args(args, size); - buff = GetStringWithArgs(buff, string_id, sub_args, last, next_substr_case_index, game_script); + case SCC_STRING1: + case SCC_STRING2: + case SCC_STRING3: + case SCC_STRING4: + case SCC_STRING5: + case SCC_STRING6: + case SCC_STRING7: + case SCC_STRING8: { // {STRING1..8} + /* Strings that consume arguments */ + StringID string_id = args.GetNextParameter(); + if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; + uint size = b - SCC_STRING1 + 1; + if (size > args.GetDataLeft()) { + buff = strecpy(buff, "(too many parameters)", last); + } else { + StringParameters sub_args(args, game_script ? args.GetDataLeft() : size); + buff = GetStringWithArgs(buff, string_id, sub_args, last, next_substr_case_index, game_script); + args.AdvanceOffset(size); + } + next_substr_case_index = 0; + break; } - next_substr_case_index = 0; - break; - } - case SCC_COMMA: // {COMMA} - buff = FormatCommaNumber(buff, args.GetNextParameter(), last); - break; + case SCC_COMMA: // {COMMA} + buff = FormatCommaNumber(buff, args.GetNextParameter(), last); + break; - case SCC_DECIMAL: {// {DECIMAL} - int64 number = args.GetNextParameter(); - int digits = args.GetNextParameter(); - buff = FormatCommaNumber(buff, number, last, digits); - break; - } + case SCC_DECIMAL: {// {DECIMAL} + int64 number = args.GetNextParameter(); + int digits = args.GetNextParameter(); + buff = FormatCommaNumber(buff, number, last, digits); + break; + } - case SCC_DECIMAL1: {// {DECIMAL1} - int64 number = args.GetNextParameter(); - buff = FormatCommaNumber(buff, number, last, 1); - break; - } + case SCC_DECIMAL1: {// {DECIMAL1} + int64 number = args.GetNextParameter(); + buff = FormatCommaNumber(buff, number, last, 1); + break; + } - case SCC_NUM: // {NUM} - buff = FormatNoCommaNumber(buff, args.GetNextParameter(), last); - break; + case SCC_NUM: // {NUM} + buff = FormatNoCommaNumber(buff, args.GetNextParameter(), last); + break; - case SCC_PLUS_NUM: { // {PLUS_NUM} - int64 num = args.GetNextParameter(); - if (num > 0) { - buff += seprintf(buff, last, "+"); + case SCC_PLUS_NUM: { // {PLUS_NUM} + int64 num = args.GetNextParameter(); + if (num > 0) { + buff += seprintf(buff, last, "+"); + } + buff = FormatNoCommaNumber(buff, num, last); + break; } - buff = FormatNoCommaNumber(buff, num, last); - break; - } - case SCC_ZEROFILL_NUM: { // {ZEROFILL_NUM} - int64 num = args.GetNextParameter(); - buff = FormatZerofillNumber(buff, num, args.GetNextParameter(), last); - break; - } + case SCC_ZEROFILL_NUM: { // {ZEROFILL_NUM} + int64 num = args.GetNextParameter(); + buff = FormatZerofillNumber(buff, num, args.GetNextParameter(), last); + break; + } - case SCC_HEX: // {HEX} - buff = FormatHexNumber(buff, args.GetNextParameter(), last); - break; - - case SCC_BYTES: // {BYTES} - buff = FormatBytes(buff, args.GetNextParameter(), last); - break; - - case SCC_CARGO_TINY: { // {CARGO_TINY} - /* Tiny description of cargotypes. Layout: - * param 1: cargo type - * param 2: cargo count */ - CargoID cargo = args.GetNextParameter(); - if (cargo >= CargoSpec::GetArraySize()) break; - - StringID cargo_str = CargoSpec::Get(cargo)->units_volume; - int64 amount = 0; - switch (cargo_str) { - case STR_TONS: - amount = _units_weight[_settings_game.locale.units_weight].c.ToDisplay(args.GetNextParameter()); - break; + case SCC_HEX: // {HEX} + buff = FormatHexNumber(buff, args.GetNextParameter(), last); + break; - case STR_LITERS: - amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); - break; + case SCC_BYTES: // {BYTES} + buff = FormatBytes(buff, args.GetNextParameter(), last); + break; - default: { - amount = args.GetNextParameter(); - break; + case SCC_CARGO_TINY: { // {CARGO_TINY} + /* Tiny description of cargotypes. Layout: + * param 1: cargo type + * param 2: cargo count */ + CargoID cargo = args.GetNextParameter(); + if (cargo >= CargoSpec::GetArraySize()) break; + + StringID cargo_str = CargoSpec::Get(cargo)->units_volume; + int64 amount = 0; + switch (cargo_str) { + case STR_TONS: + amount = _units_weight[_settings_game.locale.units_weight].c.ToDisplay(args.GetNextParameter()); + break; + + case STR_LITERS: + amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); + break; + + default: { + amount = args.GetNextParameter(); + break; + } } - } - buff = FormatCommaNumber(buff, amount, last); - break; - } + buff = FormatCommaNumber(buff, amount, last); + break; + } - case SCC_CARGO_SHORT: { // {CARGO_SHORT} - /* Short description of cargotypes. Layout: - * param 1: cargo type - * param 2: cargo count */ - CargoID cargo = args.GetNextParameter(); - if (cargo >= CargoSpec::GetArraySize()) break; - - StringID cargo_str = CargoSpec::Get(cargo)->units_volume; - switch (cargo_str) { - case STR_TONS: { - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); - break; - } + case SCC_CARGO_SHORT: { // {CARGO_SHORT} + /* Short description of cargotypes. Layout: + * param 1: cargo type + * param 2: cargo count */ + CargoID cargo = args.GetNextParameter(); + if (cargo >= CargoSpec::GetArraySize()) break; + + StringID cargo_str = CargoSpec::Get(cargo)->units_volume; + switch (cargo_str) { + case STR_TONS: { + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); + break; + } - case STR_LITERS: { - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); - break; - } + case STR_LITERS: { + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); + break; + } - default: { - auto tmp_params = MakeParameters(args.GetNextParameter()); - buff = GetStringWithArgs(buff, cargo_str, tmp_params, last); - break; + default: { + auto tmp_params = MakeParameters(args.GetNextParameter()); + buff = GetStringWithArgs(buff, cargo_str, tmp_params, last); + break; + } } + break; } - break; - } - case SCC_CARGO_LONG: { // {CARGO_LONG} - /* First parameter is cargo type, second parameter is cargo count */ - CargoID cargo = args.GetNextParameter(); - if (cargo != CT_INVALID && cargo >= CargoSpec::GetArraySize()) break; + case SCC_CARGO_LONG: { // {CARGO_LONG} + /* First parameter is cargo type, second parameter is cargo count */ + CargoID cargo = args.GetNextParameter(); + if (cargo != CT_INVALID && cargo >= CargoSpec::GetArraySize()) break; - StringID cargo_str = (cargo == CT_INVALID) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; - auto tmp_args = MakeParameters(args.GetNextParameter()); - buff = GetStringWithArgs(buff, cargo_str, tmp_args, last); - break; - } + StringID cargo_str = (cargo == CT_INVALID) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; + auto tmp_args = MakeParameters(args.GetNextParameter()); + buff = GetStringWithArgs(buff, cargo_str, tmp_args, last); + break; + } - case SCC_CARGO_LIST: { // {CARGO_LIST} - CargoTypes cmask = args.GetNextParameter(); - bool first = true; + case SCC_CARGO_LIST: { // {CARGO_LIST} + CargoTypes cmask = args.GetNextParameter(); + bool first = true; - for (const auto &cs : _sorted_cargo_specs) { - if (!HasBit(cmask, cs->Index())) continue; + for (const auto &cs : _sorted_cargo_specs) { + if (!HasBit(cmask, cs->Index())) continue; - if (buff >= last - 2) break; // ',' and ' ' + if (buff >= last - 2) break; // ',' and ' ' - if (first) { - first = false; - } else { - /* Add a comma if this is not the first item */ - *buff++ = ','; - *buff++ = ' '; + if (first) { + first = false; + } else { + /* Add a comma if this is not the first item */ + *buff++ = ','; + *buff++ = ' '; + } + + buff = GetStringWithArgs(buff, cs->name, args, last, next_substr_case_index, game_script); } - buff = GetStringWithArgs(buff, cs->name, args, last, next_substr_case_index, game_script); + /* If first is still true then no cargo is accepted */ + if (first) buff = GetStringWithArgs(buff, STR_JUST_NOTHING, args, last, next_substr_case_index, game_script); + + *buff = '\0'; + next_substr_case_index = 0; + + /* Make sure we detect any buffer overflow */ + assert(buff < last); + break; } - /* If first is still true then no cargo is accepted */ - if (first) buff = GetStringWithArgs(buff, STR_JUST_NOTHING, args, last, next_substr_case_index, game_script); + case SCC_CURRENCY_SHORT: // {CURRENCY_SHORT} + buff = FormatGenericCurrency(buff, _currency, args.GetNextParameter(), true, last); + break; - *buff = '\0'; - next_substr_case_index = 0; + case SCC_CURRENCY_LONG: // {CURRENCY_LONG} + buff = FormatGenericCurrency(buff, _currency, args.GetNextParameter(), false, last); + break; - /* Make sure we detect any buffer overflow */ - assert(buff < last); - break; - } + case SCC_DATE_TINY: // {DATE_TINY} + buff = FormatTinyOrISODate(buff, args.GetNextParameter(), STR_FORMAT_DATE_TINY, last); + break; - case SCC_CURRENCY_SHORT: // {CURRENCY_SHORT} - buff = FormatGenericCurrency(buff, _currency, args.GetNextParameter(), true, last); - break; - - case SCC_CURRENCY_LONG: // {CURRENCY_LONG} - buff = FormatGenericCurrency(buff, _currency, args.GetNextParameter(), false, last); - break; - - case SCC_DATE_TINY: // {DATE_TINY} - buff = FormatTinyOrISODate(buff, args.GetNextParameter(), STR_FORMAT_DATE_TINY, last); - break; - - case SCC_DATE_SHORT: // {DATE_SHORT} - buff = FormatMonthAndYear(buff, args.GetNextParameter(), last, next_substr_case_index); - next_substr_case_index = 0; - break; - - case SCC_DATE_LONG: // {DATE_LONG} - buff = FormatYmdString(buff, args.GetNextParameter(), last, next_substr_case_index); - next_substr_case_index = 0; - break; - - case SCC_DATE_WALLCLOCK_LONG: { // {DATE_WALLCLOCK_LONG} - if (_settings_time.time_in_minutes) { - buff = FormatWallClockString(buff, args.GetNextParameter(), last, _settings_client.gui.date_with_time, next_substr_case_index); - } else { - buff = FormatYmdString(buff, ScaledDateTicksToDate(args.GetNextParameter()), last, next_substr_case_index); - } - break; - } + case SCC_DATE_SHORT: // {DATE_SHORT} + buff = FormatMonthAndYear(buff, args.GetNextParameter(), last, next_substr_case_index); + next_substr_case_index = 0; + break; - case SCC_DATE_WALLCLOCK_SHORT: { // {DATE_WALLCLOCK_SHORT} - if (_settings_time.time_in_minutes) { - buff = FormatWallClockString(buff, args.GetNextParameter(), last, _settings_client.gui.date_with_time, next_substr_case_index); - } else { - buff = FormatYmdString(buff, ScaledDateTicksToDate(args.GetNextParameter()), last, next_substr_case_index); - } - break; - } + case SCC_DATE_LONG: // {DATE_LONG} + buff = FormatYmdString(buff, args.GetNextParameter(), last, next_substr_case_index); + next_substr_case_index = 0; + break; - case SCC_DATE_WALLCLOCK_TINY: { // {DATE_WALLCLOCK_TINY} - if (_settings_time.time_in_minutes) { - buff = FormatWallClockString(buff, args.GetNextParameter(), last, false, next_substr_case_index); - } else { - buff = FormatTinyOrISODate(buff, ScaledDateTicksToDate(args.GetNextParameter()), STR_FORMAT_DATE_TINY, last); + case SCC_DATE_WALLCLOCK_LONG: { // {DATE_WALLCLOCK_LONG} + if (_settings_time.time_in_minutes) { + buff = FormatWallClockString(buff, args.GetNextParameter(), last, _settings_client.gui.date_with_time, next_substr_case_index); + } else { + buff = FormatYmdString(buff, ScaledDateTicksToDate(args.GetNextParameter()), last, next_substr_case_index); + } + break; } - break; - } - case SCC_DATE_WALLCLOCK_ISO: { // {DATE_WALLCLOCK_ISO} - if (_settings_time.time_in_minutes) { - buff = FormatWallClockString(buff, args.GetNextParameter(), last, false, next_substr_case_index); - } else { - buff = FormatTinyOrISODate(buff, ScaledDateTicksToDate(args.GetNextParameter()), STR_FORMAT_DATE_ISO, last); + case SCC_DATE_WALLCLOCK_SHORT: { // {DATE_WALLCLOCK_SHORT} + if (_settings_time.time_in_minutes) { + buff = FormatWallClockString(buff, args.GetNextParameter(), last, _settings_client.gui.date_with_time, next_substr_case_index); + } else { + buff = FormatYmdString(buff, ScaledDateTicksToDate(args.GetNextParameter()), last, next_substr_case_index); + } + break; } - break; - } - case SCC_DATE_ISO: // {DATE_ISO} - buff = FormatTinyOrISODate(buff, args.GetNextParameter(), STR_FORMAT_DATE_ISO, last); - break; - - case SCC_TIME_HHMM: // {TIME_HHMM} - buff = FormatTimeHHMMString(buff, args.GetNextParameter(), last, next_substr_case_index); - break; - - case SCC_TT_TICKS: // {TT_TICKS} - case SCC_TT_TICKS_LONG: // {TT_TICKS_LONG} - if (_settings_client.gui.timetable_in_ticks) { - auto tmp_params = MakeParameters(args.GetNextParameter()); - buff = FormatString(buff, GetStringPtr(STR_UNITS_TICKS), tmp_params, last); - } else { - StringID str = _settings_time.time_in_minutes ? STR_TIMETABLE_MINUTES : STR_UNITS_DAYS; - int64 ticks = args.GetNextParameter(); - int64 ratio = DATE_UNIT_SIZE; - int64 units = ticks / ratio; - int64 leftover = _settings_client.gui.timetable_leftover_ticks ? ticks % ratio : 0; - auto tmp_params = MakeParameters(units); - buff = FormatString(buff, GetStringPtr(str), tmp_params, last); - if (b == SCC_TT_TICKS_LONG && _settings_time.time_in_minutes && units > 59) { - int64 hours = units / 60; - int64 minutes = units % 60; - auto tmp_params = MakeParameters( - (minutes != 0) ? STR_TIMETABLE_HOURS_MINUTES : STR_TIMETABLE_HOURS, - hours, - minutes - ); - buff = FormatString(buff, GetStringPtr(STR_TIMETABLE_MINUTES_SUFFIX), tmp_params, last); + case SCC_DATE_WALLCLOCK_TINY: { // {DATE_WALLCLOCK_TINY} + if (_settings_time.time_in_minutes) { + buff = FormatWallClockString(buff, args.GetNextParameter(), last, false, next_substr_case_index); + } else { + buff = FormatTinyOrISODate(buff, ScaledDateTicksToDate(args.GetNextParameter()), STR_FORMAT_DATE_TINY, last); } - if (leftover != 0) { - auto tmp_params = MakeParameters(leftover); - buff = FormatString(buff, GetStringPtr(STR_TIMETABLE_LEFTOVER_TICKS), tmp_params, last); + break; + } + + case SCC_DATE_WALLCLOCK_ISO: { // {DATE_WALLCLOCK_ISO} + if (_settings_time.time_in_minutes) { + buff = FormatWallClockString(buff, args.GetNextParameter(), last, false, next_substr_case_index); + } else { + buff = FormatTinyOrISODate(buff, ScaledDateTicksToDate(args.GetNextParameter()), STR_FORMAT_DATE_ISO, last); } + break; } - break; - - case SCC_FORCE: { // {FORCE} - assert(_settings_game.locale.units_force < lengthof(_units_force)); - const auto &x = _units_force[_settings_game.locale.units_force]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } - case SCC_HEIGHT: { // {HEIGHT} - assert(_settings_game.locale.units_height < lengthof(_units_height)); - const auto &x = _units_height[_settings_game.locale.units_height]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_DATE_ISO: // {DATE_ISO} + buff = FormatTinyOrISODate(buff, args.GetNextParameter(), STR_FORMAT_DATE_ISO, last); + break; - case SCC_POWER: { // {POWER} - assert(_settings_game.locale.units_power < lengthof(_units_power)); - const auto &x = _units_power[_settings_game.locale.units_power]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_TIME_HHMM: // {TIME_HHMM} + buff = FormatTimeHHMMString(buff, args.GetNextParameter(), last, next_substr_case_index); + break; - case SCC_POWER_TO_WEIGHT: { // {POWER_TO_WEIGHT} - auto setting = _settings_game.locale.units_power * 3u + _settings_game.locale.units_weight; - assert(setting < lengthof(_units_power_to_weight)); - const auto &x = _units_power_to_weight[setting]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_TT_TICKS: // {TT_TICKS} + case SCC_TT_TICKS_LONG: // {TT_TICKS_LONG} + if (_settings_client.gui.timetable_in_ticks) { + auto tmp_params = MakeParameters(args.GetNextParameter()); + buff = FormatString(buff, GetStringPtr(STR_UNITS_TICKS), tmp_params, last); + } else { + StringID str = _settings_time.time_in_minutes ? STR_TIMETABLE_MINUTES : STR_UNITS_DAYS; + int64 ticks = args.GetNextParameter(); + int64 ratio = DATE_UNIT_SIZE; + int64 units = ticks / ratio; + int64 leftover = _settings_client.gui.timetable_leftover_ticks ? ticks % ratio : 0; + auto tmp_params = MakeParameters(units); + buff = FormatString(buff, GetStringPtr(str), tmp_params, last); + if (b == SCC_TT_TICKS_LONG && _settings_time.time_in_minutes && units > 59) { + int64 hours = units / 60; + int64 minutes = units % 60; + auto tmp_params = MakeParameters( + (minutes != 0) ? STR_TIMETABLE_HOURS_MINUTES : STR_TIMETABLE_HOURS, + hours, + minutes + ); + buff = FormatString(buff, GetStringPtr(STR_TIMETABLE_MINUTES_SUFFIX), tmp_params, last); + } + if (leftover != 0) { + auto tmp_params = MakeParameters(leftover); + buff = FormatString(buff, GetStringPtr(STR_TIMETABLE_LEFTOVER_TICKS), tmp_params, last); + } + } + break; - case SCC_VELOCITY: { // {VELOCITY} - int64 arg = args.GetNextParameter(); - // Unpack vehicle type from packed argument to get desired units. - VehicleType vt = static_cast(GB(arg, 56, 8)); - byte units = GetVelocityUnits(vt); - assert(units < lengthof(_units_velocity)); - const auto &x = _units_velocity[units]; - auto tmp_params = MakeParameters(ConvertKmhishSpeedToDisplaySpeed(GB(arg, 0, 56), vt), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_FORCE: { // {FORCE} + assert(_settings_game.locale.units_force < lengthof(_units_force)); + const auto &x = _units_force[_settings_game.locale.units_force]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - case SCC_VOLUME_SHORT: { // {VOLUME_SHORT} - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_HEIGHT: { // {HEIGHT} + assert(_settings_game.locale.units_height < lengthof(_units_height)); + const auto &x = _units_height[_settings_game.locale.units_height]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - case SCC_VOLUME_LONG: { // {VOLUME_LONG} - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); - break; - } + case SCC_POWER: { // {POWER} + assert(_settings_game.locale.units_power < lengthof(_units_power)); + const auto &x = _units_power[_settings_game.locale.units_power]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - case SCC_WEIGHT_SHORT: { // {WEIGHT_SHORT} - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); - break; - } + case SCC_POWER_TO_WEIGHT: { // {POWER_TO_WEIGHT} + auto setting = _settings_game.locale.units_power * 3u + _settings_game.locale.units_weight; + assert(setting < lengthof(_units_power_to_weight)); + const auto &x = _units_power_to_weight[setting]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - case SCC_WEIGHT_LONG: { // {WEIGHT_LONG} - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); - break; - } + case SCC_VELOCITY: { // {VELOCITY} + int64 arg = args.GetNextParameter(); + // Unpack vehicle type from packed argument to get desired units. + VehicleType vt = static_cast(GB(arg, 56, 8)); + byte units = GetVelocityUnits(vt); + assert(units < lengthof(_units_velocity)); + const auto &x = _units_velocity[units]; + auto tmp_params = MakeParameters(ConvertKmhishSpeedToDisplaySpeed(GB(arg, 0, 56), vt), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - case SCC_POWER_WEIGHT_RATIO: { // {POWER_WEIGHT_RATIO} - assert(_settings_game.locale.units_power < lengthof(_units_power)); - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + case SCC_VOLUME_SHORT: { // {VOLUME_SHORT} + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - buff = FormatUnitWeightRatio(buff, last, _units_power[_settings_game.locale.units_power], args.GetNextParameter()); - break; - } + case SCC_VOLUME_LONG: { // {VOLUME_LONG} + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); + break; + } - case SCC_FORCE_WEIGHT_RATIO: { // {FORCE_WEIGHT_RATIO} - assert(_settings_game.locale.units_force < lengthof(_units_force)); - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + case SCC_WEIGHT_SHORT: { // {WEIGHT_SHORT} + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.s), tmp_params, last); + break; + } - buff = FormatUnitWeightRatio(buff, last, _units_force[_settings_game.locale.units_force], args.GetNextParameter()); - break; - } + case SCC_WEIGHT_LONG: { // {WEIGHT_LONG} + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + buff = FormatString(buff, GetStringPtr(x.l), tmp_params, last); + break; + } - case SCC_COMPANY_NAME: { // {COMPANY} - const Company *c = Company::GetIfValid(args.GetNextParameter()); - if (c == nullptr) break; + case SCC_POWER_WEIGHT_RATIO: { // {POWER_WEIGHT_RATIO} + assert(_settings_game.locale.units_power < lengthof(_units_power)); + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - if (!c->name.empty()) { - auto tmp_params = MakeParameters(c->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(c->name_2); - buff = GetStringWithArgs(buff, c->name_1, tmp_params, last); + buff = FormatUnitWeightRatio(buff, last, _units_power[_settings_game.locale.units_power], args.GetNextParameter()); + break; } - break; - } - case SCC_COMPANY_NUM: { // {COMPANY_NUM} - CompanyID company = args.GetNextParameter(); + case SCC_FORCE_WEIGHT_RATIO: { // {FORCE_WEIGHT_RATIO} + assert(_settings_game.locale.units_force < lengthof(_units_force)); + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - /* Nothing is added for AI or inactive companies */ - if (Company::IsValidHumanID(company)) { - auto tmp_params = MakeParameters(company + 1); - buff = GetStringWithArgs(buff, STR_FORMAT_COMPANY_NUM, tmp_params, last); + buff = FormatUnitWeightRatio(buff, last, _units_force[_settings_game.locale.units_force], args.GetNextParameter()); + break; } - break; - } - case SCC_DEPOT_NAME: { // {DEPOT} - VehicleType vt = args.GetNextParameter(); - if (vt == VEH_AIRCRAFT) { - auto tmp_params = MakeParameters(args.GetNextParameter()); - buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_AIRCRAFT, tmp_params, last); + case SCC_COMPANY_NAME: { // {COMPANY} + const Company *c = Company::GetIfValid(args.GetNextParameter()); + if (c == nullptr) break; + + if (!c->name.empty()) { + auto tmp_params = MakeParameters(c->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + auto tmp_params = MakeParameters(c->name_2); + buff = GetStringWithArgs(buff, c->name_1, tmp_params, last); + } break; } - const Depot *d = Depot::Get(args.GetNextParameter()); - if (!d->name.empty()) { - auto tmp_params = MakeParameters(d->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(d->town->index, d->town_cn + 1); - buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_TRAIN + 2 * vt + (d->town_cn == 0 ? 0 : 1), tmp_params, last); - } - break; - } + case SCC_COMPANY_NUM: { // {COMPANY_NUM} + CompanyID company = args.GetNextParameter(); - case SCC_ENGINE_NAME: { // {ENGINE} - int64 arg = args.GetNextParameter(); - const Engine *e = Engine::GetIfValid(static_cast(arg)); - if (e == nullptr) break; + /* Nothing is added for AI or inactive companies */ + if (Company::IsValidHumanID(company)) { + auto tmp_params = MakeParameters(company + 1); + buff = GetStringWithArgs(buff, STR_FORMAT_COMPANY_NUM, tmp_params, last); + } + break; + } - if (!e->name.empty() && e->IsEnabled()) { - auto tmp_params = MakeParameters(e->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + case SCC_DEPOT_NAME: { // {DEPOT} + VehicleType vt = args.GetNextParameter(); + if (vt == VEH_AIRCRAFT) { + auto tmp_params = MakeParameters(args.GetNextParameter()); + buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_AIRCRAFT, tmp_params, last); + break; + } + const Depot *d = Depot::Get(args.GetNextParameter()); + if (!d->name.empty()) { + auto tmp_params = MakeParameters(d->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + auto tmp_params = MakeParameters(d->town->index, d->town_cn + 1); + buff = GetStringWithArgs(buff, STR_FORMAT_DEPOT_NAME_TRAIN + 2 * vt + (d->town_cn == 0 ? 0 : 1), tmp_params, last); + } break; } - if (HasBit(e->info.callback_mask, CBM_VEHICLE_NAME)) { - uint16 callback = GetVehicleCallback(CBID_VEHICLE_NAME, static_cast(arg >> 32), 0, e->index, nullptr); - /* Not calling ErrorUnknownCallbackResult due to being inside string processing. */ - if (callback != CALLBACK_FAILED && callback < 0x400) { - const GRFFile *grffile = e->GetGRF(); - assert(grffile != nullptr); + case SCC_ENGINE_NAME: { // {ENGINE} + int64 arg = args.GetNextParameter(); + const Engine *e = Engine::GetIfValid(static_cast(arg)); + if (e == nullptr) break; - StartTextRefStackUsage(grffile, 6); - ArrayStringParameters<6> tmp_params; - buff = GetStringWithArgs(buff, GetGRFStringID(grffile->grfid, 0xD000 + callback), tmp_params, last); - StopTextRefStackUsage(); + if (!e->name.empty() && e->IsEnabled()) { + auto tmp_params = MakeParameters(e->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); break; } - } - auto tmp_params = MakeParameters(); - buff = GetStringWithArgs(buff, e->info.string_id, tmp_params, last); - break; - } - - case SCC_GROUP_NAME: { // {GROUP} - uint32 id = args.GetNextParameter(); - bool recurse = _settings_client.gui.show_group_hierarchy_name && (id & GROUP_NAME_HIERARCHY); - id &= ~GROUP_NAME_HIERARCHY; - const Group *group = Group::GetIfValid(id); - if (group == nullptr) break; + if (HasBit(e->info.callback_mask, CBM_VEHICLE_NAME)) { + uint16 callback = GetVehicleCallback(CBID_VEHICLE_NAME, static_cast(arg >> 32), 0, e->index, nullptr); + /* Not calling ErrorUnknownCallbackResult due to being inside string processing. */ + if (callback != CALLBACK_FAILED && callback < 0x400) { + const GRFFile *grffile = e->GetGRF(); + assert(grffile != nullptr); - auto handle_group = y_combinator([&](auto handle_group, const Group *g) -> void { - if (recurse && g->parent != INVALID_GROUP) { - handle_group(Group::Get(g->parent)); - auto tmp_params = MakeParameters(); - buff = GetStringWithArgs(buff, STR_HIERARCHY_SEPARATOR, tmp_params, last); - } - if (!g->name.empty()) { - auto tmp_params = MakeParameters(g->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(g->index); + StartTextRefStackUsage(grffile, 6); + ArrayStringParameters<6> tmp_params; + buff = GetStringWithArgs(buff, GetGRFStringID(grffile->grfid, 0xD000 + callback), tmp_params, last); + StopTextRefStackUsage(); - buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_NAME, tmp_params, last); + break; + } } - }); - handle_group(group); - break; - } - case SCC_INDUSTRY_NAME: { // {INDUSTRY} - const Industry *i = Industry::GetIfValid(args.GetNextParameter()); - if (i == nullptr) break; - - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - buff = strecpy(buff, i->GetCachedName().c_str(), last); - } else if (_scan_for_gender_data) { - /* Gender is defined by the industry type. - * STR_FORMAT_INDUSTRY_NAME may have the town first, so it would result in the gender of the town name */ auto tmp_params = MakeParameters(); - buff = FormatString(buff, GetStringPtr(GetIndustrySpec(i->type)->name), tmp_params, last, next_substr_case_index); - } else { - /* First print the town name and the industry type name. */ - auto tmp_params = MakeParameters(i->town->index, GetIndustrySpec(i->type)->name); - - buff = FormatString(buff, GetStringPtr(STR_FORMAT_INDUSTRY_NAME), tmp_params, last, next_substr_case_index); + buff = GetStringWithArgs(buff, e->info.string_id, tmp_params, last); + break; } - next_substr_case_index = 0; - break; - } - case SCC_PRESIDENT_NAME: { // {PRESIDENT_NAME} - const Company *c = Company::GetIfValid(args.GetNextParameter()); - if (c == nullptr) break; + case SCC_GROUP_NAME: { // {GROUP} + uint32 id = args.GetNextParameter(); + bool recurse = _settings_client.gui.show_group_hierarchy_name && (id & GROUP_NAME_HIERARCHY); + id &= ~GROUP_NAME_HIERARCHY; + const Group *group = Group::GetIfValid(id); + if (group == nullptr) break; + + auto handle_group = y_combinator([&](auto handle_group, const Group *g) -> void { + if (recurse && g->parent != INVALID_GROUP) { + handle_group(Group::Get(g->parent)); + auto tmp_params = MakeParameters(); + buff = GetStringWithArgs(buff, STR_HIERARCHY_SEPARATOR, tmp_params, last); + } + if (!g->name.empty()) { + auto tmp_params = MakeParameters(g->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + auto tmp_params = MakeParameters(g->index); - if (!c->president_name.empty()) { - auto tmp_params = MakeParameters(c->president_name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(c->president_name_2); - buff = GetStringWithArgs(buff, c->president_name_1, tmp_params, last); + buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_NAME, tmp_params, last); + } + }); + handle_group(group); + break; } - break; - } - case SCC_STATION_NAME: { // {STATION} - StationID sid = args.GetNextParameter(); - const Station *st = Station::GetIfValid(sid); + case SCC_INDUSTRY_NAME: { // {INDUSTRY} + const Industry *i = Industry::GetIfValid(args.GetNextParameter()); + if (i == nullptr) break; + + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + buff = strecpy(buff, i->GetCachedName().c_str(), last); + } else if (_scan_for_gender_data) { + /* Gender is defined by the industry type. + * STR_FORMAT_INDUSTRY_NAME may have the town first, so it would result in the gender of the town name */ + auto tmp_params = MakeParameters(); + buff = FormatString(buff, GetStringPtr(GetIndustrySpec(i->type)->name), tmp_params, last, next_substr_case_index); + } else { + /* First print the town name and the industry type name. */ + auto tmp_params = MakeParameters(i->town->index, GetIndustrySpec(i->type)->name); - if (st == nullptr) { - /* The station doesn't exist anymore. The only place where we might - * be "drawing" an invalid station is in the case of cargo that is - * in transit. */ - auto tmp_params = MakeParameters(); - buff = GetStringWithArgs(buff, STR_UNKNOWN_STATION, tmp_params, last); + buff = FormatString(buff, GetStringPtr(STR_FORMAT_INDUSTRY_NAME), tmp_params, last, next_substr_case_index); + } + next_substr_case_index = 0; break; } - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - buff = strecpy(buff, st->GetCachedName(), last); - } else if (!st->name.empty()) { - auto tmp_params = MakeParameters(st->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - StringID string_id = st->string_id; - if (st->indtype != IT_INVALID) { - /* Special case where the industry provides the name for the station */ - const IndustrySpec *indsp = GetIndustrySpec(st->indtype); - - /* Industry GRFs can change which might remove the station name and - * thus cause very strange things. Here we check for that before we - * actually set the station name. */ - if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) { - string_id = indsp->station_name; - } + case SCC_PRESIDENT_NAME: { // {PRESIDENT_NAME} + const Company *c = Company::GetIfValid(args.GetNextParameter()); + if (c == nullptr) break; + + if (!c->president_name.empty()) { + auto tmp_params = MakeParameters(c->president_name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + auto tmp_params = MakeParameters(c->president_name_2); + buff = GetStringWithArgs(buff, c->president_name_1, tmp_params, last); } - if (st->extra_name_index != UINT16_MAX && st->extra_name_index < _extra_station_names_used) { - string_id = _extra_station_names[st->extra_name_index].str; + break; + } + + case SCC_STATION_NAME: { // {STATION} + StationID sid = args.GetNextParameter(); + const Station *st = Station::GetIfValid(sid); + + if (st == nullptr) { + /* The station doesn't exist anymore. The only place where we might + * be "drawing" an invalid station is in the case of cargo that is + * in transit. */ + auto tmp_params = MakeParameters(); + buff = GetStringWithArgs(buff, STR_UNKNOWN_STATION, tmp_params, last); + break; } - auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); - buff = GetStringWithArgs(buff, string_id, tmp_params, last); + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + buff = strecpy(buff, st->GetCachedName(), last); + } else if (!st->name.empty()) { + auto tmp_params = MakeParameters(st->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + StringID string_id = st->string_id; + if (st->indtype != IT_INVALID) { + /* Special case where the industry provides the name for the station */ + const IndustrySpec *indsp = GetIndustrySpec(st->indtype); + + /* Industry GRFs can change which might remove the station name and + * thus cause very strange things. Here we check for that before we + * actually set the station name. */ + if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) { + string_id = indsp->station_name; + } + } + if (st->extra_name_index != UINT16_MAX && st->extra_name_index < _extra_station_names_used) { + string_id = _extra_station_names[st->extra_name_index].str; + } + + auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); + buff = GetStringWithArgs(buff, string_id, tmp_params, last); + } + break; } - break; - } - case SCC_TOWN_NAME: { // {TOWN} - const Town *t = Town::GetIfValid(args.GetNextParameter()); - if (t == nullptr) break; + case SCC_TOWN_NAME: { // {TOWN} + const Town *t = Town::GetIfValid(args.GetNextParameter()); + if (t == nullptr) break; - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - buff = strecpy(buff, t->GetCachedName(), last); - } else if (!t->name.empty()) { - auto tmp_params = MakeParameters(t->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - buff = GetTownName(buff, t, last); + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + buff = strecpy(buff, t->GetCachedName(), last); + } else if (!t->name.empty()) { + auto tmp_params = MakeParameters(t->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + buff = GetTownName(buff, t, last); + } + break; } - break; - } - - case SCC_VIEWPORT_TOWN_LABEL1: - case SCC_VIEWPORT_TOWN_LABEL2: { // {VIEWPORT_TOWN_LABEL1..2} - int32 t = args.GetNextParameter(); - uint64 data = args.GetNextParameter(); - - bool tiny = (b == SCC_VIEWPORT_TOWN_LABEL2); - StringID string_id = STR_VIEWPORT_TOWN_COLOUR; - if (!tiny) string_id += GB(data, 40, 2); - auto tmp_params = MakeParameters(t, GB(data, 32, 8), GB(data, 0, 32)); - buff = GetStringWithArgs(buff, string_id, tmp_params, last); - break; - } - case SCC_WAYPOINT_NAME: { // {WAYPOINT} - Waypoint *wp = Waypoint::GetIfValid(args.GetNextParameter()); - if (wp == nullptr) break; + case SCC_VIEWPORT_TOWN_LABEL1: + case SCC_VIEWPORT_TOWN_LABEL2: { // {VIEWPORT_TOWN_LABEL1..2} + int32 t = args.GetNextParameter(); + uint64 data = args.GetNextParameter(); - if (!wp->name.empty()) { - auto tmp_params = MakeParameters(wp->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(wp->town->index, wp->town_cn + 1); - StringID string_id = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME); - if (wp->town_cn != 0) string_id++; + bool tiny = (b == SCC_VIEWPORT_TOWN_LABEL2); + StringID string_id = STR_VIEWPORT_TOWN_COLOUR; + if (!tiny) string_id += GB(data, 40, 2); + auto tmp_params = MakeParameters(t, GB(data, 32, 8), GB(data, 0, 32)); buff = GetStringWithArgs(buff, string_id, tmp_params, last); + break; } - break; - } - case SCC_VEHICLE_NAME: { // {VEHICLE} - uint32 id = args.GetNextParameter(); - uint8 vehicle_names = _settings_client.gui.vehicle_names; - if (id & VEHICLE_NAME_NO_GROUP) { - id &= ~VEHICLE_NAME_NO_GROUP; - /* Change format from long to traditional */ - if (vehicle_names == 2) vehicle_names = 0; + case SCC_WAYPOINT_NAME: { // {WAYPOINT} + Waypoint *wp = Waypoint::GetIfValid(args.GetNextParameter()); + if (wp == nullptr) break; + + if (!wp->name.empty()) { + auto tmp_params = MakeParameters(wp->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else { + auto tmp_params = MakeParameters(wp->town->index, wp->town_cn + 1); + StringID string_id = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME); + if (wp->town_cn != 0) string_id++; + buff = GetStringWithArgs(buff, string_id, tmp_params, last); + } + break; } - const Vehicle *v = Vehicle::GetIfValid(id); - if (v == nullptr) break; + case SCC_VEHICLE_NAME: { // {VEHICLE} + uint32 id = args.GetNextParameter(); + uint8 vehicle_names = _settings_client.gui.vehicle_names; + if (id & VEHICLE_NAME_NO_GROUP) { + id &= ~VEHICLE_NAME_NO_GROUP; + /* Change format from long to traditional */ + if (vehicle_names == 2) vehicle_names = 0; + } - if (!v->name.empty()) { - auto tmp_params = MakeParameters(v->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else if (v->group_id != DEFAULT_GROUP && vehicle_names != 0 && v->type < VEH_COMPANY_END) { - /* The vehicle has no name, but is member of a group, so print group name */ - uint32 group_name = v->group_id; - if (_settings_client.gui.show_vehicle_group_hierarchy_name) group_name |= GROUP_NAME_HIERARCHY; - if (vehicle_names == 1) { - auto tmp_params = MakeParameters(group_name, v->unitnumber); - buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME, tmp_params, last); + const Vehicle *v = Vehicle::GetIfValid(id); + if (v == nullptr) break; + + if (!v->name.empty()) { + auto tmp_params = MakeParameters(v->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + } else if (v->group_id != DEFAULT_GROUP && vehicle_names != 0 && v->type < VEH_COMPANY_END) { + /* The vehicle has no name, but is member of a group, so print group name */ + uint32 group_name = v->group_id; + if (_settings_client.gui.show_vehicle_group_hierarchy_name) group_name |= GROUP_NAME_HIERARCHY; + if (vehicle_names == 1) { + auto tmp_params = MakeParameters(group_name, v->unitnumber); + buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME, tmp_params, last); + } else { + auto tmp_params = MakeParameters(group_name, STR_TRADITIONAL_TRAIN_NAME + v->type, v->unitnumber); + buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME_LONG, tmp_params, last); + } } else { - auto tmp_params = MakeParameters(group_name, STR_TRADITIONAL_TRAIN_NAME + v->type, v->unitnumber); - buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME_LONG, tmp_params, last); + auto tmp_params = MakeParameters(v->unitnumber); + + StringID string_id; + if (v->type < VEH_COMPANY_END) { + string_id = ((vehicle_names == 1) ? STR_SV_TRAIN_NAME : STR_TRADITIONAL_TRAIN_NAME) + v->type; + } else { + string_id = STR_INVALID_VEHICLE; + } + + buff = GetStringWithArgs(buff, string_id, tmp_params, last); } - } else { - auto tmp_params = MakeParameters(v->unitnumber); + break; + } + + case SCC_SIGN_NAME: { // {SIGN} + const Sign *si = Sign::GetIfValid(args.GetNextParameter()); + if (si == nullptr) break; - StringID string_id; - if (v->type < VEH_COMPANY_END) { - string_id = ((vehicle_names == 1) ? STR_SV_TRAIN_NAME : STR_TRADITIONAL_TRAIN_NAME) + v->type; + if (!si->name.empty()) { + auto tmp_params = MakeParameters(si->name); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); } else { - string_id = STR_INVALID_VEHICLE; + auto tmp_params = MakeParameters(); + buff = GetStringWithArgs(buff, STR_DEFAULT_SIGN_NAME, tmp_params, last); } - - buff = GetStringWithArgs(buff, string_id, tmp_params, last); + break; } - break; - } - - case SCC_SIGN_NAME: { // {SIGN} - const Sign *si = Sign::GetIfValid(args.GetNextParameter()); - if (si == nullptr) break; - if (!si->name.empty()) { - auto tmp_params = MakeParameters(si->name); + case SCC_TR_SLOT_NAME: { // {TRSLOT} + const TraceRestrictSlot *slot = TraceRestrictSlot::GetIfValid(args.GetNextParameter()); + if (slot == nullptr) break; + auto tmp_params = MakeParameters(slot->name.c_str()); buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - } else { - auto tmp_params = MakeParameters(); - buff = GetStringWithArgs(buff, STR_DEFAULT_SIGN_NAME, tmp_params, last); + break; } - break; - } - - case SCC_TR_SLOT_NAME: { // {TRSLOT} - const TraceRestrictSlot *slot = TraceRestrictSlot::GetIfValid(args.GetNextParameter()); - if (slot == nullptr) break; - auto tmp_params = MakeParameters(slot->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - break; - } - case SCC_TR_COUNTER_NAME: { // {TRCOUNTER} - const TraceRestrictCounter *ctr = TraceRestrictCounter::GetIfValid(args.GetNextParameter()); - if (ctr == nullptr) break; - auto tmp_params = MakeParameters(ctr->name.c_str()); - buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); - break; - } + case SCC_TR_COUNTER_NAME: { // {TRCOUNTER} + const TraceRestrictCounter *ctr = TraceRestrictCounter::GetIfValid(args.GetNextParameter()); + if (ctr == nullptr) break; + auto tmp_params = MakeParameters(ctr->name.c_str()); + buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, tmp_params, last); + break; + } - case SCC_STATION_FEATURES: { // {STATIONFEATURES} - buff = StationGetSpecialString(buff, args.GetNextParameter(), last); - break; - } + case SCC_STATION_FEATURES: { // {STATIONFEATURES} + buff = StationGetSpecialString(buff, args.GetNextParameter(), last); + break; + } - case SCC_COLOUR: {// {COLOUR} - int64 tc = args.GetNextParameter(); - if (tc >= 0 && tc < TC_END) { - buff += Utf8Encode(buff, SCC_BLUE + tc); + case SCC_COLOUR: {// {COLOUR} + int64 tc = args.GetNextParameter(); + if (tc >= 0 && tc < TC_END) { + buff += Utf8Encode(buff, SCC_BLUE + tc); + } + break; } - break; - } - case SCC_CONSUME_ARG: - // do nothing - break; + case SCC_CONSUME_ARG: + // do nothing + break; - default: - if (buff + Utf8CharLen(b) < last) buff += Utf8Encode(buff, b); - break; + default: + if (buff + Utf8CharLen(b) < last) buff += Utf8Encode(buff, b); + break; + } + } catch (std::out_of_range &e) { + DEBUG(misc, 0, "FormatString: %s", e.what()); + buff = strecpy(buff, "(invalid parameter)", last); } } *buff = '\0'; diff --git a/src/strings_internal.h b/src/strings_internal.h index 496df1fdbf..e881d2ae97 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -42,20 +42,13 @@ protected: public: /** * Create a new StringParameters instance that can reference part of the data of - * the given partent instance. + * the given parent instance. */ StringParameters(StringParameters &parent, size_t size) : parent(&parent), parameters(parent.parameters.subspan(parent.offset, size)) {} - ~StringParameters() - { - if (this->parent != nullptr) { - this->parent->offset += this->parameters.size(); - } - } - void PrepareForNextRun(); void SetTypeOfNextParameter(char32_t type) { this->next_type = type; } @@ -84,6 +77,17 @@ public: this->offset = offset; } + /** + * Advance the offset within the string from where to return the next result of + * \c GetInt64 or \c GetInt32. + * @param advance The amount to advance the offset by. + */ + void AdvanceOffset(size_t advance) + { + this->offset += advance; + assert(this->offset <= this->parameters.size()); + } + /** * Get the next parameter from our parameters. * This updates the offset, so the next time this is called the next parameter @@ -94,7 +98,7 @@ public: T GetNextParameter() { auto ptr = GetNextParameterPointer(); - return static_cast(ptr == nullptr ? 0 : ptr->data); + return static_cast(ptr->data); } /** @@ -106,7 +110,6 @@ public: const char *GetNextParameterString() { auto ptr = GetNextParameterPointer(); - if (ptr == nullptr) return nullptr; return ptr->string != nullptr ? ptr->string->c_str() : ptr->string_view; } @@ -226,7 +229,7 @@ public: return *this; } - ArrayStringParameters(const ArrayStringParameters& other) = delete; + ArrayStringParameters(const ArrayStringParameters &other) = delete; ArrayStringParameters& operator=(const ArrayStringParameters &other) = delete; }; diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index 138126c3f0..041006f46b 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -128,6 +128,13 @@ str = STR_CONFIG_SETTING_SERVICEATHELIPAD strhelp = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT cat = SC_EXPERT +[SDT_BOOL] +var = order.station_length_loading_penalty +def = true +str = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY +strhelp = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT +cat = SC_EXPERT + [SDT_BOOL] var = order.nonstop_only flags = SF_PATCH diff --git a/src/tbtr_template_gui_create.cpp b/src/tbtr_template_gui_create.cpp index ba5ead9cf8..e57bcc37eb 100644 --- a/src/tbtr_template_gui_create.cpp +++ b/src/tbtr_template_gui_create.cpp @@ -715,7 +715,7 @@ void CcSetVirtualTrain(const CommandCost &result, TileIndex tile, uint32 p1, uin { if (result.Failed()) return; - Window* window = FindWindowById(WC_CREATE_TEMPLATE, 0); + Window *window = FindWindowById(WC_CREATE_TEMPLATE, 0); if (window) { Train* train = Train::From(Vehicle::Get(_new_vehicle_id)); ((TemplateCreateWindow*)window)->SetVirtualTrain(train); @@ -727,7 +727,7 @@ void CcVirtualTrainWagonsMoved(const CommandCost &result, TileIndex tile, uint32 { if (result.Failed()) return; - Window* window = FindWindowById(WC_CREATE_TEMPLATE, 0); + Window *window = FindWindowById(WC_CREATE_TEMPLATE, 0); if (window) { ((TemplateCreateWindow*)window)->RearrangeVirtualTrain(); window->InvalidateData(); @@ -738,7 +738,7 @@ void CcDeleteVirtualTrain(const CommandCost &result, TileIndex tile, uint32 p1, { if (result.Failed()) return; - Window* window = FindWindowById(WC_CREATE_TEMPLATE, 0); + Window *window = FindWindowById(WC_CREATE_TEMPLATE, 0); if (window) { ((TemplateCreateWindow*)window)->VirtualVehicleDeleted(GB(p1, 0, 20)); window->InvalidateData(); diff --git a/src/thread.h b/src/thread.h index 1a3bd122a3..ffb7caf2bc 100644 --- a/src/thread.h +++ b/src/thread.h @@ -123,7 +123,7 @@ inline bool StartNewThread(std::thread *thr, const char *name, TFn&& _Fx, TArgs& } return true; - } catch (const std::system_error& e) { + } catch (const std::system_error &e) { /* Something went wrong, the system we are running on might not support threads. */ DEBUG(misc, 1, "Can't create thread '%s': %s", name, e.what()); } diff --git a/src/tilematrix_type.hpp b/src/tilematrix_type.hpp index a852351806..aacf56a06b 100644 --- a/src/tilematrix_type.hpp +++ b/src/tilematrix_type.hpp @@ -85,7 +85,7 @@ public: * Get the total covered area. * @return The area covered by the matrix. */ - const TileArea& GetArea() const + const TileArea &GetArea() const { return this->area; } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 431bf7e38e..d92fb47919 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -392,8 +392,8 @@ static CallBackFunction MenuClickSaveLoad(int index = 0) switch (index) { case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break; case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; - case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_SAVE); break; - case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; + case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break; + case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break; case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break; case SLEME_EXIT_GAME: HandleExitGameRequest(); break; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index cfe46bdeb7..50fa98b305 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -4693,7 +4693,7 @@ uint32 Vehicle::GetDisplayMaxWeight() const { uint32 max_weight = 0; - for (const Vehicle* u = this; u != nullptr; u = u->Next()) { + for (const Vehicle *u = this; u != nullptr; u = u->Next()) { max_weight += u->GetMaxWeight(); } diff --git a/src/vehicle_base.h b/src/vehicle_base.h index b79f6439ba..a973ff4f17 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -1191,8 +1191,8 @@ public: */ struct OrderIterator { typedef Order value_type; - typedef Order* pointer; - typedef Order& reference; + typedef Order *pointer; + typedef Order &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; diff --git a/src/video/cocoa/cocoa_ogl.h b/src/video/cocoa/cocoa_ogl.h index 106567d038..64ce37832d 100644 --- a/src/video/cocoa/cocoa_ogl.h +++ b/src/video/cocoa/cocoa_ogl.h @@ -50,7 +50,7 @@ protected: void *GetVideoPointer() override; void ReleaseVideoPointer() override; - NSView* AllocateDrawView() override; + NSView *AllocateDrawView() override; }; class FVideoDriver_CocoaOpenGL : public DriverFactoryBase { diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 3fe79ac905..ca23b6fd6a 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -78,7 +78,7 @@ protected: bool MakeWindow(int width, int height); - virtual NSView* AllocateDrawView() = 0; + virtual NSView *AllocateDrawView() = 0; /** Get a pointer to the video buffer. */ virtual void *GetVideoPointer() = 0; @@ -121,7 +121,7 @@ protected: void Paint() override; void CheckPaletteAnim() override; - NSView* AllocateDrawView() override; + NSView *AllocateDrawView() override; void *GetVideoPointer() override { return this->buffer_depth == 8 ? this->pixel_buffer : this->window_buffer; } }; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 1ac4fdc88f..86d7e4adbf 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -399,7 +399,7 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height) behavior |= NSWindowCollectionBehaviorFullScreenPrimary; [ this->window setCollectionBehavior:behavior ]; - NSButton* fullscreenButton = [ this->window standardWindowButton:NSWindowZoomButton ]; + NSButton *fullscreenButton = [ this->window standardWindowButton:NSWindowZoomButton ]; [ fullscreenButton setAction:@selector(toggleFullScreen:) ]; [ fullscreenButton setTarget:this->window ]; } diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index 8de1790c15..ba546926b4 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -127,12 +127,12 @@ public: void SetColourFlags(TextColour colour_flags) { this->colour_flags = colour_flags; } /** - * Natural sorting comparator function for DropDownList::sort(). - * @param first Left side of comparison. - * @param second Right side of comparison. - * @return true if \a first precedes \a second. - * @warning All items in the list need to be derivates of DropDownListStringItem. - */ + * Natural sorting comparator function for DropDownList::sort(). + * @param first Left side of comparison. + * @param second Right side of comparison. + * @return true if \a first precedes \a second. + * @warning All items in the list need to be derivates of DropDownListStringItem. + */ static bool NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second) { const std::string &str1 = static_cast(first.get())->string; diff --git a/src/window.cpp b/src/window.cpp index a405f944f6..f75627d124 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -171,7 +171,7 @@ void WindowDesc::LoadFromConfig() /** * Sort WindowDesc by ini_key. */ -static bool DescSorter(WindowDesc* const &a, WindowDesc* const &b) +static bool DescSorter(WindowDesc * const &a, WindowDesc * const &b) { if (a->ini_key != nullptr && b->ini_key != nullptr) return strcmp(a->ini_key, b->ini_key) < 0; return a->ini_key != nullptr;