From 4c1ddb147996bc9513922a095165a7c9f6f1241a Mon Sep 17 00:00:00 2001 From: glx22 Date: Fri, 5 Jan 2024 17:52:13 +0100 Subject: [PATCH 1/8] Change: [Script] detection of not properly closed DOXYGEN_API blocks --- cmake/scripts/SquirrelExport.cmake | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cmake/scripts/SquirrelExport.cmake b/cmake/scripts/SquirrelExport.cmake index e4096bc9de..5116a4c9d5 100644 --- a/cmake/scripts/SquirrelExport.cmake +++ b/cmake/scripts/SquirrelExport.cmake @@ -71,13 +71,23 @@ reset_reader() file(STRINGS "${SCRIPT_API_FILE}" SOURCE_LINES) +set(NUM_LINE 0) +macro(doxygen_check) + if(NOT "${DOXYGEN_SKIP}" STREQUAL "") + message(FATAL_ERROR "${SCRIPT_API_FILE}:${NUM_LINE}: a DOXYGEN_API block was not properly closed") + endif() +endmacro() + foreach(LINE IN LISTS SOURCE_LINES) + math(EXPR NUM_LINE "${NUM_LINE} + 1") # Ignore special doxygen blocks if("${LINE}" MATCHES "^#ifndef DOXYGEN_API") + doxygen_check() set(DOXYGEN_SKIP "next") continue() endif() if("${LINE}" MATCHES "^#ifdef DOXYGEN_API") + doxygen_check() set(DOXYGEN_SKIP "true") continue() endif() @@ -86,10 +96,10 @@ foreach(LINE IN LISTS SOURCE_LINES) continue() endif() if("${LINE}" MATCHES "^#else") - if("${DOXYGEN_SKIP}" STREQUAL "next") + if(DOXYGEN_SKIP STREQUAL "next") set(DOXYGEN_SKIP "true") - else() - unset(DOXYGEN_SKIP) + elseif(DOXYGEN_SKIP STREQUAL "true") + set(DOXYGEN_SKIP "false") endif() continue() endif() @@ -668,4 +678,6 @@ foreach(LINE IN LISTS SOURCE_LINES) endif() endforeach() +doxygen_check() + configure_file(${SCRIPT_API_SOURCE_FILE} ${SCRIPT_API_BINARY_FILE}) From 707e8001becbced1a56e4d7c25258b1ccfb0e267 Mon Sep 17 00:00:00 2001 From: glx22 Date: Fri, 5 Jan 2024 17:54:48 +0100 Subject: [PATCH 2/8] Fix #11689: properly close DOXYGEN_API block --- src/script/api/script_vehiclelist.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/api/script_vehiclelist.hpp b/src/script/api/script_vehiclelist.hpp index 942e50b7ce..c629bc48d2 100644 --- a/src/script/api/script_vehiclelist.hpp +++ b/src/script/api/script_vehiclelist.hpp @@ -45,7 +45,7 @@ public: * The constructor wrapper from Squirrel. */ ScriptVehicleList(HSQUIRRELVM vm); -#endif +#endif /* DOXYGEN_API */ }; /** From 7bfc766f94a9e08f259ba51cfd22634c8352ce0c Mon Sep 17 00:00:00 2001 From: glx22 Date: Fri, 5 Jan 2024 17:50:33 +0100 Subject: [PATCH 3/8] Fix: [Script] document return type of member GSIndustry::GetProductionLevel --- src/script/api/script_industry.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/script/api/script_industry.hpp b/src/script/api/script_industry.hpp index bedb3504d1..ea9bc7f9d8 100644 --- a/src/script/api/script_industry.hpp +++ b/src/script/api/script_industry.hpp @@ -330,6 +330,7 @@ public: /** * Gets the current production level of an industry. * @param industry_id The index of the industry. + * @return The current production level of the industry. * @api -ai */ static SQInteger GetProductionLevel(IndustryID industry_id); From 8bc473766b2f1f4499b00a12bd5f74fec0959bde Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 5 Jan 2024 18:38:36 +0000 Subject: [PATCH 4/8] Update: Translations from eints english (au): 2 changes by krysclarke chinese (simplified): 6 changes by WenSimEHRP russian: 2 changes by Ln-Wolf finnish: 2 changes by hpiirai dutch: 6 changes by Afoklala portuguese: 5 changes by azulcosta portuguese (brazilian): 2 changes by ericandradex polish: 4 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 2 ++ src/lang/dutch.txt | 10 ++++++---- src/lang/english_AU.txt | 2 ++ src/lang/finnish.txt | 2 ++ src/lang/polish.txt | 6 ++++-- src/lang/portuguese.txt | 8 +++++--- src/lang/russian.txt | 2 ++ src/lang/simplified_chinese.txt | 10 ++++++---- 8 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 916c8842b8..3fc9706655 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1778,6 +1778,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Penalidade de velocidade de carregamento para trens que são mais longos que a estação: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Quando ativado, os trens que são muito longos para a estação carregam mais lentamente do que um trem que cabe na estação. Esta configuração não afeta o itinerário. 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/dutch.txt b/src/lang/dutch.txt index 8378439d44..587135fedc 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1777,6 +1777,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Verminderde laadsnelheid voor treinen langer dan het station: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Indien ingeschakeld worden treinen die te lang zijn voor het station langzamer geladen dan treinen die in het station passen. Deze instelling is niet van invloed op het zoeken van de route. 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 @@ -1969,7 +1971,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Gemiddelde groo STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Distributiegrafiek elke {STRING} bijwerken STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :De tijd tussen opeenvolgende herberekeningen van de koppeling-grafiek. Elke berekening berekent de plannen voor één component van de grafiek. Dat betekent dat een waarde X voor deze instelling niet betekent dat de hele grafiek elke X seconden wordt bijgewerkt. Dat geldt alleen voor één component. Hoe korter je deze waarde instelt, hoe meer CPU-tijd er nodig is voor de berekening. Hoe langer je deze waarde instelt, hoe langer het duurt voordat de vrachtdistributie start op nieuwe routes. STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :{STRING} per herberekening van de distributiegrafiek besteden -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :De benodigde tijd voor een herbereking van een koppeling-grafiekcomponent. Wanneer een herberekening wordt gestart, start een draad die dit aantal seconden mag lopen. Hoe korter je deze waarde maakt, hoe groter de kans dat de draad is niet op tijd is afgelopen. Het spel stopt dan totdat dit alsnog gebeurt (het 'hikt'). Hoe langer je deze waarde maakt, hoe langer het duurt voor de distributie wordt bijgewerkt wanneer een route wijzigt. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :De benodigde tijd voor een herbereking van een koppeling-grafiekcomponent. Wanneer een herberekening wordt gestart, start een draad die dit aantal seconden mag lopen. Hoe korter je deze waarde maakt, hoe groter de kans dat de draad niet op tijd is afgelopen. Het spel stopt dan totdat dit alsnog gebeurt (het 'hikt'). Hoe langer je deze waarde maakt, hoe langer het duurt voor de distributie wordt bijgewerkt wanneer een route wijzigt. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Distributiemodus voor passagiers: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :'Symmetrisch' betekent dat ongeveer hetzelfde aantal passagiers van station A naar station B gaat als van B naar A. 'Asymmetrisch' betekent dat willekeurige aantallen passagiers reizen in beide richtingen. 'Handmatig' betekent dat er geen automatische distributie plaatsvindt voor passagiers. @@ -1990,7 +1992,7 @@ STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Hoe hoger de in STR_CONFIG_SETTING_DEMAND_DISTANCE :Effect van afstand op de vraag: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Als je dit op een waarde hoger dan 0 zet, dan zal de afstand tussen het station van herkomst A met enige vracht en een mogelijke bestemming B effect hebben op de hoeveelheid lading verzonden van A naar B. Hoe verder weg B is van A, des te minder lading wordt verzonden. Hoe hoger je deze instelt, hoe minder lading wordt verzonden naar verder geleden stations en meer lading zal worden verzonden naar dichtbij gelegen stations. STR_CONFIG_SETTING_DEMAND_SIZE :Hoeveelheid terugkerende vracht voor symmetrische modus: {STRING} -STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Door dit op minder dan 100% te zetten lijkt de symmetrische verdeling meer op de asymmetrische verdeling. Minder vracht zal geforceerd worden om zich terug te sturen als er een bepaalde hoeveelheid wordt verzonden naar een station. Op 0% van de symmetrische verdeling gedraagt deze zicht als de asymmetrische verdeling. +STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Door dit op minder dan 100% te zetten lijkt de symmetrische verdeling meer op de asymmetrische verdeling. Minder vracht zal geforceerd worden om zich terug te sturen als er een bepaalde hoeveelheid wordt verzonden naar een station. Op 0% van de symmetrische verdeling gedraagt deze zich als de asymmetrische verdeling. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Verzadiging van korte routes voordat routes met hoge capaciteit worden gebruikt: {STRING} STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Vaak zijn er meerdere routes mogelijk tussen twee stations. De vrachtdistributie verzadigt eerst de kortste route, gebruikt dan de op één na kortste route tot die verzadigd is enzovoort. Verzadiging wordt bepaald door een schatting van de capaciteit en het geplande gebruik. Wanneer alle routes verzadigd zijn, maar er is meer vraag, raken alle wegen overbelast, die met hoge capaciteit als eerste. In veel gevallen schat het algoritme helaas de capaciteit niet nauwkeurig in. Met deze instelling kun je aangeven tot welk percentage een korter pad moet worden verzadigd voordat de eerstvolgende, langere route wordt gekozen. Stel dit in op minder dan 100% om overvolle stations in geval van overschatte capaciteit te voorkomen. @@ -4476,9 +4478,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}Bepaalt STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is gelijk aan STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is niet gelijk aan STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is minder dan -STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is minder of gelijk aan +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is minder dan of gelijk aan STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :is meer dan -STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is meer of gelijk aan +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is meer dan of gelijk aan STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :is waar STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is niet waar diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index ee769426e4..d10ebe1f1c 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1777,6 +1777,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Loading speed penalty for trains that are longer than the station: {STRING} +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: {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/finnish.txt b/src/lang/finnish.txt index 2ddc8e6817..b1521cfe93 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1777,6 +1777,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Alennettu lastausnopeus asemaa pitemmille junille: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Mikäli käytössä, rautatieasemaa pitemmät junat kuormataan asemalle kokonaan mahtuvia hitaammin. Tämä asetus ei vaikuta reittien laskentaan. 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/polish.txt b/src/lang/polish.txt index 230b340408..cb35ccc3b1 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2157,6 +2157,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Obniżenie prędkości załadunku pociągów dłuższych niż stacja: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Gdy opcja ta jest włączona, pociągi dłuższe od stacji ładują się wolniej niż pociągi, które mieszczą się na stacji. To ustawienie nie wpływa na znajdowanie tras. 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 @@ -5040,9 +5042,9 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}Uwzględ STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Przełącz uwzględnianie wielkości liter przy porównywaniu wyrazu przerywającego STR_AI_DEBUG_CONTINUE :{BLACK}Kontynuuj STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Odpauzowanie i kontynuuowanie SI -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Pokaż okno debugowania tej SI +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Pokaż okno debugowania tej SI. Ctrl+klik otworzy w nowym oknie STR_AI_GAME_SCRIPT :{BLACK}Game Script -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Sprawdź log Game Script +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Sprawdź log Game Script. Ctrl+klik otworzy w nowym oknie STR_ERROR_AI_NO_AI_FOUND :Nie znaleziono SI do wczytania.{}SI jest nieaktywne i nic nie robi.{}Możesz pobrać kilka SI z przeglądarki „Dodatków Online” STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jeden z uruchomionych skryptów przestał działać. Prosimy o zgłoszenie tego autorowi skryptu dołączając zrzut ekranu okna debugowania SI / GameScript diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 31bb788205..3c2fe30e35 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -904,7 +904,7 @@ STR_NEWS_VEHICLE_IS_UNPROFITABLE :{WHITE}{VEHICLE STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} não consegue chegar ao próximo destino pois está fora de alcance STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque a ordem de adaptação falhou -STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}{VEHICLE} falhou na Auto-renovação{}{STRING} +STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Auto-renovação falhou para {VEHICLE}{}{STRING} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Novo modelo de {STRING} agora disponível! STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} @@ -1778,6 +1778,8 @@ 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_STATION_LENGTH_LOADING_PENALTY :Penalidade de velocidade de carregamento para comboios mais compridos do que a estação: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Quando ativo, os comboios que são muito compridos para a estação demoram mais tempo a carregar/encher do que um comboio que caiba na estação. Esta definição não afeta a procura de itinerários. 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 @@ -4477,9 +4479,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}Como com STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :é igual a STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :é diferente de STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :é menos que -STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :é menos que ou igual a +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :é menor que ou igual a STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :é mais que -STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :é mais que ou igual a +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :é maior que ou igual a STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :é verdadeiro STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :é falso diff --git a/src/lang/russian.txt b/src/lang/russian.txt index dfe2f4cebe..02cc0a6eca 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1928,6 +1928,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :отключе STR_CONFIG_SETTING_NOSERVICE :Не обслуживать транспорт, если отключены поломки: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Отключение технического обслуживания транспортных средств, если отключены поломки. (Если транспорт не заходит в депо, автозамена не работает). +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Медленная загрузка длинных составов: {STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :При включении - составы, длина которых превышает длину станции, загружаются медленнее тех, что полностью помещаются на станции. Это не влияет на построение маршрутов. STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Учитывать ограничение скорости у вагонов: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :При наличии в составе вагонов с ограничением скорости учитывать это ограничение при определении максимальной скорости состава diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 097adccb0c..5c1af4a975 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1446,8 +1446,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :检查 所有 STR_CONFIG_SETTING_WARN_INCOME_LESS :若线路亏损时发出提示: {STRING} STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :“打开”,当一辆车在一年内总体亏损,发出提示 -STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :车辆永不报废:{STRING} -STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :“打开”时,所有的车辆在它出现后一直可用 +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :载具永不过期:{STRING} +STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :启用时,所有载具一经面世,就可以永远选择购买使用。 STR_CONFIG_SETTING_AUTORENEW_VEHICLE :当车辆报废时自动更新:{STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :“打开”时,车辆在临近它的报废期限时自动更新 @@ -1777,6 +1777,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :关闭 STR_CONFIG_SETTING_NOSERVICE :在无故障模式下禁用保养周期:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :“打开”时,在无故障模式下,车辆禁用保养周期 +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :站台长度装卸惩罚:{STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :启用站台长度装卸惩罚。过长的火车将会在站台中装卸得更慢。此项设置不会影响寻路。 STR_CONFIG_SETTING_WAGONSPEEDLIMITS :启动车辆限速:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :“打开“时,还要根据车辆的限速来决定一列火车的最高速度 @@ -1971,7 +1973,7 @@ STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :两次连结图 STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :在货物分配的重新计算上花费 {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :每一个连结图的重新计算时间。当一次重新计算开始,一个线程会被允许运行这个秒数。此设定赋值越小,则线程无法按时结束的可能性越大,从而导致游戏运行延迟。此设定赋值越大,则在线路改变时货物再分配所需时间会变长。 -STR_CONFIG_SETTING_DISTRIBUTION_PAX :乗客分配方式:{STRING} +STR_CONFIG_SETTING_DISTRIBUTION_PAX :乘客分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :假设有交通路线连接甲、乙两站。“对称”指甲站往乙站的乗客数量与乙站往甲站的乘客数量大致相同。“不对称”指任何一站往另一站的乘客数量皆由系统随意决定。“手动”指系统不会自动分配乘客的目的地。 STR_CONFIG_SETTING_DISTRIBUTION_MAIL :邮件分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :假设有交通路线连接甲、乙两站。“对称”指甲站往乙站的邮件数量与乙站往甲站的邮件数量大致相同。“不对称”指任何一站往另一站的邮件数量皆由系统随意决定。“手动”指系统不会自动分配邮件的目的地。 @@ -2593,7 +2595,7 @@ STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}选择 STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}更新所有已下载的扩展包 STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}取消全选 STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}取消全部选择 -STR_CONTENT_SEARCH_EXTERNAL :{BLACK}搜索整个网络 +STR_CONTENT_SEARCH_EXTERNAL :{BLACK}在外部网站搜索 STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与OpenTTD没有联系的网站搜寻没有纳入OpenTTD內容服务的內容 STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}正在离开游戏! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟OpenTTD引用的规则及条款不同。{}您需要参照有关网站以取得在OpenTTD安装有关內容的资讯。{}您要継续吗? From 28e25765893e6783a80d625d93280fc590a0f665 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 5 Jan 2024 19:48:21 +0100 Subject: [PATCH 5/8] Fix: race-condition when quitting the game with libcurl (#11688) There could be a callback in _new_http_callbacks that is not processed yet. All callbacks in _http_callbacks were cancelled, but not the ones in _new_http_callbacks --- src/network/core/http_curl.cpp | 7 +++---- src/network/core/http_shared.h | 14 -------------- 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index c7a454da8b..e238a81772 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -278,10 +278,9 @@ void NetworkHTTPUninitialize() { _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(); - } + /* Ensure the callbacks are handled. This is mostly needed as we send + * a survey just before close, and that might be pending here. */ + NetworkHTTPSocketHandler::HTTPReceive(); { std::lock_guard lock(_http_mutex); diff --git a/src/network/core/http_shared.h b/src/network/core/http_shared.h index b7549e8fe7..ec3ae79348 100644 --- a/src/network/core/http_shared.h +++ b/src/network/core/http_shared.h @@ -97,20 +97,6 @@ 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() From 7788b68bbed2d8f5b174737dbbe7b11378eb08d3 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 5 Jan 2024 19:54:00 +0100 Subject: [PATCH 6/8] Fix: don't unneededly block on transmitting survey on exit (#11687) --- src/network/network_survey.cpp | 15 ++++++++++++--- src/network/network_survey.h | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/network/network_survey.cpp b/src/network/network_survey.cpp index 9f496a68d6..5e73ffb0b0 100644 --- a/src/network/network_survey.cpp +++ b/src/network/network_survey.cpp @@ -11,6 +11,7 @@ #include "network_survey.h" #include "settings_table.h" #include "network.h" +#include "network_func.h" #include "../debug.h" #include "../survey.h" #include "../3rdparty/fmt/chrono.h" @@ -99,21 +100,29 @@ void NetworkSurveyHandler::Transmit(Reason reason, bool blocking) if (blocking) { std::unique_lock lock(this->mutex); + /* Block no longer than 2 seconds. If we failed to send the survey in that time, so be it. */ - this->loaded.wait_for(lock, std::chrono::seconds(2)); + std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now() + std::chrono::seconds(2); + + while (!this->transmitted && std::chrono::steady_clock::now() < end) { + NetworkBackgroundLoop(); + this->transmitted_cv.wait_for(lock, std::chrono::milliseconds(30)); + } } } void NetworkSurveyHandler::OnFailure() { Debug(net, 1, "Survey: failed to send survey results"); - this->loaded.notify_all(); + this->transmitted = true; + this->transmitted_cv.notify_all(); } void NetworkSurveyHandler::OnReceiveData(std::unique_ptr data, size_t) { if (data == nullptr) { Debug(net, 1, "Survey: survey results sent"); - this->loaded.notify_all(); + this->transmitted = true; + this->transmitted_cv.notify_all(); } } diff --git a/src/network/network_survey.h b/src/network/network_survey.h index 1136e2780d..8acddb9ede 100644 --- a/src/network/network_survey.h +++ b/src/network/network_survey.h @@ -41,7 +41,8 @@ public: private: std::mutex mutex; ///< Mutex for the condition variable. - std::condition_variable loaded; ///< Condition variable to wait for the survey to be sent. + std::atomic transmitted; ///< Whether the survey has been transmitted. + std::condition_variable transmitted_cv; ///< Condition variable to inform changes to transmitted. }; extern NetworkSurveyHandler _survey; From 34e8c8e1c1d1003ffa96ea439c265ca607b206e4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 5 Jan 2024 18:59:38 +0000 Subject: [PATCH 7/8] Codechange: Build station and depot vehicle lists from shared order lists. (#11676) The brings some performance advantages: * No need to iterate all vehicles and check for primary vehicle as only vehicles that can have orders are listed. * Shared orders only need to be tested once instead of for each vehicle sharing them. * Vehicle tests only need to be performed on the first shared vehicle instead of all. --- src/CMakeLists.txt | 1 + src/script/api/script_vehiclelist.cpp | 33 ++++++++----------- src/vehiclelist.cpp | 32 +++++++------------ src/vehiclelist_func.h | 46 +++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 41 deletions(-) create mode 100644 src/vehiclelist_func.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dc1e696a53..05689fe5c5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -510,6 +510,7 @@ add_files( vehiclelist.cpp vehiclelist.h vehiclelist_cmd.h + vehiclelist_func.h viewport.cpp viewport_cmd.h viewport_func.h diff --git a/src/script/api/script_vehiclelist.cpp b/src/script/api/script_vehiclelist.cpp index 5a06e81aef..f3080953c3 100644 --- a/src/script/api/script_vehiclelist.cpp +++ b/src/script/api/script_vehiclelist.cpp @@ -14,6 +14,7 @@ #include "script_station.hpp" #include "../../depot_map.h" #include "../../vehicle_base.h" +#include "../../vehiclelist_func.h" #include "../../train.h" #include "../../core/backup_type.hpp" #include <../squirrel/sqvm.h> @@ -111,16 +112,12 @@ ScriptVehicleList_Station::ScriptVehicleList_Station(StationID station_id) bool is_deity = ScriptCompanyMode::IsDeity(); CompanyID owner = ScriptObject::GetCompany(); - for (const Vehicle *v : Vehicle::Iterate()) { - 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); - break; - } - } - } - } + + FindVehiclesWithOrder( + [is_deity, owner](const Vehicle *v) { return is_deity || v->owner == owner; }, + [station_id](const Order *order) { return (order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT)) && order->GetDestination() == station_id; }, + [this](const Vehicle *v) { this->AddItem(v->index); } + ); } ScriptVehicleList_Depot::ScriptVehicleList_Depot(TileIndex tile) @@ -162,16 +159,12 @@ ScriptVehicleList_Depot::ScriptVehicleList_Depot(TileIndex tile) bool is_deity = ScriptCompanyMode::IsDeity(); CompanyID owner = ScriptObject::GetCompany(); - for (const Vehicle *v : Vehicle::Iterate()) { - 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); - break; - } - } - } - } + + FindVehiclesWithOrder( + [is_deity, owner, type](const Vehicle *v) { return (is_deity || v->owner == owner) && v->type == type; }, + [dest](const Order *order) { return order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == dest; }, + [this](const Vehicle *v) { this->AddItem(v->index); } + ); } ScriptVehicleList_SharedOrders::ScriptVehicleList_SharedOrders(VehicleID vehicle_id) diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp index b7cbbb22b9..1f53986599 100644 --- a/src/vehiclelist.cpp +++ b/src/vehiclelist.cpp @@ -10,6 +10,7 @@ #include "stdafx.h" #include "train.h" #include "vehiclelist.h" +#include "vehiclelist_func.h" #include "group.h" #include "safeguards.h" @@ -116,17 +117,11 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli switch (vli.type) { case VL_STATION_LIST: - for (const Vehicle *v : Vehicle::Iterate()) { - if (v->type == vli.vtype && v->IsPrimaryVehicle()) { - for (const Order *order : v->Orders()) { - if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT) || order->IsType(OT_IMPLICIT)) - && order->GetDestination() == vli.index) { - list->push_back(v); - break; - } - } - } - } + FindVehiclesWithOrder( + [&vli](const Vehicle *v) { return v->type == vli.vtype; }, + [&vli](const Order *order) { return (order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT) || order->IsType(OT_IMPLICIT)) && order->GetDestination() == vli.index; }, + [&list](const Vehicle *v) { list->push_back(v); } + ); break; case VL_SHARED_ORDERS: { @@ -161,16 +156,11 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli break; case VL_DEPOT_LIST: - for (const Vehicle *v : Vehicle::Iterate()) { - if (v->type == vli.vtype && v->IsPrimaryVehicle()) { - for (const Order *order : v->Orders()) { - if (order->IsType(OT_GOTO_DEPOT) && !(order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) && order->GetDestination() == vli.index) { - list->push_back(v); - break; - } - } - } - } + FindVehiclesWithOrder( + [&vli](const Vehicle *v) { return v->type == vli.vtype; }, + [&vli](const Order *order) { return order->IsType(OT_GOTO_DEPOT) && !(order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) && order->GetDestination() == vli.index; }, + [&list](const Vehicle *v) { list->push_back(v); } + ); break; default: return false; diff --git a/src/vehiclelist_func.h b/src/vehiclelist_func.h new file mode 100644 index 0000000000..464bde2ff7 --- /dev/null +++ b/src/vehiclelist_func.h @@ -0,0 +1,46 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file vehiclelist_func.h Functions and type for generating vehicle lists. */ + +#ifndef VEHICLELIST_FUNC_H +#define VEHICLELIST_FUNC_H + +#include "order_base.h" +#include "vehicle_base.h" + +/** + * Find vehicles matching an order. + * This can be used, e.g. to find all vehicles that stop at a particular station. + * @param veh_pred Vehicle selection predicate. This is called only for the first vehicle using the order list. + * @param ord_pred Order selection predicate. + * @param veh_func Called for each vehicle that matches both vehicle and order predicates. + **/ +template +void FindVehiclesWithOrder(VehiclePredicate veh_pred, OrderPredicate ord_pred, VehicleFunc veh_func) +{ + for (const OrderList *orderlist : OrderList::Iterate()) { + + /* We assume all vehicles sharing an order list match the condition. */ + const Vehicle *v = orderlist->GetFirstSharedVehicle(); + if (!veh_pred(v)) continue; + + /* Vehicle is a candidate, search for a matching order. */ + for (const Order *order = orderlist->GetFirstOrder(); order != nullptr; order = order->next) { + + if (!ord_pred(order)) continue; + + /* An order matches, we can add all shared vehicles to the list. */ + for (; v != nullptr; v = v->NextShared()) { + veh_func(v); + } + break; + } + } +} + +#endif /* VEHICLELIST_FUNC_H */ From 7a5106042ffb11b40a2f3ee9fcc33dbc7fbca8a8 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 5 Jan 2024 20:58:24 +0000 Subject: [PATCH 8/8] Codechange: Use CompanyMask and company group statistics for auto clean tests. (#11693) This function does not need to know how many vehicles there are, only that there is at least one. --- src/network/network_server.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 8a4960425e..8bab091caa 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1521,30 +1521,25 @@ static void NetworkCheckRestartMap() */ static void NetworkAutoCleanCompanies() { - bool clients_in_company[MAX_COMPANIES]; - int vehicles_in_company[MAX_COMPANIES]; + CompanyMask has_clients = 0; + CompanyMask has_vehicles = 0; if (!_settings_client.network.autoclean_companies) return; - memset(clients_in_company, 0, sizeof(clients_in_company)); - /* Detect the active companies */ for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (Company::IsValidID(ci->client_playas)) clients_in_company[ci->client_playas] = true; + if (Company::IsValidID(ci->client_playas)) SetBit(has_clients, ci->client_playas); } if (!_network_dedicated) { const NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(CLIENT_ID_SERVER); assert(ci != nullptr); - if (Company::IsValidID(ci->client_playas)) clients_in_company[ci->client_playas] = true; + if (Company::IsValidID(ci->client_playas)) SetBit(has_clients, ci->client_playas); } if (_settings_client.network.autoclean_novehicles != 0) { - memset(vehicles_in_company, 0, sizeof(vehicles_in_company)); - - for (const Vehicle *v : Vehicle::Iterate()) { - if (!Company::IsValidID(v->owner) || !v->IsPrimaryVehicle()) continue; - vehicles_in_company[v->owner]++; + for (const Company *c : Company::Iterate()) { + if (std::any_of(std::begin(c->group_all), std::end(c->group_all), [](const GroupStatistics &gs) { return gs.num_vehicle != 0; })) SetBit(has_vehicles, c->index); } } @@ -1553,7 +1548,7 @@ static void NetworkAutoCleanCompanies() /* Skip the non-active once */ if (c->is_ai) continue; - if (!clients_in_company[c->index]) { + if (!HasBit(has_clients, c->index)) { /* The company is empty for one month more */ _network_company_states[c->index].months_empty++; @@ -1572,7 +1567,7 @@ static void NetworkAutoCleanCompanies() NetworkServerUpdateCompanyPassworded(c->index, false); } /* Is the company empty for autoclean_novehicles-months, and has no vehicles? */ - if (_settings_client.network.autoclean_novehicles != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_novehicles && vehicles_in_company[c->index] == 0) { + if (_settings_client.network.autoclean_novehicles != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_novehicles && !HasBit(has_vehicles, c->index)) { /* Shut the company down */ Command::Post(CCA_DELETE, c->index, CRR_AUTOCLEAN, INVALID_CLIENT_ID); IConsolePrint(CC_INFO, "Auto-cleaned company #{} with no vehicles.", c->index + 1);