From f57296a033c63de0f68e44ae1d6023fe79dac880 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sat, 29 Jul 2023 17:59:02 -0400 Subject: [PATCH 01/77] Change: Only show platform stopping location in orders when other than default (#11102) --- src/lang/english.txt | 2 +- src/order_gui.cpp | 7 ++++++- src/table/settings/gui_settings.ini | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index aa50e7e239..7936796d61 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :New orders are STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normally, a vehicle will stop at every station it passes. By enabling this setting, it will drive through all station on the way to its final destination without stopping. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behaviour nevertheless STR_CONFIG_SETTING_STOP_LOCATION :New train orders stop by default at the {STRING2} of the platform -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behaviour nevertheless +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can have their stop location set by clicking on the order text ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :near end STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :middle diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 29be44dc75..e3e84f21d5 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -287,7 +287,12 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int SetDParam(4, order->IsAutoRefit() ? STR_ORDER_AUTO_REFIT_ANY : CargoSpec::Get(order->GetRefitCargo())->name); } if (v->type == VEH_TRAIN && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) { - SetDParam(5, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END); + /* Only show the stopping location if other than the default chosen by the player. */ + if (order->GetStopLocation() != (OrderStopLocation)(_settings_client.gui.stop_location)) { + SetDParam(5, order->GetStopLocation() + STR_ORDER_STOP_LOCATION_NEAR_END); + } else { + SetDParam(5, STR_EMPTY); + } } } break; diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 6780ae01fa..8cf0ebfb3c 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -600,6 +600,7 @@ interval = 1 str = STR_CONFIG_SETTING_STOP_LOCATION strhelp = STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT strval = STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END +post_cb = [](auto) { SetWindowClassesDirty(WC_VEHICLE_ORDERS); } cat = SC_BASIC [SDTC_BOOL] From 5a2e9be9d31104f5ceda1f2c1e49a17c0e1b9554 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 30 Jul 2023 18:38:12 +0000 Subject: [PATCH 02/77] Update: Translations from eints vietnamese: 10 changes by KhoiCanDev french: 15 changes by Lishouuu, 9 changes by ottdfevr --- src/lang/french.txt | 29 ++++++++++++++++++++++++----- src/lang/vietnamese.txt | 15 ++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/lang/french.txt b/src/lang/french.txt index 98ac23e371..904611ad69 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -178,7 +178,7 @@ STR_COLOUR_PALE_GREEN :Vert pâle STR_COLOUR_PINK :Rose STR_COLOUR_YELLOW :Jaune STR_COLOUR_RED :Rouge -STR_COLOUR_LIGHT_BLUE :Bleu pâle +STR_COLOUR_LIGHT_BLUE :Bleu clair STR_COLOUR_GREEN :Vert STR_COLOUR_DARK_GREEN :Vert foncé STR_COLOUR_BLUE :Bleu @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :Blanc STR_COLOUR_RANDOM :Aléatoire ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Bleu foncé +STR_COLOUR_SECONDARY_PALE_GREEN :Vert pâle +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rose +STR_COLOUR_SECONDARY_YELLOW :Jaune +STR_COLOUR_SECONDARY_RED :Rouge +STR_COLOUR_SECONDARY_LIGHT_BLUE :Bleu clair +STR_COLOUR_SECONDARY_GREEN :Vert +STR_COLOUR_SECONDARY_DARK_GREEN :Vert foncé +STR_COLOUR_SECONDARY_BLUE :Bleu +STR_COLOUR_SECONDARY_CREAM :Beige +STR_COLOUR_SECONDARY_MAUVE :Mauve +STR_COLOUR_SECONDARY_PURPLE :Violet +STR_COLOUR_SECONDARY_ORANGE :Orange +STR_COLOUR_SECONDARY_BROWN :Marron +STR_COLOUR_SECONDARY_GREY :Gris +STR_COLOUR_SECONDARY_WHITE :Blanc +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Identique à la primaire # Units used in OpenTTD @@ -1297,7 +1314,7 @@ STR_CONFIG_SETTING_CATCHMENT :Autoriser des z STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Les zones de desserte ont des tailles différentes selon les types de stations et d'aéroports STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Les stations des compagnies peuvent desservir les industries avec une station intégrée{NBSP}: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Si activé, les industries avec une station intégrée (comme les plateformes pétrolières) peuvent aussi être desservies par les stations des compagnies construites à proximité. Si désactivé, ces industries peuvent uniquement être desservies par leur station intégrée. Aucune station de compagnie ne pourra desservir cette industrie, et la station intégrée ne desservira que cette industrie. +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Si activé, les industries avec une station intégrée (comme les plateformes pétrolières) peuvent aussi être desservies par les stations des compagnies construites à proximité. Si désactivé, ces industries peuvent uniquement être desservies par leur station intégrée. Aucune station de compagnie ne pourra desservir cette industrie, et la station intégrée ne desservira que cette industrie STR_CONFIG_SETTING_EXTRADYNAMITE :Permettre le retrait de plus d'éléments possédés par une ville{NBSP}: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Simplifier le retrait d'éléments possédés par une ville @@ -1410,8 +1427,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Aucun* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Réduit STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Autoriser les arrêts de bus sur les routes des municipalités{NBSP}: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Autoriser la construction des arrêts de bus sur les routes des municipalités +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Autoriser les arrêts de bus sur les routes appartenant aux municipalités{NBSP}: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Autoriser la construction des arrêts de bus sur les routes appartenant aux municipalités STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Autoriser les arrêts de bus sur les routes des concurrents{NBSP}: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Autoriser la construction des arrêts de bus sur les routes d'autres compagnies STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Il n'est pas possible de modifier ce paramètre quand il y a des véhicules @@ -1422,6 +1439,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Si activé, les STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Couleur de la compagnie au démarrage{NBSP}: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Choisir la couleur de démarrage pour la compagnie +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Seconde couleur de la compagnie au démarrage{NBSP}: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Choisir une seconde couleur pour le démarrage de la compagnie, si un NewGRF l'utilise. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Les aéroports n'expirent jamais{NBSP}: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activer ce paramètre fait que chaque type d'aéroports reste toujours disponible après son introduction @@ -4873,7 +4892,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Trop d'a STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Trop près d'un autre port STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Trop près d'un autre aéroport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Impossible de renommer la gare... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... cette route appartient à une ville +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... route appartenant à une ville STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... mauvaise orientation de la route STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les arrêts ne peuvent pas avoir de virages STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les arrêts ne peuvent pas avoir de jonctions diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 2a3370f8a6..639bf9bed3 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -194,9 +194,13 @@ STR_COLOUR_RANDOM :Ngẫu nhiên STR_COLOUR_SECONDARY_DARK_BLUE :Xanh da trời đậm STR_COLOUR_SECONDARY_PALE_GREEN :Xanh lá cây nhạt STR_COLOUR_SECONDARY_SECONDARY_PINK :Hồng +STR_COLOUR_SECONDARY_YELLOW :Vàng +STR_COLOUR_SECONDARY_RED :Đỏ STR_COLOUR_SECONDARY_LIGHT_BLUE :Xanh da trời nhạt +STR_COLOUR_SECONDARY_GREEN :Xanh lá cây STR_COLOUR_SECONDARY_DARK_GREEN :Xanh lá cây đậm STR_COLOUR_SECONDARY_BLUE :Xanh da trời +STR_COLOUR_SECONDARY_CREAM :Kem STR_COLOUR_SECONDARY_MAUVE :Tím nhạt STR_COLOUR_SECONDARY_PURPLE :Tím STR_COLOUR_SECONDARY_ORANGE :Cam @@ -1422,8 +1426,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :không* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :giảm bớt STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :bình thường -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Cho phép xây điểm dừng xe buýt trên đường của thị trấn: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Cho phép xây dựng điểm dừng xe buýt trên đường sở hữu bởi địa phương +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Cho phép xây điểm dừng xe buýt trên đường sở hữu bởi thị trấn: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Cho phép xây dựng điểm dừng xe buýt trên đường thuộc sở hữu của địa phương STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Cho phép xây điểm dừng xe buýt trên đường của đối thủ: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Cho phép xây dựng điểm dừng xe buýt trên đường sở hữu bởi công ty khác STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Không thể đổi thiết đặt này khi vẫn còn các phương tiện giao thông. @@ -1431,9 +1435,10 @@ STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Không t STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Phí bảo trì cơ sở hạ tầng: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Khi mở, thì hạ tầng công ty sẽ sinh ra chi phí bảo trì. Chi phí sẽ tăng theo mạng lưới giao thông bạn xây dựng, và sẽ tiêu tốn của công ty lớn nhiều hơn công ty nhỏ -STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Màu bắt đầu của công ty: {STRING} -STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Thay đổi màu sắc mặc định khi bắt đầu công ty +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Màu chủ đạo của công ty: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Thay đổi màu sắc chủ đạo của công ty +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Màu phụ của công ty: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Thay đổi màu sắc phụ khi bắt đầu công ty, nếu sử dụng NewGRF bật tính năng này STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Sân bay không bao giờ hết hạn sử dụng: {STRING} @@ -4886,7 +4891,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Quá nhi STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Quá sát với hải cảng khác STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Quá sát với sân bay khác STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Không thể đổi tên ga, bến,cảng... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... đây là đường của địa phương +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... đây là đường sở hữu bởi địa phương STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... đường quay mặt sai hướng STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... đi qua điểm dừng không thể đi qua góc STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... đi qua điểm dừng không thể có ngã rẽ From 4decd2aa48ae55786c6f197a4983fd7e0da76139 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 30 Jul 2023 17:00:44 -0400 Subject: [PATCH 03/77] Change: Enable "Forbid 90 degree turns" setting by default --- src/table/settings/pathfinding_settings.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index 20c08aced4..b25c69dfa1 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -38,7 +38,7 @@ startup = false [SDT_BOOL] var = pf.forbid_90_deg -def = false +def = true str = STR_CONFIG_SETTING_FORBID_90_DEG strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT post_cb = InvalidateShipPathCache From 9876c861e4cd8779ddf523b12670b64983abae64 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 30 Jul 2023 17:27:14 -0400 Subject: [PATCH 04/77] Remove: Unused ship pathfinder invalidation setting callback --- src/table/settings/pathfinding_settings.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index b25c69dfa1..df2494d351 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -41,7 +41,6 @@ var = pf.forbid_90_deg def = true str = STR_CONFIG_SETTING_FORBID_90_DEG strhelp = STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT -post_cb = InvalidateShipPathCache cat = SC_EXPERT [SDT_BOOL] From 43559524eb43d80d7c0123ff01aceb1c5d6d305f Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 31 Jul 2023 18:39:05 +0000 Subject: [PATCH 05/77] Update: Translations from eints english (au): 1 change by krysclarke english (us): 1 change by 2TallTyler portuguese: 1 change by azulcosta --- src/lang/english_AU.txt | 2 +- src/lang/english_US.txt | 2 +- src/lang/portuguese.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 8dcd23cc15..591833acae 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :New orders are STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normally, a vehicle will stop at every station it passes. By enabling this setting, it will drive through all stations on the way to its final destination without stopping. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behaviour nevertheless STR_CONFIG_SETTING_STOP_LOCATION :New train orders stop by default at the {STRING} of the platform -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behaviour nevertheless +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can have their stop location set by clicking on the order text ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :near end STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :middle diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index a1d4ff0091..10928ec5d5 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :New orders are STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normally, a vehicle will stop at every station it passes. By enabling this setting, it will drive through all stations on the way to its final destination without stopping. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behavior nevertheless STR_CONFIG_SETTING_STOP_LOCATION :New train orders stop by default at the {STRING} of the platform -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can be set explicitly to either behavior nevertheless +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Place where a train will stop at the platform by default. The 'near end' means close to the entry point, 'middle' means in the middle of the platform, and 'far end' means far away from the entry point. Note, that this setting only defines a default value for new orders. Individual orders can have their stop location set by clicking on the order text ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :near end STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :middle diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 55bed8aee8..e449f1ee45 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1384,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Novas ordens s STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalmente, um veículo para em cada estação por onde passa. Ao ativar esta configuração, um veículo irá passar por todas as estações no seu percurso, parando apenas no destino final. Esta opção só tem efeito para novas rotas, mas as rotas existentes podem ser alteradas para funcionarem de forma igual. STR_CONFIG_SETTING_STOP_LOCATION :Ordens novas do comboio param {STRING} da plataforma -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local de paragem do comboio nas plataformas por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afeta o valor por omissão para novas ordens. Ordens individuais podem utilizar qualquer uma das opções independentemente desta +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local de paragem do comboio nas plataformas por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afeta o valor por omissão para novas ordens. Ordens individuais podem ter o local de paragem definido clicando no texto da ordem ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :no extremo perto STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :no meio From 4acb68e539ecb8559ff499a2917c29969f5252ac Mon Sep 17 00:00:00 2001 From: PeterN Date: Tue, 1 Aug 2023 15:05:42 +0100 Subject: [PATCH 06/77] Fix #11162: Get colour map of correct train part. (#11163) --- src/train_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/train_gui.cpp b/src/train_gui.cpp index 4c121fb135..00d2703e55 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -378,7 +378,7 @@ void DrawTrainDetails(const Train *v, const Rect &r, int vscroll_pos, uint16_t v if (e->GetGRF() != nullptr) { pitch = ScaleSpriteTrad(e->GetGRF()->traininfo_vehicle_pitch); } - PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v); + PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(u); VehicleSpriteSeq seq; u->GetImage(dir, EIT_IN_DETAILS, &seq); seq.Draw(px + (rtl ? -offset.x : offset.x), r.top - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->vehstatus & VS_CRASHED) != 0); From 4213a2c909931981130802f8e8ca35d970e0e8ac Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 1 Aug 2023 18:38:22 +0000 Subject: [PATCH 07/77] Update: Translations from eints russian: 1 change by Ln-Wolf turkish: 33 changes by densxd danish: 1 change by bscargo french: 1 change by Lishouuu polish: 21 changes by pAter-exe --- src/lang/danish.txt | 2 +- src/lang/french.txt | 2 +- src/lang/polish.txt | 23 +++++++++++++++++++++-- src/lang/russian.txt | 2 +- src/lang/turkish.txt | 44 +++++++++++++++++++++++++++++++++----------- 5 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index b07aa8b10b..37d7a8dfac 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nye ordrer er ' STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalt vil et køretøj stoppe ved hver station den passerer. Ved at aktivere denne indstilling, vil det passere alle stationer på vej til sin endelige destination uden at stoppe. Bemærk, at denne indstilling kun definerer en standardværdi for nye ordrer. Individuelle ordrer kan indstilles udtrykkeligt til en specific adfærd alligevel STR_CONFIG_SETTING_STOP_LOCATION :Nye togordrer stopper som standard ved {STRING} af perronen -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Stedet hvor et tog vil standse ved perronen som standard. Den "nærmeste ende" forstås tæt på indgangen, 'midten' betyder i midten af platformen, og "fjerneste ende" forstås længest væk fra indgang. Bemærk, at denne indstilling kun definerer en standardværdi for nye ordrer. Individuelle ordrer kan indstilles udtrykkeligt til anden adfærd alligevel +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Der hvor et tog vil standse ved perronen som standard. Den "nærmeste ende" forstås tæt på indgangen, 'midten' betyder i midten af platformen, og "fjerneste ende" forstås længest væk fra indgang. Bemærk, at denne indstilling kun definerer en standardværdi for nye ordrer. Individuelle ordrer kan indstilles udtrykkeligt til anden adfærd alligevel ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :den nærmeste ende STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :midten diff --git a/src/lang/french.txt b/src/lang/french.txt index 904611ad69..a63e6e020c 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1384,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Les nouveaux or STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalement, un véhicule s'arrête dans chaque station qu'il traverse. En activant ce paramètre, il traversera toutes les stations sur le chemin de sa destination finale sans s'arrêter. Noter que ce paramètre définit uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent par après être réglés individuellement avec un autre comportement STR_CONFIG_SETTING_STOP_LOCATION :Les nouveaux ordres arrêtent les trains {G 0 au au "à la"} {STRING} du quai par défaut -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Endroit du quai où un train s'arrête par défaut. "queue" signifie proche du point d'entrée. "milieu" signifie au milieu du quai. "tête" signifie à l'opposé du point d'entrée. Noter que ce paramètre défini uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent par ailleurs être réglés individuellement avec un autre comportement +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Endroit du quai où un train s'arrête par défaut. "queue" signifie proche du point d'entrée. "milieu" signifie au milieu du quai. "tête" signifie à l'opposé du point d'entrée. Noter que ce paramètre défini uniquement une valeur par défaut pour les nouveaux ordres. Les ordres peuvent avoir leur emplacement d'arrêt défini individuellement en cliquant sur le texte de l'ordre ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :{G=f}queue STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :{G=m}milieu diff --git a/src/lang/polish.txt b/src/lang/polish.txt index d425ed608a..aad5b5eee3 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -570,6 +570,23 @@ STR_COLOUR_WHITE :Biały STR_COLOUR_RANDOM :Losowy ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Ciemnoniebieski +STR_COLOUR_SECONDARY_PALE_GREEN :Bladozielony +STR_COLOUR_SECONDARY_SECONDARY_PINK :Różowy +STR_COLOUR_SECONDARY_YELLOW :Żółty +STR_COLOUR_SECONDARY_RED :Czerwony +STR_COLOUR_SECONDARY_LIGHT_BLUE :Jasnoniebieski +STR_COLOUR_SECONDARY_GREEN :Zielony +STR_COLOUR_SECONDARY_DARK_GREEN :Ciemnozielony +STR_COLOUR_SECONDARY_BLUE :Niebieski +STR_COLOUR_SECONDARY_CREAM :Kremowy +STR_COLOUR_SECONDARY_MAUVE :Fiołkoworóżowy +STR_COLOUR_SECONDARY_PURPLE :Purpurowy +STR_COLOUR_SECONDARY_ORANGE :Pomarańczowy +STR_COLOUR_SECONDARY_BROWN :Brązowy +STR_COLOUR_SECONDARY_GREY :Szary +STR_COLOUR_SECONDARY_WHITE :Biały +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Taki jak podstawowy # Units used in OpenTTD @@ -1801,6 +1818,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Kiedy włączon STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Początkowy kolor firmy: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Wybierz początkowy kolor dla firmy +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Początkowy kolor dodatkowy firmy: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Wybierz początkowy kolor dodatkowy dla firmy, jeśli używany jest NewGRF, który go wykorzystuje. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Pozwól budować stare lotniska: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Włączona opcja sprawia, że każdy typ lotniska będzie dostępny na zawsze od chwili wprowadzenia @@ -2551,7 +2570,7 @@ STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Pokaż s STR_LIVERY_SHIP_TOOLTIP :{BLACK}Pokaż schematy koloru statków STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Pokaż schematy koloru samolotów STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Wybierz główny kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów -STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz drugi kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów +STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Wybierz dodatkowy kolor dla wybranego schematu. Ctrl+klik ustawi ten kolor dla wszystkich schematów STR_LIVERY_PANEL_TOOLTIP :{BLACK}Wybierz schemat kolorów do zmiany, albo wiele schematów z CTRL+klik. Kliknij na okienku aby wł./wył. używanie schematu. ###length 23 @@ -5258,7 +5277,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Zbyt wie STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Zbyt blisko innego portu STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Zbyt blisko innego lotniska STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nie można zmienić nazwy stacji... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ta droga należy do miasta +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... droga należąca do miasta STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... droga jest zorientowana w złym kierunku STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... przystanki przelotowe nie mogą mieć zakrętów STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... przystanki przelotowe nie mogą mieć skrzyżowań diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 3feb01ea7e..231e445fdf 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1534,7 +1534,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Создава STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Обычно транспортное средство останавливается на каждой станции, через которое проезжает. Если в задании стоит метка «без остановок», то ТС не останавливается на пути к станции назначения. Эта настройка влияет только на вновь создаваемые задания; после создания маршрута каждое задание можно настроить индивидуально. STR_CONFIG_SETTING_STOP_LOCATION :По умолчанию поезда останавливаются {STRING} станции -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Укажите, в какой части станции должны останавливаться поезда. «Начало станции» обозначает тот край платформы, куда поезд прибывает; «середина станции» - середину платформы; «конец станции» - край платформы, противоположный тому, откуда прибыл поезд. Учтите, что это значения по умолчанию; в каждом задании можно указать своё место остановки. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Укажите, в какой части станции должны останавливаться поезда. «Начало станции» обозначает тот край платформы, куда поезд прибывает; «середина станции» - середину платформы; «конец станции» - край платформы, противоположный тому, откуда прибыл поезд. Учтите, что это значения по умолчанию; для каждого задания можно указать место остановки щелчком по тексту задания. ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :в начале STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :в середине diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index c8cbeb8552..4012f9bbe8 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :Beyaz STR_COLOUR_RANDOM :Rastgele ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Koyu Mavi +STR_COLOUR_SECONDARY_PALE_GREEN :Soluk Yeşil +STR_COLOUR_SECONDARY_SECONDARY_PINK :Pembe +STR_COLOUR_SECONDARY_YELLOW :Sarı +STR_COLOUR_SECONDARY_RED :Kırmızı +STR_COLOUR_SECONDARY_LIGHT_BLUE :Açık Mavi +STR_COLOUR_SECONDARY_GREEN :Yeşil +STR_COLOUR_SECONDARY_DARK_GREEN :Koyu Yeşil +STR_COLOUR_SECONDARY_BLUE :Mavi +STR_COLOUR_SECONDARY_CREAM :Krem +STR_COLOUR_SECONDARY_MAUVE :Leylak +STR_COLOUR_SECONDARY_PURPLE :Mor +STR_COLOUR_SECONDARY_ORANGE :Turuncu +STR_COLOUR_SECONDARY_BROWN :Kahverengi +STR_COLOUR_SECONDARY_GREY :Gri +STR_COLOUR_SECONDARY_WHITE :Beyaz +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Birincil Ile Aynı # Units used in OpenTTD @@ -1063,7 +1080,7 @@ STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}60Hz'den yüksek tazeleme oranları performansı etkileyebilir. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Temel grafik kümesi -STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kullanılacak temel grafik kümesini seçin +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kullanılacak temel grafik kümesini seçin (oyun içinde değiştirlemez sadece ana menüde değiştirebilinir) STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} kayıp/bozuk dosya STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Temel grafik setiyle ilgili ilave bilgiler @@ -1297,7 +1314,7 @@ STR_CONFIG_SETTING_CATCHMENT :İstasyon kapsa STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Farklı istasyon ve hava limanları için farklı büyüklükte alanlar gerekir STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Şirket istasyonları, bağlı nötr istasyonları olan endüstrilere hizmet edebilir: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Etkinleştirildiğinde, bağlı istasyonları olan endüstrilere (Petrol Kuleleri gibi) yakınlarda kurulan şirkete ait istasyonlar da hizmet verebilir. Devre dışı bırakıldığında, bu sektörlere yalnızca bağlı istasyonları tarafından hizmet verilebilir. Yakındaki herhangi bir şirket istasyonu onlara hizmet veremeyecek ve ekli istasyon sektör dışında başka bir şeye hizmet etmeyecek +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Etkinleştirildiğinde, bağlı istasyonlara (Petrol Kuleleri gibi) sahip endüstrilere, yakınlarda inşa edilen şirkete ait istasyonlar tarafından da hizmet verilebilir. Devre dışı bırakıldığında, bu sektörlere yalnızca bağlı oldukları istasyonlar tarafından hizmet verilebilir. Yakındaki herhangi bir şirket istasyonu onlara hizmet veremeyecektir ve bağlı istasyon endüstri dışında başka bir şeye hizmet etmeyecektir. STR_CONFIG_SETTING_EXTRADYNAMITE :Şehirlere ait köprülerin, yolların ve tünellerin yıkılmasına izin vermeleri için, şehir yetkililerinin toleransını arttır: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Belediyelerin sahip olduğu altyapı ve binaların yıkımını kolaylaştır @@ -1367,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Yeni talimatlar STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalde bir araç geçtiği tüm istasyonlarda durur. Bu ayarın etkinleştirilmesi ile araçlar son duraklarına kadarki istasyonlardan durmaksızın geçerler. Not: bu ayarlama yalnızca yeni talimatlar için önceden belirlenmiş bir değeri tarif eder. Tek başına verilen talimatlar yine ayrıca belirlenebilir STR_CONFIG_SETTING_STOP_LOCATION :Yeni tren talimatları için varsayılan durma yeri platformun {STRING} kısmıdır -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Bir trenin platformun neresinde duracağını ayarlayın. ‘Yakın uç’ giriş noktasına yakın demektir, ‘orta’ platformun ortasını ifade eder, ‘uzak uç’ giriş noktasından uzak olan ucu ifade eder. Not: bu ayarlama yalnızca yeni talimatlar için önceden belirlenmiş bir değeri tarif eder. Tek başına verilen talimatlar yine ayrıca belirlenebilir +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Bir trenin varsayılan olarak platformda duracağı yer. 'Yakın uç', giriş noktasına yakın, 'orta', platformun ortasında ve 'uzak uç', giriş noktasından uzakta anlamına gelir. Bu ayarın yalnızca yeni siparişler için bir varsayılan değer tanımladığını unutmayın. Bireysel siparişler, sipariş metnine tıklayarak durma konumlarını ayarlayabilir ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :yakın uç STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :orta @@ -1410,8 +1427,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Hiç STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Azaltılmış STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Şehiriçi yollara durak yapmak izinli: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Kasabanın sahip olduğu yollarda yol üstü durakların inşasına izin verir +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Kasabaların sahip olduğu yollarda arabalı yol duraklarına izin ver: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Kasabaların sahip olduğu yollarda arabalı yol duraklarının inşasına izin ver STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Rakiplerin yolu üzerinde durak yapmaya izin ver: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Başka şirketlerin sahip olduğu yollarda yol üstü durakların inşasına izin verir STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Araçlar varken bu ayarı değiştirmezsiniz @@ -1422,6 +1439,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Etkinleştirild STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Şirket başlangıç rengi: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Şirketin başlangıç rengini seç +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Başlangıç şirketin ikinci rengi: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Bunu etkinleştiren bir NewGRF kullanıyorsanız, şirket için başlangıç ikincil rengini seçin. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Havalimanlarının süresi asla dolmasın: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Bu ayarı etkinleştirmek her havaalanı türünün, tanıtımından sonra sürekli olarak kullanılabilir kalmasını sağlar. @@ -1624,6 +1643,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Kapalı STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Sağ tıklama ile pencereyi kapat: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :İçerisinde sağ tıklandığında pencereyi kapatır. Sağ tıklandığında ipuçları gösterimini devre dışı bırakır! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Hayır +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Evet +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Evet, yapışkan hariç STR_CONFIG_SETTING_AUTOSAVE :Otomatik kaydet: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Otomatik oyun kaydetme sıklığını seçin @@ -3088,7 +3110,7 @@ STR_ABOUT_VERSION :{BLACK}OpenTTD STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-{STRING} OpenTTD ekibi # Framerate display window -STR_FRAMERATE_CAPTION :{WHITE}Kare oranı +STR_FRAMERATE_CAPTION :{WHITE}Kare Oranı STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Simülasyon oranı: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Saniyede simüle edilen oyun zaman birim sayısı. @@ -3547,7 +3569,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Şirket sahibinin heykelini dik.{}Şehirdeki istasyon derecelendirmesinde kalıcı bir yükseltme sağlar.{}{POP_COLOUR}Fiyatı: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Şehirde ticari binaların yapımı için bağış yap.{}Bu kasabanın büyümesine geçici bir yükseltme sağlar.{}{POP_COLOUR}Fiyatı: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW} Bir yıllık ayrıcalıklı nakliyat haklarını satın al.{} Belediye, rakip istasyonların yolcu ve kargo taşımasına izin vermez. Bir rakipten alınan başarılı bir rüşvet, bu sözleşmeyi iptal edecektir.{}{POP_COLOUR} Fiyat: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Yakalanırsan şiddetli bir ceza alma riskini göze alarak yerel yönetime bölge derecelendirmesini arttırmak için rüşvet ver.{}{POP_COLOUR}Fiyat: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Puanınızı yükseltmek için yerel makamlara rüşvet verin ve bir rakibin özel taşıma haklarını iptal edin, yakalanırsa ciddi bir ceza alma riskini göze alın.{}{POP_COLOUR}Maliyet: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Hedefler @@ -3865,8 +3887,8 @@ STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRIN STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Garaja Gönder STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Garaja Gönder -STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Tersaneye Gönder -STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Hangara Gönder +STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Tersaneye gönder +STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Hangara gönder STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Listedeki tüm araçları durdurmak için bas STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Listedeki tüm araçları başlatmak için bas @@ -4620,7 +4642,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}YZ Hata # AI configuration window STR_AI_CONFIG_CAPTION_AI :{WHITE}YZ Ayarları -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Oyun Betiği Yapılandırması +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Oyun Betiği Ayarları STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Bir sonraki oyunda yüklenecek Oyun Betiği STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Bir sonraki oyunda yüklenecek YZ'ler STR_AI_CONFIG_HUMAN_PLAYER :İnsan oyuncu @@ -4870,7 +4892,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Çok faz STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Başka bir limana çok yakın STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Başka bir havalimanına çok yakın STR_ERROR_CAN_T_RENAME_STATION :{WHITE}İsim değiştirilemiyor... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... bu yol belediyeye ait +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... yol kasabaya ait STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... yol yanlış yönde STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... yol üstü duraklar köşe üzerine inşa edilemez STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... yol üstü duraklar kavşak üzerine inşa edilemez From 6a048bc168423b585c6f33e95e6a2822843801ef Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 1 Aug 2023 19:06:41 +0100 Subject: [PATCH 08/77] Fix #11164: Duplicate town names when using the many random towns function --- src/town_cmd.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index ca8ac9f8c7..50b38fea37 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2256,6 +2256,11 @@ bool GenerateTowns(TownLayout layout) SetGeneratingWorldProgress(GWP_TOWN, total); + /* Pre-populate the town names list with the names of any towns already on the map */ + for (const Town *town : Town::Iterate()) { + town_names.insert(town->GetCachedName()); + } + /* First attempt will be made at creating the suggested number of towns. * Note that this is really a suggested value, not a required one. * We would not like the system to lock up just because the user wanted 100 cities on a 64*64 map, would we? */ From 11ba39b4358d5ac71fe1abc3d4d26afb72d08332 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 2 Aug 2023 18:38:24 +0000 Subject: [PATCH 09/77] Update: Translations from eints korean: 21 changes by telk5093 polish: 1 change by pAter-exe --- src/lang/korean.txt | 23 +++++++++++++++++++++-- src/lang/polish.txt | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 8ba0618ace..48cac3644a 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :흰색 STR_COLOUR_RANDOM :무작위 ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :어두운 파랑 +STR_COLOUR_SECONDARY_PALE_GREEN :연한 녹색 +STR_COLOUR_SECONDARY_SECONDARY_PINK :분홍 +STR_COLOUR_SECONDARY_YELLOW :노랑 +STR_COLOUR_SECONDARY_RED :빨강 +STR_COLOUR_SECONDARY_LIGHT_BLUE :밝은 파랑 +STR_COLOUR_SECONDARY_GREEN :녹색 +STR_COLOUR_SECONDARY_DARK_GREEN :어두운 녹색 +STR_COLOUR_SECONDARY_BLUE :파랑 +STR_COLOUR_SECONDARY_CREAM :연한 분홍 +STR_COLOUR_SECONDARY_MAUVE :연한 보라 +STR_COLOUR_SECONDARY_PURPLE :보라 +STR_COLOUR_SECONDARY_ORANGE :주황 +STR_COLOUR_SECONDARY_BROWN :갈색 +STR_COLOUR_SECONDARY_GREY :회색 +STR_COLOUR_SECONDARY_WHITE :흰색 +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :주 색상과 같게 # Units used in OpenTTD @@ -1367,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :새로 지정 STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :일반적으로 차량은 경로 상에 있는 모든 역에 정차하게 되어있습니다. 이 설정을 켜면, 차량이 마지막 목적지까지 정차없이 모든 역을 통과할 것입니다. 이 설정은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 하지만 각 차량의 경로는 두 가지 방법 중에 원하는 대로 다시 설정할 수 있습니다. STR_CONFIG_SETTING_STOP_LOCATION :새로 지정하는 역 정차 경로는 기본적으로 역의 {STRING}에 정지하도록 설정 -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :열차가 기본적으로 정거장의 어느 위치에 정차할 것인지를 설정합니다. '가까운 쪽'은 역에 진입하는 곳과 가까운 곳에, '중간'은 역 중앙에, '먼쪽'은 진입하는 곳과 먼 곳에 정차합니다. 이 설정은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 하지만 각 차량의 경로는 두 가지 방법 중에 원하는 대로 다시 설정할 수 있습니다. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :열차가 기본적으로 정거장의 어느 위치에 정차할 것인지를 설정합니다. '가까운 쪽'은 역에 진입하는 곳과 가까운 곳에, '중간'은 역 중앙에, '먼쪽'은 진입하는 곳과 먼 곳에 정차합니다. 이 설정은 새로 경로를 지정하는 차량에만 적용되는 점을 알아두십시오. 개별 경로의 정차 위치는 그 경로를 클릭해서 변경할 수 있습니다. ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :가까운쪽 STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :중간 @@ -1422,6 +1439,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :이 설정을 STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :시작시 회사 색상: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :새 회사에서 사용할 색상을 선택합니다 +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :시작시 회사 부 색상: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :부 색상을 지원하는 NewGRF를 사용할 경우, 새 회사에서 사용할 부 색상을 선택합니다. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :옛날 공항을 사라지지 않고 계속 만들 수 있게 함: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :이 설정을 켜면, 소형 공항을 포함한 모든 공항 종류를 도입 이후에 계속 사용할 수 있게 됩니다. @@ -4873,7 +4892,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}트럭 STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}다른 항구와 너무 가깝습니다 STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}다른 공항과 너무 가깝습니다 STR_ERROR_CAN_T_RENAME_STATION :{WHITE}역 이름을 바꿀 수 없습니다... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... 여기는 도시 소유의 도로 입니다 +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... 도시 소유의 도로입니다 STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... 도로의 방향과 일치하지 않습니다 STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... 통과식 도로 정류장은 굽은 도로에 건설할 수 없습니다 STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... 통과식 도로 정류장은 교차로에 건설할 수 없습니다 diff --git a/src/lang/polish.txt b/src/lang/polish.txt index aad5b5eee3..b6674cf3b5 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1763,7 +1763,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nowe polecenia STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalnie pojazd zatrzyma się na każdej stacji, przez którą przejeżdża. Po włączeniu tej opcji, pojazd przejedzie do swojego celu bez zatrzymywania się. Zwróć uwagę na to, że to ustawienie ma wpływ tylko na nowe polecenia. Pojedyncze polecenia mogą być ustalane bez względu na wartość tej opcji STR_CONFIG_SETTING_STOP_LOCATION :Nowe rozkazy pociągu kończą się domyślnie na {STRING} peronu -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Miejsce, w którym pociąg domyślnie zatrzyma się na peronie. 'Początek' oznacza blisko kierunku przyjazdu, 'środek' oznacza środkową część peronu, a 'koniec' oznacza daleko od kierunku przyjazdu. Zapamiętaj, że to ustawienie określa tylko domyślną wartość dla nowych poleceń. Wszystkie rozkazy mogą być zmienione, bez względu na wartość ustawienia +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Miejsce, w którym pociąg domyślnie zatrzyma się na peronie. „Początek” oznacza blisko wjazdu, „środek” oznacza środkową część peronu, a „koniec” oznacza daleko od wjazdu. Pamiętaj, że to ustawienie określa tylko domyślną wartość dla nowych poleceń. Miejsce zatrzymania poszczególnych poleceń można ustawić, klikając na tekst danego polecenia ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :początku STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :środku From 9d376dc8e05ec8fc5510ffb1fca33bdad00f3a0d Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 3 Aug 2023 18:38:02 +0000 Subject: [PATCH 10/77] Update: Translations from eints finnish: 1 change by hpiirai portuguese (brazilian): 1 change by pasantoro --- src/lang/brazilian_portuguese.txt | 2 +- src/lang/finnish.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 7baf2584f9..197e6f55e9 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1384,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Novas ordens s STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalmente, um veículo para em todas as estações por qual passa. Ativando essa configuração fará com que o veículo pule todas as estações até chegar no seu destino final. Note que isso se aplica para novas ordens padrão. É possível alterar esse comportamento individualmente para cada ordem STR_CONFIG_SETTING_STOP_LOCATION :Novas ordens de trem param no {STRING} da plataforma -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Define onde um trem irá parar na plataforma por padrão. 'Fim' significa parar próximo da saída da estação. 'Meio' significa no meio da plataforma e 'Início' significa próximo à entrada da estação. Isso apenas afeta as novas ordens padrão. Esse comportamento pode ser definido individualmente para cada ordem +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local onde um trem irá parar na plataforma. 'Início' significa próximo à entrada da estação, 'Meio' significa no meio da plataforma e 'Fim' significa parar próximo da saída da estação. Isso define um padrão que afeta apenas as novas ordens. Ordens individuais podem ter o local de parada definido clicando no texto da ordem ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :início STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :meio diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index db666dc25d..179a7f0833 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Uudet käskyt o STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaalisti kulkuneuvo pysähtyy jokaisella läpikulkemallaan asemalla. Mikäli tämä asetus on käytössä kulkuneuvot eivät pysähdy ajaessaan asemien läpi. Huomioi, että tämä asetus määrittää oletusarvoisen toiminnon uusille kulkuneuvoille. Asetusta voidaan muuttaa erikseen kunkin kulkuneuvon kohdalla STR_CONFIG_SETTING_STOP_LOCATION :Uudet junien käskyt pysäyttävät junan aseman {STRING} -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Paikka, johon juna pysähtyy oletuksena asemalla. ”Alkuun” tarkoittaa, että junan viimeinen vaunu pysähtyy laiturin alkuun; ”keskelle” tarkoittaa junan pysähtymistä keskelle laituria; ja ”loppuun” tarkoittaa, että veturi pysähtyy laiturin päähän. Huomaa, että tämä asetus määrittää vain oletusarvon uusille käskyille. Yksittäisten käskyjen kohdalla käyttäytymistä voi muuttaa tästä asetuksesta huolimatta +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Paikka, johon juna pysähtyy oletuksena asemalla. ”Alkuun” tarkoittaa, että juna pysähtyy laiturin alkuun; ”keskelle” tarkoittaa junan pysähtymistä keskelle laituria; ja ”loppuun” tarkoittaa, että juna pysähtyy laiturin päähän. Huomaa, että tämä asetus määrittää vain oletusarvon uusille käskyille – yksittäisen käskyn osalta pysähtymispaikkaa voi muuttaa napsauttamalla käskyn tekstiä ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :alkuun STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :keskelle From 77c00dfe98998e7f1582de196d395f2affefb0ee Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 4 Aug 2023 18:38:28 +0000 Subject: [PATCH 11/77] Update: Translations from eints slovak: 9 changes by legitalk dutch: 3 changes by Afoklala --- src/lang/dutch.txt | 6 +++--- src/lang/slovak.txt | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index ec32cfd1b6..6ae868944d 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1383,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nieuwe orders z STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaal gesproken stopt een voertuig op elk station dat wordt gepasseerd. Wanneer je deze instelling inschakelt, passeert het alle stations op weg naar de eindbestemming zonder te stoppen. Merk op dat deze instelling alleen een standaardwaarde voor nieuwe orders bepaalt. Individuele opdrachten kunnen expliciet worden ingesteld op elk gewenst gedrag. STR_CONFIG_SETTING_STOP_LOCATION :Nieuwe treinorders stoppen de trein standaard {STRING} van het perron -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Plaats waar een trein standaard stopt aan het perron. 'Aan het begin' betekent in de buurt van de ingang, 'In het midden' betekent in het midden van het perron, en 'Aan het einde' betekent ver weg van de ingang. Merk op dat deze instelling alleen een standaardwaarde voor nieuwe orders bepaalt. Je kunt opdrachten expliciet instellen op elk gewenst gedrag. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Plaats waar een trein standaard stopt aan het perron. 'Aan het begin' betekent in de buurt van de ingang, 'In het midden' betekent in het midden van het perron, en 'Aan het einde' betekent ver weg van de ingang. Merk op dat deze instelling alleen een standaardwaarde voor nieuwe orders bepaalt. Je kunt individuele stoplocaties per opdracht instellen door op de opdrachttekst te klikken ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :aan het begin STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :in het midden @@ -1426,7 +1426,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Geen* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Verminderd STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normaal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Haltes plaatsen op door stad beheerde wegen toestaan: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Doorrijhaltes op stedelijke wegen toestaan: {STRING} STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Bouwen van doorrijhaltes op stedelijke wegen toestaan STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Haltes op wegen van tegenstanders toestaan: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Bouwen van doorrijhaltes op wegen van andere bedrijven toestaan @@ -4891,7 +4891,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Te veel STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Te dicht bij een andere haven STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Te dicht bij een ander vliegveld STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan stationsnaam niet veranderen... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... deze weg is eigendom van een plaats +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... weg in eigendom van een stad STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... weg is in de verkeerde richting STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... doorrij haltes kunnen geen bochten hebben STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... doorrij haltes kunnen geen kruisingen hebben diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 0eba3335a2..e748685cd5 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -255,6 +255,9 @@ STR_COLOUR_WHITE :Biela STR_COLOUR_RANDOM :Náhodná ###length 17 +STR_COLOUR_SECONDARY_LIGHT_BLUE :Svetlomodrá +STR_COLOUR_SECONDARY_BLUE :Modrá +STR_COLOUR_SECONDARY_WHITE :Biela # Units used in OpenTTD @@ -1002,12 +1005,14 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Nastavi # Game options window STR_GAME_OPTIONS_CAPTION :{WHITE}Možnosti hry +STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Mena STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Výber menovej jednotky +STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({STRING}) ###length 42 STR_GAME_OPTIONS_CURRENCY_GBP :Libra šterlingov @@ -1059,6 +1064,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Výber i # Autosave dropdown ###length 5 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Vypnuté +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_30_MINUTES :Každých 30 minút STR_GAME_OPTIONS_LANGUAGE :{BLACK}Jazyk STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Výber jazyka rozhrania @@ -1225,6 +1231,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbali STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Zabaliť všetko STR_CONFIG_SETTING_RESET_ALL :Resetovať všetky hodnoty STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(nie je dostupné vysvetlenie) +STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR} STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Predvolená hodnota: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE :{LTBLUE}Nastavenie typu: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE_CLIENT :Nastavenie klienta (neukladané v uložených hrách; ovplyvní všetky hry) @@ -3881,6 +3888,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Zadať p STR_VEHICLE_LIST_REPLACE_VEHICLES :Vymeniť vozidlá STR_VEHICLE_LIST_SEND_FOR_SERVICING :Vykonať servis STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zisk tento rok: {CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Poslať do depa STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Poslať do garáže From 9a602ff304457e9c45ec276393853e4f550b39a9 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 6 Aug 2023 12:57:10 -0400 Subject: [PATCH 12/77] Fix #10334: Store separate newgrf-safe version of date_of_last_service. (#11124) This value is not changed when the date cheat is used, which caused issues with changing properties based on service date. Co-authored-by: Peter Nelson --- src/aircraft_cmd.cpp | 2 ++ src/articulated_vehicles.cpp | 1 + src/newgrf_engine.cpp | 6 +++--- src/roadveh_cmd.cpp | 1 + src/saveload/afterload.cpp | 7 +++++++ src/saveload/saveload.h | 1 + src/saveload/vehicle_sl.cpp | 1 + src/ship_cmd.cpp | 1 + src/train_cmd.cpp | 3 +++ src/vehicle.cpp | 3 +++ src/vehicle_base.h | 1 + 11 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 9ce0cf3164..9960faaa2b 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -339,6 +339,7 @@ CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine * v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_aircraft); v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->build_year = u->build_year = TimerGameCalendar::year; v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); @@ -1557,6 +1558,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass * if (v->subtype == AIR_HELICOPTER && apc->num_helipads > 0) { /* an excerpt of ServiceAircraft, without the invisibility stuff */ v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->breakdowns_since_last_service = 0; v->reliability = v->GetEngine()->reliability; SetWindowDirty(WC_VEHICLE_DETAILS, v->index); diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 291deab99f..a0bea42b97 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -398,6 +398,7 @@ void AddArticulatedParts(Vehicle *first) v->y_pos = first->y_pos; v->z_pos = first->z_pos; v->date_of_last_service = first->date_of_last_service; + v->date_of_last_service_newgrf = first->date_of_last_service_newgrf; v->build_year = first->build_year; v->vehstatus = first->vehstatus & ~VS_STOPPED; diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index e1e7e7a0bd..6007860861 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -597,7 +597,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } case 0x4B: // Long date of last service - return v->date_of_last_service; + return v->date_of_last_service_newgrf; case 0x4C: // Current maximum speed in NewGRF units if (!v->IsPrimaryVehicle()) return 0; @@ -767,8 +767,8 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } return (variable - 0x80) == 0x10 ? ticks : GB(ticks, 8, 8); } - case 0x12: return ClampTo(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR); - case 0x13: return GB(ClampTo(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR), 8, 8); + case 0x12: return ClampTo(v->date_of_last_service_newgrf - DAYS_TILL_ORIGINAL_BASE_YEAR); + case 0x13: return GB(ClampTo(v->date_of_last_service_newgrf - DAYS_TILL_ORIGINAL_BASE_YEAR), 8, 8); case 0x14: return v->GetServiceInterval(); case 0x15: return GB(v->GetServiceInterval(), 8, 8); case 0x16: return v->last_station_visited; diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index d022e233fe..7f1ef4f116 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -300,6 +300,7 @@ CommandCost CmdBuildRoadVehicle(DoCommandFlag flags, TileIndex tile, const Engin v->SetServiceInterval(Company::Get(v->owner)->settings.vehicle.servint_roadveh); v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->build_year = TimerGameCalendar::year; v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 8d784533db..26497ed0e9 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3234,6 +3234,13 @@ bool AfterLoadGame() _new_competitor_timeout.fired = _new_competitor_timeout.period == 0; } + if (IsSavegameVersionBefore(SLV_NEWGRF_LAST_SERVICE)) { + /* Set service date provided to NewGRF. */ + for (Vehicle *v : Vehicle::Iterate()) { + v->date_of_last_service_newgrf = v->date_of_last_service; + } + } + AfterLoadLabelMaps(); AfterLoadCompanyStats(); AfterLoadStoryBook(); diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 3aedfb266f..8c7c283774 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -358,6 +358,7 @@ enum SaveLoadVersion : uint16_t { SLV_INDUSTRY_CARGO_REORGANISE, ///< 315 PR#10853 Industry accepts/produced data reorganised. SLV_PERIODS_IN_TRANSIT_RENAME, ///< 316 PR#11112 Rename days in transit to (cargo) periods in transit. + SLV_NEWGRF_LAST_SERVICE, ///< 317 PR#11124 Added stable date_of_last_service to avoid NewGRF trouble. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 43c2240d22..c4840bdf9a 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -675,6 +675,7 @@ public: SLE_CONDVAR(Vehicle, max_age, SLE_INT32, SLV_31, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, date_of_last_service, SLE_FILE_U16 | SLE_VAR_I32, SL_MIN_VERSION, SLV_31), SLE_CONDVAR(Vehicle, date_of_last_service, SLE_INT32, SLV_31, SL_MAX_VERSION), + SLE_CONDVAR(Vehicle, date_of_last_service_newgrf, SLE_INT32, SLV_NEWGRF_LAST_SERVICE, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, service_interval, SLE_UINT16, SL_MIN_VERSION, SLV_31), SLE_CONDVAR(Vehicle, service_interval, SLE_FILE_U32 | SLE_VAR_U16, SLV_31, SLV_180), SLE_CONDVAR(Vehicle, service_interval, SLE_UINT16, SLV_180, SL_MAX_VERSION), diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index fc44f6f76c..48620a2502 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -903,6 +903,7 @@ CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, V v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_ships); v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->build_year = TimerGameCalendar::year; v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = Random(); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 628675a635..dde3b329a8 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -654,6 +654,7 @@ static CommandCost CmdBuildRailWagon(DoCommandFlag flags, TileIndex tile, const v->railtype = rvi->railtype; v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->build_year = TimerGameCalendar::year; v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = Random(); @@ -719,6 +720,7 @@ static void AddRearEngineToMultiheadedTrain(Train *v) u->railtype = v->railtype; u->engine_type = v->engine_type; u->date_of_last_service = v->date_of_last_service; + u->date_of_last_service_newgrf = v->date_of_last_service_newgrf; u->build_year = v->build_year; u->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); u->random_bits = Random(); @@ -783,6 +785,7 @@ CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engin v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_trains); v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->build_year = TimerGameCalendar::year; v->sprite_cache.sprite_seq.Set(SPR_IMG_QUERY); v->random_bits = Random(); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 1efdb30ba5..5e86e3c347 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -170,6 +170,7 @@ void VehicleServiceInDepot(Vehicle *v) do { v->date_of_last_service = TimerGameCalendar::date; + v->date_of_last_service_newgrf = TimerGameCalendar::date; v->breakdowns_since_last_service = 0; v->reliability = v->GetEngine()->reliability; /* Prevent vehicles from breaking down directly after exiting the depot. */ @@ -761,6 +762,8 @@ uint32_t Vehicle::GetGRFID() const void Vehicle::ShiftDates(int interval) { this->date_of_last_service = std::max(this->date_of_last_service + interval, 0); + /* date_of_last_service_newgrf is not updated here as it must stay stable + * for vehicles outside of a depot. */ } /** diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 093f4b5c2e..5ceb992690 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -288,6 +288,7 @@ public: TimerGameCalendar::Date age; ///< Age in days TimerGameCalendar::Date max_age; ///< Maximum age TimerGameCalendar::Date date_of_last_service; ///< Last date the vehicle had a service at a depot. + TimerGameCalendar::Date date_of_last_service_newgrf; ///< Last date the vehicle had a service at a depot, unchanged by the date cheat to protect against unsafe NewGRF behavior. uint16_t reliability; ///< Reliability. uint16_t reliability_spd_dec; ///< Reliability decrease speed. byte breakdown_ctr; ///< Counter for managing breakdown events. @see Vehicle::HandleBreakdown From 2bc97fae660dac800bdaefd3f9debc8fb907424f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 6 Aug 2023 18:38:21 +0000 Subject: [PATCH 13/77] Update: Translations from eints swedish: 45 changes by joeax910 portuguese: 106 changes by azulcosta --- src/lang/portuguese.txt | 212 ++++++++++++++++++++-------------------- src/lang/swedish.txt | 65 ++++++++---- 2 files changed, 151 insertions(+), 126 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index e449f1ee45..c8c5821545 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1769,14 +1769,14 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Utilização m STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Definir o volume máximo de memória que pode ser utilizada por um script antes de este ser terminado. Para mapas maiores é possível que este parâmetro tenha de ser aumentado. STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB -STR_CONFIG_SETTING_SERVINT_ISPERCENT :Os intervalos de serviço são em percentagem: {STRING} +STR_CONFIG_SETTING_SERVINT_ISPERCENT :Os intervalos de manutenção são em percentagem: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Quando ativado, os veículos procuram fazer a manutenção quando sua fiabilidade reduz para uma determinada percentagem da fiabilidade máxima.{}{}Por exemplo, se a fiabilidade máxima de um veículo for 90% e o intervalo de manutenção for 20%, o veículo tentará fazer a manutenção quando atinge 72% de fiabilidade. STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo de serviço para comboios por omissão: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Definir o intervalo de manutenção por omissão para novos veículos sobre carris, se não for configurado um intervalo de manutenção explícito para o veículo STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo de serviço para veículos de estrada por omissão: {STRING} STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Definir o intervalo de manutenção por omissão para novos veículos de estrada, se não for configurado um intervalo de manutenção explícito para o veículo -STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de serviço para aeronaves padrão: {STRING} +STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de manutenção para aeronaves por omissão: {STRING} STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Definir o intervalo de manutenção por omissão para novas aeronaves, se não for configurado um intervalo de manutenção explícito para o veículo STR_CONFIG_SETTING_SERVINT_SHIPS :Intervalo de serviço para navios por omissão: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Definir o intervalo de manutenção por omissão para novos navios, se não for configurado um intervalo de manutenção explícito para o veículo @@ -2700,14 +2700,14 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construção de STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construir monocarril STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construir Maglev -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl alterna a construção/remoção de linha férrea. Shift alterna contruir/mostrar custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl alterna a construção/remoção de caminhos-de-ferro. Shift alterna contruir/mostrar custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Shift alterna contruir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl alterna a construção/remoção de linha férrea. Shift alterna construir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl alterna a construção/remoção de caminhos-de-ferro. Shift alterna construir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Converter linha em ponto de controlo. Ctrl permite juntar pontos de controlo. Shift alterna construir/mostrar custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais ferroviários. Ctrl alterna entre semáforos/sinais elétricos{}Arrastar constrói sinais ao longo de uma linha reta de carris. Ctrl constrói sinais até a próxima junção ou sinal{}Ctrl+Clique alterna entre abrir a janela de seleção de sinais. Shift alterna construir/mostrar custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna contruir/mostrar custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift alterna contruir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna construir/mostrar custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de passagem e estações. Fixar o Ctrl também remove a linha férrea de pontos de passagem e estações STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de linha. Shift alterna construir/mostrar custo estimado @@ -2717,8 +2717,8 @@ STR_RAIL_NAME_MONORAIL :Monocarril STR_RAIL_NAME_MAGLEV :Maglev # Rail depot construction window -STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do depósito -STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação do depósito +STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Ferroviário +STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do depósito ferroviário # Rail waypoint construction window STR_WAYPOINT_CAPTION :{WHITE}Ponto de controlo @@ -2786,20 +2786,20 @@ STR_BRIDGE_TUBULAR_SILICON :Tubular, Silíc STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Construção de estradas STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Construção de eléctricos STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construir estradas. Ctrl alterna a construção/remoção de estradas -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para eléctricos. Ctrl alterna a construção/remoção de carris para eléctricos. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl alterna a construção/remoção de estradas. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir carris para eléctricos usando o modo automático. Ctrl alterna a construção/remoção de carris para eléctricos. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir depósito de veículos rodoviários (para compra e manutenção de veículos rodoviários). Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir depósito de eléctricos (para compra e manutenção). Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de eléctricos para passageiros. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir área de carregamento de camiões. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de eléctricos para carga. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para elétricos. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl alterna a construção/remoção de estradas. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir carris para elétricos usando o modo automático. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem rodoviária (para compra e manutenção de veículos rodoviários). Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir área de carregamento de camiões. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte de estrada. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para eléctricos. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel de estrada. Shift alterna contruir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para eléctricos. Shift alterna contruir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte rodoviária. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para elétricos. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para elétricos. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar construir/remover linhas de eléctricos e sinais STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Converter/Atualizar tipo de estrada. Shift alterna construir/mostrar custo estimado @@ -2809,10 +2809,10 @@ STR_ROAD_NAME_ROAD :Estrada STR_ROAD_NAME_TRAM :Carris para elétricos # Road depot construction window -STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação do depósito -STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Seleccionar a orientação do depósito -STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do depósito para eléctricos -STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Escolher a orientação do depósito de eléctricos +STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação da Garagem +STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação da garagem +STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação da Garagem de Elétricos +STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação da garagem de elétricos # Road vehicle station construction window STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da estação de autocarros @@ -2828,24 +2828,24 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Seleccio STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de hidrovia STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Canais STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canais. Shift alterna construção/estimativa de custos -STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir diques. Shift alterna contruir/mostrar custo estimado -STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir depósito naval (para compra e manutenção de navio). Shift alterna contruir/mostrar custo estimado -STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl permite juntar estações. Shift alterna contruir/mostar custo estimado +STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir eclusas. Shift alterna construir/mostrar custo estimado +STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir estaleiro naval (para compra e manutenção de navios). Shift alterna construir/mostrar custo estimado +STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl permite juntar estações. Shift alterna construir/mostar custo estimado STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Esta bóia de posição pode ser usada para marcar pontos de rota adicionais. Shift alterna construção/mostra de custos estimados -STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Construir aqueduto. Shift alterna contruir/mostrar custo estimado +STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Construir aqueduto. Shift alterna construir/mostrar custo estimado STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definir área de água.{}Construir um canal, a não ser que a tecla Ctrl esteja pressionada a nível do mar, nesse caso inundará as zonas circundantes STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Colocar rios. Tecla "Ctrl" seleciona a área diagonalmente # Ship depot construction window -STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Orientação do Depósito -STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Seleccione a orientação do depósito naval +STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Orientação do Estaleiro Naval +STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do estaleiro naval # Dock construction window STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Doca # Airport toolbar STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Aeroportos -STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Construir aeroporto. Ctrl permite juntar estações. Shift alterna contruir/mostrar custo estimado +STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Construir aeroporto. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado # Airport construction window STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Selecção de Aeroporto @@ -3043,12 +3043,12 @@ STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Linha de caminh STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Linha de caminhos-de-ferro com sinais combinados e de rota STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais combinados e de sentido único STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de rota e de sentido único -STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de comboios de caminhos-de-ferro +STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito ferroviário para comboios STR_LAI_ROAD_DESCRIPTION_ROAD :Estrada STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Estrada com iluminação STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :Estrada com árvores -STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT :Depósito de veículos rodoviários +STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT :Garagem para veículos rodoviários STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING :Passagem de nível STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Linha de eléctrico @@ -3073,7 +3073,7 @@ STR_LAI_WATER_DESCRIPTION_CANAL :Canal STR_LAI_WATER_DESCRIPTION_LOCK :Dique STR_LAI_WATER_DESCRIPTION_RIVER :Rio STR_LAI_WATER_DESCRIPTION_COAST_OR_RIVERBANK :Costa ou margem -STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT :Depósito naval +STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT :Estaleiro naval # Industries come directly from their industry names @@ -3885,9 +3885,9 @@ STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLA STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} -STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar para depósito -STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar para depósito -STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Enviar para depósito +STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Mandar para o depósito +STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Mandar para a garagem +STR_VEHICLE_LIST_SEND_SHIP_TO_DEPOT :Mandar para o estaleiro STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Enviar para hangar STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para imobilizar todos os veículos na lista @@ -4058,33 +4058,33 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ve STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para adicionar/remover do comboio, clique com o botão direito do rato para informações. Fixe o Ctrl para fazer com que as duas funções se apliquem à seguinte cadeia -STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Veículos - faça clique direito num veículo para informações -STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Navios - faça clique direito num navio para informações -STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronave - faça clique direito na aeronave para informações +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para acrescentar/retirar do comboio; clique com o botão direito para informações. Pressionando a tecla Ctrl aplica ambas as funções à cadeia seguinte +STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Veículos - clique com o botão direito num veículo para informações +STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Navios - clique com o botão direito num navio para informações +STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronave - Clique com o botão direito na aeronave para informações ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}Arraste o veículo ferroviário para aqui para o vender -STR_DEPOT_ROAD_VEHICLE_SELL_TOOLTIP :{BLACK}Arraste o veículo rodoviário para aqui para o vender -STR_DEPOT_SHIP_SELL_TOOLTIP :{BLACK}Arraste o navio para aqui para o vender -STR_DEPOT_AIRCRAFT_SELL_TOOLTIP :{BLACK}Arraste a aeronave para aqui para a vender +STR_DEPOT_TRAIN_SELL_TOOLTIP :{BLACK}Arraste para aqui o veículo ferroviário para vendê-lo +STR_DEPOT_ROAD_VEHICLE_SELL_TOOLTIP :{BLACK}Arraste para aqui o veículo rodoviário para vendê-lo +STR_DEPOT_SHIP_SELL_TOOLTIP :{BLACK}Arraste para aqui o navio para vendê-lo +STR_DEPOT_AIRCRAFT_SELL_TOOLTIP :{BLACK}Arraste para aqui a aeronave para vendê-la ###length VEHICLE_TYPES STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TOOLTIP :{BLACK}Vender todos os comboios no depósito -STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :{BLACK}Vender todos os veículos no depósito -STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}Vender todos os navios no depósito +STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :{BLACK}Vender todos os veículos na garagem +STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}Vender todos os navios no estaleiro naval STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Vender todas as aeronaves no hangar ###length VEHICLE_TYPES -STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Autosubstituir todos os comboios no depósito -STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Autosubstituir todos os veículos rodoviários no depósito -STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Autosubstituir todos os navios no depósito -STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Autosubstituir todas as aeronaves no hangar +STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Auto-substituir todos os comboios no depósito +STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Auto-substituir todos os veículos rodoviários na garagem +STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Auto-substituir todos os navios no estaleiro naval +STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Auto-substituir todas as aeronaves no hangar ###length VEHICLE_TYPES STR_DEPOT_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Novos Veículos STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Novos Veículos -STR_DEPOT_SHIP_NEW_VEHICLES_BUTTON :{BLACK}Novos navios +STR_DEPOT_SHIP_NEW_VEHICLES_BUTTON :{BLACK}Novos Navios STR_DEPOT_AIRCRAFT_NEW_VEHICLES_BUTTON :{BLACK}Nova Aeronave ###length VEHICLE_TYPES @@ -4100,37 +4100,37 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Clonar n STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Clonar Aeronave ###length VEHICLE_TYPES -STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Esta acção comprará uma cópia de um comboio, incluindo todas as carruagens. Clique neste botão e, de seguida, num comboio que se encontre dentro ou fora do depósito. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra estimativa de custo, sem comprar -STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Esta ação comprará uma cópia de um veículo rodoviário. Clique neste botão e de seguida, num veículo que se encontre dentro ou fora de um depósito. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra estimativa de custo, sem comprar -STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Esta ação comprará uma cópia de um navio. Clique neste botão e de seguida, num navio que se encontre dentro ou fora do depósito. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra estimativa de custo, sem comprar -STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esta ação comprará uma cópia de uma aeronave. Clique neste botão e de seguida, numa aeronave que se encontre dentro ou fora do hangar. Ctrl+Clique ira partilhar as ordens. Shift+Clique mostra estimativa de custo, sem comprar +STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Esta ação irá comprar uma cópia de um comboio, incluindo todas as carruagens. Clique neste botão e, de seguida, num comboio que se encontre dentro ou fora do depósito ferroviário. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar +STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Esta ação irá comprar uma cópia de um veículo rodoviário. Clique neste botão e de seguida, num veículo rodoviário que se encontre dentro ou fora da garagem. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar +STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Esta ação irá comprar uma cópia de um navio. Clique neste botão e de seguida, num navio que se encontre dentro ou fora do estaleiro naval. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar +STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esta ação irá comprar uma cópia de uma aeronave. Clique neste botão e de seguida, numa aeronave que se encontre dentro ou fora do hangar. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização de um depósito ferroviário. Ctrl+Clique abre um novo visualizador na localização do depósito ferroviário -STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito de veículos rodoviários. Ctrl+Clique abre um novo visualizador na localização do depósito de veículos -STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito naval. Ctrl+Clique abre um novo visualizador na localização do depósito naval +STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito ferroviário. Ctrl+Clique abre um novo visualizador na localização do depósito ferroviário +STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização da garagem de veículos rodoviários. Ctrl+Clique abre um novo visualizador na localização da garagem +STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do estaleiro naval. Ctrl+Clique abre um novo visualizador na localização do estaleiro naval STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do hangar. Ctrl+Clique abre um novo visualizador na localização do hangar ###length VEHICLE_TYPES -STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Obter uma lista de todos os comboios em cujas ordens conste este depósito -STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Obter uma lista de todos os veículos em cujas ordens conste este depósito -STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Obter uma lista de todos os navios em cujas ordens conste este depósito -STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Obter uma lista de todas as aeronaves em cujas ordens conste um hangar deste aeroporto +STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Obter a lista de todos os comboios com este depósito nas suas ordens +STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Obter a lista de todos os veículos rodoviários com esta garagem nas suas ordens +STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Obter a lista de todos os navios com este estaleiro naval nas suas ordens +STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Obter a lista de todas as aeronaves com qualquer hangar deste aeroporto nas suas ordens ###length VEHICLE_TYPES -STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Pressione o botão esquerdo do rato para imobilizar todos os comboios no depósito -STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Pressione o botão esquerdo do rato para imobilizar todos os veículos no depósito -STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Pressione o botão esquerdo do rato para imobilizar todos os navios no depósito -STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para imobilizar todas as aeronaves no hangar +STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Clique para parar todos os comboios dentro do depósito +STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Clique para parar todos os veículos rodoviários dentro da garagem +STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Clique para parar todos os navios dentro do estaleiro naval +STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Clique para parar todas as aeronaves dentro do hangar ###length VEHICLE_TYPES -STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para iniciar todos os comboios no depósito -STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para iniciar todos os veículos rodoviários no depósito -STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Pressione o botão esquerdo do rato para iniciar todos os navios no depósito -STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para iniciar todas as aeronaves no hangar +STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Clique para saírem todos os comboios deste depósito +STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Clique para saírem todos os veículos rodoviários desta garagem +STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Clique para saírem todos os navios deste estaleiro naval +STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Clique para saírem todas as aeronaves deste hangar -STR_DEPOT_DRAG_WHOLE_TRAIN_TO_SELL_TOOLTIP :{BLACK}Arrastar locomotiva para aqui para vender todo o comboio -STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Está prestes a vender todos os veículos no depósito. Tem a certeza? +STR_DEPOT_DRAG_WHOLE_TRAIN_TO_SELL_TOOLTIP :{BLACK}Arraste para aqui a locomotiva para vender todo o comboio +STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Está prestes a vender todos os veículos imobilizados aqui. Tem a certeza? # Engine preview window STR_ENGINE_PREVIEW_CAPTION :{WHITE}Mensagem de um fabricante de veículos @@ -4216,10 +4216,10 @@ STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrar STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Centralize a vista principal na localização da aeronave. Um clique duplo seguirá a aeronave na visualização principal. Ctrl + Clique abre uma nova janela de visualização na localização da aeronave ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito -STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para o depósito -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o depósito -STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar +STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito. Ctrl+Clique fará apenas manutenção +STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para a garagem. Ctrl+Clique fará apenas manutenção +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique fará apenas manutenção +STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar. Ctrl+Clique fará apenas manutenção ###length VEHICLE_TYPES STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Esta ação comprará uma cópia do comboio, incluindo as carruagens. Ctrl+Clique irá partilhar as ordens. Shift + Clique mostra estimativa de custo, sem comprar @@ -4271,7 +4271,7 @@ STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}Dirige- STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sem ordens, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dirige-se a {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Dirige-se para {DEPOT}, {VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Efetuar manutenção em {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manutenção em {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Não é possível chegar a {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Não é possível chegar a {WAYPOINT}, {VELOCITY} @@ -4426,9 +4426,9 @@ STR_ORDER_DROP_REFIT_AUTO :Mercadoria fixa STR_ORDER_DROP_REFIT_AUTO_ANY :Mercadoria disponível STR_ORDER_SERVICE :{BLACK}Manutenção -STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vai sempre -STR_ORDER_DROP_SERVICE_DEPOT :Serviço caso necessário -STR_ORDER_DROP_HALT_DEPOT :Pare +STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre +STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária +STR_ORDER_DROP_HALT_DEPOT :Parar STR_ORDER_SERVICE_TOOLTIP :{BLACK}Saltar esta ordem a menos que seja necessário manutenção STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados de veículo para ida à base @@ -4483,12 +4483,12 @@ STR_ORDER_GO_NON_STOP_TO_WAYPOINT :Ir sem parar po STR_ORDER_SERVICE_AT :Serviço em STR_ORDER_SERVICE_NON_STOP_AT :Serviço sem parar em -STR_ORDER_NEAREST_DEPOT :o mais próximo +STR_ORDER_NEAREST_DEPOT :o mais perto STR_ORDER_NEAREST_HANGAR :o hangar mais próximo ###length 3 -STR_ORDER_TRAIN_DEPOT :Depósito ferroviário -STR_ORDER_ROAD_VEHICLE_DEPOT :Depósito de veículos rodoviários -STR_ORDER_SHIP_DEPOT :Depósito naval +STR_ORDER_TRAIN_DEPOT :Depósito Ferroviário +STR_ORDER_ROAD_VEHICLE_DEPOT :Garagem Rodoviária +STR_ORDER_SHIP_DEPOT :Estaleiro Naval ###next-name-looks-similar STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING} @@ -4929,19 +4929,19 @@ STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... bói STR_ERROR_BUOY_IS_IN_USE :{WHITE}... bóia está em uso por outra empresa! # Depot related errors -STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Não é possível construir depósito aqui... -STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Não é possível construir depósito de veículos rodoviários aqui... -STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Não é possível construir depósito para eléctricos neste local... -STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Não é possível construir depósito naval aqui... +STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Não é possível construir um depósito ferroviário aqui... +STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Não é possível construir uma garagem aqui... +STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Não é possível construir uma garagem para elétricos aqui... +STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Não é possível construir um estaleiro naval aqui... STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}Não é possível alterar o nome do depósito... -STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... tem que estar parado dentro do depósito -STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... deve estar parado num depósito de veículos rodoviários -STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... tem que estar parado no depósito +STR_ERROR_TRAIN_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... tem que estar parado dentro do depósito ferroviário +STR_ERROR_ROAD_VEHICLE_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... tem que estar parado dentro da garagem +STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT :{WHITE}... tem que estar parado dentro do estaleiro naval STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... tem que estar parado no hangar -STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Os comboios só podem ser alterados quando parados num depósito +STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Os comboios só podem ser modificados quando parados num depósito ferroviário STR_ERROR_TRAIN_TOO_LONG :{WHITE}Comboio muito longo STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Impossível inverter a direcção do veículo... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... compostos por unidades múltiplas @@ -4995,7 +4995,7 @@ STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Linha de # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Não é possível construir canais aqui... -STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Não é possível construir diques aqui... +STR_ERROR_CAN_T_BUILD_LOCKS :{WHITE}Não é possível construir eclusas aqui... STR_ERROR_CAN_T_PLACE_RIVERS :{WHITE}Não se pode pôr rio aqui... STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... deverá ser construído na água STR_ERROR_CAN_T_BUILD_ON_WATER :{WHITE}... não é possível construir na água @@ -5083,9 +5083,9 @@ STR_ERROR_CAN_T_STOP_START_SHIP :{WHITE}Não é STR_ERROR_CAN_T_STOP_START_AIRCRAFT :{WHITE}Não é possível iniciar/parar aeronave... ###length VEHICLE_TYPES -STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Não é possível mandar o comboio para o depósito... -STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}Não é possível mandar o veículo para o depósito... -STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Não é possível mandar navio para o depósito... +STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Não é possível mandar o comboio para o depósito ferroviário... +STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}Não é possível mandar o veículo para a garagem... +STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Não é possível mandar navio para o estaleiro naval... STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Não é possível mandar aeronave para o hangar... ###length VEHICLE_TYPES @@ -5597,12 +5597,12 @@ STR_FORMAT_WAYPOINT_NAME :Ponto de contro STR_FORMAT_WAYPOINT_NAME_SERIAL :Ponto de controlo {TOWN}#{COMMA} ###length 6 -STR_FORMAT_DEPOT_NAME_TRAIN :Depósito de Comboios de {TOWN} -STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :Depósito de Comboios de {TOWN} #{COMMA} -STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :Depósito de Veículos Rodoviários de {TOWN} -STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :Depósito de Veículos Rodoviários de {TOWN} #{COMMA} -STR_FORMAT_DEPOT_NAME_SHIP :Depósito naval de {TOWN} -STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :Depósito naval de {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_TRAIN :Depósito Ferroviário de {TOWN} +STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :Depósito Ferroviário de {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :Garagem Rodoviária de {TOWN} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :Garagem Rodoviária de {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_SHIP :Estaleiro Naval de {TOWN} +STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :Estaleiro Naval de {TOWN} #{COMMA} ###next-name-looks-similar STR_FORMAT_DEPOT_NAME_AIRCRAFT :Hangar de {STATION} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 35f4f8bdb1..02c60afd7c 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -191,6 +191,23 @@ STR_COLOUR_WHITE :Vit STR_COLOUR_RANDOM :Slumpmässig ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Mörkblå +STR_COLOUR_SECONDARY_PALE_GREEN :Blekgrön +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rosa +STR_COLOUR_SECONDARY_YELLOW :Gul +STR_COLOUR_SECONDARY_RED :Röd +STR_COLOUR_SECONDARY_LIGHT_BLUE :Ljusblå +STR_COLOUR_SECONDARY_GREEN :Grön +STR_COLOUR_SECONDARY_DARK_GREEN :Mörkgrön +STR_COLOUR_SECONDARY_BLUE :Blå +STR_COLOUR_SECONDARY_CREAM :Gräddvit +STR_COLOUR_SECONDARY_MAUVE :Lila +STR_COLOUR_SECONDARY_PURPLE :Purpur +STR_COLOUR_SECONDARY_ORANGE :Orange +STR_COLOUR_SECONDARY_BROWN :Brun +STR_COLOUR_SECONDARY_GREY :Grå +STR_COLOUR_SECONDARY_WHITE :Vit +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Samma som huvudfärgen # Units used in OpenTTD @@ -357,9 +374,9 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Visa fin STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Visa allmän företagsinformation STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Visa berättelsebok STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Visa lista över mål -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Visa grafer +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Visa företagsgrafer och fraktförtjänster STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Visa topplista över företag -STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Bekosta konstruktion av en ny industri eller lista alla industrier +STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Inspektera industrier eller finansiera anläggning av en ny industri STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Visa lista över företagets tåg. Ctrl+klick döljer listan över grupper STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Visa lista över företagets vägfordon. Ctrl+klick döljer listan över grupper STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Visa lista över företagets skepp. Ctrl+klick döljer listan över grupper @@ -607,7 +624,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Graf öv STR_GRAPH_INCOME_CAPTION :{WHITE}Graf över inkomster STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Enheter levererat gods STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Företagets prestationsvärderingar (maxvärdering=1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Företagsvärde +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Företagsvärdesgraf STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Fraktförtjänster STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Dagar under transport @@ -1052,6 +1069,7 @@ STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Om aktiv STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Om undersökning och integritet STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Detta öppnar en länk i webbläsaren med mer information om den automatiska undersökningen. STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Förhandsgranska enkätresultat +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Visa enkätresultatet från det nu pågående spelet STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafik @@ -1061,12 +1079,12 @@ STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}uppdateringsfrekvenser högre än 60Hz kan påverka prestandan. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Grafikpaket som standard -STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Välj vilket grafikpaket som ska användas som standard +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Välj vilket grafikpaket som ska användas som standard (kan ej ändras under spel, utan endast från huvudmenyn) STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} saknad{P "" e}/trasig{P "" a} fil{P "" er} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Ytterligare information om basgrafik-settet STR_GAME_OPTIONS_BASE_SFX :{BLACK}Grundljudspaket -STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Välj vilket grundljudspaket som ska användas (kan inte ändras under spel, utom endast från huvudmenyn) +STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Välj vilket grundljudspaket som ska användas (kan inte ändras under spel, utan endast från huvudmenyn) STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Ytterligare information om grundljudpaketet STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Musikpaket valt @@ -1236,6 +1254,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Vänster STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Centrerad STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Höger +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 "" er} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximalt startlån: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximalt belopp ett företag kan låna (där inflationen inte tas med i beräkningen) @@ -1294,7 +1313,7 @@ STR_CONFIG_SETTING_CATCHMENT :Tillåt mer rea STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Ha olika stora uppsamlingsområden för olika typer av stationer och flygplatser STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Företagsstationerna kan betjäna industrier med tillhörande neutrala stationer: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :När aktiverat, kan industrier med tillhörande stationer (t.ex. oljeplattformar) också betjänas av företagsägda stationer som är byggda i närheten. När inaktiverat kan dessa industrier endast betjänas av deras tillhörande stationer. Några närliggande företagsstationer kommer inte att kunna tjäna dem, inte heller kommer den tillhörande stationen att tjäna något annat än industrin +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :När det är aktiverat kan industrier med anslutna stationer (t.ex. oljeplattformar) också betjänas av företagsägda stationer som är byggda i närheten. När det är inaktiverat kan dessa industrier endast betjänas av deras anslutna stationer. Inga närliggande företagsstationer kommer att kunna betjäna dem och inte heller kommer den anslutna stationen att betjäna något annat än sin industri STR_CONFIG_SETTING_EXTRADYNAMITE :Tillåt borttagning av fler stadsägda vägar, broar och tunnlar: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Underlätta borttagning av stadsägd infrastruktur och byggnader @@ -1364,7 +1383,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nya order är ' STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :I normala fall stannar ett fordon vid varje station det passerar. Aktiveras den här inställningen kommer det istället att köra igenom alla stationer på väg till dess slutdestination utan att stanna. Tänk på att den här inställningen bara definierar ett förinställt värde för nya order. Individuella order kan uttryckligen definiera båda typerna av beteende oavsett inställning STR_CONFIG_SETTING_STOP_LOCATION :Nya tåg-order stannar som standard vid {STRING} av platformen -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Grundinställning för var tåg stannar utmed plattformar. 'början' betyder i början av plattformen sett från var tåget kommer ifrån. 'mitten' betyder i mitten av plattformen och 'slutet' betyder så långt bort som möjligt. Notera att denna inställning endast anger grundvärdet för nya ordrar. Individuella instruktioner kan ges per orderrad explicit till valfritt värde oberoende av denna inställning. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Grundinställning för var tåg stannar utmed plattformar. 'början' betyder i början av plattformen sett från var tåget kommer ifrån. 'mitten' betyder i mitten av plattformen och 'slutet' betyder så långt bort som möjligt. Notera att denna inställning endast anger grundvärdet för nya order. Stoppläge kan ställas in för individuella order genom att klicka på deras orderrad ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :början STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :mitten @@ -1407,8 +1426,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Inga* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducerad STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Tillåt genomfartshållplatser på stadsägda vägar: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Tillåt konstruktion av genomfartshållplatser på stadsägda vägar +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Tillåt genomfartshållplatser på vägar som ägs av städer: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Tillåt konstruktion av genomfartshållplatser på vägar som ägs av städer STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Tillåt dina fordon att köra genom motståndarens hållplatser: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Tillåt konstruktion av genomfartshållplatser på vägar som ägs av andra företag STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Det är inte möjligt att ändra denna inställning när det finns fordon @@ -1419,6 +1438,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Om det är akti STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Företagets startfärg: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Välj startfärg för företaget +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Företagets andravalsstartfärg: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Välj andravalsfärg för företaget att starta med, om du använder en NewGRF som stöder det. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Flygplatser blir aldrig gamla: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Aktivering av denna inställning gör så att alla flygplatstyper finns kvar i obegränsad tid efter att de blivit tillgängliga @@ -1621,6 +1642,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Av STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Stäng fönster med högerklick: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Stänger fönster när man högerklickar inuti dem. Denna inställning inaktiverar tooltips vid högerklick! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nej +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, förutom klistrade STR_CONFIG_SETTING_AUTOSAVE :Autospara: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Välj intervall mellan automatisk sparande @@ -1745,7 +1769,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Hur mycket minn STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Visa serviceintervall i procent: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Välj om fordonsservice ska triggas av hur lång tid som har gått sedan senaste service eller av att tillförlitligheten faller med en viss procentsats av den maximala tillförlitligheten +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :När det är aktiverat försöker fordon bli servade när deras tillförlitlighet har fallit med en viss procentsats av den maximala tillförlitligheten.{}{}Till exempel, om ett fordons maximala tillförlitlighet är 90% och serviceintervallet är 20% kommer fordonet söka service när tillförlitligheten är 72%.Välj om fordonsservice ska triggas av hur lång tid som har gått sedan senaste service eller av att tillförlitligheten faller med STR_CONFIG_SETTING_SERVINT_TRAINS :Normalt serviceintervall för tåg: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Välj vilket serviceintervall som normalt sett ska användas för nya tåg, om inget annat serviceintervall uttryckligen anges @@ -1950,7 +1974,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Inga STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Initial stadsstorleks-multiplikator: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Storstäders genomsnittliga storlek i relation till vanliga städers vid spelets början -STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Uppdatera distributionsdiagram var {STRING}sekund{P 0:2 "" s} +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Uppdatera distributionsdiagram var {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tid mellan efterföljande omräkningar av länkgrafen. Varje omräkning beräknar planerna för en komponent i grafen. Det betyder att ett värde X för den här inställningen inte betyder att hela grafen kommer att uppdateras var X:e sekund. Bara viss komponent kommer att göra det. Ju kortare du ställer in den desto mer CPU-tid kommer att behövas för att beräkna den. Ju längre du ställer in den desto längre tid tar det tills lastdistributionen startar på nya rutter. STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Ta {STRING} för omräkning av distributionsdiagrammet STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tid som det tar för varje omräkning av en länkdiagramkomponent. När en omräkning startas skapas en tråd som tillåts köra i detta antal sekunder. Ju kortare du ställer in detta desto mer sannolikt är det att tråden inte är färdig när den ska. Sedan stannar spelet tills det är ("lag"). Ju längre du ställer in den desto längre tid tar det för distributionen att uppdateras när rutter ändras. @@ -2328,7 +2352,7 @@ STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Huruvida STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} klient{P "" er} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Max antal tillåtna klienter: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Välj max antal tillåtna klienter. Alla platser måste inte fyllas. -STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} företag{P y ies} +STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} företag STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Max antal företag: STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Begränsa antalet företag på servern @@ -2925,7 +2949,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}3x3 rutn STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Slumpa # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Bekosta ny industri +STR_FUND_INDUSTRY_CAPTION :{WHITE}Industrifinansiering STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Välj lämplig industri från denna lista STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Skapa slumpmässiga industrier STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Täck kartan med slumpmässigt placerade industrier @@ -3443,7 +3467,7 @@ STR_NEWGRF_BROKEN :{WHITE}'Beteend STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Power wagon-tillstånd för '{1:ENGINE}' ändrades utanför en depå STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Fordonslängd för '{1:ENGINE}' ändrades utanför en depå STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Kapaciteten ändrades för '{1:ENGINE}' utan att vara i depå eller anpassning -STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tåg '{VEHICLE}' som tillhör '{COMPANY}' har ogiltig längd. Detta orsakas förmodligen av problem med en NewGRF. Spelet kan desynkroniseras eller krascha +STR_BROKEN_VEHICLE_LENGTH :{WHITE}Tåget '{VEHICLE}' som tillhör '{COMPANY}' har ogiltig längd. Detta orsakas förmodligen av problem med en NewGRF. Spelet kan desynkroniseras eller krascha STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' ger felaktig information STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Last-/återställningsinformationen för '{1:ENGINE}' skiljer sig från köplistan efter konstruktion. Detta kan leda till att automatisk förnyelse/uppgradering misslyckas med att anpassa fordonen/vagnarna korrekt @@ -3543,8 +3567,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Bekosta ombyggnad av stadens vägnätverk.{}Orsakar ansenliga störningar för vägtrafik i upp till 6 månader.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Bygg en staty till ditt företags ära.{}Ger en permanent boost till stationers betyg i staden.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Bekosta konstruktion av nya byggnader i staden.{}Ger en temporär boost till stadens tillväxt.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Köp 1 års exklusiva transporträttigheter i staden.{}De lokala myndigheterna kommer inte tillåta passagerare och gods att använda dina motståndares stationer.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW} Muta de lokala myndigheterna för att öka din värdering, med risk för att få höga böter om du blir upptäckt.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Köp 1 års exklusiva transporträttigheter i staden.{}De lokala myndigheterna kommer inte tillåta passagerare och gods att använda dina motståndares stationer. En framgångsrik muta från en motståndare gör att kontraktet bryts.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW} Muta de lokala myndigheterna för att öka din värdering och återkalla en motståndares exklusiva transporträttigheter, med risk för att få höga böter om du blir upptäckt.{}{POP_COLOUR}Kostnad: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Mål @@ -3783,7 +3807,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Namn på VD STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Ange hur mycket pengar du vill ge STR_BUY_COMPANY_MESSAGE :{WHITE}Vi letar efter någon som vill köpa och ta över vårt företag{}{}Vill du köpa {COMPANY} för {CURRENCY_LONG}? -STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE} vid ett fientligt övertagande av {COMPANY} kommer du att köpa alla tillgångar, betala av alla lån och betala två års vinst.{}{}Den totala summan uppskattas till {CURRENCY_LONG}.{}{}Vill du fortsätta denna fientliga övertagningen? +STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE} vid ett fientligt övertagande av {COMPANY} kommer du att köpa alla tillgångar, betala av alla lån och betala två års vinst.{}{}Den totala summan uppskattas till {CURRENCY_LONG}.{}{}Vill du fortsätta detta fientliga övertagande? # Company infrastructure window STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infrastruktur för {COMPANY} @@ -4433,7 +4457,7 @@ STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :falskt STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}Värde att jämföra fordonsdata mot STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Skriv in värde att jämföra mot -STR_ORDERS_SKIP_BUTTON :{BLACK}Skippa +STR_ORDERS_SKIP_BUTTON :{BLACK}Hoppa över STR_ORDERS_SKIP_TOOLTIP :{BLACK}Hoppa över nuvarande order och starta nästa. Ctrl+klick hoppar över till vald order STR_ORDERS_DELETE_BUTTON :{BLACK}Ta bort @@ -4578,6 +4602,7 @@ STR_TIMETABLE_EXPECTED :{BLACK}Förvän STR_TIMETABLE_SCHEDULED :{BLACK}Schemalagt STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Ändra mellan förväntat och schemalagt +STR_TIMETABLE_ARRIVAL :A: {COLOUR}{DATE_TINY} STR_TIMETABLE_DEPARTURE :D: {COLOUR}{DATE_TINY} @@ -4624,7 +4649,7 @@ STR_AI_CONFIG_RANDOM_AI :Slumpa datorspe STR_AI_CONFIG_NONE :(inget) STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Max antal motståndare: {ORANGE}{COMMA} -STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervall mellan start av tävlande: {ORANGE}{COMMA} minut{P "" s} +STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervall mellan start av motståndare: {ORANGE}{COMMA} minut{P "" er} STR_AI_CONFIG_MOVE_UP :{BLACK}Flytta upp STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Flytta upp vald datorspelare i listan @@ -4866,7 +4891,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}För må STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}För nära en annan hamn STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}För nära en annan flygplats STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan inte byta namn på station... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... detta är en stadsägd väg +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... detta är en väg som ägs av en stad STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vägen pekar i fel riktning STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... genomfartshållplatser kan inte ha gatuhörn STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... genomfartshållplatser kan inte ha korsningar From 4daa00c22aa935cda27dc1cf17a137c457d53065 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 7 Aug 2023 18:38:52 +0000 Subject: [PATCH 14/77] Update: Translations from eints slovak: 53 changes by legitalk --- src/lang/slovak.txt | 67 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index e748685cd5..1cf36067a9 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -255,8 +255,21 @@ STR_COLOUR_WHITE :Biela STR_COLOUR_RANDOM :Náhodná ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Tmavomodrá +STR_COLOUR_SECONDARY_PALE_GREEN :Svetlozelená +STR_COLOUR_SECONDARY_SECONDARY_PINK :Ružová +STR_COLOUR_SECONDARY_YELLOW :Žltá +STR_COLOUR_SECONDARY_RED :Červená STR_COLOUR_SECONDARY_LIGHT_BLUE :Svetlomodrá +STR_COLOUR_SECONDARY_GREEN :Zelená +STR_COLOUR_SECONDARY_DARK_GREEN :Tmavozelená STR_COLOUR_SECONDARY_BLUE :Modrá +STR_COLOUR_SECONDARY_CREAM :Krémová +STR_COLOUR_SECONDARY_MAUVE :Svetlofialová +STR_COLOUR_SECONDARY_PURPLE :Fialová +STR_COLOUR_SECONDARY_ORANGE :Oranžová +STR_COLOUR_SECONDARY_BROWN :Hnedá +STR_COLOUR_SECONDARY_GREY :Šedá STR_COLOUR_SECONDARY_WHITE :Biela @@ -920,7 +933,7 @@ STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLAC STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} bola zavretá veriteľmi a celý majetok bol rozpredaný! STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Založená nová dopravná spoločnosť! STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}Príchod nového konkurenta {STRING} pri meste {TOWN}! -STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} bola kúpená spoločnosťou {STRING}! +STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} bola kúpená spoločnosťou {STRING} za nezverejnenú sumu! STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Prezident) STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} sponzoroval výstavbu nového mesta {TOWN}! @@ -1005,9 +1018,19 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Nastavi # Game options window STR_GAME_OPTIONS_CAPTION :{WHITE}Možnosti hry +STR_GAME_OPTIONS_TAB_GENERAL :Všeobecné STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika +STR_GAME_OPTIONS_TAB_SOUND :Zvuk +STR_GAME_OPTIONS_VOLUME :Hlasitosť +STR_GAME_OPTIONS_SFX_VOLUME :Zvukové efekty +STR_GAME_OPTIONS_MUSIC_VOLUME :Hudba +STR_GAME_OPTIONS_VOLUME_0 :0 % +STR_GAME_OPTIONS_VOLUME_25 :25 % +STR_GAME_OPTIONS_VOLUME_50 :50 % +STR_GAME_OPTIONS_VOLUME_75 :75 % +STR_GAME_OPTIONS_VOLUME_100 :100 % STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Mena STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Výber menovej jednotky @@ -1064,7 +1087,10 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Výber i # Autosave dropdown ###length 5 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Vypnuté +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_10_MINUTES :Každých 10 minút STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_30_MINUTES :Každých 30 minút +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_60_MINUTES :Každých 60 minút +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_120_MINUTES :Každých 120 minút STR_GAME_OPTIONS_LANGUAGE :{BLACK}Jazyk STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Výber jazyka rozhrania @@ -1101,6 +1127,8 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x STR_GAME_OPTIONS_GUI_SCALE_4X :4x STR_GAME_OPTIONS_GUI_SCALE_5X :5x +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Automatizovaný prieskum +STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Zúčastniť sa automatizovaného prieskumu STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafika @@ -1110,12 +1138,12 @@ STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Obnovovacia frekvencia vyššia ako 60Hz môže znížiť výkon. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Základná sada grafiky -STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Výber sady grafiky, ktorá má byť použitá +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Výber sady grafiky, ktorá má byť použitá (nie je možné zmeniť v hre, iba z hlavného menu) STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} chýbajúci/poškodený súbor{P "" "y" "ov"} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Dodatočné informácie o základnej sade grafiky STR_GAME_OPTIONS_BASE_SFX :{BLACK}Základná sada zvukov -STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Výber sady zvukov, ktorá má byť použitá +STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Výber sady zvukov, ktorá má byť použitá (nie je možné zmeniť v hre, iba z hlavného menu) STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Dodatočné informácie o základnej sade zvukov STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Základná sada hudby @@ -1285,6 +1313,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :vľavo STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :v strede STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :vpravo +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sek{P 0 "unda" "undy" "únd"} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximálny počiatočný úver: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximálna množstvo peňazí ktoré si môže spoločnosť požičať (bez inflácie) @@ -1413,7 +1442,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nové príkazy STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normálne, vlak vždy zastaví v každej stanici cez ktorú prechádza. Povolením tohoto nastavenia, vlak bude pokračovať cez všetky stanice ktoré má v ceste až do svojej cieľovej stanice. Uvedomte si to, že toto nastavenie definuje "pôvodné" nastavenie LEN pre nové trasy. Samostatne zadávané cesty môžu byť nastavené aj inak. STR_CONFIG_SETTING_STOP_LOCATION :Vlaky zastavujú štandardne {STRING} stanice. -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Zvoľte kde zastaví vlak po príjazde do stanice. "Blízky koniec" znamená že vlak zastaví najbližšie ku vstupnému bodu, "Stred" že zastaví v strede stanice a "daleký koniec" že zastaví čo najďalej od vstupného bodu. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Zvoľte kde zastaví vlak po príjazde do stanice. "Blízky koniec" znamená že vlak zastaví najbližšie ku vstupnému bodu, "Stred" že zastaví v strede stanice a "daleký koniec" že zastaví čo najďalej od vstupného bodu. Uvedomte si to, že toto nastavenie definuje "pôvodné" nastavenie len pre nové trasy. Samostatne zadávané cesty môžu mať nastavené ich pozíciu zastavenia v stanici kliknutím na text príkazu ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :na začiatku STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :v strede @@ -1457,7 +1486,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Obmedzené STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normálny STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Povoliť prejazdné zastávky na mestských cestách: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Povoliť budovanie "prejazdných" nakládok a zastávok na cestách vlastnených mestom. +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Povoliť budovanie "prejazdných" nakládok a zastávok na cestách vlastnených mestom STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Výstavba zastávok na cestách vlastnených konkurenciou: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Povoliť budovanie "prejazdných" nakládok a zastávok na cestách vlastnených iným hráčom. STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Zmena nastavenia nie je možná, pokiaľ sa tu nachádzajú vozidlá @@ -2461,6 +2490,8 @@ STR_NETWORK_ASK_RELAY_NO :{BLACK}Nie STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Áno, tentokrát STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Áno, znova sa nepýtať +STR_NETWORK_ASK_SURVEY_NO :Nie +STR_NETWORK_ASK_SURVEY_YES :Áno STR_NETWORK_SPECTATORS :Pozorovatelia @@ -2751,7 +2782,8 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Automati STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Vyberte druh stanice pre zobrazenie STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Vyberte typ stanice pre vystavbu -STR_STATION_CLASS_DFLT :Pôvodná stanica +STR_STATION_CLASS_DFLT :Pôvodná +STR_STATION_CLASS_DFLT_STATION :Predvolená stanica STR_STATION_CLASS_WAYP :Smerové body # Signal window @@ -2960,7 +2992,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}3x3 mrie STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Náhodný # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Financovať nový priemysel +STR_FUND_INDUSTRY_CAPTION :{WHITE}Financovanie priemyslu STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Vyberte vhodný typ priemyslu zo zoznamu STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Vytvoriť náhodný priemysel STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Pokryť mapu náhodne umiestneným priemyslom @@ -2976,14 +3008,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Odstrán STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Ste si istý, že chcete odstrániť všetok priemysel? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Reťazec pre priemysel: {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Reťazec pre náklad: {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Reťazec pre priemysel - {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Reťazec pre náklad - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Produkujúci priemysel STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Podporovaný priemysel STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Domy STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Klikni na priemysel pre zobrazenie dodávateľov a zákazníkov STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Klikni na náklad pre zobrazenie dodávateľov a zákazníkov -STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Zobraziť reťazec +STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Priemyselné reťaze STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Zobraziť náklad dodávaného a prijímaného priemyslu STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Odkaz na malú mapu STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Vybrať zobrazený priemysel taktiež v malej mape @@ -3578,8 +3610,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Financovať rekonštrukciu mestskej cestnej siete.{}Spôsobí dopravný chaos a zápchy trvajúce ďalších 6 mesiacov.{}{POP_COLOUR}Cena: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Postaviť sochu na počesť vašej spoločnosti.{}Zabezpečí trvalé zvýšenie hodnotenia staníc v tomto meste.{}{POP_COLOUR}Cena: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financovať výstavbu nových budov v meste.{}Zabezpečí dočasné zrýchlenie rastu tohto mesta.{}{POP_COLOUR}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Zakúpiť exkluzívne dopravné práva v meste na 1 rok.{}Miestna správa nedovolí cestujúcim a nákladu používať stanice konkurentov.{}{POP_COLOUR}Cena: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Podplatiť miestnu správu pre zvýšenie hodnotenia vašej spoločnosti, s rizikom ťažkého postihu pri odhalení.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Zakúpiť exkluzívne dopravné práva v meste na 1 rok.{}Miestna správa nedovolí cestujúcim a nákladu používať stanice konkurentov. Úspešný úplatok od konkurenta túto zmluvu zruší.{}{POP_COLOUR}Cena: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Podplatiť miestnu správu pre zvýšenie hodnotenia vašej spoločnosti a zrušiť exkluzívne prepravné práva konkurenta, s rizikom prísneho trestu pri odhalení.{}{POP_COLOUR}Cena: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Ciele @@ -3887,6 +3919,7 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Možnost STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Zadať príkazy všetkým vozidlám v zozname STR_VEHICLE_LIST_REPLACE_VEHICLES :Vymeniť vozidlá STR_VEHICLE_LIST_SEND_FOR_SERVICING :Vykonať servis +STR_VEHICLE_LIST_CREATE_GROUP :Vytvoriť skupinu STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zisk tento rok: {CURRENCY_LONG} (minulý rok: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4609,6 +4642,8 @@ STR_TIMETABLE_EXPECTED :{BLACK}Očakáv STR_TIMETABLE_SCHEDULED :{BLACK}Plánované STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Prepnúť medzi očakávaným a plánovaným +STR_TIMETABLE_ARRIVAL :P: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE :O: {COLOUR}{DATE_TINY} # Date window (for timetable) @@ -4645,8 +4680,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Jeden z STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Okno ladenia AI/skriptu je dostupné len pre server # AI configuration window -STR_AI_CONFIG_CAPTION_AI :{WHITE}Konfigurácia AI -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Konfigurácia skriptu +STR_AI_CONFIG_CAPTION_AI :{WHITE}Nastavenia AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Nastavenia skriptu STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Skript, ktorý bude načítaný v ďalšej hre STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}AI, ktoré budú načítané v ďalšiej hre STR_AI_CONFIG_HUMAN_PLAYER :Človek @@ -5648,17 +5683,21 @@ STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} STR_JUST_CARGO :{CARGO_LONG} +STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_CHECKMARK :{CHECKMARK} STR_JUST_COMMA :{COMMA} STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT} STR_JUST_CURRENCY_LONG :{CURRENCY_LONG} STR_JUST_CARGO_LIST :{CARGO_LIST} +STR_JUST_DECIMAL :{DECIMAL} STR_JUST_INT :{NUM} STR_JUST_DATE_TINY :{DATE_TINY} STR_JUST_DATE_SHORT :{DATE_SHORT} STR_JUST_DATE_LONG :{DATE_LONG} STR_JUST_DATE_ISO :{DATE_ISO} STR_JUST_STRING :{STRING} +STR_JUST_STRING1 :{STRING} +STR_JUST_STRING2 :{STRING} STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_RAW_STRING :{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} From c2fc2d2ed571dcf78d7dd6368e14d058d9ae69ba Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 9 Aug 2023 18:40:24 +0000 Subject: [PATCH 15/77] Update: Translations from eints romanian: 48 changes by bnegrut --- src/lang/romanian.txt | 66 +++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 2444fcede8..854717f437 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -183,7 +183,7 @@ STR_COLOUR_DARK_GREEN :Verde închis STR_COLOUR_BLUE :Albastru STR_COLOUR_CREAM :Crem STR_COLOUR_MAUVE :Mov -STR_COLOUR_PURPLE :Purpuriu +STR_COLOUR_PURPLE :Violet STR_COLOUR_ORANGE :Portocaliu STR_COLOUR_BROWN :Maro STR_COLOUR_GREY :Gri @@ -191,6 +191,23 @@ STR_COLOUR_WHITE :Alb STR_COLOUR_RANDOM :Aleator ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Albastru închis +STR_COLOUR_SECONDARY_PALE_GREEN :Verde pal +STR_COLOUR_SECONDARY_SECONDARY_PINK :Roz +STR_COLOUR_SECONDARY_YELLOW :Galben +STR_COLOUR_SECONDARY_RED :Roșu +STR_COLOUR_SECONDARY_LIGHT_BLUE :Albastru deschis +STR_COLOUR_SECONDARY_GREEN :Verde +STR_COLOUR_SECONDARY_DARK_GREEN :Verde închis +STR_COLOUR_SECONDARY_BLUE :Albastru +STR_COLOUR_SECONDARY_CREAM :Crem +STR_COLOUR_SECONDARY_MAUVE :Mov +STR_COLOUR_SECONDARY_PURPLE :Violet +STR_COLOUR_SECONDARY_ORANGE :Portocaliu +STR_COLOUR_SECONDARY_BROWN :Maro +STR_COLOUR_SECONDARY_GREY :Gri +STR_COLOUR_SECONDARY_WHITE :Alb +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :La fel ca opțiunea primară # Units used in OpenTTD @@ -607,7 +624,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Graficul STR_GRAPH_INCOME_CAPTION :{WHITE}Graficul veniturilor STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unităţi de marfă livrate STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Evaluarea performanţelor companiilor (maxim=1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valorile companiilor +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Graficul valorii companiilor STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Prețurile transportului de mărfuri STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Zile în tranzit @@ -954,6 +971,7 @@ STR_GAME_OPTIONS_VOLUME_100 :100% STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Unitate monetară STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Alege unitatea monetară +STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({STRING}) ###length 42 STR_GAME_OPTIONS_CURRENCY_GBP :Liră sterlină @@ -1061,12 +1079,12 @@ STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Ratele de împrospătare de peste 60Hz ar putea afecta performanța. STR_GAME_OPTIONS_BASE_GRF :{BLACK}Set grafic de bază -STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selectează setul grafic de bază utilizat în joc +STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selectați setul de grafică de bază pe care să îl utilizați (nu poate fi schimbat în joc, doar din meniul principal) STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} {P fișier fișiere "de fișiere"} lipsă/corupt{P "" e e} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Informaţii adiţionale despre setul grafic de bază STR_GAME_OPTIONS_BASE_SFX :{BLACK}Set sunete de bază -STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Selectează un set de sunete pentru a fi folosit în joc +STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Selectați sunetele de bază setate pentru a fi utilizate (nu pot fi modificate în joc, doar din meniul principal) STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Informaţii adiţionale despre setul de sunete de bază STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Setul de muzică de bază @@ -1294,7 +1312,7 @@ STR_CONFIG_SETTING_CATCHMENT :Permite arii de STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Permite zone diferite de captare pentru tipuri diferite de staţii şi aeroporturi STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Stațiile companiei pot deservi industrii cu stații neutre atașate: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Dacă este activată, industriile cu stații atașate (cum ar fi Platforma petrolieră) pot fi deservite și de stațiile alăturate ale companiilor. Dacă e dezactivată, aceste industrii nu vor putea fi servite decât prin intermediul stațiilor atașate. Nicio stație din preajmă a unei companii nu le va putea deservi, iar stația atașată nu va putea deservi decât industria sa. +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Când este activată, industriile cu stații atașate (cum ar fi platformele petroliere) pot fi deservite și de stații deținute de companie construite în apropiere. Când sunt dezactivate, aceste industrii pot fi deservite numai de stațiile atașate. Orice stație a companiei din apropiere nu le va putea deservi și nici stația atașată nu va deservi altceva decât industria STR_CONFIG_SETTING_EXTRADYNAMITE :Permite demolarea unui nr. mai mare de drumuri, poduri și tunele deținute de oraș: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Facilitează eliminarea de clădiri şi infrastructură deţinute de oraş @@ -1364,7 +1382,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Comenzile noi s STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :În mod normal, un vehicul va opri în fiecare stație prin care trece. Prin activarea acestei setări, va trece fără oprire prin toate stațiile în drumul către destinația finală. Notă: această setare are efect doar asupra valorii implicite pentru comenzile noi. Comenzile individuale pot fi configurate explicit cu oricare din variante STR_CONFIG_SETTING_STOP_LOCATION :La comenzile noi ale trenurilor, oprirea implicită la platformă se face la {STRING} -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Locul în care oprește trenul pe platformă. La „capătul apropiat” înseamnă că trenul va opri aproape de locul de intrare, „mijloc” înseamnă mijlocul platformei, iar „capătul îndepărtat” înseamnă departe de punctul de intrare. Notă: această setare are efect doar pentru comenzile noi. Comenzile individuale pot fi configurate explicit cu oricare din variante +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Locul în care un tren se va opri la peron în mod implicit. „Capătul apropiat” înseamnă aproape de punctul de intrare, „mijloc” înseamnă în mijlocul platformei, iar „capătul îndepărtat” înseamnă departe de punctul de intrare. Rețineți că această setare definește doar o valoare implicită pentru comenzile noi. Pentru comenzile individuale se pot stabili locația opririi făcând clic pe textul comenzii ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :capătul apropiat al STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :mijlocul @@ -1407,8 +1425,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :niciunul STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :redus STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permite construirea stațiilor pe drumurile din proprietatea orașului: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite construcția stațiilor pe drumurile construite de un oraș +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permite construirea stațiilor pe drumurile deținute de orașe: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite construirea de stații pe drumurile aflate în proprietatea orașelor STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permite construirea staţiilor pe drumurile competitorilor: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Permite construcția stațiilor pe drumurile construite de altă companie STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Schimbarea acestei setări nu este permisă când există vehicule în joc @@ -1419,6 +1437,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Cand este activ STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Culoarea de început a companiei: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Alege culoarea de început pentru companie +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Culoarea secundară a companiei de pornire: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Alege culoarea secundară de pornire pentru companie, dacă utilizați un NewGRF care o activează. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeroporturile nu expiră niciodată: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activarea acestei opțiuni determina ca fiecare tip de aeroport sa fie disponibil permanent, după ce a fost introdus. @@ -1621,6 +1641,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Oprit STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Închidere fereastră la clic-dreapta: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Închide o fereastră prin clic-dreapta înăuntrul ei. Dezactivează sfatul oferit la clic-dreapta! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nu +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Da +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Da, mai puțin cele lipite STR_CONFIG_SETTING_AUTOSAVE :Autosalvare: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Alege intervalul de timp dintre salvările automate @@ -1950,7 +1973,9 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :deloc STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicator iniţial dimensiune oraş: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Dimensiunea medie a orașelor mari față de orașele normale, la începutul jocului +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Actualizează graficul de distribuție la fiecare {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Durată de timp între recalculările grafului de legături. Fiecare recalculare calculează planurile pentru o componentă a grafului. Asta înseamnă că o valoare X pentru această setare nu va actualiza graful la fiecare X secunde, ci doar o componentă va fi actualizată. O durată scurtă înseamnă mai mult timp pentru procesare, iar o durată lungă înseamnă că începutul distribuției mărfii pe noile rute va lua mai mult timp. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Ia {STRING} pentru recalcularea graficului de distribuție STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Durată de timp pentru fiecare recalculare unei componente a grafului de legături. Când începe recalcularea, un fir de execuție va putea rula acest număr de secunde. Cu un interval scurt, e mai probabil ca firul de execuția să nu termine la timp. Asta pauzează jocul până la terminarea execuției ("lag"). Cu un interval lung, actualizarea distribuției la schimbarea rutelor va lua mai mult timp. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modalitatea de distribuire a pasagerilor: {STRING} @@ -2923,7 +2948,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}Grilă 3 STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Aleator # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Construieşte un nou obiectiv industrial +STR_FUND_INDUSTRY_CAPTION :{WHITE}Finanțare industrie STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Alege industria potrivită din acestă listă STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Creează multe industrii aleatoare STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Umple harta cu industrii generate aleator @@ -2939,14 +2964,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Elimină STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Sigur vrei să elimini toate industriile? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Lanţ industrial pentru industria {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Lanţ industrial pentru cargo {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Lanț industrial - {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Lant de marfă - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Industrii producătoare STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Industrii acceptante STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Case STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Click pe industrie pentru a vedea furnizorii şi clienţii săi STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Click pe cargo pentru a vedea furnizorii şi clienţii săi -STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Afişează lanţ +STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Lanţ industrial STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Afișează industriile care furnizează și acceptă marfă STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Link către harta mică STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selectează industriile afişate şi pe harta mică @@ -3502,7 +3527,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Orașul STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Orașul {RED}nu{BLACK} crește STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limita zgomotului în oraş: {ORANGE}{COMMA}{BLACK} maxim: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrează imaginea pe locaţia oraşului. Ctrl+Click deshide o fereastra cu locaţia oraşului -STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autorit. locală +STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autoritate locală STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Afişează informaţii referitoare la autoritatea locală STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Schimbă numele oraşului @@ -3541,8 +3566,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Finanțați reconstrucția rețelei de drumuri urbane.{}Provoacă perturbări considerabile ale traficului rutier timp de până la 6 luni.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construiește o statuie în onoarea companiei tale.{}Oferă un spor permanent pentru cotele stațiilor tale din acest oraș.{}{POP_COLOUR}Cost: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finanțează construcția de noi clădiri în oraș.{}Oferă un spor temporar dezvoltării în acest oraș.{}{POP_COLOUR}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Cumpără drepturi exclusive de transport în acest oraș, timp de un an.{}Autoritățile locale nu vor permite călătorilor și mărfurilor să folosească stațiile competitorilor.{}{POP_COLOUR}Cost: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Mituiți autoritatea locală pentru a vă crește ratingul, cu riscul unei sancțiuni severe dacă eşti prins.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Cumpărați drepturi exclusive de transport pentru un an în oraș.{}Autoritatea orașului nu va permite pasagerilor și mărfurilor să folosească stațiile concurenților dvs. O mită reușită de la un concurent va anula acest contract.{}{POP_COLOUR}Cost: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Mituiți autoritatea locală pentru a vă crește ratingul și pentru a anula drepturile exclusive de transport ale unui concurent, cu riscul unei penalități severe dacă ești prins.{}{POP_COLOUR}Cost: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Scopuri @@ -3853,6 +3878,7 @@ STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Gestione STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Trimite instrucțiuni tuturor vehiculelor din această listă STR_VEHICLE_LIST_REPLACE_VEHICLES :Înlocuiește vehiculele STR_VEHICLE_LIST_SEND_FOR_SERVICING :Trimite in service +STR_VEHICLE_LIST_CREATE_GROUP :Crează grup STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit anul acesta: {CURRENCY_LONG} (anul trecut: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4575,6 +4601,8 @@ STR_TIMETABLE_EXPECTED :{BLACK}Estimat STR_TIMETABLE_SCHEDULED :{BLACK}Planificat STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Comută între estimare şi orar +STR_TIMETABLE_ARRIVAL :S: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE :P: {COLOUR}{DATE_TINY} # Date window (for timetable) @@ -4611,8 +4639,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}O Inteli STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Fereastra pentru depanare IA / Script Joc este disponibilă doar serverului # AI configuration window -STR_AI_CONFIG_CAPTION_AI :{WHITE}Configurație AI -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configurarea scriptului de joc +STR_AI_CONFIG_CAPTION_AI :{WHITE}Setări AI +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Setări Script de joc STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Scriptul care va fi încărcat în jocul următor STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Modulul de IA care va fi încărcat în jocul următor STR_AI_CONFIG_HUMAN_PLAYER :Jucator uman @@ -4862,7 +4890,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Prea mul STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Prea aproape de alt port STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Prea aproape de un alt aeroport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nu se poate redenumi staţia... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... drum în proprietatea oraşului +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... drum deținut de un oraș STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... drum orientat în direcţia greşită STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... haltele nu pot avea colţuri STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... haltele nu pot avea intersecţii @@ -5629,6 +5657,8 @@ STR_JUST_DATE_SHORT :{DATE_SHORT} STR_JUST_DATE_LONG :{DATE_LONG} STR_JUST_DATE_ISO :{DATE_ISO} STR_JUST_STRING :{STRING} +STR_JUST_STRING1 :{STRING} +STR_JUST_STRING2 :{STRING} STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_RAW_STRING :{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} From ba95764f1c94811895205f171b4ab1031b84b974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Wed, 9 Aug 2023 21:43:34 +0200 Subject: [PATCH 16/77] Fix 57717a2: VS2022 optimisation bug is fixed with MSVC 19.37 (#11172) --- cmake/CompileFlags.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index 6a942b2160..a499714481 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -56,8 +56,8 @@ macro(compile_flags) if(MSVC) add_compile_options(/W3) - if(MSVC_VERSION GREATER 1929 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # Starting with version 19.30, there is an optimisation bug, see #9966 for details + if(MSVC_VERSION GREATER 1929 AND MSVC_VERSION LESS 1937 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # Starting with version 19.30 (fixed in version 19.37), there is an optimisation bug, see #9966 for details # This flag disables the broken optimisation to work around the bug add_compile_options(/d2ssa-rse-) endif() From 6f057cbe6a208c4706372a8378ab122ef05298aa Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 07:52:59 -0400 Subject: [PATCH 17/77] Codechange: Use proper date type in ClickChangeDateCheat (#11176) --- src/cheat_gui.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index a56f3b5c78..27211daa56 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -104,12 +104,12 @@ extern void EnginesMonthlyLoop(); static int32_t ClickChangeDateCheat(int32_t new_value, int32_t change_direction) { /* Don't allow changing to an invalid year, or the current year. */ - new_value = Clamp(new_value, MIN_YEAR, MAX_YEAR); - if (new_value == TimerGameCalendar::year) return TimerGameCalendar::year; + auto new_year = Clamp(TimerGameCalendar::Year(new_value), MIN_YEAR, MAX_YEAR); + if (new_year == TimerGameCalendar::year) return TimerGameCalendar::year; TimerGameCalendar::YearMonthDay ymd; TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date, &ymd); - TimerGameCalendar::Date new_date = TimerGameCalendar::ConvertYMDToDate(new_value, ymd.month, ymd.day); + TimerGameCalendar::Date new_date = TimerGameCalendar::ConvertYMDToDate(new_year, ymd.month, ymd.day); /* Shift cached dates before we change the date. */ for (auto v : Vehicle::Iterate()) v->ShiftDates(new_date - TimerGameCalendar::date); From 93069066f933533d37050bbc94eb35b31f90a9d0 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 08:18:32 -0400 Subject: [PATCH 18/77] Codechange: Use auto type when sorting dates (#11175) --- src/build_vehicle_gui.cpp | 6 +++--- src/network/network_gui.cpp | 4 ++-- src/vehicle_gui.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index af2cccec3b..0dd06a3edb 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -125,9 +125,9 @@ static bool EngineNumberSorter(const GUIEngineListItem &a, const GUIEngineListIt */ static bool EngineIntroDateSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { - const int va = Engine::Get(a.engine_id)->intro_date; - const int vb = Engine::Get(b.engine_id)->intro_date; - const int r = va - vb; + const auto va = Engine::Get(a.engine_id)->intro_date; + const auto vb = Engine::Get(b.engine_id)->intro_date; + const auto r = va - vb; /* Use EngineID to sort instead since we want consistent sorting */ if (r == 0) return EngineNumberSorter(a, b); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 01fba02ef1..0f6c5e2dca 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -324,14 +324,14 @@ protected: /** Sort servers by current date */ static bool NGameDateSorter(NetworkGameList * const &a, NetworkGameList * const &b) { - int r = a->info.game_date - b->info.game_date; + auto r = a->info.game_date - b->info.game_date; return (r != 0) ? r < 0 : NGameClientSorter(a, b); } /** Sort servers by the number of days the game is running */ static bool NGameYearsSorter(NetworkGameList * const &a, NetworkGameList * const &b) { - int r = a->info.game_date - a->info.start_date - b->info.game_date + b->info.start_date; + auto r = a->info.game_date - a->info.start_date - b->info.game_date + b->info.start_date; return (r != 0) ? r < 0: NGameDateSorter(a, b); } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 7f5f1d9da4..607140f31b 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1360,7 +1360,7 @@ static bool VehicleNameSorter(const Vehicle * const &a, const Vehicle * const &b /** Sort vehicles by their age */ static bool VehicleAgeSorter(const Vehicle * const &a, const Vehicle * const &b) { - int r = a->age - b->age; + auto r = a->age - b->age; return (r != 0) ? r < 0 : VehicleNumberSorter(a, b); } From e4fd99a33ad81ad6bede3e1ee1f1c6af8be00f4e Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 08:18:59 -0400 Subject: [PATCH 19/77] Codechange: Use DateAtStartOfYear() instead of multiplying by DAYS_IN_LEAP_YEAR (#11174) --- regression/regression/result.txt | 64 ++++++++++++++++---------------- src/engine.cpp | 5 +-- src/timetable_cmd.cpp | 2 +- src/vehicle.cpp | 8 ++-- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 59ecd46fb0..fac7d1df0d 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -1388,7 +1388,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 75 GetMaxSpeed(): 64 GetPrice(): 8203 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 820 GetPower(): 300 GetWeight(): 47 @@ -1532,7 +1532,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 80 GetMaxSpeed(): 112 GetPrice(): 15234 - GetMaxAge(): 7686 + GetMaxAge(): 7671 GetRunningCost(): 1968 GetPower(): 1000 GetWeight(): 131 @@ -1550,7 +1550,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 84 GetMaxSpeed(): 128 GetPrice(): 22265 - GetMaxAge(): 7320 + GetMaxAge(): 7305 GetRunningCost(): 2296 GetPower(): 1200 GetWeight(): 162 @@ -3476,7 +3476,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 78 GetMaxSpeed(): 56 GetPrice(): 4921 - GetMaxAge(): 4392 + GetMaxAge(): 4383 GetRunningCost(): 426 GetPower(): 90 GetWeight(): 10 @@ -3602,7 +3602,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 77 GetMaxSpeed(): 48 GetPrice(): 4429 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3656,7 +3656,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 92 GetMaxSpeed(): 48 GetPrice(): 4716 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3764,7 +3764,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 98 GetMaxSpeed(): 48 GetPrice(): 4511 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3818,7 +3818,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 97 GetMaxSpeed(): 48 GetPrice(): 4306 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3872,7 +3872,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 87 GetMaxSpeed(): 48 GetPrice(): 4388 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3926,7 +3926,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 97 GetMaxSpeed(): 48 GetPrice(): 4675 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -3980,7 +3980,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 98 GetMaxSpeed(): 48 GetPrice(): 4839 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -4034,7 +4034,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 97 GetMaxSpeed(): 48 GetPrice(): 4962 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -4088,7 +4088,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 82 GetMaxSpeed(): 48 GetPrice(): 4593 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -4142,7 +4142,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 76 GetMaxSpeed(): 48 GetPrice(): 5947 - GetMaxAge(): 5490 + GetMaxAge(): 5479 GetRunningCost(): 421 GetPower(): 120 GetWeight(): 9 @@ -5060,7 +5060,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 99 GetMaxSpeed(): 24 GetPrice(): 30468 - GetMaxAge(): 10980 + GetMaxAge(): 10958 GetRunningCost(): 2296 GetPower(): -1 GetWeight(): -1 @@ -5096,7 +5096,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 88 GetMaxSpeed(): 32 GetPrice(): 18281 - GetMaxAge(): 10980 + GetMaxAge(): 10958 GetRunningCost(): 1476 GetPower(): -1 GetWeight(): -1 @@ -5186,7 +5186,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 81 GetMaxSpeed(): 24 GetPrice(): 24375 - GetMaxAge(): 10980 + GetMaxAge(): 10958 GetRunningCost(): 2460 GetPower(): -1 GetWeight(): -1 @@ -5258,7 +5258,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 58 GetMaxSpeed(): 236 GetPrice(): 28710 - GetMaxAge(): 7320 + GetMaxAge(): 7305 GetRunningCost(): 2390 GetPower(): -1 GetWeight(): -1 @@ -5276,7 +5276,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 95 GetMaxSpeed(): 236 GetPrice(): 30761 - GetMaxAge(): 8784 + GetMaxAge(): 8766 GetRunningCost(): 2812 GetPower(): -1 GetWeight(): -1 @@ -5330,7 +5330,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetReliability(): 77 GetMaxSpeed(): 236 GetPrice(): 30761 - GetMaxAge(): 10980 + GetMaxAge(): 10958 GetRunningCost(): 2756 GetPower(): -1 GetWeight(): -1 @@ -9323,8 +9323,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetEngineType(): 153 GetUnitNumber(): 1 GetAge(): 1 - GetMaxAge(): 5490 - GetAgeLeft(): 5489 + GetMaxAge(): 5479 + GetAgeLeft(): 5478 GetCurrentSpeed(): 7 GetRunningCost(): 421 GetProfitThisYear(): -1 @@ -9416,17 +9416,17 @@ ERROR: IsEnd() is invalid as Begin() is never called 14 => 0 13 => 0 MaxAge ListDump: - 16 => 10980 - 14 => 10980 - 17 => 7320 - 13 => 5490 - 12 => 5490 + 16 => 10958 + 14 => 10958 + 17 => 7305 + 13 => 5479 + 12 => 5479 AgeLeft ListDump: - 16 => 10980 - 14 => 10980 - 17 => 7320 - 13 => 5490 - 12 => 5489 + 16 => 10958 + 14 => 10958 + 17 => 7305 + 13 => 5479 + 12 => 5478 CurrentSpeed ListDump: 12 => 27 17 => 0 diff --git a/src/engine.cpp b/src/engine.cpp index 9ae6a9deec..28f0054d8e 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -437,8 +437,7 @@ uint Engine::GetDisplayMaxTractiveEffort() const */ TimerGameCalendar::Date Engine::GetLifeLengthInDays() const { - /* Assume leap years; this gives the player a bit more than the given amount of years, but never less. */ - return (this->info.lifelength + _settings_game.vehicle.extend_vehicle_life) * DAYS_IN_LEAP_YEAR; + return DateAtStartOfYear(this->info.lifelength + _settings_game.vehicle.extend_vehicle_life); } /** @@ -663,7 +662,7 @@ void SetYearEngineAgingStops() /* Base year ending date on half the model life */ TimerGameCalendar::YearMonthDay ymd; - TimerGameCalendar::ConvertDateToYMD(ei->base_intro + (ei->lifelength * DAYS_IN_LEAP_YEAR) / 2, &ymd); + TimerGameCalendar::ConvertDateToYMD(ei->base_intro + DateAtStartOfYear(ei->lifelength) / 2, &ymd); _year_engine_aging_stops = std::max(_year_engine_aging_stops, ymd.year); } diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 35ebc37f3f..40c3f428fd 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -304,7 +304,7 @@ CommandCost CmdSetTimetableStart(DoCommandFlag flags, VehicleID veh_id, bool tim /* Don't let a timetable start more than 15 years into the future or 1 year in the past. */ if (start_date < 0 || start_date > MAX_DATE) return CMD_ERROR; - if (start_date - TimerGameCalendar::date > MAX_TIMETABLE_START_YEARS * DAYS_IN_LEAP_YEAR) return CMD_ERROR; + if (start_date - TimerGameCalendar::date > DateAtStartOfYear(MAX_TIMETABLE_START_YEARS)) return CMD_ERROR; if (TimerGameCalendar::date - start_date > DAYS_IN_LEAP_YEAR) return CMD_ERROR; if (timetable_all && !v->orders->IsCompleteTimetable()) return CommandCost(STR_ERROR_TIMETABLE_INCOMPLETE); if (timetable_all && start_date + total_duration / DAY_TICKS > MAX_DATE) return CMD_ERROR; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 5e86e3c347..768b819ca3 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1377,9 +1377,11 @@ void AgeVehicle(Vehicle *v) if (!v->IsPrimaryVehicle() && (v->type != VEH_TRAIN || !Train::From(v)->IsEngine())) return; int age = v->age - v->max_age; - if (age == DAYS_IN_LEAP_YEAR * 0 || age == DAYS_IN_LEAP_YEAR * 1 || - age == DAYS_IN_LEAP_YEAR * 2 || age == DAYS_IN_LEAP_YEAR * 3 || age == DAYS_IN_LEAP_YEAR * 4) { - v->reliability_spd_dec <<= 1; + for (int32_t i = 0; i <= 4; i++) { + if (age == DateAtStartOfYear(i)) { + v->reliability_spd_dec <<= 1; + break; + } } SetWindowDirty(WC_VEHICLE_DETAILS, v->index); From 4928ccf916d5fd00c17171ab95b8c3bb7529c343 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 08:19:26 -0400 Subject: [PATCH 20/77] Fix #10478: Clarify airport noise control setting texts (#11169) --- src/lang/english.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 7936796d61..777168e2ac 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1899,8 +1899,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Allow towns to STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Towns are allowed to build level crossings: {STRING2} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Enabling this setting allows towns to build level crossings -STR_CONFIG_SETTING_NOISE_LEVEL :Allow town controlled noise level for airports: {STRING2} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :With this setting disabled, there can be two airports in each town. With this setting enabled, the number of airports in a town is limited by the noise acceptance of the town, which depends on population and airport size and distance +STR_CONFIG_SETTING_NOISE_LEVEL :Limit airport placement based on noise level: {STRING2} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Allow towns to block airport construction based on their noise acceptance level, which is based on the town's population and airport size and distance. If this setting is disabled, towns allow only two airports unless the local authority attitude is set to "Permissive" STR_CONFIG_SETTING_TOWN_FOUNDING :Founding towns in game: {STRING2} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Enabling this setting allows players to found new towns in the game From 6190f48df00deeb566c18ce826b5fe38624999ed Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 08:19:54 -0400 Subject: [PATCH 21/77] Codechange: Add a DateToYear function instead of dividing each time (#11173) --- src/build_vehicle_gui.cpp | 2 +- src/date_type.h | 10 ++++++++++ src/order_cmd.cpp | 4 ++-- src/vehicle_gui.cpp | 4 ++-- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 0dd06a3edb..9279abdbee 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -967,7 +967,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, if (e->type != VEH_TRAIN || e->u.rail.railveh_type != RAILVEH_WAGON) { /* Design date - Life length */ SetDParam(0, ymd.year); - SetDParam(1, e->GetLifeLengthInDays() / DAYS_IN_LEAP_YEAR); + SetDParam(1, DateToYear(e->GetLifeLengthInDays())); DrawString(left, right, y, STR_PURCHASE_INFO_DESIGNED_LIFE); y += FONT_HEIGHT_NORMAL; diff --git a/src/date_type.h b/src/date_type.h index c88b4f2061..3f69f6050b 100644 --- a/src/date_type.h +++ b/src/date_type.h @@ -63,6 +63,16 @@ static constexpr TimerGameCalendar::Date DateAtStartOfYear(TimerGameCalendar::Ye return (DAYS_IN_YEAR * year) + number_of_leap_years; } +/** + * Calculate the year of a given date. + * @param date The date to consider. + * @return the year. + */ +static inline TimerGameCalendar::Year DateToYear(TimerGameCalendar::Date date) +{ + return date / DAYS_IN_LEAP_YEAR; +} + /** * The date of the first day of the original base year. */ diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 038f630126..a8f9017e49 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1941,10 +1941,10 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) case OCV_RELIABILITY: skip_order = OrderConditionCompare(occ, ToPercent16(v->reliability), value); break; case OCV_MAX_RELIABILITY: skip_order = OrderConditionCompare(occ, ToPercent16(v->GetEngine()->reliability), value); break; case OCV_MAX_SPEED: skip_order = OrderConditionCompare(occ, v->GetDisplayMaxSpeed() * 10 / 16, value); break; - case OCV_AGE: skip_order = OrderConditionCompare(occ, v->age / DAYS_IN_LEAP_YEAR, value); break; + case OCV_AGE: skip_order = OrderConditionCompare(occ, DateToYear(v->age), value); break; case OCV_REQUIRES_SERVICE: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break; case OCV_UNCONDITIONALLY: skip_order = true; break; - case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1, 0) / DAYS_IN_LEAP_YEAR, value); break; + case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(DateToYear(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1), 0), value); break; default: NOT_REACHED(); } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 607140f31b..5d1a705f3c 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2495,9 +2495,9 @@ struct VehicleDetailsWindow : Window { Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); /* Draw running cost */ - SetDParam(1, v->age / DAYS_IN_LEAP_YEAR); + SetDParam(1, DateToYear(v->age)); SetDParam(0, (v->age + DAYS_IN_YEAR < v->max_age) ? STR_VEHICLE_INFO_AGE : STR_VEHICLE_INFO_AGE_RED); - SetDParam(2, v->max_age / DAYS_IN_LEAP_YEAR); + SetDParam(2, DateToYear(v->max_age)); SetDParam(3, v->GetDisplayRunningCost()); DrawString(tr, STR_VEHICLE_INFO_AGE_RUNNING_COST_YR); tr.top += FONT_HEIGHT_NORMAL; From 5fba47b0f734f5b2f8fd63cd96a44ee9cb2df64c Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 11 Aug 2023 14:53:51 +0200 Subject: [PATCH 22/77] Codechange: make no assumptions on how the internals of TileIndex work (#11183) Basically, avoid ".value", and just cast it to its original type if you want to retrieve this. --- src/map_func.h | 4 ++-- src/misc/endian_buffer.hpp | 4 ++-- src/script/squirrel_helper.hpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/map_func.h b/src/map_func.h index f879e00cb9..ab0495de94 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -426,7 +426,7 @@ debug_inline static TileIndex TileVirtXY(uint x, uint y) */ debug_inline static uint TileX(TileIndex tile) { - return tile.value & Map::MaxX(); + return static_cast(tile) & Map::MaxX(); } /** @@ -436,7 +436,7 @@ debug_inline static uint TileX(TileIndex tile) */ debug_inline static uint TileY(TileIndex tile) { - return tile.value >> Map::LogX(); + return static_cast(tile) >> Map::LogX(); } /** diff --git a/src/misc/endian_buffer.hpp b/src/misc/endian_buffer.hpp index 0579a9b7f4..c0deea38d6 100644 --- a/src/misc/endian_buffer.hpp +++ b/src/misc/endian_buffer.hpp @@ -53,7 +53,7 @@ public: if constexpr (std::is_enum_v) { this->Write(static_cast>(data)); } else if constexpr (std::is_base_of_v) { - this->Write(data.value); + this->Write(static_cast(data)); } else { this->Write(data); } @@ -146,7 +146,7 @@ public: if constexpr (std::is_enum_v) { data = static_cast(this->Read>()); } else if constexpr (std::is_base_of_v) { - data.value = this->Read(); + data = this->Read(); } else { data = this->Read(); } diff --git a/src/script/squirrel_helper.hpp b/src/script/squirrel_helper.hpp index bedf484f62..4bcccbf60a 100644 --- a/src/script/squirrel_helper.hpp +++ b/src/script/squirrel_helper.hpp @@ -37,7 +37,7 @@ namespace SQConvert { template <> struct Return { static inline int Set(HSQUIRRELVM vm, int32_t res) { sq_pushinteger(vm, res); return 1; } }; template <> struct Return { static inline int Set(HSQUIRRELVM vm, int64_t res) { sq_pushinteger(vm, res); return 1; } }; template <> struct Return { static inline int Set(HSQUIRRELVM vm, Money res) { sq_pushinteger(vm, res); return 1; } }; - template <> struct Return { static inline int Set(HSQUIRRELVM vm, TileIndex res) { sq_pushinteger(vm, (int32_t)res.value); return 1; } }; + template <> struct Return { static inline int Set(HSQUIRRELVM vm, TileIndex res) { sq_pushinteger(vm, (int32_t)static_cast(res)); return 1; } }; template <> struct Return { static inline int Set(HSQUIRRELVM vm, bool res) { sq_pushbool (vm, res); return 1; } }; template <> struct Return { /* Do not use char *, use std::optional instead. */ }; template <> struct Return { /* Do not use const char *, use std::optional instead. */ }; From c9c9cfa4fd72f9569ae05e88203e8397a33ea4e0 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 11 Aug 2023 14:55:55 +0200 Subject: [PATCH 23/77] Codechange: simplify the type of loaded_at_xy / next_station (#11182) It was TileOrStationID, most likely to make sure both types in the union are identical. But as TileIndex is a StrongTypeDef that becomes a bit weird. So instead, still make sure they are of equal size, but define their individual types better. --- src/cargopacket.cpp | 8 ++++---- src/cargopacket.h | 13 +++++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index b9d88ac7bc..d921960bb0 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -75,7 +75,7 @@ CargoPacket::CargoPacket(uint16_t count, uint16_t periods_in_transit, StationID source_id(source_id), source(source), source_xy(source_xy), - loaded_at_xy(loaded_at_xy.value) + loaded_at_xy(loaded_at_xy) { assert(count != 0); this->source_type = source_type; @@ -553,7 +553,7 @@ void VehicleCargoList::InvalidateCache() * @return Amount of cargo actually reassigned. */ template -uint VehicleCargoList::Reassign(uint max_move, TileOrStationID) +uint VehicleCargoList::Reassign(uint max_move, StationID) { static_assert(Tfrom != MTA_TRANSFER && Tto != MTA_TRANSFER); static_assert(Tfrom - Tto == 1 || Tto - Tfrom == 1); @@ -571,7 +571,7 @@ uint VehicleCargoList::Reassign(uint max_move, TileOrStationID) * @return Amount of cargo actually reassigned. */ template<> -uint VehicleCargoList::Reassign(uint max_move, TileOrStationID next_station) +uint VehicleCargoList::Reassign(uint max_move, StationID next_station) { max_move = std::min(this->action_counts[MTA_DELIVER], max_move); @@ -866,4 +866,4 @@ uint StationCargoList::Reroute(uint max_move, StationCargoList *dest, StationID */ template class CargoList; template class CargoList; -template uint VehicleCargoList::Reassign(uint, TileOrStationID); +template uint VehicleCargoList::Reassign(uint, StationID); diff --git a/src/cargopacket.h b/src/cargopacket.h index 08b7683f9c..96cb7fb506 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -34,7 +34,12 @@ template class CargoList; class StationCargoList; // forward-declare, so we can use it in VehicleCargoList. extern SaveLoadTable GetCargoPacketDesc(); -typedef uint32_t TileOrStationID; +/** + * To make alignment in the union in CargoPacket a bit easier, create a new type + * that is a StationID, but stored as 32bit. + */ +typedef uint32_t StationID_32bit; +static_assert(sizeof(TileIndex) == sizeof(StationID_32bit)); /** * Container for cargo from the same location and time. @@ -49,8 +54,8 @@ private: StationID source; ///< The station where the cargo came from first. TileIndex source_xy; ///< The origin of the cargo (first station in feeder chain). union { - TileOrStationID loaded_at_xy; ///< Location where this cargo has been loaded into the vehicle. - TileOrStationID next_station; ///< Station where the cargo wants to go next. + TileIndex loaded_at_xy; ///< Location where this cargo has been loaded into the vehicle. + StationID_32bit next_station; ///< Station where the cargo wants to go next. }; /** The CargoList caches, thus needs to know about it. */ @@ -416,7 +421,7 @@ public: * applicable), return value is amount of cargo actually moved. */ template - uint Reassign(uint max_move, TileOrStationID update = INVALID_TILE); + uint Reassign(uint max_move, StationID update = INVALID_STATION); uint Return(uint max_move, StationCargoList *dest, StationID next_station); uint Unload(uint max_move, StationCargoList *dest, CargoPayment *payment); uint Shift(uint max_move, VehicleCargoList *dest); From c7b51a8c3a2b1067f66fc01806549686b4917dbc Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 09:32:42 -0400 Subject: [PATCH 24/77] Codechange: Use proper date types in various places (#11177) --- src/currency.h | 5 +++-- src/graph_gui.cpp | 2 +- src/newgrf.cpp | 2 +- src/order_cmd.cpp | 2 +- src/settings_gui.cpp | 8 ++++---- src/toolbar_gui.cpp | 2 +- src/vehicle.cpp | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/currency.h b/src/currency.h index 33d8d088a2..d2e864d964 100644 --- a/src/currency.h +++ b/src/currency.h @@ -14,8 +14,9 @@ #include "string_func.h" #include "strings_type.h" -static const int CF_NOEURO = 0; ///< Currency never switches to the Euro (as far as known). -static const int CF_ISEURO = 1; ///< Currency _is_ the Euro. +static constexpr TimerGameCalendar::Year CF_NOEURO = 0; ///< Currency never switches to the Euro (as far as known). +static constexpr TimerGameCalendar::Year CF_ISEURO = 1; ///< Currency _is_ the Euro. +static constexpr TimerGameCalendar::Year MIN_EURO_YEAR = 2000; ///< The earliest year custom currencies may switch to the Euro. /** * This enum gives the currencies a unique id which must be maintained for diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 6559ad485e..dba31fe4fe 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -582,7 +582,7 @@ public: } int mo = (TimerGameCalendar::month / 3 - nums) * 3; - int yr = TimerGameCalendar::year; + auto yr = TimerGameCalendar::year; while (mo < 0) { yr--; mo += 12; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 8108f2eee1..34a443bb1f 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -6512,7 +6512,7 @@ bool GetGlobalVariable(byte param, uint32_t *value, const GRFFile *grffile) { switch (param) { case 0x00: // current date - *value = std::max(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0); + *value = std::max(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::Date(0)); return true; case 0x01: // current year diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index a8f9017e49..8a6490bd76 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1944,7 +1944,7 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) case OCV_AGE: skip_order = OrderConditionCompare(occ, DateToYear(v->age), value); break; case OCV_REQUIRES_SERVICE: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break; case OCV_UNCONDITIONALLY: skip_order = true; break; - case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(DateToYear(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1), 0), value); break; + case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(DateToYear(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1), TimerGameCalendar::Date(0)), value); break; default: NOT_REACHED(); } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index a34651397c..8718f70e24 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2844,13 +2844,13 @@ struct CustomCurrencyWindow : Window { break; case WID_CC_YEAR_DOWN: - _custom_currency.to_euro = (_custom_currency.to_euro <= 2000) ? CF_NOEURO : _custom_currency.to_euro - 1; + _custom_currency.to_euro = (_custom_currency.to_euro <= MIN_EURO_YEAR) ? CF_NOEURO : _custom_currency.to_euro - 1; if (_custom_currency.to_euro == CF_NOEURO) this->DisableWidget(WID_CC_YEAR_DOWN); this->EnableWidget(WID_CC_YEAR_UP); break; case WID_CC_YEAR_UP: - _custom_currency.to_euro = Clamp(_custom_currency.to_euro + 1, 2000, MAX_YEAR); + _custom_currency.to_euro = Clamp(_custom_currency.to_euro + 1, MIN_EURO_YEAR, MAX_YEAR); if (_custom_currency.to_euro == MAX_YEAR) this->DisableWidget(WID_CC_YEAR_UP); this->EnableWidget(WID_CC_YEAR_DOWN); break; @@ -2895,9 +2895,9 @@ struct CustomCurrencyWindow : Window { break; case WID_CC_YEAR: { // Year to switch to euro - int val = atoi(str); + TimerGameCalendar::Year val = atoi(str); - _custom_currency.to_euro = (val < 2000 ? CF_NOEURO : std::min(val, MAX_YEAR)); + _custom_currency.to_euro = (val < MIN_EURO_YEAR ? CF_NOEURO : std::min(val, MAX_YEAR)); break; } } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 9198d182e8..766da5b151 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2505,7 +2505,7 @@ struct ScenarioEditorToolbarWindow : Window { /* Was 'cancel' pressed? */ if (str == nullptr) return; - int32_t value; + TimerGameCalendar::Year value; if (!StrEmpty(str)) { value = atoi(str); } else { diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 768b819ca3..0979b2c1f8 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -761,7 +761,7 @@ uint32_t Vehicle::GetGRFID() const */ void Vehicle::ShiftDates(int interval) { - this->date_of_last_service = std::max(this->date_of_last_service + interval, 0); + this->date_of_last_service = std::max(this->date_of_last_service + interval, TimerGameCalendar::Date(0)); /* date_of_last_service_newgrf is not updated here as it must stay stable * for vehicles outside of a depot. */ } From 8ea01c0bfb244e819431b9aa97f476dab1eb0369 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 11 Aug 2023 10:05:16 -0400 Subject: [PATCH 25/77] Fix #11180: Use TileVirtXY for aircraft crash tile (#11184) --- src/aircraft_cmd.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 9960faaa2b..f8e8bae342 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1326,14 +1326,12 @@ static void CrashAirplane(Aircraft *v) v->Next()->cargo.Truncate(); const Station *st = GetTargetAirportIfValid(v); StringID newsitem; - TileIndex vt; + TileIndex vt = TileVirtXY(v->x_pos, v->y_pos); if (st == nullptr) { newsitem = STR_NEWS_PLANE_CRASH_OUT_OF_FUEL; - vt = TileVirtXY(v->x_pos, v->y_pos); } else { SetDParam(1, st->index); newsitem = STR_NEWS_AIRCRAFT_CRASH; - vt = v->tile; } AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); From 02be6ab6ba80ecb8e370622436d5584710bd6e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Fri, 11 Aug 2023 22:30:01 +0200 Subject: [PATCH 26/77] Fix #11179, a979d9c: Don't start more competitors than allowed (#11185) --- src/company_cmd.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index ff125b44ea..ca6ade6039 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -600,12 +600,12 @@ TimeoutTimer _new_competitor_timeout(0, []() { if (_networking && Company::GetNumItems() >= _settings_client.network.max_companies) return; /* count number of competitors */ - uint n = 0; + uint8_t n = 0; for (const Company *c : Company::Iterate()) { if (c->is_ai) n++; } - if (n >= (uint)_settings_game.difficulty.max_no_competitors) return; + if (n >= _settings_game.difficulty.max_no_competitors) return; /* Send a command to all clients to start up a new AI. * Works fine for Multiplayer and Singleplayer */ @@ -720,8 +720,15 @@ void OnTick_Companies() int32_t timeout = _settings_game.difficulty.competitors_interval * 60 * TICKS_PER_SECOND; /* If the interval is zero, start as many competitors as needed then check every ~10 minutes if a company went bankrupt and needs replacing. */ if (timeout == 0) { + /* count number of competitors */ + uint8_t n = 0; + for (const Company *cc : Company::Iterate()) { + if (cc->is_ai) n++; + } + for (auto i = 0; i < _settings_game.difficulty.max_no_competitors; i++) { if (_networking && Company::GetNumItems() >= _settings_client.network.max_companies) break; + if (n++ >= _settings_game.difficulty.max_no_competitors) break; Command::Post(CCA_NEW_AI, INVALID_COMPANY, CRR_NONE, INVALID_CLIENT_ID); } timeout = 10 * 60 * TICKS_PER_SECOND; From 01f55eb73424a8ca068219e94341d40ef8f3f1a5 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 16:02:11 +0200 Subject: [PATCH 27/77] Codechange: introduce week/quarter triggers for TimerGameCalendar (#11189) This simplifies code that triggers on these periods. --- src/network/network_server.cpp | 19 +++++++++++++++++-- src/timer/timer_game_calendar.cpp | 12 ++++++++++++ src/timer/timer_game_calendar.h | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index ad87c21835..24c6537530 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1822,6 +1822,15 @@ static IntervalTimer _network_yearly({TimerGameCalendar::YEAR NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY); }); +/** Quarterly "callback". Called whenever the quarter changes. */ +static IntervalTimer _network_quarterly({TimerGameCalendar::QUARTER, TimerGameCalendar::Priority::NONE}, [](auto) +{ + if (!_network_server) return; + + NetworkAutoCleanCompanies(); + NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY); +}); + /** Monthly "callback". Called whenever the month changes. */ static IntervalTimer _network_monthly({TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [](auto) { @@ -1829,7 +1838,14 @@ static IntervalTimer _network_monthly({TimerGameCalendar::MON NetworkAutoCleanCompanies(); NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY); - if ((TimerGameCalendar::month % 3) == 0) NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY); +}); + +/** Weekly "callback". Called whenever the week changes. */ +static IntervalTimer _network_weekly({TimerGameCalendar::WEEK, TimerGameCalendar::Priority::NONE}, [](auto) +{ + if (!_network_server) return; + + NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY); }); /** Daily "callback". Called whenever the date changes. */ @@ -1838,7 +1854,6 @@ static IntervalTimer _network_daily({TimerGameCalendar::DAY, if (!_network_server) return; NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY); - if ((TimerGameCalendar::date % 7) == 3) NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY); }); /** diff --git a/src/timer/timer_game_calendar.cpp b/src/timer/timer_game_calendar.cpp index f7e5707354..8174f9a1b4 100644 --- a/src/timer/timer_game_calendar.cpp +++ b/src/timer/timer_game_calendar.cpp @@ -215,10 +215,22 @@ void TimerManager::Elapsed(TimerGameCalendar::TElapsed delta) timer->Elapsed(TimerGameCalendar::DAY); } + if ((TimerGameCalendar::date % 7) == 3) { + for (auto timer : timers) { + timer->Elapsed(TimerGameCalendar::WEEK); + } + } + if (new_month) { for (auto timer : timers) { timer->Elapsed(TimerGameCalendar::MONTH); } + + if ((TimerGameCalendar::month % 3) == 0) { + for (auto timer : timers) { + timer->Elapsed(TimerGameCalendar::QUARTER); + } + } } if (new_year) { diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index b1e8448daf..ddb8a62342 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -34,7 +34,9 @@ class TimerGameCalendar { public: enum Trigger { DAY, + WEEK, MONTH, + QUARTER, YEAR, }; enum Priority { From b7acf9e50ecbf1aec6e79138da01554a601dd089 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 16:02:31 +0200 Subject: [PATCH 28/77] Codechange: use TimerGameCalendar::Year and friends when working with years (#11188) --- src/company_gui.cpp | 4 ++-- src/genworld_gui.cpp | 4 ++-- src/newgrf.cpp | 2 +- src/order_cmd.cpp | 2 +- src/statusbar_gui.cpp | 2 +- src/timetable_gui.cpp | 2 +- src/vehicle.cpp | 8 ++++---- src/vehicle_gui.cpp | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index dc660a6194..94509c7a62 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -260,7 +260,7 @@ static Money DrawYearCategory (const Rect &r, int start_y, ExpensesList list, co * @param tbl Reference to table of amounts for \a year. * @note The environment must provide padding at the left and right of \a r. */ -static void DrawYearColumn(const Rect &r, int year, const Money (&tbl)[EXPENSES_END]) +static void DrawYearColumn(const Rect &r, TimerGameCalendar::Year year, const Money (&tbl)[EXPENSES_END]) { int y = r.top; Money sum; @@ -434,7 +434,7 @@ struct CompanyFinancesWindow : Window { case WID_CF_EXPS_PRICE2: case WID_CF_EXPS_PRICE3: { const Company *c = Company::Get((CompanyID)this->window_number); - int age = std::min(TimerGameCalendar::year - c->inaugurated_year, 2); + auto age = std::min(TimerGameCalendar::year - c->inaugurated_year, TimerGameCalendar::Year(2)); int wid_offset = widget - WID_CF_EXPS_PRICE1; if (wid_offset <= age) { DrawYearColumn(r, TimerGameCalendar::year - (age - wid_offset), c->yearly_expenses[age - wid_offset]); diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index d76ee4bf1c..b24811fe05 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -987,7 +987,7 @@ struct GenerateLandscapeWindow : public Window { case WID_GL_START_DATE_TEXT: this->SetWidgetDirty(WID_GL_START_DATE_TEXT); - _settings_newgame.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR); + _settings_newgame.game_creation.starting_year = Clamp(TimerGameCalendar::Year(value), MIN_YEAR, MAX_YEAR); break; case WID_GL_SNOW_COVERAGE_TEXT: @@ -1258,7 +1258,7 @@ struct CreateScenarioWindow : public Window switch (this->widget_id) { case WID_CS_START_DATE_TEXT: this->SetWidgetDirty(WID_CS_START_DATE_TEXT); - _settings_newgame.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR); + _settings_newgame.game_creation.starting_year = Clamp(TimerGameCalendar::Year(value), MIN_YEAR, MAX_YEAR); break; case WID_CS_FLAT_LAND_HEIGHT_TEXT: diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 34a443bb1f..d14f20a904 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2257,7 +2257,7 @@ static ChangeInfoResult BridgeChangeInfo(uint brid, int numinfo, int prop, ByteR break; case 0x0F: // Long format year of availability (year since year 0) - bridge->avail_year = Clamp(buf->ReadDWord(), MIN_YEAR, MAX_YEAR); + bridge->avail_year = Clamp(TimerGameCalendar::Year(buf->ReadDWord()), MIN_YEAR, MAX_YEAR); break; case 0x10: { // purchase string diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 8a6490bd76..8c6f0ae892 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1944,7 +1944,7 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) case OCV_AGE: skip_order = OrderConditionCompare(occ, DateToYear(v->age), value); break; case OCV_REQUIRES_SERVICE: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break; case OCV_UNCONDITIONALLY: skip_order = true; break; - case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(DateToYear(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1), TimerGameCalendar::Date(0)), value); break; + case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, std::max(DateToYear(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1), TimerGameCalendar::Year(0)), value); break; default: NOT_REACHED(); } diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index bd80f743d0..848b7ee6b0 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -89,7 +89,7 @@ struct StatusBarWindow : Window { Dimension d; switch (widget) { case WID_S_LEFT: - SetDParamMaxValue(0, MAX_YEAR * DAYS_IN_YEAR); + SetDParamMaxValue(0, DateAtStartOfYear(MAX_YEAR)); d = GetStringBoundingBox(STR_JUST_DATE_LONG); break; diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 2d5e7b62d2..80b49a24f0 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -193,7 +193,7 @@ struct TimetableWindow : Window { { switch (widget) { case WID_VT_ARRIVAL_DEPARTURE_PANEL: - SetDParamMaxValue(1, MAX_YEAR * DAYS_IN_YEAR, 0, FS_SMALL); + SetDParamMaxValue(1, DateAtStartOfYear(MAX_YEAR), 0, FS_SMALL); size->width = std::max(GetStringBoundingBox(STR_TIMETABLE_ARRIVAL).width, GetStringBoundingBox(STR_TIMETABLE_DEPARTURE).width) + WidgetDimensions::scaled.hsep_wide + padding.width; FALLTHROUGH; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 0979b2c1f8..f6e5219c39 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1376,7 +1376,7 @@ void AgeVehicle(Vehicle *v) if (!v->IsPrimaryVehicle() && (v->type != VEH_TRAIN || !Train::From(v)->IsEngine())) return; - int age = v->age - v->max_age; + auto age = v->age - v->max_age; for (int32_t i = 0; i <= 4; i++) { if (age == DateAtStartOfYear(i)) { v->reliability_spd_dec <<= 1; @@ -1396,11 +1396,11 @@ void AgeVehicle(Vehicle *v) if (EngineHasReplacementForCompany(c, v->engine_type, v->group_id)) return; StringID str; - if (age == -DAYS_IN_LEAP_YEAR) { + if (age == DateAtStartOfYear(-1)) { str = STR_NEWS_VEHICLE_IS_GETTING_OLD; - } else if (age == 0) { + } else if (age == DateAtStartOfYear(0)) { str = STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD; - } else if (age > 0 && (age % DAYS_IN_LEAP_YEAR) == 0) { + } else if (age > DateAtStartOfYear(0) && (age % DAYS_IN_LEAP_YEAR) == 0) { str = STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND; } else { return; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5d1a705f3c..ed4d6acb02 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2438,7 +2438,7 @@ struct VehicleDetailsWindow : Window { case WID_VD_SERVICING_INTERVAL: SetDParamMaxValue(0, MAX_SERVINT_DAYS); // Roughly the maximum interval - SetDParamMaxValue(1, MAX_YEAR * DAYS_IN_YEAR); // Roughly the maximum year + SetDParamMaxValue(1, DateAtStartOfYear(MAX_YEAR)); // Roughly the maximum year size->width = std::max( GetStringBoundingBox(STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT).width, GetStringBoundingBox(STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS).width From a9ed590ca71cc133607762dac2071e30496d2b09 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 16:02:38 +0200 Subject: [PATCH 29/77] Codechange: use TimerGameCalendar::Date for variables in linkgraph that are dates (#11187) --- src/linkgraph/linkgraph.cpp | 2 +- src/linkgraph/linkgraph.h | 8 ++++---- src/linkgraph/linkgraphjob.h | 2 +- src/linkgraph/linkgraphschedule.cpp | 2 +- src/linkgraph/linkgraphschedule.h | 2 +- src/station_cmd.cpp | 13 ++++++------- src/vehicle.cpp | 2 +- src/vehicle_base.h | 2 +- 8 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/linkgraph/linkgraph.cpp b/src/linkgraph/linkgraph.cpp index 015e167955..f0e0597189 100644 --- a/src/linkgraph/linkgraph.cpp +++ b/src/linkgraph/linkgraph.cpp @@ -50,7 +50,7 @@ LinkGraph::BaseEdge::BaseEdge(NodeID dest_node) * This is useful if the date has been modified with the cheat menu. * @param interval Number of days to be added or subtracted. */ -void LinkGraph::ShiftDates(int interval) +void LinkGraph::ShiftDates(TimerGameCalendar::Date interval) { this->last_compression += interval; for (NodeID node1 = 0; node1 < this->Size(); ++node1) { diff --git a/src/linkgraph/linkgraph.h b/src/linkgraph/linkgraph.h index 106af79ab1..59bbcb758e 100644 --- a/src/linkgraph/linkgraph.h +++ b/src/linkgraph/linkgraph.h @@ -171,10 +171,10 @@ public: static const uint MIN_TIMEOUT_DISTANCE = 32; /** Number of days before deleting links served only by vehicles stopped in depot. */ - static const uint STALE_LINK_DEPOT_TIMEOUT = 1024; + static constexpr TimerGameCalendar::Date STALE_LINK_DEPOT_TIMEOUT = 1024; /** Minimum number of days between subsequent compressions of a LG. */ - static const uint COMPRESSION_INTERVAL = 256; + static constexpr TimerGameCalendar::Date COMPRESSION_INTERVAL = 256; /** * Scale a value from a link graph of age orig_age for usage in one of age @@ -184,7 +184,7 @@ public: * @param orig_age Age of the original link graph. * @return scaled value. */ - inline static uint Scale(uint val, uint target_age, uint orig_age) + inline static uint Scale(uint val, TimerGameCalendar::Date target_age, TimerGameCalendar::Date orig_age) { return val > 0 ? std::max(1U, val * target_age / orig_age) : 0; } @@ -198,7 +198,7 @@ public: LinkGraph(CargoID cargo) : cargo(cargo), last_compression(TimerGameCalendar::date) {} void Init(uint size); - void ShiftDates(int interval); + void ShiftDates(TimerGameCalendar::Date interval); void Compress(); void Merge(LinkGraph *other); diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index 2c2e9a86cc..6ea6c70307 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -223,7 +223,7 @@ public: * Change the join date on date cheating. * @param interval Number of days to add. */ - inline void ShiftJoinDate(int interval) { this->join_date += interval; } + inline void ShiftJoinDate(TimerGameCalendar::Date interval) { this->join_date += interval; } /** * Get the link graph settings for this component. diff --git a/src/linkgraph/linkgraphschedule.cpp b/src/linkgraph/linkgraphschedule.cpp index 3c3a12f4fe..ffdd54e7f3 100644 --- a/src/linkgraph/linkgraphschedule.cpp +++ b/src/linkgraph/linkgraphschedule.cpp @@ -132,7 +132,7 @@ void LinkGraphSchedule::SpawnAll() * graph jobs by the number of days given. * @param interval Number of days to be added or subtracted. */ -void LinkGraphSchedule::ShiftDates(int interval) +void LinkGraphSchedule::ShiftDates(TimerGameCalendar::Date interval) { for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(interval); for (LinkGraphJob *lgj : LinkGraphJob::Iterate()) lgj->ShiftJoinDate(interval); diff --git a/src/linkgraph/linkgraphschedule.h b/src/linkgraph/linkgraphschedule.h index 1e76cda324..572db030a9 100644 --- a/src/linkgraph/linkgraphschedule.h +++ b/src/linkgraph/linkgraphschedule.h @@ -58,7 +58,7 @@ public: bool IsJoinWithUnfinishedJobDue() const; void JoinNext(); void SpawnAll(); - void ShiftDates(int interval); + void ShiftDates(TimerGameCalendar::Date interval); /** * Queue a link graph for execution. diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 10ab53f652..7aa176e49e 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3806,8 +3806,8 @@ void DeleteStaleLinks(Station *from) Station *to = Station::Get((*lg)[edge.dest_node].station); assert(to->goods[c].node == edge.dest_node); assert(TimerGameCalendar::date >= edge.LastUpdate()); - uint timeout = LinkGraph::MIN_TIMEOUT_DISTANCE + (DistanceManhattan(from->xy, to->xy) >> 3); - if ((uint)(TimerGameCalendar::date - edge.LastUpdate()) > timeout) { + auto timeout = TimerGameCalendar::Date(LinkGraph::MIN_TIMEOUT_DISTANCE + (DistanceManhattan(from->xy, to->xy) >> 3)); + if (TimerGameCalendar::date - edge.LastUpdate() > timeout) { bool updated = false; if (auto_distributed) { @@ -3835,8 +3835,7 @@ void DeleteStaleLinks(Station *from) while (iter != vehicles.end()) { Vehicle *v = *iter; /* Do not refresh links of vehicles that have been stopped in depot for a long time. */ - if (!v->IsStoppedInDepot() || static_cast(TimerGameCalendar::date - v->date_of_last_service) <= - LinkGraph::STALE_LINK_DEPOT_TIMEOUT) { + if (!v->IsStoppedInDepot() || TimerGameCalendar::date - v->date_of_last_service <= LinkGraph::STALE_LINK_DEPOT_TIMEOUT) { LinkRefresher::Run(v, false); // Don't allow merging. Otherwise lg might get deleted. } if (edge.LastUpdate() == TimerGameCalendar::date) { @@ -3862,11 +3861,11 @@ void DeleteStaleLinks(Station *from) ge.flows.DeleteFlows(to->index); RerouteCargo(from, c, to->index, from->index); } - } else if (edge.last_unrestricted_update != INVALID_DATE && (uint)(TimerGameCalendar::date - edge.last_unrestricted_update) > timeout) { + } else if (edge.last_unrestricted_update != INVALID_DATE && TimerGameCalendar::date - edge.last_unrestricted_update > timeout) { edge.Restrict(); ge.flows.RestrictFlows(to->index); RerouteCargo(from, c, to->index, from->index); - } else if (edge.last_restricted_update != INVALID_DATE && (uint)(TimerGameCalendar::date - edge.last_restricted_update) > timeout) { + } else if (edge.last_restricted_update != INVALID_DATE && TimerGameCalendar::date - edge.last_restricted_update > timeout) { edge.Release(); } } @@ -3874,7 +3873,7 @@ void DeleteStaleLinks(Station *from) for (NodeID r : to_remove) (*lg)[ge.node].RemoveEdge(r); assert(TimerGameCalendar::date >= lg->LastCompression()); - if ((uint)(TimerGameCalendar::date - lg->LastCompression()) > LinkGraph::COMPRESSION_INTERVAL) { + if (TimerGameCalendar::date - lg->LastCompression() > LinkGraph::COMPRESSION_INTERVAL) { lg->Compress(); } } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index f6e5219c39..a21e4ff052 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -759,7 +759,7 @@ uint32_t Vehicle::GetGRFID() const * This is useful if the date has been modified with the cheat menu. * @param interval Number of days to be added or substracted. */ -void Vehicle::ShiftDates(int interval) +void Vehicle::ShiftDates(TimerGameCalendar::Date interval) { this->date_of_last_service = std::max(this->date_of_last_service + interval, TimerGameCalendar::Date(0)); /* date_of_last_service_newgrf is not updated here as it must stay stable diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 5ceb992690..a9a32deb4d 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -575,7 +575,7 @@ public: */ virtual void OnNewDay() {}; - void ShiftDates(int interval); + void ShiftDates(TimerGameCalendar::Date interval); /** * Crash the (whole) vehicle chain. From 0238a2b56708c17bd268edfe778837cda4f8a335 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 18:05:00 +0200 Subject: [PATCH 30/77] Codechange: use std::variant instead of using bitflags in the value (#11191) --- src/news_gui.cpp | 6 +++++- src/stdafx.h | 1 + src/vehicle_gui.cpp | 2 +- src/viewport.cpp | 14 ++++++-------- src/viewport_func.h | 3 ++- src/widget.cpp | 6 +++--- src/widget_type.h | 2 +- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/news_gui.cpp b/src/news_gui.cpp index e52dc18bf0..f6ffc7e683 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -308,7 +308,11 @@ struct NewsWindow : Window { /* Initialize viewport if it exists. */ NWidgetViewport *nvp = this->GetWidget(WID_N_VIEWPORT); if (nvp != nullptr) { - nvp->InitializeViewport(this, ni->reftype1 == NR_VEHICLE ? 0x80000000 | ni->ref1 : (uint32_t)GetReferenceTile(ni->reftype1, ni->ref1),ScaleZoomGUI(ZOOM_LVL_NEWS)); + if (ni->reftype1 == NR_VEHICLE) { + nvp->InitializeViewport(this, GetReferenceTile(ni->reftype1, ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS)); + } else { + nvp->InitializeViewport(this, static_cast(ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS)); + } if (this->ni->flags & NF_NO_TRANSPARENT) nvp->disp_flags |= ND_NO_TRANSPARENCY; if ((this->ni->flags & NF_INCOLOUR) == 0) { nvp->disp_flags |= ND_SHADE_GREY; diff --git a/src/stdafx.h b/src/stdafx.h index 2e4d3a7586..ae6805efe6 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -80,6 +80,7 @@ #include #include #include +#include #include #if defined(UNIX) || defined(__MINGW32__) diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index ed4d6acb02..9810c9c17f 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2915,7 +2915,7 @@ public: } this->FinishInitNested(window_number); this->owner = v->owner; - this->GetWidget(WID_VV_VIEWPORT)->InitializeViewport(this, this->window_number | (1 << 31), ScaleZoomGUI(_vehicle_view_zoom_levels[v->type])); + this->GetWidget(WID_VV_VIEWPORT)->InitializeViewport(this, static_cast(this->window_number), ScaleZoomGUI(_vehicle_view_zoom_levels[v->type])); this->GetWidget(WID_VV_START_STOP)->tool_tip = STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP + v->type; this->GetWidget(WID_VV_RENAME)->tool_tip = STR_VEHICLE_DETAILS_TRAIN_RENAME + v->type; diff --git a/src/viewport.cpp b/src/viewport.cpp index 02548dd442..02fd8796dd 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -213,13 +213,11 @@ void DeleteWindowViewport(Window *w) * @param y Offset of top edge of viewport with respect to top edge window \a w * @param width Width of the viewport * @param height Height of the viewport - * @param follow_flags Flags controlling the viewport. - * - If bit 31 is set, the lower 20 bits are the vehicle that the viewport should follow. - * - If bit 31 is clear, it is a #TileIndex. + * @param focus Either the tile index or vehicle ID to focus. * @param zoom Zoomlevel to display */ void InitializeWindowViewport(Window *w, int x, int y, - int width, int height, uint32_t follow_flags, ZoomLevel zoom) + int width, int height, std::variant focus, ZoomLevel zoom) { assert(w->viewport == nullptr); @@ -237,15 +235,15 @@ void InitializeWindowViewport(Window *w, int x, int y, Point pt; - if (follow_flags & 0x80000000) { + if (std::holds_alternative(focus)) { const Vehicle *veh; - vp->follow_vehicle = (VehicleID)(follow_flags & 0xFFFFF); + vp->follow_vehicle = std::get(focus); veh = Vehicle::Get(vp->follow_vehicle); pt = MapXYZToViewport(vp, veh->x_pos, veh->y_pos, veh->z_pos); } else { - x = TileX(follow_flags) * TILE_SIZE; - y = TileY(follow_flags) * TILE_SIZE; + x = TileX(std::get(focus)) * TILE_SIZE; + y = TileY(std::get(focus)) * TILE_SIZE; vp->follow_vehicle = INVALID_VEHICLE; pt = MapXYZToViewport(vp, x, y, GetSlopePixelZ(x, y)); diff --git a/src/viewport_func.h b/src/viewport_func.h index d6be050979..a9111c4375 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -15,13 +15,14 @@ #include "window_type.h" #include "tile_map.h" #include "station_type.h" +#include "vehicle_type.h" static const int TILE_HEIGHT_STEP = 50; ///< One Z unit tile height difference is displayed as 50m. void SetSelectionRed(bool); void DeleteWindowViewport(Window *w); -void InitializeWindowViewport(Window *w, int x, int y, int width, int height, uint32_t follow_flags, ZoomLevel zoom); +void InitializeWindowViewport(Window *w, int x, int y, int width, int height, std::variant focus, ZoomLevel zoom); Viewport *IsPtInWindowViewport(const Window *w, int x, int y); Point TranslateXYToTileCoord(const Viewport *vp, int x, int y, bool clamp_to_map = true); Point GetTileBelowCursor(); diff --git a/src/widget.cpp b/src/widget.cpp index 5dafacd7a2..e41dd57cdc 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -2333,12 +2333,12 @@ void NWidgetViewport::Draw(const Window *w) /** * Initialize the viewport of the window. * @param w Window owning the viewport. - * @param follow_flags Type of viewport, see #InitializeWindowViewport(). + * @param focus Either the tile index or vehicle ID to focus. * @param zoom Zoom level. */ -void NWidgetViewport::InitializeViewport(Window *w, uint32_t follow_flags, ZoomLevel zoom) +void NWidgetViewport::InitializeViewport(Window *w, std::variant focus, ZoomLevel zoom) { - InitializeWindowViewport(w, this->pos_x, this->pos_y, this->current_x, this->current_y, follow_flags, zoom); + InitializeWindowViewport(w, this->pos_x, this->pos_y, this->current_x, this->current_y, focus, zoom); } /** diff --git a/src/widget_type.h b/src/widget_type.h index 96776c1af1..6edbdf0533 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -629,7 +629,7 @@ public: void SetupSmallestSize(Window *w, bool init_array) override; void Draw(const Window *w) override; - void InitializeViewport(Window *w, uint32_t follow_flags, ZoomLevel zoom); + void InitializeViewport(Window *w, std::variant focus, ZoomLevel zoom); void UpdateViewportCoordinates(Window *w); }; From 299570b2c1b69556f2c4f432e7c5111de6a9765f Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 20:14:21 +0200 Subject: [PATCH 31/77] Codechange: make TimerGameCalendar Date and Year types strongly typed (#10761) --- src/cheat_gui.cpp | 4 +- src/company_gui.cpp | 2 +- src/core/format.hpp | 4 +- src/core/math_func.hpp | 20 +- src/core/strong_typedef_type.hpp | 259 +++++++++++++++++++------- src/date_gui.cpp | 4 +- src/date_type.h | 7 +- src/depot_gui.cpp | 2 +- src/economy.cpp | 2 +- src/engine.cpp | 12 +- src/genworld_gui.cpp | 2 +- src/landscape.cpp | 8 +- src/linkgraph/flowmapper.cpp | 4 +- src/linkgraph/linkgraph.cpp | 2 +- src/linkgraph/linkgraph.h | 4 +- src/linkgraph/linkgraphschedule.cpp | 4 +- src/misc/endian_buffer.hpp | 4 +- src/network/core/game_info.cpp | 8 +- src/network/network_admin.cpp | 8 +- src/newgrf.cpp | 12 +- src/newgrf_engine.cpp | 12 +- src/newgrf_house.cpp | 2 +- src/newgrf_industries.cpp | 8 +- src/newgrf_object.cpp | 4 +- src/newgrf_railtype.cpp | 6 +- src/newgrf_roadtype.cpp | 6 +- src/newgrf_town.cpp | 2 +- src/openttd.cpp | 4 +- src/order_cmd.cpp | 6 + src/pathfinder/yapf/yapf_node.hpp | 4 +- src/rail.cpp | 2 +- src/road.cpp | 4 +- src/saveload/map_sl.cpp | 4 +- src/saveload/oldloader.h | 3 - src/saveload/oldloader_sl.cpp | 6 +- src/script/api/script_basestation.cpp | 2 +- src/script/api/script_client.cpp | 2 +- src/script/api/script_date.cpp | 6 +- src/script/api/script_date.hpp | 2 +- src/script/api/script_engine.cpp | 4 +- src/script/api/script_industry.cpp | 8 +- src/script/api/script_story_page.cpp | 2 +- src/script/api/script_vehicle.cpp | 8 +- src/settings_internal.h | 44 ++++- src/stdafx.h | 7 + src/strings_func.h | 13 ++ src/strings_internal.h | 6 + src/table/roadtypes.h | 2 +- src/tile_type.h | 35 +--- src/timer/timer_game_calendar.cpp | 8 +- src/timer/timer_game_calendar.h | 17 +- src/timetable_cmd.cpp | 2 +- src/toolbar_gui.cpp | 2 +- src/town_cmd.cpp | 4 +- src/vehicle.cpp | 2 +- 55 files changed, 404 insertions(+), 217 deletions(-) diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 27211daa56..5e5c97c98b 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -105,7 +105,7 @@ static int32_t ClickChangeDateCheat(int32_t new_value, int32_t change_direction) { /* Don't allow changing to an invalid year, or the current year. */ auto new_year = Clamp(TimerGameCalendar::Year(new_value), MIN_YEAR, MAX_YEAR); - if (new_year == TimerGameCalendar::year) return TimerGameCalendar::year; + if (new_year == TimerGameCalendar::year) return static_cast(TimerGameCalendar::year); TimerGameCalendar::YearMonthDay ymd; TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date, &ymd); @@ -125,7 +125,7 @@ static int32_t ClickChangeDateCheat(int32_t new_value, int32_t change_direction) InvalidateWindowClassesData(WC_TRUCK_STATION, 0); InvalidateWindowClassesData(WC_BUILD_OBJECT, 0); ResetSignalVariant(); - return TimerGameCalendar::year; + return static_cast(TimerGameCalendar::year); } /** diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 94509c7a62..409c57a276 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -437,7 +437,7 @@ struct CompanyFinancesWindow : Window { auto age = std::min(TimerGameCalendar::year - c->inaugurated_year, TimerGameCalendar::Year(2)); int wid_offset = widget - WID_CF_EXPS_PRICE1; if (wid_offset <= age) { - DrawYearColumn(r, TimerGameCalendar::year - (age - wid_offset), c->yearly_expenses[age - wid_offset]); + DrawYearColumn(r, TimerGameCalendar::year - (age - wid_offset), c->yearly_expenses[static_cast(age - wid_offset)]); } break; } diff --git a/src/core/format.hpp b/src/core/format.hpp index f701ea6dfe..97abe7951c 100644 --- a/src/core/format.hpp +++ b/src/core/format.hpp @@ -28,8 +28,8 @@ struct fmt::formatter::value>> : fmt:: }; template -struct fmt::formatter::value>> : fmt::formatter { - using underlying_type = typename T::Type; +struct fmt::formatter::value>> : fmt::formatter { + using underlying_type = typename T::BaseType; using parent = typename fmt::formatter; constexpr fmt::format_parse_context::iterator parse(fmt::format_parse_context &ctx) { diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 1b0908db32..9596433e7b 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -10,6 +10,7 @@ #ifndef MATH_FUNC_HPP #define MATH_FUNC_HPP +#include "strong_typedef_type.hpp" /** * Returns the absolute value of (scalar) variable. @@ -162,7 +163,7 @@ static inline uint ClampU(const uint a, const uint min, const uint max) * for the return type. * @see Clamp(int, int, int) */ -template +template ::value, int> = 0> constexpr To ClampTo(From value) { static_assert(std::numeric_limits::is_integer, "Do not clamp from non-integer values"); @@ -213,6 +214,15 @@ constexpr To ClampTo(From value) return static_cast(std::min(value, std::numeric_limits::max())); } +/** + * Specialization of ClampTo for #StrongType::Typedef. + */ +template ::value, int> = 0> +constexpr To ClampTo(From value) +{ + return ClampTo(static_cast(value)); +} + /** * Returns the (absolute) difference between two (scalar) variables * @@ -254,10 +264,14 @@ static inline bool IsInsideBS(const T x, const size_t base, const size_t size) * @param max The maximum of the interval * @see IsInsideBS() */ -template +template , std::is_base_of>, int> = 0> static constexpr inline bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept { - return (size_t)(x - min) < (max - min); + if constexpr (std::is_base_of_v) { + return (size_t)(static_cast(x) - min) < (max - min); + } else { + return (size_t)(x - min) < (max - min); + } } /** diff --git a/src/core/strong_typedef_type.hpp b/src/core/strong_typedef_type.hpp index ec639688bb..0c1abe9843 100644 --- a/src/core/strong_typedef_type.hpp +++ b/src/core/strong_typedef_type.hpp @@ -10,74 +10,199 @@ #ifndef STRONG_TYPEDEF_TYPE_HPP #define STRONG_TYPEDEF_TYPE_HPP -/** Non-templated base for #StrongTypedef for use with type trait queries. */ -struct StrongTypedefBase {}; - -/** - * Templated helper to make a type-safe 'typedef' representing a single POD value. - * A normal 'typedef' is not distinct from its base type and will be treated as - * identical in many contexts. This class provides a distinct type that can still - * be assign from and compared to values of its base type. - * - * @note This is meant to be used as a base class, not directly. - * @tparam T Storage type - * @tparam Tthis Type of the derived class (i.e. the concrete usage of this class). - */ -template -struct StrongTypedef : StrongTypedefBase { - using Type = T; - - T value{}; ///< Backing storage field. - - debug_inline constexpr StrongTypedef() = default; - debug_inline constexpr StrongTypedef(const StrongTypedef &o) = default; - debug_inline constexpr StrongTypedef(StrongTypedef &&o) = default; - - debug_inline constexpr StrongTypedef(const T &value) : value(value) {} - - debug_inline constexpr Tthis &operator =(const Tthis &rhs) { this->value = rhs.value; return static_cast(*this); } - debug_inline constexpr Tthis &operator =(Tthis &&rhs) { this->value = std::move(rhs.value); return static_cast(*this); } - debug_inline constexpr Tthis &operator =(const T &rhs) { this->value = rhs; return static_cast(*this); } - - explicit constexpr operator T() const { return this->value; } +#include "../3rdparty/fmt/format.h" - constexpr bool operator ==(const Tthis &rhs) const { return this->value == rhs.value; } - constexpr bool operator !=(const Tthis &rhs) const { return this->value != rhs.value; } - constexpr bool operator ==(const T &rhs) const { return this->value == rhs; } - constexpr bool operator !=(const T &rhs) const { return this->value != rhs; } -}; - -/** - * Extension of #StrongTypedef with operators for addition and subtraction. - * @tparam T Storage type - * @tparam Tthis Type of the derived class (i.e. the concrete usage of this class). - */ -template -struct StrongIntegralTypedef : StrongTypedef { - using StrongTypedef::StrongTypedef; - - debug_inline constexpr StrongIntegralTypedef() = default; - debug_inline constexpr StrongIntegralTypedef(const StrongIntegralTypedef &o) = default; - debug_inline constexpr StrongIntegralTypedef(StrongIntegralTypedef &&o) = default; - - debug_inline constexpr StrongIntegralTypedef(const T &value) : StrongTypedef(value) {} - - debug_inline constexpr Tthis &operator =(const Tthis &rhs) { this->value = rhs.value; return static_cast(*this); } - debug_inline constexpr Tthis &operator =(Tthis &&rhs) { this->value = std::move(rhs.value); return static_cast(*this); } - debug_inline constexpr Tthis &operator =(const T &rhs) { this->value = rhs; return static_cast(*this); } - - constexpr Tthis &operator ++() { this->value++; return static_cast(*this); } - constexpr Tthis &operator --() { this->value--; return static_cast(*this); } - constexpr Tthis operator ++(int) { auto res = static_cast(*this); this->value++; return res; } - constexpr Tthis operator --(int) { auto res = static_cast(*this); this->value--; return res; } - - constexpr Tthis &operator +=(const Tthis &rhs) { this->value += rhs.value; return *static_cast(this); } - constexpr Tthis &operator -=(const Tthis &rhs) { this->value -= rhs.value; return *static_cast(this); } +/** Non-templated base for #StrongType::Typedef for use with type trait queries. */ +struct StrongTypedefBase {}; - constexpr Tthis operator +(const Tthis &rhs) const { return Tthis{ this->value + rhs.value }; } - constexpr Tthis operator -(const Tthis &rhs) const { return Tthis{ this->value - rhs.value }; } - constexpr Tthis operator +(const T &rhs) const { return Tthis{ this->value + rhs }; } - constexpr Tthis operator -(const T &rhs) const { return Tthis{ this->value - rhs }; } -}; +namespace StrongType { + /** + * Mix-in which makes the new Typedef comparable with itself and its base type. + */ + struct Compare { + template + struct mixin { + friend constexpr bool operator ==(const TType &lhs, const TType &rhs) { return lhs.value == rhs.value; } + friend constexpr bool operator ==(const TType &lhs, const TBaseType &rhs) { return lhs.value == rhs; } + + friend constexpr bool operator !=(const TType &lhs, const TType &rhs) { return lhs.value != rhs.value; } + friend constexpr bool operator !=(const TType &lhs, const TBaseType &rhs) { return lhs.value != rhs; } + + friend constexpr bool operator <=(const TType &lhs, const TType &rhs) { return lhs.value <= rhs.value; } + friend constexpr bool operator <=(const TType &lhs, const TBaseType &rhs) { return lhs.value <= rhs; } + + friend constexpr bool operator <(const TType &lhs, const TType &rhs) { return lhs.value < rhs.value; } + friend constexpr bool operator <(const TType &lhs, const TBaseType &rhs) { return lhs.value < rhs; } + + friend constexpr bool operator >=(const TType &lhs, const TType &rhs) { return lhs.value >= rhs.value; } + friend constexpr bool operator >=(const TType &lhs, const TBaseType &rhs) { return lhs.value >= rhs; } + + friend constexpr bool operator >(const TType &lhs, const TType &rhs) { return lhs.value > rhs.value; } + friend constexpr bool operator >(const TType &lhs, const TBaseType &rhs) { return lhs.value > rhs; } + }; + }; + + /** + * Mix-in which makes the new Typedef behave more like an integer. This means you can add and subtract from it. + * + * Operators like divide, multiply and module are explicitly denied, as that often makes little sense for the + * new type. If you want to do these actions on the new Typedef, you are better off first casting it to the + * base type. + */ + struct Integer { + template + struct mixin { + friend constexpr TType &operator ++(TType &lhs) { lhs.value++; return lhs; } + friend constexpr TType &operator --(TType &lhs) { lhs.value--; return lhs; } + friend constexpr TType operator ++(TType &lhs, int) { TType res = lhs; lhs.value++; return res; } + friend constexpr TType operator --(TType &lhs, int) { TType res = lhs; lhs.value--; return res; } + + friend constexpr TType &operator +=(TType &lhs, const TType &rhs) { lhs.value += rhs.value; return lhs; } + friend constexpr TType operator +(const TType &lhs, const TType &rhs) { return TType{ lhs.value + rhs.value }; } + friend constexpr TType operator +(const TType &lhs, const TBaseType &rhs) { return TType{ lhs.value + rhs }; } + + friend constexpr TType &operator -=(TType &lhs, const TType &rhs) { lhs.value -= rhs.value; return lhs; } + friend constexpr TType operator -(const TType &lhs, const TType &rhs) { return TType{ lhs.value - rhs.value }; } + friend constexpr TType operator -(const TType &lhs, const TBaseType &rhs) { return TType{ lhs.value - rhs }; } + + /* For most new types, the rest of the operators make no sense. For example, + * what does it actually mean to multiply a Year with a value. Or to do a + * bitwise OR on a Date. Or to divide a TileIndex by 2. Conceptually, they + * don't really mean anything. So force the user to first cast it to the + * base type, so the operation no longer returns the new Typedef. */ + + constexpr TType &operator *=(const TType &rhs) = delete; + constexpr TType operator *(const TType &rhs) = delete; + constexpr TType operator *(const TBaseType &rhs) = delete; + + constexpr TType &operator /=(const TType &rhs) = delete; + constexpr TType operator /(const TType &rhs) = delete; + constexpr TType operator /(const TBaseType &rhs) = delete; + + constexpr TType &operator %=(const TType &rhs) = delete; + constexpr TType operator %(const TType &rhs) = delete; + constexpr TType operator %(const TBaseType &rhs) = delete; + + constexpr TType &operator &=(const TType &rhs) = delete; + constexpr TType operator &(const TType &rhs) = delete; + constexpr TType operator &(const TBaseType &rhs) = delete; + + constexpr TType &operator |=(const TType &rhs) = delete; + constexpr TType operator |(const TType &rhs) = delete; + constexpr TType operator |(const TBaseType &rhs) = delete; + + constexpr TType &operator ^=(const TType &rhs) = delete; + constexpr TType operator ^(const TType &rhs) = delete; + constexpr TType operator ^(const TBaseType &rhs) = delete; + + constexpr TType &operator <<=(const TType &rhs) = delete; + constexpr TType operator <<(const TType &rhs) = delete; + constexpr TType operator <<(const TBaseType &rhs) = delete; + + constexpr TType &operator >>=(const TType &rhs) = delete; + constexpr TType operator >>(const TType &rhs) = delete; + constexpr TType operator >>(const TBaseType &rhs) = delete; + + constexpr TType operator ~() = delete; + constexpr TType operator -() = delete; + }; + }; + + /** + * Mix-in which makes the new Typedef compatible with another type (which is not the base type). + * + * @note The base type of the new Typedef will be cast to the other type; so make sure they are compatible. + * + * @tparam TCompatibleType The other type to be compatible with. + */ + template + struct Compatible { + template + struct mixin { + friend constexpr bool operator ==(const TType &lhs, TCompatibleType rhs) { return lhs.value == static_cast(rhs); } + friend constexpr bool operator !=(const TType &lhs, TCompatibleType rhs) { return lhs.value != static_cast(rhs); } + + friend constexpr bool operator <=(const TType &lhs, TCompatibleType rhs) { return lhs.value <= static_cast(rhs); } + friend constexpr bool operator <(const TType &lhs, TCompatibleType rhs) { return lhs.value < static_cast(rhs); } + friend constexpr bool operator >=(const TType &lhs, TCompatibleType rhs) { return lhs.value >= static_cast(rhs); } + friend constexpr bool operator >(const TType &lhs, TCompatibleType rhs) { return lhs.value > static_cast(rhs); } + + friend constexpr TType operator +(const TType &lhs, TCompatibleType rhs) { return { static_cast(lhs.value + rhs) }; } + friend constexpr TType operator -(const TType &lhs, TCompatibleType rhs) { return { static_cast(lhs.value - rhs) }; } + }; + }; + + /** + * Mix-in which makes the new Typedef implicitly convertible to its base type. + * + * Be careful: when allowing implicit conversion, you won't notice if this type is assigned to a compatible, but different, type. + * For example: + * + * StrongType::Typedef a = 1; + * StrongType::Typedef b = 2; + * a = b; // OK + */ + struct Implicit { + template + struct mixin { + constexpr operator TBaseType () const { return static_cast(*this).value; } + }; + }; + + /** + * Mix-in which makes the new Typedef explicitly convertible to its base type. + */ + struct Explicit { + template + struct mixin { + explicit constexpr operator TBaseType () const { return static_cast(*this).value; } + }; + }; + + /** + * Templated helper to make a type-safe 'typedef' representing a single POD value. + * A normal 'typedef' is not distinct from its base type and will be treated as + * identical in many contexts. This class provides a distinct type that can still + * be assign from and compared to values of its base type. + * + * Example usage: + * + * using MyType = StrongType::Typedef; + * + * @tparam TBaseType Type of the derived class (i.e. the concrete usage of this class). + * @tparam TTag An unique struct to keep types of the same TBaseType distinct. + * @tparam TProperties A list of mixins to add to the class. + */ + template + struct EMPTY_BASES Typedef : public StrongTypedefBase, public TProperties::template mixin, TBaseType>... { + using BaseType = TBaseType; + + constexpr Typedef() = default; + constexpr Typedef(const Typedef &) = default; + constexpr Typedef(Typedef &&) = default; + + constexpr Typedef(const TBaseType &value) : value(value) {} + + constexpr Typedef &operator =(const Typedef &rhs) { this->value = rhs.value; return *this; } + constexpr Typedef &operator =(Typedef &&rhs) { this->value = std::move(rhs.value); return *this; } + constexpr Typedef &operator =(const TBaseType &rhs) { this->value = rhs; return *this; } + + /* Only allow TProperties classes access to the internal value. Everyone else needs to do an explicit cast. */ + friend struct Explicit; + friend struct Implicit; + friend struct Compare; + friend struct Integer; + template friend struct Compatible; + +/* GCC / MSVC don't pick up on the "friend struct" above, where CLang does. + * As in our CI we compile for all three targets, it is sufficient to have one + * that errors on this; but nobody should be using "value" directly. Instead, + * use a static_cast<> to convert to the base type. */ +#ifdef __clang__ + protected: +#endif /* __clang__ */ + TBaseType value{}; + }; +} #endif /* STRONG_TYPEDEF_TYPE_HPP */ diff --git a/src/date_gui.cpp b/src/date_gui.cpp index fcb872f51a..febf505836 100644 --- a/src/date_gui.cpp +++ b/src/date_gui.cpp @@ -91,9 +91,9 @@ struct SetDateWindow : Window { case WID_SD_YEAR: for (TimerGameCalendar::Year i = this->min_year; i <= this->max_year; i++) { SetDParam(0, i); - list.emplace_back(new DropDownListStringItem(STR_JUST_INT, i, false)); + list.emplace_back(new DropDownListStringItem(STR_JUST_INT, static_cast(i), false)); } - selected = this->date.year; + selected = static_cast(this->date.year); break; } diff --git a/src/date_type.h b/src/date_type.h index 3f69f6050b..412fcd275e 100644 --- a/src/date_type.h +++ b/src/date_type.h @@ -58,9 +58,10 @@ static constexpr TimerGameCalendar::Year ORIGINAL_MAX_YEAR = 2090; */ static constexpr TimerGameCalendar::Date DateAtStartOfYear(TimerGameCalendar::Year year) { - uint number_of_leap_years = (year == 0) ? 0 : ((year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + 1); + int32_t year_as_int = static_cast(year); + uint number_of_leap_years = (year == 0) ? 0 : ((year_as_int - 1) / 4 - (year_as_int - 1) / 100 + (year_as_int - 1) / 400 + 1); - return (DAYS_IN_YEAR * year) + number_of_leap_years; + return (DAYS_IN_YEAR * year_as_int) + number_of_leap_years; } /** @@ -70,7 +71,7 @@ static constexpr TimerGameCalendar::Date DateAtStartOfYear(TimerGameCalendar::Ye */ static inline TimerGameCalendar::Year DateToYear(TimerGameCalendar::Date date) { - return date / DAYS_IN_LEAP_YEAR; + return static_cast(date) / DAYS_IN_LEAP_YEAR; } /** diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 50101fb9db..b7fb593a45 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -360,7 +360,7 @@ struct DepotWindow : Window { DrawSpriteIgnorePadding((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, flag, false, SA_CENTER); SetDParam(0, v->unitnumber); - DrawString(text, STR_JUST_COMMA, (uint16_t)(v->max_age - DAYS_IN_LEAP_YEAR) >= v->age ? TC_BLACK : TC_RED); + DrawString(text, STR_JUST_COMMA, (v->max_age - DAYS_IN_LEAP_YEAR) >= v->age ? TC_BLACK : TC_RED); } } diff --git a/src/economy.cpp b/src/economy.cpp index a7e36ba172..5af92821c7 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -928,7 +928,7 @@ void StartupEconomy() if (_settings_game.economy.inflation) { /* Apply inflation that happened before our game start year. */ - int months = (std::min(TimerGameCalendar::year, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR) * 12; + int months = static_cast(std::min(TimerGameCalendar::year, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR) * 12; for (int i = 0; i < months; i++) { AddInflation(false); } diff --git a/src/engine.cpp b/src/engine.cpp index 28f0054d8e..a66bc501da 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -662,7 +662,7 @@ void SetYearEngineAgingStops() /* Base year ending date on half the model life */ TimerGameCalendar::YearMonthDay ymd; - TimerGameCalendar::ConvertDateToYMD(ei->base_intro + DateAtStartOfYear(ei->lifelength) / 2, &ymd); + TimerGameCalendar::ConvertDateToYMD(ei->base_intro + static_cast(DateAtStartOfYear(ei->lifelength)) / 2, &ymd); _year_engine_aging_stops = std::max(_year_engine_aging_stops, ymd.year); } @@ -688,7 +688,7 @@ void StartupOneEngine(Engine *e, TimerGameCalendar::Date aging_date, uint32_t se SavedRandomSeeds saved_seeds; SaveRandomSeeds(&saved_seeds); SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^ - ei->base_intro ^ + static_cast(ei->base_intro) ^ e->type ^ e->GetGRFID()); uint32_t r = Random(); @@ -698,7 +698,7 @@ void StartupOneEngine(Engine *e, TimerGameCalendar::Date aging_date, uint32_t se * Note: TTDP uses fixed 1922 */ e->intro_date = ei->base_intro <= TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year + 2, 0, 1) ? ei->base_intro : (TimerGameCalendar::Date)GB(r, 0, 9) + ei->base_intro; if (e->intro_date <= TimerGameCalendar::date) { - e->age = (aging_date - e->intro_date) >> 5; + e->age = static_cast(aging_date - e->intro_date) >> 5; e->company_avail = MAX_UVALUE(CompanyMask); e->flags |= ENGINE_AVAILABLE; } @@ -710,8 +710,8 @@ void StartupOneEngine(Engine *e, TimerGameCalendar::Date aging_date, uint32_t se } SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^ - (re->index << 16) ^ (re->info.base_intro << 12) ^ (re->info.decay_speed << 8) ^ - (re->info.lifelength << 4) ^ re->info.retire_early ^ + (re->index << 16) ^ (static_cast(re->info.base_intro) << 12) ^ (re->info.decay_speed << 8) ^ + (static_cast(re->info.lifelength) << 4) ^ re->info.retire_early ^ e->type ^ e->GetGRFID()); @@ -722,7 +722,7 @@ void StartupOneEngine(Engine *e, TimerGameCalendar::Date aging_date, uint32_t se r = Random(); e->reliability_final = GB(r, 16, 14) + 0x3FFF; e->duration_phase_1 = GB(r, 0, 5) + 7; - e->duration_phase_2 = GB(r, 5, 4) + ei->base_life * 12 - 96; + e->duration_phase_2 = GB(r, 5, 4) + static_cast(ei->base_life) * 12 - 96; e->duration_phase_3 = GB(r, 9, 7) + 120; RestoreRandomSeeds(saved_seeds); diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index b24811fe05..669e597f78 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -968,7 +968,7 @@ struct GenerateLandscapeWindow : public Window { /* An empty string means revert to the default */ switch (this->widget_id) { case WID_GL_HEIGHTMAP_HEIGHT_TEXT: value = MAP_HEIGHT_LIMIT_AUTO_MINIMUM; break; - case WID_GL_START_DATE_TEXT: value = DEF_START_YEAR; break; + case WID_GL_START_DATE_TEXT: value = static_cast(DEF_START_YEAR); break; case WID_GL_SNOW_COVERAGE_TEXT: value = DEF_SNOW_COVERAGE; break; case WID_GL_DESERT_COVERAGE_TEXT: value = DEF_DESERT_COVERAGE; break; case WID_GL_TOWN_PULLDOWN: value = 1; break; diff --git a/src/landscape.cpp b/src/landscape.cpp index b43b09e599..a4a0a3a051 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -787,7 +787,7 @@ void RunTileLoop() _tile_type_procs[GetTileType(tile)]->tile_loop_proc(tile); /* Get the next tile in sequence using a Galois LFSR. */ - tile = (tile >> 1) ^ (-(int32_t)(tile & 1) & feedback); + tile = (static_cast(tile) >> 1) ^ (-(int32_t)(static_cast(tile) & 1) & feedback); } _cur_tileloop_tile = tile; @@ -935,11 +935,11 @@ static void GenerateTerrain(int type, uint flag) static void CreateDesertOrRainForest(uint desert_tropic_line) { - TileIndex update_freq = Map::Size() / 4; + uint update_freq = Map::Size() / 4; const TileIndexDiffC *data; for (TileIndex tile = 0; tile != Map::Size(); ++tile) { - if ((tile % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); + if ((static_cast(tile) % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); if (!IsValidTile(tile)) continue; @@ -960,7 +960,7 @@ static void CreateDesertOrRainForest(uint desert_tropic_line) } for (TileIndex tile = 0; tile != Map::Size(); ++tile) { - if ((tile % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); + if ((static_cast(tile) % update_freq) == 0) IncreaseGeneratingWorldProgress(GWP_LANDSCAPE); if (!IsValidTile(tile)) continue; diff --git a/src/linkgraph/flowmapper.cpp b/src/linkgraph/flowmapper.cpp index 497aacb62b..b27719dc52 100644 --- a/src/linkgraph/flowmapper.cpp +++ b/src/linkgraph/flowmapper.cpp @@ -50,9 +50,9 @@ void FlowMapper::Run(LinkGraphJob &job) const /* Scale by time the graph has been running without being compressed. Add 1 to avoid * division by 0 if spawn date == last compression date. This matches * LinkGraph::Monthly(). */ - uint runtime = job.JoinDate() - job.Settings().recalc_time / SECONDS_PER_DAY - job.LastCompression() + 1; + auto runtime = job.JoinDate() - job.Settings().recalc_time / SECONDS_PER_DAY - job.LastCompression() + 1; for (auto &it : flows) { - it.second.ScaleToMonthly(runtime); + it.second.ScaleToMonthly(static_cast(runtime)); } } /* Clear paths. */ diff --git a/src/linkgraph/linkgraph.cpp b/src/linkgraph/linkgraph.cpp index f0e0597189..33d2adbad6 100644 --- a/src/linkgraph/linkgraph.cpp +++ b/src/linkgraph/linkgraph.cpp @@ -65,7 +65,7 @@ void LinkGraph::ShiftDates(TimerGameCalendar::Date interval) void LinkGraph::Compress() { - this->last_compression = (TimerGameCalendar::date + this->last_compression) / 2; + this->last_compression = static_cast(TimerGameCalendar::date + this->last_compression) / 2; for (NodeID node1 = 0; node1 < this->Size(); ++node1) { this->nodes[node1].supply /= 2; for (BaseEdge &edge : this->nodes[node1].edges) { diff --git a/src/linkgraph/linkgraph.h b/src/linkgraph/linkgraph.h index 59bbcb758e..6ca1a04b29 100644 --- a/src/linkgraph/linkgraph.h +++ b/src/linkgraph/linkgraph.h @@ -186,7 +186,7 @@ public: */ inline static uint Scale(uint val, TimerGameCalendar::Date target_age, TimerGameCalendar::Date orig_age) { - return val > 0 ? std::max(1U, val * target_age / orig_age) : 0; + return val > 0 ? std::max(1U, val * static_cast(target_age) / static_cast(orig_age)) : 0; } /** Bare constructor, only for save/load. */ @@ -249,7 +249,7 @@ public: */ inline uint Monthly(uint base) const { - return base * 30 / (TimerGameCalendar::date - this->last_compression + 1); + return base * 30 / static_cast(TimerGameCalendar::date - this->last_compression + 1); } NodeID AddNode(const Station *st); diff --git a/src/linkgraph/linkgraphschedule.cpp b/src/linkgraph/linkgraphschedule.cpp index ffdd54e7f3..4a2af43d02 100644 --- a/src/linkgraph/linkgraphschedule.cpp +++ b/src/linkgraph/linkgraphschedule.cpp @@ -178,7 +178,7 @@ void StateGameLoop_LinkGraphPauseControl() } } else if (_pause_mode == PM_UNPAUSED && TimerGameCalendar::date_fract == LinkGraphSchedule::SPAWN_JOIN_TICK - 2 && - TimerGameCalendar::date % (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY) == (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY) / 2 && + static_cast(TimerGameCalendar::date) % (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY) == (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY) / 2 && LinkGraphSchedule::instance.IsJoinWithUnfinishedJobDue()) { /* Perform check two TimerGameCalendar::date_fract ticks before we would join, to make * sure it also works in multiplayer. */ @@ -205,7 +205,7 @@ void AfterLoad_LinkGraphPauseControl() void OnTick_LinkGraph() { if (TimerGameCalendar::date_fract != LinkGraphSchedule::SPAWN_JOIN_TICK) return; - TimerGameCalendar::Date offset = TimerGameCalendar::date % (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY); + TimerGameCalendar::Date offset = static_cast(TimerGameCalendar::date) % (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY); if (offset == 0) { LinkGraphSchedule::instance.SpawnNext(); } else if (offset == (_settings_game.linkgraph.recalc_interval / SECONDS_PER_DAY) / 2) { diff --git a/src/misc/endian_buffer.hpp b/src/misc/endian_buffer.hpp index c0deea38d6..8422ebb4d3 100644 --- a/src/misc/endian_buffer.hpp +++ b/src/misc/endian_buffer.hpp @@ -53,7 +53,7 @@ public: if constexpr (std::is_enum_v) { this->Write(static_cast>(data)); } else if constexpr (std::is_base_of_v) { - this->Write(static_cast(data)); + this->Write(static_cast(data)); } else { this->Write(data); } @@ -146,7 +146,7 @@ public: if constexpr (std::is_enum_v) { data = static_cast(this->Read>()); } else if constexpr (std::is_base_of_v) { - data = this->Read(); + data = this->Read(); } else { data = this->Read(); } diff --git a/src/network/core/game_info.cpp b/src/network/core/game_info.cpp index bfbfc25716..fd95fe1dfb 100644 --- a/src/network/core/game_info.cpp +++ b/src/network/core/game_info.cpp @@ -227,8 +227,8 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool } /* NETWORK_GAME_INFO_VERSION = 3 */ - p->Send_uint32(info->game_date); - p->Send_uint32(info->start_date); + p->Send_uint32(static_cast(info->game_date)); + p->Send_uint32(static_cast(info->start_date)); /* NETWORK_GAME_INFO_VERSION = 2 */ p->Send_uint8 (info->companies_max); @@ -323,8 +323,8 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo } case 3: - info->game_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); - info->start_date = Clamp(p->Recv_uint32(), 0, MAX_DATE); + info->game_date = Clamp(p->Recv_uint32(), 0, static_cast(MAX_DATE)); + info->start_date = Clamp(p->Recv_uint32(), 0, static_cast(MAX_DATE)); FALLTHROUGH; case 2: diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index f92ec0920a..2ad53d972e 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -178,7 +178,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome() p->Send_string(""); // Used to be map-name. p->Send_uint32(_settings_game.game_creation.generation_seed); p->Send_uint8 (_settings_game.game_creation.landscape); - p->Send_uint32(TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1)); + p->Send_uint32(static_cast(TimerGameCalendar::ConvertYMDToDate(_settings_game.game_creation.starting_year, 0, 1))); p->Send_uint16(Map::SizeX()); p->Send_uint16(Map::SizeY()); @@ -208,7 +208,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate() { Packet *p = new Packet(ADMIN_PACKET_SERVER_DATE); - p->Send_uint32(TimerGameCalendar::date); + p->Send_uint32(static_cast(TimerGameCalendar::date)); this->SendPacket(p); return NETWORK_RECV_STATUS_OKAY; @@ -244,7 +244,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC p->Send_string(cs == nullptr ? "" : const_cast(cs->client_address).GetHostname()); p->Send_string(ci->client_name); p->Send_uint8 (0); // Used to be language - p->Send_uint32(ci->join_date); + p->Send_uint32(static_cast(ci->join_date)); p->Send_uint8 (ci->client_playas); this->SendPacket(p); @@ -329,7 +329,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company p->Send_string(GetString(STR_PRESIDENT_NAME)); p->Send_uint8 (c->colour); p->Send_bool (NetworkCompanyIsPassworded(c->index)); - p->Send_uint32(c->inaugurated_year); + p->Send_uint32(static_cast(c->inaugurated_year)); p->Send_bool (c->is_ai); p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy diff --git a/src/newgrf.cpp b/src/newgrf.cpp index d14f20a904..a94b003763 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -6512,18 +6512,18 @@ bool GetGlobalVariable(byte param, uint32_t *value, const GRFFile *grffile) { switch (param) { case 0x00: // current date - *value = std::max(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::Date(0)); + *value = static_cast(std::max(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::Date(0))); return true; case 0x01: // current year - *value = Clamp(TimerGameCalendar::year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; + *value = static_cast(Clamp(TimerGameCalendar::year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR); return true; case 0x02: { // detailed date information: month of year (bit 0-7), day of month (bit 8-12), leap year (bit 15), day of year (bit 16-24) TimerGameCalendar::YearMonthDay ymd; TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date, &ymd); TimerGameCalendar::Date start_of_year = TimerGameCalendar::ConvertYMDToDate(ymd.year, 0, 1); - *value = ymd.month | (ymd.day - 1) << 8 | (TimerGameCalendar::IsLeapYear(ymd.year) ? 1 << 15 : 0) | (TimerGameCalendar::date - start_of_year) << 16; + *value = ymd.month | (ymd.day - 1) << 8 | (TimerGameCalendar::IsLeapYear(ymd.year) ? 1 << 15 : 0) | static_cast(TimerGameCalendar::date - start_of_year) << 16; return true; } @@ -6629,11 +6629,11 @@ bool GetGlobalVariable(byte param, uint32_t *value, const GRFFile *grffile) return true; case 0x23: // long format date - *value = TimerGameCalendar::date; + *value = static_cast(TimerGameCalendar::date); return true; case 0x24: // long format year - *value = TimerGameCalendar::year; + *value = static_cast(TimerGameCalendar::year); return true; default: return false; @@ -7228,7 +7228,7 @@ static uint32_t GetPatchVariable(uint8_t param) { switch (param) { /* start year - 1920 */ - case 0x0B: return std::max(_settings_game.game_creation.starting_year, ORIGINAL_BASE_YEAR) - ORIGINAL_BASE_YEAR; + case 0x0B: return static_cast(std::max(_settings_game.game_creation.starting_year, ORIGINAL_BASE_YEAR) - ORIGINAL_BASE_YEAR); /* freight trains weight factor */ case 0x0E: return _settings_game.vehicle.freight_trains; diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 6007860861..d0e9685df9 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -572,7 +572,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } case 0x48: return v->GetEngine()->flags; // Vehicle Type Info - case 0x49: return v->build_year; + case 0x49: return static_cast(v->build_year); case 0x4A: switch (v->type) { @@ -597,7 +597,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } case 0x4B: // Long date of last service - return v->date_of_last_service_newgrf; + return static_cast(v->date_of_last_service_newgrf); case 0x4C: // Current maximum speed in NewGRF units if (!v->IsPrimaryVehicle()) return 0; @@ -829,7 +829,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec case 0x41: return GB(ClampTo(v->age), 8, 8); case 0x42: return ClampTo(v->max_age); case 0x43: return GB(ClampTo(v->max_age), 8, 8); - case 0x44: return Clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; + case 0x44: return static_cast(Clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR); case 0x45: return v->unitnumber; case 0x46: return v->GetEngine()->grf_prop.local_id; case 0x47: return GB(v->GetEngine()->grf_prop.local_id, 8, 8); @@ -972,11 +972,11 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } } case 0x48: return Engine::Get(this->self_type)->flags; // Vehicle Type Info - case 0x49: return TimerGameCalendar::year; // 'Long' format build year - case 0x4B: return TimerGameCalendar::date; // Long date of last service + case 0x49: return static_cast(TimerGameCalendar::year); // 'Long' format build year + case 0x4B: return static_cast(TimerGameCalendar::date); // Long date of last service case 0x92: return ClampTo(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR); // Date of last service case 0x93: return GB(ClampTo(TimerGameCalendar::date - DAYS_TILL_ORIGINAL_BASE_YEAR), 8, 8); - case 0xC4: return Clamp(TimerGameCalendar::year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year + case 0xC4: return static_cast(Clamp(TimerGameCalendar::year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR); // Build year case 0xC6: return Engine::Get(this->self_type)->grf_prop.local_id; case 0xC7: return GB(Engine::Get(this->self_type)->grf_prop.local_id, 8, 8); case 0xDA: return INVALID_VEHICLE; // Next vehicle diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 4520cfaff5..7d82cc83b7 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -296,7 +296,7 @@ static uint32_t GetDistanceFromNearbyHouse(uint8_t parameter, TileIndex tile, Ho case 0x40: return (IsTileType(this->tile, MP_HOUSE) ? GetHouseBuildingStage(this->tile) : 0) | TileHash2Bit(TileX(this->tile), TileY(this->tile)) << 2; /* Building age. */ - case 0x41: return IsTileType(this->tile, MP_HOUSE) ? GetHouseAge(this->tile) : 0; + case 0x41: return static_cast(IsTileType(this->tile, MP_HOUSE) ? GetHouseAge(this->tile) : 0); /* Town zone */ case 0x42: return GetTownRadiusGroup(this->town, this->tile); diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index b9612fb311..047102e620 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -163,7 +163,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo switch (variable) { case 0x80: return this->tile; - case 0x81: return GB(this->tile, 8, 8); + case 0x81: return GB(static_cast(this->tile), 8, 8); /* Pointer to the town the industry is associated with */ case 0x82: return this->industry->town->index; @@ -247,7 +247,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo return this->industry->founder | (is_ai ? 0x10000 : 0) | (colours << 24); } - case 0x46: return this->industry->construction_date; // Date when built - long format - (in days) + case 0x46: return static_cast(this->industry->construction_date); // Date when built - long format - (in days) /* Override flags from GS */ case 0x47: return this->industry->ctlflags; @@ -338,7 +338,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo if (!IsValidCargoID(cargo)) return 0; auto it = this->industry->GetCargoAccepted(cargo); if (it == std::end(this->industry->accepted)) return 0; // invalid cargo - if (variable == 0x6E) return it->last_accepted; + if (variable == 0x6E) return static_cast(it->last_accepted); if (variable == 0x6F) return it->waiting; NOT_REACHED(); } @@ -348,7 +348,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo /* Industry structure access*/ case 0x80: return this->industry->location.tile; - case 0x81: return GB(this->industry->location.tile, 8, 8); + case 0x81: return GB(static_cast(this->industry->location.tile), 8, 8); /* Pointer to the town the industry is associated with */ case 0x82: return this->industry->town->index; case 0x83: diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index ee65ac6359..6442041c60 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -277,7 +277,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte local_id, uint32_t grf break; /* Construction date */ - case 0x42: return TimerGameCalendar::date; + case 0x42: return static_cast(TimerGameCalendar::date); /* Object founder information */ case 0x44: return _current_company; @@ -315,7 +315,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte local_id, uint32_t grf case 0x41: return GetTileSlope(this->tile) << 8 | GetTerrainType(this->tile); /* Construction date */ - case 0x42: return this->obj->build_date; + case 0x42: return static_cast(this->obj->build_date); /* Animation counter */ case 0x43: return GetAnimationFrame(this->tile); diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 9f074e4b4d..6b7bfd763c 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -30,7 +30,7 @@ case 0x40: return 0; case 0x41: return 0; case 0x42: return 0; - case 0x43: return TimerGameCalendar::date; + case 0x43: return static_cast(TimerGameCalendar::date); case 0x44: return HZB_TOWN_EDGE; } } @@ -40,8 +40,8 @@ case 0x41: return 0; case 0x42: return IsLevelCrossingTile(this->tile) && IsCrossingBarred(this->tile); case 0x43: - if (IsRailDepotTile(this->tile)) return Depot::GetByTile(this->tile)->build_date; - return TimerGameCalendar::date; + if (IsRailDepotTile(this->tile)) return static_cast(Depot::GetByTile(this->tile)->build_date); + return static_cast(TimerGameCalendar::date); case 0x44: { const Town *t = nullptr; if (IsRailDepotTile(this->tile)) { diff --git a/src/newgrf_roadtype.cpp b/src/newgrf_roadtype.cpp index 1be5b7585a..ab2897deaf 100644 --- a/src/newgrf_roadtype.cpp +++ b/src/newgrf_roadtype.cpp @@ -30,7 +30,7 @@ case 0x40: return 0; case 0x41: return 0; case 0x42: return 0; - case 0x43: return TimerGameCalendar::date; + case 0x43: return static_cast(TimerGameCalendar::date); case 0x44: return HZB_TOWN_EDGE; } } @@ -40,8 +40,8 @@ case 0x41: return 0; case 0x42: return IsLevelCrossingTile(this->tile) && IsCrossingBarred(this->tile); case 0x43: - if (IsRoadDepotTile(this->tile)) return Depot::GetByTile(this->tile)->build_date; - return TimerGameCalendar::date; + if (IsRoadDepotTile(this->tile)) return static_cast(Depot::GetByTile(this->tile)->build_date); + return static_cast(TimerGameCalendar::date); case 0x44: { const Town *t = nullptr; if (IsRoadDepotTile(this->tile)) { diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index f8fae8d2f0..ace57b5eeb 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -44,7 +44,7 @@ /* Town properties */ case 0x80: return this->t->xy; - case 0x81: return GB(this->t->xy, 8, 8); + case 0x81: return GB(static_cast(this->t->xy), 8, 8); case 0x82: return ClampTo(this->t->cache.population); case 0x83: return GB(ClampTo(this->t->cache.population), 8, 8); case 0x8A: return this->t->grow_counter / TOWN_GROWTH_TICKS; diff --git a/src/openttd.cpp b/src/openttd.cpp index bb54a7168a..2155d827cd 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -430,7 +430,7 @@ struct AfterNewGRFScan : NewGRFScanCallback { MusicDriver::GetInstance()->SetVolume(_settings_client.music.music_vol); SetEffectVolume(_settings_client.music.effect_vol); - if (startyear != INVALID_YEAR) IConsoleSetSetting("game_creation.starting_year", startyear); + if (startyear != INVALID_YEAR) IConsoleSetSetting("game_creation.starting_year", static_cast(startyear)); if (generation_seed != GENERATE_NEW_SEED) _settings_newgame.game_creation.generation_seed = generation_seed; if (!dedicated_host.empty()) { @@ -1389,7 +1389,7 @@ void StateGameLoop() CallWindowGameTickEvent(); NewsLoop(); } else { - if (_debug_desync_level > 2 && TimerGameCalendar::date_fract == 0 && (TimerGameCalendar::date & 0x1F) == 0) { + if (_debug_desync_level > 2 && TimerGameCalendar::date_fract == 0 && (static_cast(TimerGameCalendar::date) & 0x1F) == 0) { /* Save the desync savegame if needed. */ std::string name = fmt::format("dmp_cmds_{:08x}_{:08x}.sav", _settings_game.game_creation.generation_seed, TimerGameCalendar::date); SaveOrLoad(name, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, false); diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 8c6f0ae892..b6bf5c5bc0 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1922,6 +1922,12 @@ static bool OrderConditionCompare(OrderConditionComparator occ, int variable, in } } +template ::value, int> = 0> +static bool OrderConditionCompare(OrderConditionComparator occ, T variable, int value) +{ + return OrderConditionCompare(occ, static_cast(variable), value); +} + /** * Process a conditional order and determine the next order. * @param order the order the vehicle currently has diff --git a/src/pathfinder/yapf/yapf_node.hpp b/src/pathfinder/yapf/yapf_node.hpp index ce4ba3b289..9d079ae918 100644 --- a/src/pathfinder/yapf/yapf_node.hpp +++ b/src/pathfinder/yapf/yapf_node.hpp @@ -25,7 +25,7 @@ struct CYapfNodeKeyExitDir { inline int CalcHash() const { - return m_exitdir | (m_tile << 2); + return m_exitdir | (static_cast(m_tile) << 2); } inline bool operator==(const CYapfNodeKeyExitDir &other) const @@ -45,7 +45,7 @@ struct CYapfNodeKeyTrackDir : public CYapfNodeKeyExitDir { inline int CalcHash() const { - return m_td | (m_tile << 4); + return m_td | (static_cast(m_tile) << 4); } inline bool operator==(const CYapfNodeKeyTrackDir &other) const diff --git a/src/rail.cpp b/src/rail.cpp index 8f05c09785..d8991f0a4b 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -225,7 +225,7 @@ RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date if (rti->label == 0) continue; /* Not date introduced. */ - if (!IsInsideMM(rti->introduction_date, 0, MAX_DATE)) continue; + if (!IsInsideMM(rti->introduction_date, 0, static_cast(MAX_DATE))) continue; /* Not yet introduced at this date. */ if (rti->introduction_date > date) continue; diff --git a/src/road.cpp b/src/road.cpp index 1d3ec4d43d..de16bdf947 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -115,7 +115,7 @@ bool HasRoadTypeAvail(const CompanyID company, RoadType roadtype) if (rti->label == 0) return false; /* Not yet introduced at this date. */ - if (IsInsideMM(rti->introduction_date, 0, MAX_DATE) && rti->introduction_date > TimerGameCalendar::date) return false; + if (IsInsideMM(rti->introduction_date, 0, static_cast(MAX_DATE)) && rti->introduction_date > TimerGameCalendar::date) return false; /* * Do not allow building hidden road types, except when a town may build it. @@ -173,7 +173,7 @@ RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, TimerGameCalendar::Date if (rti->label == 0) continue; /* Not date introduced. */ - if (!IsInsideMM(rti->introduction_date, 0, MAX_DATE)) continue; + if (!IsInsideMM(rti->introduction_date, 0, static_cast(MAX_DATE))) continue; /* Not yet introduced at this date. */ if (rti->introduction_date > date) continue; diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp index 528bd359cb..ed33a7e624 100644 --- a/src/saveload/map_sl.cpp +++ b/src/saveload/map_sl.cpp @@ -169,7 +169,7 @@ struct MAP2ChunkHandler : ChunkHandler { std::array buf; TileIndex size = Map::Size(); - SlSetLength(size * sizeof(uint16_t)); + SlSetLength(static_cast(size) * sizeof(uint16_t)); for (TileIndex i = 0; i != size;) { for (uint j = 0; j != MAP_SL_BUF_SIZE; j++) buf[j] = Tile(i++).m2(); SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT16); @@ -344,7 +344,7 @@ struct MAP8ChunkHandler : ChunkHandler { std::array buf; TileIndex size = Map::Size(); - SlSetLength(size * sizeof(uint16_t)); + SlSetLength(static_cast(size) * sizeof(uint16_t)); for (TileIndex i = 0; i != size;) { for (uint j = 0; j != MAP_SL_BUF_SIZE; j++) buf[j] = Tile(i++).m8(); SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT16); diff --git a/src/saveload/oldloader.h b/src/saveload/oldloader.h index d4a2d3d260..09f143db16 100644 --- a/src/saveload/oldloader.h +++ b/src/saveload/oldloader.h @@ -93,9 +93,6 @@ struct OldChunks { OldChunkProc *proc; ///< Pointer to function that is called with OC_CHUNK }; -/* If it fails, check lines above.. */ -static_assert(sizeof(TileIndex) == 4); - extern uint _bump_assert_value; byte ReadByte(LoadgameState *ls); bool LoadChunk(LoadgameState *ls, void *base, const OldChunks *chunks); diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index db847cded7..d1349c99a6 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -57,8 +57,8 @@ static void FixTTDMapArray() /* _old_map3 is moved to _m::m3 and _m::m4 */ for (TileIndex t = 0; t < OLD_MAP_SIZE; t++) { Tile tile(t); - tile.m3() = _old_map3[t * 2]; - tile.m4() = _old_map3[t * 2 + 1]; + tile.m3() = _old_map3[static_cast(t) * 2]; + tile.m4() = _old_map3[static_cast(t) * 2 + 1]; } for (TileIndex t = 0; t < OLD_MAP_SIZE; t++) { @@ -416,7 +416,7 @@ static bool FixTTOEngines() if (TimerGameCalendar::date >= e->intro_date && HasBit(e->info.climates, 0)) { e->flags |= ENGINE_AVAILABLE; e->company_avail = MAX_UVALUE(CompanyMask); - e->age = TimerGameCalendar::date > e->intro_date ? (TimerGameCalendar::date - e->intro_date) / 30 : 0; + e->age = TimerGameCalendar::date > e->intro_date ? static_cast(TimerGameCalendar::date - e->intro_date) / 30 : 0; } } else { /* Using data from TTO savegame */ diff --git a/src/script/api/script_basestation.cpp b/src/script/api/script_basestation.cpp index 1863ea8554..caa5cf8034 100644 --- a/src/script/api/script_basestation.cpp +++ b/src/script/api/script_basestation.cpp @@ -63,5 +63,5 @@ { if (!IsValidBaseStation(station_id)) return ScriptDate::DATE_INVALID; - return (ScriptDate::Date)::BaseStation::Get(station_id)->build_date; + return (ScriptDate::Date)(int32_t)::BaseStation::Get(station_id)->build_date; } diff --git a/src/script/api/script_client.cpp b/src/script/api/script_client.cpp index 87f90d65c8..5445698913 100644 --- a/src/script/api/script_client.cpp +++ b/src/script/api/script_client.cpp @@ -50,5 +50,5 @@ static NetworkClientInfo *FindClientInfo(ScriptClient::ClientID client) { NetworkClientInfo *ci = FindClientInfo(client); if (ci == nullptr) return ScriptDate::DATE_INVALID; - return (ScriptDate::Date)ci->join_date; + return (ScriptDate::Date)(int32_t)ci->join_date; } diff --git a/src/script/api/script_date.cpp b/src/script/api/script_date.cpp index 56ad8b8827..1fbf80999e 100644 --- a/src/script/api/script_date.cpp +++ b/src/script/api/script_date.cpp @@ -22,7 +22,7 @@ /* static */ ScriptDate::Date ScriptDate::GetCurrentDate() { - return (ScriptDate::Date)TimerGameCalendar::date; + return (ScriptDate::Date)(int32_t)TimerGameCalendar::date; } /* static */ SQInteger ScriptDate::GetYear(ScriptDate::Date date) @@ -31,7 +31,7 @@ ::TimerGameCalendar::YearMonthDay ymd; ::TimerGameCalendar::ConvertDateToYMD(date, &ymd); - return ymd.year; + return (int32_t)ymd.year; } /* static */ SQInteger ScriptDate::GetMonth(ScriptDate::Date date) @@ -58,7 +58,7 @@ if (day_of_month < 1 || day_of_month > 31) return DATE_INVALID; if (year < 0 || year > MAX_YEAR) return DATE_INVALID; - return (ScriptDate::Date)::TimerGameCalendar::ConvertYMDToDate(year, month - 1, day_of_month); + return (ScriptDate::Date)(int32_t)::TimerGameCalendar::ConvertYMDToDate(year, month - 1, day_of_month); } /* static */ SQInteger ScriptDate::GetSystemTime() diff --git a/src/script/api/script_date.hpp b/src/script/api/script_date.hpp index 4373706aa7..6fa2053cc4 100644 --- a/src/script/api/script_date.hpp +++ b/src/script/api/script_date.hpp @@ -31,7 +31,7 @@ public: * compose valid date values for a known year, month and day. */ enum Date { - DATE_INVALID = ::INVALID_DATE, ///< A value representing an invalid date. + DATE_INVALID = (int32_t)::INVALID_DATE, ///< A value representing an invalid date. }; /** diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index d833a91a33..9797b863c4 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -139,7 +139,7 @@ if (!IsValidEngine(engine_id)) return -1; if (GetVehicleType(engine_id) == ScriptVehicle::VT_RAIL && IsWagon(engine_id)) return -1; - return ::Engine::Get(engine_id)->GetLifeLengthInDays(); + return (int32_t)::Engine::Get(engine_id)->GetLifeLengthInDays(); } /* static */ Money ScriptEngine::GetRunningCost(EngineID engine_id) @@ -179,7 +179,7 @@ { if (!IsValidEngine(engine_id)) return ScriptDate::DATE_INVALID; - return (ScriptDate::Date)::Engine::Get(engine_id)->intro_date; + return (ScriptDate::Date)(int32_t)::Engine::Get(engine_id)->intro_date; } /* static */ ScriptVehicle::VehicleType ScriptEngine::GetVehicleType(EngineID engine_id) diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp index eea5714f24..b332accc02 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -53,7 +53,7 @@ { Industry *i = Industry::GetIfValid(industry_id); if (i == nullptr) return ScriptDate::DATE_INVALID; - return (ScriptDate::Date)i->construction_date; + return (ScriptDate::Date)(int32_t)i->construction_date; } /* static */ bool ScriptIndustry::SetText(IndustryID industry_id, Text *text) @@ -222,7 +222,7 @@ { Industry *i = Industry::GetIfValid(industry_id); if (i == nullptr) return 0; - return i->last_prod_year; + return (int32_t)i->last_prod_year; } /* static */ ScriptDate::Date ScriptIndustry::GetCargoLastAcceptedDate(IndustryID industry_id, CargoID cargo_type) @@ -232,11 +232,11 @@ if (!::IsValidCargoID(cargo_type)) { auto it = std::max_element(std::begin(i->accepted), std::end(i->accepted), [](const auto &a, const auto &b) { return a.last_accepted < b.last_accepted; }); - return (ScriptDate::Date)it->last_accepted; + return (ScriptDate::Date)(int32_t)it->last_accepted; } else { auto it = i->GetCargoAccepted(cargo_type); if (it == std::end(i->accepted)) return ScriptDate::DATE_INVALID; - return (ScriptDate::Date)it->last_accepted; + return (ScriptDate::Date)(int32_t)it->last_accepted; } } diff --git a/src/script/api/script_story_page.cpp b/src/script/api/script_story_page.cpp index bd83125c25..4a049f540c 100644 --- a/src/script/api/script_story_page.cpp +++ b/src/script/api/script_story_page.cpp @@ -182,7 +182,7 @@ static inline bool StoryPageElementTypeRequiresText(StoryPageElementType type) EnforcePrecondition(ScriptDate::DATE_INVALID, IsValidStoryPage(story_page_id)); EnforceDeityMode(ScriptDate::DATE_INVALID); - return (ScriptDate::Date)StoryPage::Get(story_page_id)->date; + return (ScriptDate::Date)(int32_t)StoryPage::Get(story_page_id)->date; } /* static */ bool ScriptStoryPage::SetDate(StoryPageID story_page_id, ScriptDate::Date date) diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp index 7db46acc5d..76f4f282b0 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -311,7 +311,7 @@ { if (!IsValidVehicle(vehicle_id)) return -1; - return ::Vehicle::Get(vehicle_id)->age; + return (int32_t)::Vehicle::Get(vehicle_id)->age; } /* static */ SQInteger ScriptVehicle::GetWagonAge(VehicleID vehicle_id, SQInteger wagon) @@ -323,21 +323,21 @@ if (v->type == VEH_TRAIN) { while (wagon-- > 0) v = ::Train::From(v)->GetNextUnit(); } - return v->age; + return (int32_t)v->age; } /* static */ SQInteger ScriptVehicle::GetMaxAge(VehicleID vehicle_id) { if (!IsPrimaryVehicle(vehicle_id)) return -1; - return ::Vehicle::Get(vehicle_id)->max_age; + return (int32_t)::Vehicle::Get(vehicle_id)->max_age; } /* static */ SQInteger ScriptVehicle::GetAgeLeft(VehicleID vehicle_id) { if (!IsPrimaryVehicle(vehicle_id)) return -1; - return ::Vehicle::Get(vehicle_id)->max_age - ::Vehicle::Get(vehicle_id)->age; + return (int32_t)(::Vehicle::Get(vehicle_id)->max_age - ::Vehicle::Get(vehicle_id)->age); } /* static */ SQInteger ScriptVehicle::GetCurrentSpeed(VehicleID vehicle_id) diff --git a/src/settings_internal.h b/src/settings_internal.h index 9e07bacf13..5bee8ba84b 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -149,12 +149,46 @@ struct IntSettingDesc : SettingDesc { */ typedef void PostChangeCallback(int32_t value); - IntSettingDesc(const SaveLoad &save, SettingFlag flags, bool startup, int32_t def, - int32_t min, uint32_t max, int32_t interval, StringID str, StringID str_help, StringID str_val, + template < + typename Tdef, + typename Tmin, + typename Tmax, + typename Tinterval, + std::enable_if_t, std::is_base_of>, int> = 0, + std::enable_if_t, std::is_base_of>, int> = 0, + std::enable_if_t, std::is_base_of>, int> = 0, + std::enable_if_t, std::is_base_of>, int> = 0 + > + IntSettingDesc(const SaveLoad &save, SettingFlag flags, bool startup, Tdef def, + Tmin min, Tmax max, Tinterval interval, StringID str, StringID str_help, StringID str_val, SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback) : - SettingDesc(save, flags, startup), def(def), min(min), max(max), interval(interval), + SettingDesc(save, flags, startup), str(str), str_help(str_help), str_val(str_val), cat(cat), pre_check(pre_check), - post_callback(post_callback) {} + post_callback(post_callback) { + if constexpr (std::is_base_of_v) { + this->def = static_cast(def); + } else { + this->def = def; + } + + if constexpr (std::is_base_of_v) { + this->min = static_cast(min); + } else { + this->min = min; + } + + if constexpr (std::is_base_of_v) { + this->max = static_cast(max); + } else { + this->max = max; + } + + if constexpr (std::is_base_of_v) { + this->interval = static_cast(interval); + } else { + this->interval = interval; + } + } int32_t def; ///< default value given when none is present int32_t min; ///< minimum values @@ -193,7 +227,7 @@ struct BoolSettingDesc : IntSettingDesc { BoolSettingDesc(const SaveLoad &save, SettingFlag flags, bool startup, bool def, StringID str, StringID str_help, StringID str_val, SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback) : - IntSettingDesc(save, flags, startup, def, 0, 1, 0, str, str_help, str_val, cat, + IntSettingDesc(save, flags, startup, def ? 1 : 0, 0, 1, 0, str, str_help, str_val, cat, pre_check, post_callback) {} static std::optional ParseSingleValue(const char *str); diff --git a/src/stdafx.h b/src/stdafx.h index ae6805efe6..d727aa2891 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -126,6 +126,13 @@ # define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #endif +#if defined(_MSC_VER) + // See https://learn.microsoft.com/en-us/cpp/cpp/empty-bases?view=msvc-170 +# define EMPTY_BASES __declspec(empty_bases) +#else +# define EMPTY_BASES +#endif + /* Stuff for MSVC */ #if defined(_MSC_VER) # pragma once diff --git a/src/strings_func.h b/src/strings_func.h index 175e5556e3..03fb1becb2 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -15,6 +15,7 @@ #include "gfx_type.h" #include "core/bitmath_func.hpp" #include "core/span_type.hpp" +#include "core/strong_typedef_type.hpp" #include "vehicle_type.h" /** @@ -82,6 +83,18 @@ void SetDParam(size_t n, uint64_t v); void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count = 0, FontSize size = FS_NORMAL); void SetDParamMaxDigits(size_t n, uint count, FontSize size = FS_NORMAL); +template ::value, int> = 0> +void SetDParam(size_t n, T v) +{ + SetDParam(n, static_cast(v)); +} + +template ::value, int> = 0> +void SetDParamMaxValue(size_t n, T max_value, uint min_count = 0, FontSize size = FS_NORMAL) +{ + SetDParamMaxValue(n, static_cast(max_value), min_count, size); +} + void SetDParamStr(size_t n, const char *str); void SetDParamStr(size_t n, const std::string &str); void SetDParamStr(size_t n, std::string &&str); diff --git a/src/strings_internal.h b/src/strings_internal.h index 875c82f053..c85b179ca5 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -153,6 +153,12 @@ public: this->parameters[n].string_view = nullptr; } + template ::value, int> = 0> + void SetParam(size_t n, T v) + { + SetParam(n, static_cast(v)); + } + void SetParam(size_t n, const char *str) { assert(n < this->parameters.size()); diff --git a/src/table/roadtypes.h b/src/table/roadtypes.h index d11573d632..c59965d53c 100644 --- a/src/table/roadtypes.h +++ b/src/table/roadtypes.h @@ -82,7 +82,7 @@ static const RoadTypeInfo _original_roadtypes[] = { 0x01, /* introduction date */ - MIN_YEAR, + static_cast(MIN_YEAR), /* roadtypes required for this to be introduced */ ROADTYPES_NONE, diff --git a/src/tile_type.h b/src/tile_type.h index 87bbcc9f95..b7e80dedc9 100644 --- a/src/tile_type.h +++ b/src/tile_type.h @@ -81,36 +81,13 @@ enum TropicZone { /** * The index/ID of a Tile. + * + * It is compatible with int32 / int64 for easy math throughout the code. */ -struct TileIndex : StrongIntegralTypedef { - using StrongIntegralTypedef::StrongIntegralTypedef; - - debug_inline constexpr TileIndex() = default; - debug_inline constexpr TileIndex(const TileIndex &o) = default; - debug_inline constexpr TileIndex(TileIndex &&o) = default; - - debug_inline constexpr TileIndex(const uint32_t &value) : StrongIntegralTypedef(value) {} - - debug_inline constexpr TileIndex &operator =(const TileIndex &rhs) { this->value = rhs.value; return *this; } - debug_inline constexpr TileIndex &operator =(TileIndex &&rhs) { this->value = std::move(rhs.value); return *this; } - debug_inline constexpr TileIndex &operator =(const uint32_t &rhs) { this->value = rhs; return *this; } - - /** Implicit conversion to the base type for e.g. array indexing. */ - debug_inline constexpr operator uint32_t() const { return this->value; } - - /* Import operators from the base class into our overload set. */ - using StrongIntegralTypedef::operator ==; - using StrongIntegralTypedef::operator !=; - using StrongIntegralTypedef::operator +; - using StrongIntegralTypedef::operator -; - - /* Add comparison and add/sub for signed ints as e.g. 0 is signed and will - * match ambiguously when only unsigned overloads are present. */ - constexpr bool operator ==(int rhs) const { return this->value == (uint32_t)rhs; } - constexpr bool operator !=(int rhs) const { return this->value != (uint32_t)rhs; } - constexpr TileIndex operator +(int rhs) const { return { (uint32_t)(this->value + rhs) }; } - constexpr TileIndex operator -(int rhs) const { return { (uint32_t)(this->value - rhs) }; } -}; +using TileIndex = StrongType::Typedef, StrongType::Compatible>; + +/* Make sure the size is as expected. */ +static_assert(sizeof(TileIndex) == 4); /** * The very nice invalid tile marker diff --git a/src/timer/timer_game_calendar.cpp b/src/timer/timer_game_calendar.cpp index 8174f9a1b4..8cf18c91b2 100644 --- a/src/timer/timer_game_calendar.cpp +++ b/src/timer/timer_game_calendar.cpp @@ -75,8 +75,8 @@ static const uint16_t _accum_days_for_month[] = { */ /* There are 97 leap years in 400 years */ - TimerGameCalendar::Year yr = 400 * (date / (DAYS_IN_YEAR * 400 + 97)); - int rem = date % (DAYS_IN_YEAR * 400 + 97); + TimerGameCalendar::Year yr = 400 * (static_cast(date) / (DAYS_IN_YEAR * 400 + 97)); + int rem = static_cast(date) % (DAYS_IN_YEAR * 400 + 97); uint16_t x; if (rem >= DAYS_IN_YEAR * 100 + 25) { @@ -141,7 +141,7 @@ static const uint16_t _accum_days_for_month[] = { */ /* static */ bool TimerGameCalendar::IsLeapYear(TimerGameCalendar::Year yr) { - return yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0); + return static_cast(yr) % 4 == 0 && (static_cast(yr) % 100 != 0 || static_cast(yr) % 400 == 0); } /** @@ -215,7 +215,7 @@ void TimerManager::Elapsed(TimerGameCalendar::TElapsed delta) timer->Elapsed(TimerGameCalendar::DAY); } - if ((TimerGameCalendar::date % 7) == 3) { + if ((static_cast(TimerGameCalendar::date) % 7) == 3) { for (auto timer : timers) { timer->Elapsed(TimerGameCalendar::WEEK); } diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index ddb8a62342..833f5893c1 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -11,6 +11,7 @@ #define TIMER_GAME_CALENDAR_H #include "stdafx.h" +#include "../core/strong_typedef_type.hpp" /** * Timer that is increased every 27ms, and counts towards ticks / days / months / years. @@ -76,12 +77,18 @@ public: struct TStorage { }; - using Date = int32_t; ///< The type to store our dates in - using DateFract = uint16_t; ///< The fraction of a date we're in, i.e. the number of ticks since the last date changeover + /** The type to store our dates in. */ + using Date = StrongType::Typedef; - using Year = int32_t; ///< Type for the year, note: 0 based, i.e. starts at the year 0. - using Month = uint8_t; ///< Type for the month, note: 0 based, i.e. 0 = January, 11 = December. - using Day = uint8_t; ///< Type for the day of the month, note: 1 based, first day of a month is 1. + /** The fraction of a date we're in, i.e. the number of ticks since the last date changeover. */ + using DateFract = uint16_t; + + /** Type for the year, note: 0 based, i.e. starts at the year 0. */ + using Year = StrongType::Typedef; + /** Type for the month, note: 0 based, i.e. 0 = January, 11 = December. */ + using Month = uint8_t; + /** Type for the day of the month, note: 1 based, first day of a month is 1. */ + using Day = uint8_t; /** * Data structure to convert between Date and triplet (year, month, and day). diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 40c3f428fd..459f257dba 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -426,7 +426,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) just_started = !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED); if (v->timetable_start != 0) { - v->lateness_counter = (TimerGameCalendar::date - v->timetable_start) * DAY_TICKS + TimerGameCalendar::date_fract; + v->lateness_counter = static_cast(TimerGameCalendar::date - v->timetable_start) * DAY_TICKS + TimerGameCalendar::date_fract; v->timetable_start = 0; } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 766da5b151..16bc9839b4 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2510,7 +2510,7 @@ struct ScenarioEditorToolbarWindow : Window { value = atoi(str); } else { /* An empty string means revert to the default */ - value = DEF_START_YEAR; + value = static_cast(DEF_START_YEAR); } SetStartingYear(value); diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 50b38fea37..96fccf564e 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -595,7 +595,7 @@ static void TileLoop_Town(TileIndex tile) /* Binomial distribution per tick, by a series of coin flips */ /* Reduce generation rate to a 1/4, using tile bits to spread out distribution. * As tick counter is incremented by 256 between each call, we ignore the lower 8 bits. */ - if (GB(TimerGameTick::counter, 8, 2) == GB(tile, 0, 2)) { + if (GB(TimerGameTick::counter, 8, 2) == GB(static_cast(tile), 0, 2)) { /* Make a bitmask with up to 32 bits set, one for each potential pax */ int genmax = (hs->population + 7) / 8; uint32_t genmask = (genmax >= 32) ? 0xFFFFFFFF : ((1 << genmax) - 1); @@ -871,7 +871,7 @@ RoadType GetTownRoadType(const Town *t) if (!HasBit(rti->flags, ROTF_TOWN_BUILD)) continue; /* Not yet introduced at this date. */ - if (IsInsideMM(rti->introduction_date, 0, MAX_DATE) && rti->introduction_date > TimerGameCalendar::date) continue; + if (IsInsideMM(rti->introduction_date, 0, static_cast(MAX_DATE)) && rti->introduction_date > TimerGameCalendar::date) continue; if (best != nullptr) { if ((rti->max_speed == 0 ? assume_max_speed : rti->max_speed) < (best->max_speed == 0 ? assume_max_speed : best->max_speed)) continue; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index a21e4ff052..ac42a1a38a 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1400,7 +1400,7 @@ void AgeVehicle(Vehicle *v) str = STR_NEWS_VEHICLE_IS_GETTING_OLD; } else if (age == DateAtStartOfYear(0)) { str = STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD; - } else if (age > DateAtStartOfYear(0) && (age % DAYS_IN_LEAP_YEAR) == 0) { + } else if (age > DateAtStartOfYear(0) && (static_cast(age) % DAYS_IN_LEAP_YEAR) == 0) { str = STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND; } else { return; From 9624017fc28364bfefeb7a8cc3a9e21cd56341f2 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 12 Aug 2023 20:18:22 +0200 Subject: [PATCH 32/77] Codechange: be more type-specific about types in NPFs queue (#11192) --- src/landscape.cpp | 2 +- src/pathfinder/npf/npf.cpp | 16 ++++++++-------- src/pathfinder/npf/queue.cpp | 28 ++++++++++++++-------------- src/pathfinder/npf/queue.h | 17 ++++++++++------- 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index a4a0a3a051..036402bfd1 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1286,7 +1286,7 @@ static const uint RIVER_HASH_SIZE = 8; ///< The number of bits the hash for rive * @param dir The unused direction. * @return The hash for the tile. */ -static uint River_Hash(uint tile, uint dir) +static uint River_Hash(TileIndex tile, Trackdir dir) { return GB(TileHash(TileX(tile), TileY(tile)), 0, RIVER_HASH_SIZE); } diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index b20db3f86c..c1bf1ba44e 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -132,20 +132,20 @@ static uint NPFDistanceTrack(TileIndex t0, TileIndex t1) /** * Calculates a hash value for use in the NPF. - * @param key1 The TileIndex of the tile to hash - * @param key2 The Trackdir of the track on the tile. + * @param tile The TileIndex of the tile to hash + * @param dir The Trackdir of the track on the tile. * * @todo Think of a better hash. */ -static uint NPFHash(uint key1, uint key2) +static uint NPFHash(TileIndex tile, Trackdir dir) { /* TODO: think of a better hash? */ - uint part1 = TileX(key1) & NPF_HASH_HALFMASK; - uint part2 = TileY(key1) & NPF_HASH_HALFMASK; + uint part1 = TileX(tile) & NPF_HASH_HALFMASK; + uint part2 = TileY(tile) & NPF_HASH_HALFMASK; - assert(IsValidTrackdir((Trackdir)key2)); - assert(IsValidTile((TileIndex)key1)); - return ((part1 << NPF_HASH_HALFBITS | part2) + (NPF_HASH_SIZE * key2 / TRACKDIR_END)) % NPF_HASH_SIZE; + assert(IsValidTrackdir(dir)); + assert(IsValidTile(tile)); + return ((part1 << NPF_HASH_HALFBITS | part2) + (NPF_HASH_SIZE * dir / TRACKDIR_END)) % NPF_HASH_SIZE; } static int32_t NPFCalcZero(AyStar *as, AyStarNode *current, OpenListNode *parent) diff --git a/src/pathfinder/npf/queue.cpp b/src/pathfinder/npf/queue.cpp index f1acf26eb3..0bd9046906 100644 --- a/src/pathfinder/npf/queue.cpp +++ b/src/pathfinder/npf/queue.cpp @@ -366,9 +366,9 @@ void Hash::Clear(bool free_values) * bucket, or nullptr if it is empty. prev can also be nullptr, in which case it is * not used for output. */ -HashNode *Hash::FindNode(uint key1, uint key2, HashNode** prev_out) const +HashNode *Hash::FindNode(TileIndex tile, Trackdir dir, HashNode** prev_out) const { - uint hash = this->hash(key1, key2); + uint hash = this->hash(tile, dir); HashNode *result = nullptr; /* Check if the bucket is empty */ @@ -376,7 +376,7 @@ HashNode *Hash::FindNode(uint key1, uint key2, HashNode** prev_out) const if (prev_out != nullptr) *prev_out = nullptr; result = nullptr; /* Check the first node specially */ - } else if (this->buckets[hash].key1 == key1 && this->buckets[hash].key2 == key2) { + } else if (this->buckets[hash].tile == tile && this->buckets[hash].dir == dir) { /* Save the value */ result = this->buckets + hash; if (prev_out != nullptr) *prev_out = nullptr; @@ -386,7 +386,7 @@ HashNode *Hash::FindNode(uint key1, uint key2, HashNode** prev_out) const HashNode *node; for (node = prev->next; node != nullptr; node = node->next) { - if (node->key1 == key1 && node->key2 == key2) { + if (node->tile == tile && node->dir == dir) { /* Found it */ result = node; break; @@ -403,11 +403,11 @@ HashNode *Hash::FindNode(uint key1, uint key2, HashNode** prev_out) const * that value. Returns nullptr when the value was not present. The value returned * is _not_ free()'d! */ -void *Hash::DeleteValue(uint key1, uint key2) +void *Hash::DeleteValue(TileIndex tile, Trackdir dir) { void *result; HashNode *prev; // Used as output var for below function call - HashNode *node = this->FindNode(key1, key2, &prev); + HashNode *node = this->FindNode(tile, dir, &prev); if (node == nullptr) { /* not found */ @@ -426,7 +426,7 @@ void *Hash::DeleteValue(uint key1, uint key2) } else { /* This was the last in this bucket * Mark it as empty */ - uint hash = this->hash(key1, key2); + uint hash = this->hash(tile, dir); this->buckets_in_use[hash] = false; } } else { @@ -446,10 +446,10 @@ void *Hash::DeleteValue(uint key1, uint key2) * Sets the value associated with the given key pair to the given value. * Returns the old value if the value was replaced, nullptr when it was not yet present. */ -void *Hash::Set(uint key1, uint key2, void *value) +void *Hash::Set(TileIndex tile, Trackdir dir, void *value) { HashNode *prev; - HashNode *node = this->FindNode(key1, key2, &prev); + HashNode *node = this->FindNode(tile, dir, &prev); if (node != nullptr) { /* Found it */ @@ -461,7 +461,7 @@ void *Hash::Set(uint key1, uint key2, void *value) /* It is not yet present, let's add it */ if (prev == nullptr) { /* The bucket is still empty */ - uint hash = this->hash(key1, key2); + uint hash = this->hash(tile, dir); this->buckets_in_use[hash] = true; node = this->buckets + hash; } else { @@ -470,8 +470,8 @@ void *Hash::Set(uint key1, uint key2, void *value) prev->next = node; } node->next = nullptr; - node->key1 = key1; - node->key2 = key2; + node->tile = tile; + node->dir = dir; node->value = value; this->size++; return nullptr; @@ -481,9 +481,9 @@ void *Hash::Set(uint key1, uint key2, void *value) * Gets the value associated with the given key pair, or nullptr when it is not * present. */ -void *Hash::Get(uint key1, uint key2) const +void *Hash::Get(TileIndex tile, Trackdir dir) const { - HashNode *node = this->FindNode(key1, key2, nullptr); + HashNode *node = this->FindNode(tile, dir, nullptr); return (node != nullptr) ? node->value : nullptr; } diff --git a/src/pathfinder/npf/queue.h b/src/pathfinder/npf/queue.h index c65131aec9..53b62ac6b9 100644 --- a/src/pathfinder/npf/queue.h +++ b/src/pathfinder/npf/queue.h @@ -10,6 +10,9 @@ #ifndef QUEUE_H #define QUEUE_H +#include "../../tile_type.h" +#include "../../track_type.h" + //#define HASH_STATS @@ -58,8 +61,8 @@ struct BinaryHeap { * Hash */ struct HashNode { - uint key1; - uint key2; + TileIndex tile; + Trackdir dir; void *value; HashNode *next; }; @@ -67,7 +70,7 @@ struct HashNode { * Generates a hash code from the given key pair. You should make sure that * the resulting range is clearly defined. */ -typedef uint Hash_HashProc(uint key1, uint key2); +typedef uint Hash_HashProc(TileIndex tile, Trackdir dir); struct Hash { /* The hash function used */ Hash_HashProc *hash; @@ -83,10 +86,10 @@ struct Hash { void Init(Hash_HashProc *hash, uint num_buckets); - void *Get(uint key1, uint key2) const; - void *Set(uint key1, uint key2, void *value); + void *Get(TileIndex tile, Trackdir dir) const; + void *Set(TileIndex tile, Trackdir dir, void *value); - void *DeleteValue(uint key1, uint key2); + void *DeleteValue(TileIndex tile, Trackdir dir); void Clear(bool free_values); void Delete(bool free_values); @@ -103,7 +106,7 @@ protected: #ifdef HASH_STATS void PrintStatistics() const; #endif - HashNode *FindNode(uint key1, uint key2, HashNode** prev_out) const; + HashNode *FindNode(TileIndex tile, Trackdir dir, HashNode** prev_out) const; }; #endif /* QUEUE_H */ From 56e0d0c7ef06ee363d3547bfb8b30ed94f299e8f Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 12 Aug 2023 18:38:26 +0000 Subject: [PATCH 33/77] Update: Translations from eints korean: 3 changes by telk5093 russian: 2 changes by Ln-Wolf portuguese: 3 changes by azulcosta --- src/lang/korean.txt | 6 +++--- src/lang/portuguese.txt | 6 +++--- src/lang/russian.txt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 48cac3644a..d64d4dceca 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1190,7 +1190,7 @@ STR_TERRAIN_TYPE_CUSTOM_VALUE :사용자 지 STR_CITY_APPROVAL_LENIENT :관대함 STR_CITY_APPROVAL_TOLERANT :신경 씀 STR_CITY_APPROVAL_HOSTILE :싫어함 -STR_CITY_APPROVAL_PERMISSIVE :신경 안씀 (회사 행동에 영향 없음) +STR_CITY_APPROVAL_PERMISSIVE :신경 안 씀 (회사 행동에 영향 없음) STR_WARNING_NO_SUITABLE_AI :{WHITE}사용할 수 있는 인공지능이 없습니다...{}'온라인 콘텐츠' 시스템을 통해 인공지능을 다운로드받을 수 있습니다. @@ -1900,8 +1900,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :도시가 성 STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :도시가 회사 소유의 선로에 건널목을 만드는 것을 허용: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :도시가 회사 소유의 선로에 건널목을 건설할 수 있도록 허용합니다 -STR_CONFIG_SETTING_NOISE_LEVEL :도시가 공항에서 나오는 소음을 제한하도록 함: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :이 설정을 끄면, 한 도시에는 공항을 2개까지 지을 수 있습니다. 이 설정을 켜면, 한 도시에 지을 수 있는 공항의 수는 도시가 허용 가능한 소음 기준에 따라 달라집니다. 소음 기준은 도시 인구, 공항의 크기와 거리에 따라 다릅니다. +STR_CONFIG_SETTING_NOISE_LEVEL :소음 수준에 따라 공항 설치를 제한: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :도시의 인구와 공항 크기 및 거리에 따라 달라지는 도시의 소음 허용 수준에 따라, 도시가 공항 건설을 막을 수 있게 만듭니다. 이 설정을 끄면, 지역 당국의 태도 설정을 "신경 안 씀"으로 설정하지 않은 경우 한 도시에는 공항을 2개까지만 지을 수 있습니다. STR_CONFIG_SETTING_TOWN_FOUNDING :게임 도중에 도시 건설: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :플레이어가 게임 중에 새로운 도시를 설립하는 것을 허용합니다. diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index c8c5821545..c7e891b319 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1900,8 +1900,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite às loc STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Localidades podem construir passagens de nível: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Ativar esta preferência permite às localidades construir cruzamentos nivelados -STR_CONFIG_SETTING_NOISE_LEVEL :Permitir que a localidade controle o nível de ruído dos aeroportos: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Com esta preferência desativada, podem haver dois aeroportos em cada localidade. Com esta preferência ativa, o número de aeroportos numa localidade é limitado pela aceitação do ruído na mesma, que depende da população, do tamanho do aeroporto e da sua distância +STR_CONFIG_SETTING_NOISE_LEVEL :Limitar a localização do aeroporto em função do nível de ruído: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Permitir que as localidades bloqueiem a construção de aeroportos em função da aceitação do nível de ruído, que é baseado no total de habitantes da localidade e no tamanho e distância do aeroporto. Se esta definição estiver desativada, as localidades permitirão apenas dois aeroportos, a menos que a atitude da autoridade local esteja definida como "Permissiva" STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar localidades no jogo: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Ativar esta preferência permite aos jogadores fundar novas localidades no jogo @@ -4807,7 +4807,7 @@ STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Não per # Local authority errors STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}A autoridade local de {TOWN} não autorizou -STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}{TOWN} a autoridade local recusa permitir que outro aeroporto seja construído nesta localidade +STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}{TOWN} a autoridade local recusa-se a permitir a construção de outro aeroporto nesta localidade STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}{TOWN} a autoridade local não permite a construção do aeroporto devido à poluição sonora STR_ERROR_BRIBE_FAILED :{WHITE}A sua tentativa de suborno foi descoberta por um investigador regional diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 231e445fdf..7601bfa895 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2050,8 +2050,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Разреши STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Города могут создавать ж/д переезды: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Разрешить городам строить дороги через железнодорожные пути -STR_CONFIG_SETTING_NOISE_LEVEL :Разрешить городам контролировать уровень шума аэропортов: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :При выключенной настройке количество аэропортов ограничено двумя на каждый город. При включенной - администрация города ограничивает только уровень допустимого шума (он зависит от количества жителей). Уровень шума, производимого аэропортом, зависит от его типа и расстояния от центра города. +STR_CONFIG_SETTING_NOISE_LEVEL :Ограничить строительство аэропортов в соответствии с уровнем шума: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Разрешить городам регулировать строительство аэропортов в соответствии с допустимым уровнем шума, который зависит от населения города, а также от размера аэропорта и расстояния до него. При отключенной настройке количество аэропортов ограничено двумя на каждый город, если только отношение администрации к компаниям не настроено как "дозволяющее". STR_CONFIG_SETTING_TOWN_FOUNDING :Строительство городов в игре: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Включение данной настройки позволяет игрокам основывать новые города From a8e4d35bded50d9c1c570c2fbd5e3cd809a03ad5 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Tue, 25 Jul 2023 22:11:21 +0200 Subject: [PATCH 34/77] Fix: crash when not passing parameter for -n --- src/openttd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openttd.cpp b/src/openttd.cpp index 2155d827cd..912be832c3 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -166,7 +166,7 @@ static void ShowHelp() " -e = Start Editor\n" " -g [savegame] = Start new/save game immediately\n" " -G seed = Set random seed\n" - " -n [ip:port#company]= Join network game\n" + " -n ip[:port][#company]= Join network game\n" " -p password = Password to join server\n" " -P password = Password to join company\n" " -D [ip][:port] = Start dedicated server\n" @@ -473,7 +473,7 @@ static const OptionData _options[] = { GETOPT_SHORT_VALUE('v'), GETOPT_SHORT_VALUE('b'), GETOPT_SHORT_OPTVAL('D'), - GETOPT_SHORT_OPTVAL('n'), + GETOPT_SHORT_VALUE('n'), GETOPT_SHORT_VALUE('l'), GETOPT_SHORT_VALUE('p'), GETOPT_SHORT_VALUE('P'), @@ -548,7 +548,7 @@ int openttd_main(int argc, char *argv[]) break; case 'f': _dedicated_forks = true; break; case 'n': - scanner->connection_string = mgo.opt; // optional IP:port#company parameter + scanner->connection_string = mgo.opt; // IP:port#company parameter break; case 'l': debuglog_conn = mgo.opt; From 40195e689d69f341487b4d0bf074f66956c1317d Mon Sep 17 00:00:00 2001 From: Rubidium Date: Tue, 25 Jul 2023 22:27:23 +0200 Subject: [PATCH 35/77] Change: improve wording of help (host instead of IP) and update man page --- docs/openttd.6 | 28 ++++++++++++++++++---------- src/openttd.cpp | 8 ++++---- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/openttd.6 b/docs/openttd.6 index 4e04be32c1..f45021503b 100644 --- a/docs/openttd.6 +++ b/docs/openttd.6 @@ -1,6 +1,6 @@ .\" Hey, EMACS: -*- nroff -*- .\" Please adjust this date whenever revising the manpage. -.Dd October 13, 2014 +.Dd August 12, 2023 .Dt OPENTTD 6 .Os .Sh NAME @@ -8,7 +8,7 @@ .Nd open source clone of the Microprose game \(lqTransport Tycoon Deluxe\(rq .Sh SYNOPSIS .Nm -.Op Fl efhx +.Op Fl efhQxX .Op Fl b Ar blitter .Op Fl c Ar config_file .Op Fl d Op Ar level | Ar cat Ns = Ns Ar lvl Ns Op , Ns Ar ... @@ -19,7 +19,7 @@ .Op Fl l Ar host Ns Op : Ns Ar port .Op Fl m Ar driver .Op Fl M Ar musicset -.Op Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player +.Op Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar company .Op Fl p Ar password .Op Fl P Ar password .Op Fl q Ar savegame @@ -29,7 +29,7 @@ .Op Fl t Ar year .Op Fl v Ar driver .Sh OPTIONS -.Bl -tag -width "-n host[:port][#player]" +.Bl -tag -width "-n host[:port][#company]" .It Fl b Ar blitter Select the blitter .Ar blitter ; @@ -83,10 +83,8 @@ see .Fl h for a full list. .It Fl l Ar host Ns Op : Ns Ar port -Redirect -.Fn DEBUG -output; see -.Fl D . +Redirect debug output; see +.Fl d . .It Fl m Ar driver Select the music driver .Ar driver ; @@ -99,8 +97,8 @@ Select the music set see .Fl h for a full list. -.It Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar player -Join a network game, optionally specifying a port to connect to and player to +.It Fl n Ar host Ns Oo : Ns Ar port Oc Ns Op # Ns Ar company +Join a network game, optionally specifying a port to connect to and company to play as. .It Fl p Ar password Password used to join server. @@ -112,6 +110,14 @@ Only useful with .Fl n . .It Fl q Ar savegame Write some information about the specified savegame and exit. +.It Fl Q +Don't scan for/load NewGRF files on startup. +.Pp +Passing +.Fl Q +twice (so, +.Fl QQ +) will disable NewGRF scanning/loading entirely. .It Fl r Ar width Ns x Ns Ar height Set the resolution to .Ar width @@ -141,6 +147,8 @@ see for a full list. .It Fl x Do not automatically save to config file on exit. +.It Fl X +Do not use global folders to search for files. .El .Sh SEE ALSO .Lk https://wiki.openttd.org "Wiki" diff --git a/src/openttd.cpp b/src/openttd.cpp index 912be832c3..3ee2182d8e 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -166,11 +166,11 @@ static void ShowHelp() " -e = Start Editor\n" " -g [savegame] = Start new/save game immediately\n" " -G seed = Set random seed\n" - " -n ip[:port][#company]= Join network game\n" + " -n host[:port][#company]= Join network game\n" " -p password = Password to join server\n" " -P password = Password to join company\n" - " -D [ip][:port] = Start dedicated server\n" - " -l ip[:port] = Redirect Debug()\n" + " -D [host][:port] = Start dedicated server\n" + " -l host[:port] = Redirect Debug()\n" #if !defined(_WIN32) " -f = Fork into the background (dedicated only)\n" #endif @@ -548,7 +548,7 @@ int openttd_main(int argc, char *argv[]) break; case 'f': _dedicated_forks = true; break; case 'n': - scanner->connection_string = mgo.opt; // IP:port#company parameter + scanner->connection_string = mgo.opt; // host:port#company parameter break; case 'l': debuglog_conn = mgo.opt; From 9dc2fbe4fa5c0e8764cfc8c72e1abc4d90252922 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 13 Aug 2023 12:16:36 +0200 Subject: [PATCH 36/77] Fix 0238a2b5: crash when news message is displayed (#11195) --- src/news_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/news_gui.cpp b/src/news_gui.cpp index f6ffc7e683..765983c47a 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -309,9 +309,9 @@ struct NewsWindow : Window { NWidgetViewport *nvp = this->GetWidget(WID_N_VIEWPORT); if (nvp != nullptr) { if (ni->reftype1 == NR_VEHICLE) { - nvp->InitializeViewport(this, GetReferenceTile(ni->reftype1, ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS)); - } else { nvp->InitializeViewport(this, static_cast(ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS)); + } else { + nvp->InitializeViewport(this, GetReferenceTile(ni->reftype1, ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS)); } if (this->ni->flags & NF_NO_TRANSPARENT) nvp->disp_flags |= ND_NO_TRANSPARENCY; if ((this->ni->flags & NF_INCOLOUR) == 0) { From 07268357356bfef2396b56ef0250ea939937fb7f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 13 Aug 2023 18:38:43 +0000 Subject: [PATCH 37/77] Update: Translations from eints english (au): 2 changes by krysclarke french: 1 change by Lishouuu portuguese (brazilian): 2 changes by pasantoro --- src/lang/brazilian_portuguese.txt | 4 ++-- src/lang/english_AU.txt | 4 ++-- src/lang/french.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 197e6f55e9..a40ee4dc3e 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1900,8 +1900,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite cidades STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir cidades construirem cruzamentos de nível: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Se ativado, permite as cidades construírem ruas que atravessam ferrovias -STR_CONFIG_SETTING_NOISE_LEVEL :Permitir controle de ruído de aeronaves pelas cidades: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Se desativado, podem haver 2 aeroportos por cidade. Se ativado, o número de aeroportos é limitado pelo controle de ruído da cidade, que depende da população, tamanho e distância do aeroporto +STR_CONFIG_SETTING_NOISE_LEVEL :Limitar a localização do aeroporto em função do nível de ruído: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Permitir que as localidades bloqueiem a construção de aeroportos em função da aceitação do nível de ruído, que é baseado no total de habitantes da localidade e no tamanho e distância do aeroporto. Se esta definição estiver desativada, as localidades permitirão apenas dois aeroportos, a menos que a atitude da autoridade local esteja definida como "Permissiva" STR_CONFIG_SETTING_TOWN_FOUNDING :Fundação de cidades no jogo: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Se ativado, permite jogadores construírem novas cidades diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 591833acae..d01cd400f4 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1899,8 +1899,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Allow towns to STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Towns are allowed to build level crossings: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Enabling this setting allows towns to build level crossings -STR_CONFIG_SETTING_NOISE_LEVEL :Allow town controlled noise level for airports: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :With this setting disabled, there can be two airports in each town. With this setting enabled, the number of airports in a town is limited by the noise acceptance of the town, which depends on population and airport size and distance +STR_CONFIG_SETTING_NOISE_LEVEL :Limit airport placement based on noise level: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Allow towns to block airport construction based on their noise acceptance level, which is based on the town's population and airport size and distance. If this setting is disabled, towns allow only two airports unless the local authority attitude is set to "Permissive" STR_CONFIG_SETTING_TOWN_FOUNDING :Founding towns in game: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Enabling this setting allows players to found new towns in the game diff --git a/src/lang/french.txt b/src/lang/french.txt index a63e6e020c..6e48736c02 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1900,7 +1900,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Autoriser les v STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Autoriser la construction des passages à niveau par les villes{NBSP}: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activer ce paramètre pour autoriser les villes à construire des passages à niveau -STR_CONFIG_SETTING_NOISE_LEVEL :Permettre plus d'aéroports par ville, selon les nuisances sonores{NBSP}: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL :Limiter les placements des aéroports en fonction du niveau sonore{NBSP}: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Avec ce paramètre désactivé, il peut y avoir deux aéroports dans chaque ville. Avec ce paramètre activé, le nombre d'aéroports dans une ville est limité par le bruit qu'elle accepte, celui-ci dépend de la population, de la taille de l'aéroport et de la distance STR_CONFIG_SETTING_TOWN_FOUNDING :Fonder des villes en cours de jeu{NBSP}: {STRING} From 61dfd74e442c622c280f2de6a7785788b5f19733 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 13 Aug 2023 15:03:45 -0400 Subject: [PATCH 38/77] Codechange: Use correct type for max timetable start years constant (#11197) --- src/timetable.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/timetable.h b/src/timetable.h index 2a1ef830c4..efa38599e3 100644 --- a/src/timetable.h +++ b/src/timetable.h @@ -11,9 +11,10 @@ #define TIMETABLE_H #include "date_type.h" +#include "timer/timer_game_calendar.h" #include "vehicle_type.h" -static const uint8_t MAX_TIMETABLE_START_YEARS = 15; ///< The maximum start date offset, in years. +static const TimerGameCalendar::Year MAX_TIMETABLE_START_YEARS = 15; ///< The maximum start date offset, in years. void ShowTimetableWindow(const Vehicle *v); void UpdateVehicleTimetable(Vehicle *v, bool travelling); From e652cd643423924c60a67091142f9583fba9c442 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 14 Aug 2023 18:38:20 +0000 Subject: [PATCH 39/77] Update: Translations from eints swedish: 1 change by Brickblock1 english (us): 2 changes by 2TallTyler --- src/lang/english_US.txt | 4 ++-- src/lang/swedish.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 10928ec5d5..d0d308be77 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1899,8 +1899,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Allow towns to STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Towns are allowed to build grade crossings: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Enabling this setting allows towns to build grade crossings -STR_CONFIG_SETTING_NOISE_LEVEL :Allow town controlled noise level for airports: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :With this setting disabled, there can be two airports in each town. With this setting enabled, the number of airports in a town is limited by the noise acceptance of the town, which depends on population and airport size and distance +STR_CONFIG_SETTING_NOISE_LEVEL :Limit airport placement based on noise level: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Allow towns to block airport construction based on their noise acceptance level, which is based on the town's population and airport size and distance. If this setting is disabled, towns allow only two airports unless the local authority attitude is set to "Permissive" STR_CONFIG_SETTING_TOWN_FOUNDING :Founding towns in game: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Enabling this setting allows players to found new towns in the game diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 02c60afd7c..3efb0a1772 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1899,7 +1899,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Tillåt städer STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Städer tillåts bygga plankorsningar: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Om denna inställning aktiveras så blir det tillåtet för städer att bygga plankorsningar -STR_CONFIG_SETTING_NOISE_LEVEL :Tillåt stadskontrollerade bullernivåer för flygplatser: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL :Begränsa var flygplatser kan placeras baserat på ljudnivå: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Med denna inställning avstängd kan det finnas max två flygplatser i varje stad. Med inställningen påslagen begränsas antalet flygplatser i en stad istället av vilken bullernivå staden accepterar, vilket styrs av populationen, flygplatsens storlek och avstånd till staden STR_CONFIG_SETTING_TOWN_FOUNDING :Grunda städer i spelet: {STRING} From 7ef55bdfb0d58015e7d6d29d01469579cae19711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Mon, 14 Aug 2023 23:29:03 +0200 Subject: [PATCH 40/77] Cleanup: [CMake] don't add strgen.h twice (#11199) --- src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8420e650a9..6ef4fa3fdf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -415,7 +415,6 @@ add_files( story_cmd.h story_gui.cpp story_type.h - strgen/strgen.h string.cpp string_base.h string_func.h From 5d3f7939e2c967fb40768757ef91e40246350458 Mon Sep 17 00:00:00 2001 From: arikover <53194907+arikover@users.noreply.github.com> Date: Tue, 15 Aug 2023 10:34:36 +0200 Subject: [PATCH 41/77] Fix d42a78f: Show correct road speed in construction dropdowns (#11196) --- src/road_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 01ac10ec75..056febcf00 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1835,7 +1835,7 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b const RoadTypeInfo *rti = GetRoadTypeInfo(rt); SetDParam(0, rti->strings.menu_text); - SetDParam(1, rti->max_speed); + SetDParam(1, rti->max_speed / 2); if (for_replacement) { list.emplace_back(new DropDownListStringItem(rti->strings.replace_text, rt, !HasBit(avail_roadtypes, rt))); } else { @@ -1879,7 +1879,7 @@ DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts) const RoadTypeInfo *rti = GetRoadTypeInfo(rt); SetDParam(0, rti->strings.menu_text); - SetDParam(1, rti->max_speed); + SetDParam(1, rti->max_speed / 2); StringID str = rti->max_speed > 0 ? STR_TOOLBAR_RAILTYPE_VELOCITY : STR_JUST_STRING; DropDownListIconItem *item = new DropDownListIconItem(rti->gui_sprites.build_x_road, PAL_NONE, str, rt, !HasBit(avail_roadtypes, rt)); item->SetDimension(d); From 07730584d7b85d696c0ec2977556bc339ed45fab Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 15 Aug 2023 18:12:05 +0200 Subject: [PATCH 42/77] Codechange: make explicit when a TileIndex is cast to its basetype (#11190) This prevents people accidentially assigning a TileIndex to a Date or any other type they shouldn't. --- src/build_vehicle_gui.cpp | 10 +++++-- src/company_cmd.cpp | 2 +- src/core/strong_typedef_type.hpp | 32 ++------------------- src/disaster_vehicle.cpp | 6 ++-- src/industry_cmd.cpp | 2 +- src/map_func.h | 26 ++++++++--------- src/misc/dbg_helpers.cpp | 2 +- src/misc_gui.cpp | 6 ++-- src/newgrf_industries.cpp | 4 +-- src/newgrf_object.cpp | 2 +- src/newgrf_station.cpp | 2 +- src/newgrf_town.cpp | 2 +- src/news_func.h | 2 +- src/object_cmd.cpp | 2 +- src/pathfinder/yapf/yapf_node_rail.hpp | 2 +- src/rail_cmd.cpp | 4 +-- src/saveload/afterload.cpp | 2 +- src/saveload/map_sl.cpp | 40 +++++++++++++------------- src/script/api/script_bridge.cpp | 4 +-- src/script/api/script_depotlist.cpp | 4 +-- src/script/api/script_map.hpp | 2 +- src/script/api/script_road.cpp | 4 +-- src/script/api/script_tilelist.cpp | 8 +++--- src/script/api/script_tunnel.cpp | 2 +- src/station_cmd.cpp | 6 ++-- src/story.cpp | 2 +- src/tile_type.h | 2 +- src/timer/timer_game_calendar.h | 4 +-- src/town_cmd.cpp | 2 +- src/window_func.h | 25 ++++++++++++++++ src/window_gui.h | 12 ++++++++ 31 files changed, 120 insertions(+), 105 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 9279abdbee..86563ad8d9 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1177,7 +1177,7 @@ struct BuildVehicleWindow : Window { { this->vehicle_type = type; this->listview_mode = tile == INVALID_TILE; - this->window_number = this->listview_mode ? (int)type : (int)tile; + this->window_number = this->listview_mode ? (int)type : static_cast(tile); this->sel_engine = INVALID_ENGINE; @@ -1212,7 +1212,11 @@ struct BuildVehicleWindow : Window { this->details_height = ((this->vehicle_type == VEH_TRAIN) ? 10 : 9); - this->FinishInitNested(tile == INVALID_TILE ? (int)type : (int)tile); + if (tile == INVALID_TILE) { + this->FinishInitNested(type); + } else { + this->FinishInitNested(tile); + } this->querystrings[WID_BV_FILTER] = &this->vehicle_editbox; this->vehicle_editbox.cancel_button = QueryString::ACTION_CLEAR; @@ -1891,7 +1895,7 @@ void ShowBuildVehicleWindow(TileIndex tile, VehicleType type) * so if tile == INVALID_TILE (Available XXX Window), use 'type' as unique number. * As it always is a low value, it won't collide with any real tile * number. */ - uint num = (tile == INVALID_TILE) ? (int)type : (int)tile; + uint num = (tile == INVALID_TILE) ? (int)type : static_cast(tile); assert(IsCompanyBuildableVehicleType(type)); diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index ca6ade6039..2647b334f4 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -389,7 +389,7 @@ set_name:; SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION); SetDParamStr(2, cni->company_name); SetDParam(3, t->index); - AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni); + AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, static_cast(c->last_build_coordinate), NR_NONE, UINT32_MAX, cni); } return; } diff --git a/src/core/strong_typedef_type.hpp b/src/core/strong_typedef_type.hpp index 0c1abe9843..f5715ed586 100644 --- a/src/core/strong_typedef_type.hpp +++ b/src/core/strong_typedef_type.hpp @@ -132,33 +132,6 @@ namespace StrongType { }; }; - /** - * Mix-in which makes the new Typedef implicitly convertible to its base type. - * - * Be careful: when allowing implicit conversion, you won't notice if this type is assigned to a compatible, but different, type. - * For example: - * - * StrongType::Typedef a = 1; - * StrongType::Typedef b = 2; - * a = b; // OK - */ - struct Implicit { - template - struct mixin { - constexpr operator TBaseType () const { return static_cast(*this).value; } - }; - }; - - /** - * Mix-in which makes the new Typedef explicitly convertible to its base type. - */ - struct Explicit { - template - struct mixin { - explicit constexpr operator TBaseType () const { return static_cast(*this).value; } - }; - }; - /** * Templated helper to make a type-safe 'typedef' representing a single POD value. * A normal 'typedef' is not distinct from its base type and will be treated as @@ -187,9 +160,10 @@ namespace StrongType { constexpr Typedef &operator =(Typedef &&rhs) { this->value = std::move(rhs.value); return *this; } constexpr Typedef &operator =(const TBaseType &rhs) { this->value = rhs; return *this; } + /* Only allow explicit conversions to BaseType. */ + explicit constexpr operator TBaseType () const { return this->value; } + /* Only allow TProperties classes access to the internal value. Everyone else needs to do an explicit cast. */ - friend struct Explicit; - friend struct Implicit; friend struct Compare; friend struct Integer; template friend struct Compatible; diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index c5419b4f4b..4aa5549c83 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -358,7 +358,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v) return true; } else { /* Target a vehicle */ - RoadVehicle *u = RoadVehicle::Get(v->dest_tile); + RoadVehicle *u = RoadVehicle::Get(static_cast(v->dest_tile)); assert(u != nullptr && u->type == VEH_ROAD && u->IsFrontEngine()); uint dist = Delta(v->x_pos, u->x_pos) + Delta(v->y_pos, u->y_pos); @@ -437,7 +437,7 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, b if (v->state == 2) { if (GB(v->tick_counter, 0, 2) == 0) { - Industry *i = Industry::Get(v->dest_tile); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid + Industry *i = Industry::Get(static_cast(v->dest_tile)); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid int x = TileX(i->location.tile) * TILE_SIZE; int y = TileY(i->location.tile) * TILE_SIZE; uint32_t r = Random(); @@ -455,7 +455,7 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, b v->state = 2; v->age = 0; - Industry *i = Industry::Get(v->dest_tile); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid + Industry *i = Industry::Get(static_cast(v->dest_tile)); // Industry destructor calls ReleaseDisastersTargetingIndustry, so this is valid DestructIndustry(i); SetDParam(0, i->town->index); diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 7612e30f93..8c0ef4773e 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -151,7 +151,7 @@ Industry::~Industry() for (TileIndex tile_cur : this->location) { if (IsTileType(tile_cur, MP_INDUSTRY)) { if (GetIndustryIndex(tile_cur) == this->index) { - DeleteNewGRFInspectWindow(GSF_INDUSTRYTILES, tile_cur); + DeleteNewGRFInspectWindow(GSF_INDUSTRYTILES, static_cast(tile_cur)); /* MakeWaterKeepingClass() can also handle 'land' */ MakeWaterKeepingClass(tile_cur, OWNER_NONE); diff --git a/src/map_func.h b/src/map_func.h index ab0495de94..89507a9c70 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -77,7 +77,7 @@ public: /** * Implicit conversion to the uint for bounds checking. */ - debug_inline constexpr operator uint() const { return tile; } + debug_inline constexpr operator uint() const { return static_cast(tile); } /** * The type (bits 4..7), bridges (2..3), rainforest/desert (0..1) @@ -88,7 +88,7 @@ public: */ debug_inline byte &type() { - return base_tiles[tile].type; + return base_tiles[static_cast(tile)].type; } /** @@ -100,7 +100,7 @@ public: */ debug_inline byte &height() { - return base_tiles[tile].height; + return base_tiles[static_cast(tile)].height; } /** @@ -112,7 +112,7 @@ public: */ debug_inline byte &m1() { - return base_tiles[tile].m1; + return base_tiles[static_cast(tile)].m1; } /** @@ -124,7 +124,7 @@ public: */ debug_inline uint16_t &m2() { - return base_tiles[tile].m2; + return base_tiles[static_cast(tile)].m2; } /** @@ -136,7 +136,7 @@ public: */ debug_inline byte &m3() { - return base_tiles[tile].m3; + return base_tiles[static_cast(tile)].m3; } /** @@ -148,7 +148,7 @@ public: */ debug_inline byte &m4() { - return base_tiles[tile].m4; + return base_tiles[static_cast(tile)].m4; } /** @@ -160,7 +160,7 @@ public: */ debug_inline byte &m5() { - return base_tiles[tile].m5; + return base_tiles[static_cast(tile)].m5; } /** @@ -172,7 +172,7 @@ public: */ debug_inline byte &m6() { - return extended_tiles[tile].m6; + return extended_tiles[static_cast(tile)].m6; } /** @@ -184,7 +184,7 @@ public: */ debug_inline byte &m7() { - return extended_tiles[tile].m7; + return extended_tiles[static_cast(tile)].m7; } /** @@ -196,7 +196,7 @@ public: */ debug_inline uint16_t &m8() { - return extended_tiles[tile].m8; + return extended_tiles[static_cast(tile)].m8; } }; @@ -314,9 +314,9 @@ public: * It does this by masking the 'high' bits of. * @param tile the tile to 'wrap' */ - static inline TileIndex WrapToMap(uint tile) + static inline TileIndex WrapToMap(TileIndex tile) { - return tile & Map::tile_mask; + return static_cast(tile) & Map::tile_mask; } /** diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp index cad18a6eb8..7c4a15aa6a 100644 --- a/src/misc/dbg_helpers.cpp +++ b/src/misc/dbg_helpers.cpp @@ -63,7 +63,7 @@ std::string ValueStr(SignalType t) std::string TileStr(TileIndex tile) { std::stringstream ss; - ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << tile; // 0x%04X + ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << static_cast(tile); // 0x%04X ss << " (" << TileX(tile) << ", " << TileY(tile) << ")"; return ss.str(); } diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index ac971c284f..9b6e894136 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -207,7 +207,7 @@ public: /* Location */ std::stringstream tile_ss; - tile_ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << std::uppercase << tile; // 0x%.4X + tile_ss << "0x" << std::setfill('0') << std::setw(4) << std::hex << std::uppercase << static_cast(tile); // 0x%.4X SetDParam(0, TileX(tile)); SetDParam(1, TileY(tile)); @@ -331,12 +331,12 @@ public: bool IsNewGRFInspectable() const override { - return ::IsNewGRFInspectable(GetGrfSpecFeature(this->tile), this->tile); + return ::IsNewGRFInspectable(GetGrfSpecFeature(this->tile), static_cast(this->tile)); } void ShowNewGRFInspectWindow() const override { - ::ShowNewGRFInspectWindow(GetGrfSpecFeature(this->tile), this->tile); + ::ShowNewGRFInspectWindow(GetGrfSpecFeature(this->tile), static_cast(this->tile)); } void OnClick(Point pt, int widget, int click_count) override diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index 047102e620..672d2034be 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -162,7 +162,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo /* Variables available during construction check. */ switch (variable) { - case 0x80: return this->tile; + case 0x80: return static_cast(this->tile); case 0x81: return GB(static_cast(this->tile), 8, 8); /* Pointer to the town the industry is associated with */ @@ -347,7 +347,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte param_setID, byte layo case 0x7C: return (this->industry->psa != nullptr) ? this->industry->psa->GetValue(parameter) : 0; /* Industry structure access*/ - case 0x80: return this->industry->location.tile; + case 0x80: return static_cast(this->industry->location.tile); case 0x81: return GB(static_cast(this->industry->location.tile), 8, 8); /* Pointer to the town the industry is associated with */ case 0x82: return this->industry->town->index; diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 6442041c60..624f5cfebd 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -305,7 +305,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(byte local_id, uint32_t grf switch (variable) { /* Relative position. */ case 0x40: { - uint offset = this->tile - this->obj->location.tile; + TileIndex offset = this->tile - this->obj->location.tile; uint offset_x = TileX(offset); uint offset_y = TileY(offset); return offset_y << 20 | offset_x << 16 | offset_y << 8 | offset_x; diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 9bf3bca665..560bd29f93 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -649,7 +649,7 @@ uint16_t GetStationCallback(CallbackID callback, uint32_t param1, uint32_t param */ CommandCost PerformStationTileSlopeCheck(TileIndex north_tile, TileIndex cur_tile, const StationSpec *statspec, Axis axis, byte plat_len, byte numtracks) { - TileIndexDiff diff = cur_tile - north_tile; + TileIndex diff = cur_tile - north_tile; Slope slope = GetTileSlope(cur_tile); StationResolverObject object(statspec, nullptr, cur_tile, CBID_STATION_LAND_SLOPE_CHECK, diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index ace57b5eeb..127b64fa5e 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -43,7 +43,7 @@ } /* Town properties */ - case 0x80: return this->t->xy; + case 0x80: return static_cast(this->t->xy); case 0x81: return GB(static_cast(this->t->xy), 8, 8); case 0x82: return ClampTo(this->t->cache.population); case 0x83: return GB(ClampTo(this->t->cache.population), 8, 8); diff --git a/src/news_func.h b/src/news_func.h index 465bab7243..466f4befec 100644 --- a/src/news_func.h +++ b/src/news_func.h @@ -44,7 +44,7 @@ static inline void AddVehicleAdviceNewsItem(StringID string, VehicleID vehicle) static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, const NewsAllocatedData *data = nullptr, StationID station = INVALID_STATION) { - AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile, station == INVALID_STATION ? NR_NONE : NR_STATION, station, data); + AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, static_cast(tile), station == INVALID_STATION ? NR_NONE : NR_STATION, station, data); } static inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry) diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 89df861c36..3be124e5fd 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -511,7 +511,7 @@ static void ReallyClearObjectTile(Object *o) { Object::DecTypeCount(o->type); for (TileIndex tile_cur : o->location) { - DeleteNewGRFInspectWindow(GSF_OBJECTS, tile_cur); + DeleteNewGRFInspectWindow(GSF_OBJECTS, static_cast(tile_cur)); MakeWaterKeepingClass(tile_cur, GetTileOwner(tile_cur)); } diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index 8aa517e042..16027d06e5 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -27,7 +27,7 @@ struct CYapfRailSegmentKey inline void Set(const CYapfNodeKeyTrackDir &node_key) { - m_value = (((int)node_key.m_tile) << 4) | node_key.m_td; + m_value = (static_cast(node_key.m_tile) << 4) | node_key.m_td; } inline int32_t CalcHash() const diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index ae5d9769a1..684bdf639e 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -662,7 +662,7 @@ CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= LEVELCROSSING_TRACKBIT_FACTOR; DirtyCompanyInfrastructureWindows(owner); MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypeRoad(tile), GetRoadTypeTram(tile), GetTownIndex(tile), GetRoadOwner(tile, RTT_ROAD), GetRoadOwner(tile, RTT_TRAM)); - DeleteNewGRFInspectWindow(GSF_RAILTYPES, tile); + DeleteNewGRFInspectWindow(GSF_RAILTYPES, static_cast(tile)); } break; } @@ -720,7 +720,7 @@ CommandCost CmdRemoveSingleRail(DoCommandFlag flags, TileIndex tile, Track track } else { DoClearSquare(tile); } - DeleteNewGRFInspectWindow(GSF_RAILTYPES, tile); + DeleteNewGRFInspectWindow(GSF_RAILTYPES, static_cast(tile)); } else { SetTrackBits(tile, present); SetTrackReservation(tile, GetRailReservationTrackBits(tile) & present); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 26497ed0e9..b03ad503d4 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2143,7 +2143,7 @@ bool AfterLoadGame() /* Delete small ufos heading for non-existing vehicles */ for (DisasterVehicle *v : DisasterVehicle::Iterate()) { if (v->subtype == 2 /* ST_SMALL_UFO */ && v->state != 0) { - const Vehicle *u = Vehicle::GetIfValid(v->dest_tile); + const Vehicle *u = Vehicle::GetIfValid(static_cast(v->dest_tile)); if (u == nullptr || u->type != VEH_ROAD || !RoadVehicle::From(u)->IsFrontEngine()) { delete v; } diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp index ed33a7e624..f5407dd04e 100644 --- a/src/saveload/map_sl.cpp +++ b/src/saveload/map_sl.cpp @@ -72,7 +72,7 @@ struct MAPTChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -83,7 +83,7 @@ struct MAPTChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -99,7 +99,7 @@ struct MAPHChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -110,7 +110,7 @@ struct MAPHChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -126,7 +126,7 @@ struct MAPOChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -137,7 +137,7 @@ struct MAPOChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -153,7 +153,7 @@ struct MAP2ChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, @@ -167,7 +167,7 @@ struct MAP2ChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(static_cast(size) * sizeof(uint16_t)); for (TileIndex i = 0; i != size;) { @@ -183,7 +183,7 @@ struct M3LOChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -194,7 +194,7 @@ struct M3LOChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -210,7 +210,7 @@ struct M3HIChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -221,7 +221,7 @@ struct M3HIChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -237,7 +237,7 @@ struct MAP5ChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -248,7 +248,7 @@ struct MAP5ChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -264,7 +264,7 @@ struct MAPEChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); if (IsSavegameVersionBefore(SLV_42)) { for (TileIndex i = 0; i != size;) { @@ -288,7 +288,7 @@ struct MAPEChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -304,7 +304,7 @@ struct MAP7ChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT8); @@ -315,7 +315,7 @@ struct MAP7ChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(size); for (TileIndex i = 0; i != size;) { @@ -331,7 +331,7 @@ struct MAP8ChunkHandler : ChunkHandler { void Load() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); for (TileIndex i = 0; i != size;) { SlCopy(buf.data(), MAP_SL_BUF_SIZE, SLE_UINT16); @@ -342,7 +342,7 @@ struct MAP8ChunkHandler : ChunkHandler { void Save() const override { std::array buf; - TileIndex size = Map::Size(); + uint size = Map::Size(); SlSetLength(static_cast(size) * sizeof(uint16_t)); for (TileIndex i = 0; i != size;) { diff --git a/src/script/api/script_bridge.cpp b/src/script/api/script_bridge.cpp index d09c214e48..b128c87d2b 100644 --- a/src/script/api/script_bridge.cpp +++ b/src/script/api/script_bridge.cpp @@ -83,8 +83,8 @@ static void _DoCommandReturnBuildBridge1(class ScriptInstance *instance) switch (vehicle_type) { case ScriptVehicle::VT_ROAD: - ScriptObject::SetCallbackVariable(0, start); - ScriptObject::SetCallbackVariable(1, end); + ScriptObject::SetCallbackVariable(0, static_cast(start)); + ScriptObject::SetCallbackVariable(1, static_cast(end)); return ScriptObject::Command::Do(&::_DoCommandReturnBuildBridge1, end, start, TRANSPORT_ROAD, bridge_id, ScriptRoad::GetCurrentRoadType()); case ScriptVehicle::VT_RAIL: return ScriptObject::Command::Do(end, start, TRANSPORT_RAIL, bridge_id, ScriptRail::GetCurrentRailType()); diff --git a/src/script/api/script_depotlist.cpp b/src/script/api/script_depotlist.cpp index 2e1dc6fc98..9f2dc96ee4 100644 --- a/src/script/api/script_depotlist.cpp +++ b/src/script/api/script_depotlist.cpp @@ -30,7 +30,7 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) for (const Station *st : Station::Iterate()) { if (st->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) { for (uint i = 0; i < st->airport.GetNumHangars(); i++) { - this->AddItem(st->airport.GetHangarTile(i)); + this->AddItem(static_cast(st->airport.GetHangarTile(i))); } } } @@ -40,6 +40,6 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) /* Handle 'standard' depots. */ for (const Depot *depot : Depot::Iterate()) { - if ((::GetTileOwner(depot->xy) == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && ::IsTileType(depot->xy, tile_type)) this->AddItem(depot->xy); + if ((::GetTileOwner(depot->xy) == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && ::IsTileType(depot->xy, tile_type)) this->AddItem(static_cast(depot->xy)); } } diff --git a/src/script/api/script_map.hpp b/src/script/api/script_map.hpp index 8e3fe31d6d..45b4a4b191 100644 --- a/src/script/api/script_map.hpp +++ b/src/script/api/script_map.hpp @@ -19,7 +19,7 @@ */ class ScriptMap : public ScriptObject { public: - static const int TILE_INVALID = (int)INVALID_TILE; ///< Invalid TileIndex. + static const int TILE_INVALID = static_cast(INVALID_TILE); ///< Invalid TileIndex. /** * Checks whether the given tile is valid. diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index d17ba9638f..8c702f1b41 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -382,8 +382,8 @@ static bool NormaliseTileOffset(int32_t *tile) /* static */ SQInteger ScriptRoad::CanBuildConnectedRoadParts(ScriptTile::Slope slope_, Array<> &&existing, TileIndex start_, TileIndex end_) { ::Slope slope = (::Slope)slope_; - int32_t start = start_; - int32_t end = end_; + int32_t start = static_cast(start_); + int32_t end = static_cast(end_); /* The start tile and end tile cannot be the same tile either. */ if (start == end) return -1; diff --git a/src/script/api/script_tilelist.cpp b/src/script/api/script_tilelist.cpp index 16b5adcedc..e23b4eaa33 100644 --- a/src/script/api/script_tilelist.cpp +++ b/src/script/api/script_tilelist.cpp @@ -21,14 +21,14 @@ void ScriptTileList::AddRectangle(TileIndex t1, TileIndex t2) if (!::IsValidTile(t2)) return; TileArea ta(t1, t2); - for (TileIndex t : ta) this->AddItem(t); + for (TileIndex t : ta) this->AddItem(static_cast(t)); } void ScriptTileList::AddTile(TileIndex tile) { if (!::IsValidTile(tile)) return; - this->AddItem(tile); + this->AddItem(static_cast(tile)); } void ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2) @@ -37,14 +37,14 @@ void ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2) if (!::IsValidTile(t2)) return; TileArea ta(t1, t2); - for (TileIndex t : ta) this->RemoveItem(t); + for (TileIndex t : ta) this->RemoveItem(static_cast(t)); } void ScriptTileList::RemoveTile(TileIndex tile) { if (!::IsValidTile(tile)) return; - this->RemoveItem(tile); + this->RemoveItem(static_cast(tile)); } /** diff --git a/src/script/api/script_tunnel.cpp b/src/script/api/script_tunnel.cpp index 0e1286c334..a1ff3e03e2 100644 --- a/src/script/api/script_tunnel.cpp +++ b/src/script/api/script_tunnel.cpp @@ -93,7 +93,7 @@ static void _DoCommandReturnBuildTunnel1(class ScriptInstance *instance) /* For rail we do nothing special */ return ScriptObject::Command::Do(start, TRANSPORT_RAIL, ScriptRail::GetCurrentRailType()); } else { - ScriptObject::SetCallbackVariable(0, start); + ScriptObject::SetCallbackVariable(0, static_cast(start)); return ScriptObject::Command::Do(&::_DoCommandReturnBuildTunnel1, start, TRANSPORT_ROAD, ScriptRoad::GetCurrentRoadType()); } } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 7aa176e49e..c8fbd43c5a 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1651,7 +1651,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector &affected_st if (!build_rail && !IsStationTileBlocked(tile)) Company::Get(owner)->infrastructure.rail[rt]--; DoClearSquare(tile); - DeleteNewGRFInspectWindow(GSF_STATIONS, tile); + DeleteNewGRFInspectWindow(GSF_STATIONS, static_cast(tile)); if (build_rail) MakeRailNormal(tile, owner, TrackToTrackBits(track), rt); Company::Get(owner)->infrastructure.station--; DirtyCompanyInfrastructureWindows(owner); @@ -2149,7 +2149,7 @@ static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlag flags, int repla uint specindex = GetCustomRoadStopSpecIndex(tile); - DeleteNewGRFInspectWindow(GSF_ROADSTOPS, tile); + DeleteNewGRFInspectWindow(GSF_ROADSTOPS, static_cast(tile)); if (IsDriveThroughStopTile(tile)) { /* Clears the tile for us */ @@ -2533,7 +2533,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) if (flags & DC_EXEC) { DeleteAnimatedTile(tile_cur); DoClearSquare(tile_cur); - DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur); + DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, static_cast(tile_cur)); } } diff --git a/src/story.cpp b/src/story.cpp index a3d86c59da..86e09a0705 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -99,7 +99,7 @@ static void UpdateElement(StoryPageElement &pe, TileIndex tile, uint32_t referen break; case SPET_LOCATION: pe.text = text; - pe.referenced_id = tile; + pe.referenced_id = static_cast(tile); break; case SPET_GOAL: pe.referenced_id = (GoalID)reference; diff --git a/src/tile_type.h b/src/tile_type.h index b7e80dedc9..83c1a7460b 100644 --- a/src/tile_type.h +++ b/src/tile_type.h @@ -84,7 +84,7 @@ enum TropicZone { * * It is compatible with int32 / int64 for easy math throughout the code. */ -using TileIndex = StrongType::Typedef, StrongType::Compatible>; +using TileIndex = StrongType::Typedef, StrongType::Compatible>; /* Make sure the size is as expected. */ static_assert(sizeof(TileIndex) == 4); diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index 833f5893c1..de8c78a8ec 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -78,13 +78,13 @@ public: }; /** The type to store our dates in. */ - using Date = StrongType::Typedef; + using Date = StrongType::Typedef; /** The fraction of a date we're in, i.e. the number of ticks since the last date changeover. */ using DateFract = uint16_t; /** Type for the year, note: 0 based, i.e. starts at the year 0. */ - using Year = StrongType::Typedef; + using Year = StrongType::Typedef; /** Type for the month, note: 0 based, i.e. 0 = January, 11 = December. */ using Month = uint8_t; /** Type for the day of the month, note: 1 based, first day of a month is 1. */ diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 96fccf564e..6b7e827ddd 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2714,7 +2714,7 @@ static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house) DoClearSquare(tile); DeleteAnimatedTile(tile); - DeleteNewGRFInspectWindow(GSF_HOUSES, tile); + DeleteNewGRFInspectWindow(GSF_HOUSES, static_cast(tile)); } /** diff --git a/src/window_func.h b/src/window_func.h index 0f4d154e54..11037db891 100644 --- a/src/window_func.h +++ b/src/window_func.h @@ -13,12 +13,19 @@ #include "window_type.h" #include "company_type.h" #include "core/geometry_type.hpp" +#include "core/strong_typedef_type.hpp" Window *FindWindowById(WindowClass cls, WindowNumber number); Window *FindWindowByClass(WindowClass cls); Window *GetMainWindow(); void ChangeWindowOwner(Owner old_owner, Owner new_owner); +template::value, int> = 0> +Window *FindWindowById(WindowClass cls, T number) +{ + return FindWindowById(cls, static_cast(number)); +} + void ResizeWindow(Window *w, int x, int y, bool clamp_to_screen = true); int PositionMainToolbar(Window *w); int PositionStatusbar(Window *w); @@ -37,6 +44,12 @@ void InputLoop(); void InvalidateWindowData(WindowClass cls, WindowNumber number, int data = 0, bool gui_scope = false); void InvalidateWindowClassesData(WindowClass cls, int data = 0, bool gui_scope = false); +template::value, int> = 0> +void InvalidateWindowData(WindowClass cls, T number, int data = 0, bool gui_scope = false) +{ + InvalidateWindowData(cls, static_cast(number), data, gui_scope); +} + void CloseNonVitalWindows(); void CloseAllNonVitalWindows(); void DeleteAllMessages(); @@ -54,9 +67,21 @@ void SetWindowWidgetDirty(WindowClass cls, WindowNumber number, byte widget_inde void SetWindowDirty(WindowClass cls, WindowNumber number); void SetWindowClassesDirty(WindowClass cls); +template::value, int> = 0> +void SetWindowDirty(WindowClass cls, T number) +{ + SetWindowDirty(cls, static_cast(number)); +} + void CloseWindowById(WindowClass cls, WindowNumber number, bool force = true); void CloseWindowByClass(WindowClass cls); +template::value, int> = 0> +void CloseWindowById(WindowClass cls, T number, bool force = true) +{ + CloseWindowById(cls, static_cast(number), force); +} + bool EditBoxInGlobalFocus(); bool FocusedWindowIsConsole(); Point GetCaretPosition(); diff --git a/src/window_gui.h b/src/window_gui.h index a639362ecd..1d0d884c54 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -284,6 +284,12 @@ public: void CreateNestedTree(bool fill_nested = true); void FinishInitNested(WindowNumber window_number = 0); + template::value, int> = 0> + void FinishInitNested(T number) + { + this->FinishInitNested(static_cast(number)); + } + /** * Set the timeout flag of the window and initiate the timer. */ @@ -880,6 +886,12 @@ public: Window *BringWindowToFrontById(WindowClass cls, WindowNumber number); Window *FindWindowFromPt(int x, int y); +template::value, int> = 0> +Window *BringWindowToFrontById(WindowClass cls, T number) +{ + return BringWindowToFrontById(cls, static_cast(number)); +} + /** * Open a new window. * @tparam Wcls %Window class to use if the window does not exist. From 662f76bfc4657b27b37e68a9086637b40d1243ac Mon Sep 17 00:00:00 2001 From: romw314 <106016361+romw314@users.noreply.github.com> Date: Tue, 15 Aug 2023 22:21:13 +0200 Subject: [PATCH 43/77] Docs: mention Windows 11 in directory_structure.md (#11200) --- docs/directory_structure.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/directory_structure.md b/docs/directory_structure.md index 51ad1c5a3e..c8b5c6a9d4 100644 --- a/docs/directory_structure.md +++ b/docs/directory_structure.md @@ -19,14 +19,14 @@ your operating system: - Windows: - `C:\My Documents\OpenTTD` (95, 98, ME) - `C:\Documents and Settings\\My Documents\OpenTTD` (2000, XP) - - `C:\Users\\Documents\OpenTTD` (Vista, 7, 8.1, 10) + - `C:\Users\\Documents\OpenTTD` (Vista, 7, 8.1, 10, 11) - macOS: `~/Documents/OpenTTD` - Linux: `$XDG_DATA_HOME/openttd` which is usually `~/.local/share/openttd` when built with XDG base directory support, otherwise `~/.openttd` 3. The shared directory - Windows: - `C:\Documents and Settings\All Users\Shared Documents\OpenTTD` (2000, XP) - - `C:\Users\Public\Documents\OpenTTD` (Vista, 7, 8.1, 10) + - `C:\Users\Public\Documents\OpenTTD` (Vista, 7, 8.1, 10, 11) - macOS: `/Library/Application Support/OpenTTD` - Linux: not available 4. The binary directory (where the OpenTTD executable is) From db1a9f00c08cd15033ee4e2da5342a8942481fa2 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 16 Aug 2023 18:38:51 +0000 Subject: [PATCH 44/77] Update: Translations from eints dutch: 1 change by Bouke --- src/lang/dutch.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 6ae868944d..c5728b5f5a 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1254,7 +1254,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Links STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Midden STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rechts -STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "" n} +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}seconde{P 0 "" n} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximale beginlening: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximaal bedrag dat een bedrijf kan lenen (zonder rekening te houden met de inflatie) From 9061fef59c34c496bd64bd0e50b9473f49c3ea6e Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 16 Aug 2023 20:17:02 +0100 Subject: [PATCH 45/77] Fix #11203: [ICU] Glyph to char mapping with multiple runs (#11204) --- src/gfx_layout_icu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gfx_layout_icu.cpp b/src/gfx_layout_icu.cpp index d731ef68da..35d9eaf7f2 100644 --- a/src/gfx_layout_icu.cpp +++ b/src/gfx_layout_icu.cpp @@ -206,7 +206,7 @@ void ICURun::Shape(UChar *buff, size_t buff_length) { x_advance = glyph_pos[i].x_advance / FONT_SCALE; } - this->glyph_to_char.push_back(glyph_info[i].cluster - this->start); + this->glyph_to_char.push_back(glyph_info[i].cluster); this->advance.push_back(x_advance); advance += x_advance; } @@ -465,7 +465,7 @@ std::unique_ptr ICUParagraphLayout::NextLine(int /* There is no suitable line-break and this is the only run on the * line. So we break at the cluster. This is not pretty, but the * best we can do. */ - new_partial_length = char_pos - this->partial_offset; + new_partial_length = char_pos - overflow_run->start - this->partial_offset; } } From e8c49d35431f78e6ce8680de525772f5e444bcca Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 17 Aug 2023 18:38:20 +0000 Subject: [PATCH 46/77] Update: Translations from eints swedish: 1 change by joeax910 --- src/lang/swedish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 3efb0a1772..2c1381def2 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1900,7 +1900,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Städer tillåt STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Om denna inställning aktiveras så blir det tillåtet för städer att bygga plankorsningar STR_CONFIG_SETTING_NOISE_LEVEL :Begränsa var flygplatser kan placeras baserat på ljudnivå: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Med denna inställning avstängd kan det finnas max två flygplatser i varje stad. Med inställningen påslagen begränsas antalet flygplatser i en stad istället av vilken bullernivå staden accepterar, vilket styrs av populationen, flygplatsens storlek och avstånd till staden +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Tillåt städer att stoppa flygplatsbyggen med hänvisning till den bullernivå staden accepterar, vilket styrs av populationen, flygplatsens storlek och avstånd till staden. Om denna inställning inaktiveras tillåter städer endast två flygplatser, såvida de lokala myndigheternas inställning inte är satt till "Tillåtande" STR_CONFIG_SETTING_TOWN_FOUNDING :Grunda städer i spelet: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Om denna inställning aktiveras blir det möjligt för spelare att grunda nya städer i spelet From 2bf3c02fbf04439bd5aa3c7fddd04248416a8764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Thu, 17 Aug 2023 21:14:39 +0200 Subject: [PATCH 47/77] Fix: no fast forward in network was ensured only from GUI side (#11206) --- src/toolbar_gui.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 16bc9839b4..f7f7eccdc1 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -287,6 +287,8 @@ static CallBackFunction ToolbarPauseClick(Window *w) */ static CallBackFunction ToolbarFastForwardClick(Window *w) { + if (_networking) return CBF_NONE; // no fast forward in network game + ChangeGameSpeed(_game_speed == 100); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); From 5ac333c2cccc3cb133c8587468e565e8d86e0852 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Fri, 18 Aug 2023 13:22:00 +0200 Subject: [PATCH 48/77] Fix: [MacOS] screen looks blue-ish when using newer SDKs (#11207) The define kCGBitmapByteOrder32Host changed (around SDK 12?) into an enum, which means an old #ifndef was triggering, overwriting the value to 0. Sadly, 0 means Order16Big, causing RGBA to become GRAB, which results in strange colours. As we no longer support PPC, drop that piece of code completely. --- src/video/cocoa/cocoa_v.mm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 28058bea15..f94601813f 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -64,13 +64,6 @@ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information. */ -/* On some old versions of MAC OS this may not be defined. - * Those versions generally only produce code for PPC. So it should be safe to - * set this to 0. */ -#ifndef kCGBitmapByteOrder32Host -#define kCGBitmapByteOrder32Host 0 -#endif - bool _cocoa_video_started = false; static Palette _local_palette; ///< Current palette to use for drawing. From 7f5c0aab600a34cbb84e313311a894a28f056e62 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 18 Aug 2023 18:38:21 +0000 Subject: [PATCH 49/77] Update: Translations from eints dutch: 2 changes by Afoklala --- src/lang/dutch.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index c5728b5f5a..d783fb9078 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1899,8 +1899,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Steden toestaan STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Steden mogen gelijkvloerse kruisingen bouwen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Door deze optie in te schakelen kunnen steden gelijkvloerse kruisingen bouwen -STR_CONFIG_SETTING_NOISE_LEVEL :Geluidsniveaucontrole door steden voor vliegvelden toestaan: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Als je deze instelling uitschakelt, mogen er twee luchthavens per stad zijn. Als je deze instelling ingeschakelt, wordt het aantal luchthavens in een stad beperkt door de lawaaitolerantie van de stad; deze is afhankelijk van de bevolking en de grootte en afstand van de luchthaven. +STR_CONFIG_SETTING_NOISE_LEVEL :Plaatsing van vliegvelden beperken op basis van het lawaainiveau: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Hiermee wordt het aantal luchthavens in een stad beperkt door de lawaaitolerantie van de stad; deze is afhankelijk van de bevolking en de grootte en afstand van de luchthaven. Als deze instelling is uitgeschakeld, staat de stad slechts twee luchthavens toe, tenzij de houding van het gemeentebestuur is ingesteld op 'Toegeeflijk'. STR_CONFIG_SETTING_TOWN_FOUNDING :Steden stichten in spel: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Wanneer deze instelling is ingeschakeld kunnen spelers nieuwe steden stichten tijdens het spel From 53af20910b51bdcac21a64413de9edda449fb5b4 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 19 Aug 2023 00:43:32 +0200 Subject: [PATCH 50/77] Fix: [MSVC] generate static libraries / executables correctly with vcpkg -static target (#11208) --- CMakeLists.txt | 8 ++++++++ cmake/CompileFlags.cmake | 17 ----------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5339244f2b..1fc0fe1d16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,14 @@ set_target_properties(openttd PROPERTIES OUTPUT_NAME "${BINARY_NAME}") if(MSVC) # Add DPI manifest to project; other WIN32 targets get this via ottdres.rc target_sources(openttd PRIVATE "${CMAKE_SOURCE_DIR}/os/windows/openttd.manifest") + + # If target -static is used, switch our project to static (/MT) too. + # If the target ends on -static-md, it will remain dynamic (/MD). + if(VCPKG_TARGET_TRIPLET MATCHES "-static" AND NOT VCPKG_TARGET_TRIPLET MATCHES "-md") + set_property(TARGET openttd_lib PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET openttd PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + set_property(TARGET openttd_test PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif() endif() target_precompile_headers(openttd_lib diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index a499714481..ef2ea2dd49 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -4,23 +4,6 @@ # macro(compile_flags) if(MSVC) - if(VCPKG_TARGET_TRIPLET MATCHES "-static" AND NOT VCPKG_TARGET_TRIPLET MATCHES "-md") - # Switch to MT (static) instead of MD (dynamic) binary - - # For MSVC two generators are available - # - a command line generator (Ninja) using CMAKE_BUILD_TYPE to specify the - # configuration of the build tree - # - an IDE generator (Visual Studio) using CMAKE_CONFIGURATION_TYPES to - # specify all configurations that will be available in the generated solution - list(APPEND MSVC_CONFIGS "${CMAKE_BUILD_TYPE}" "${CMAKE_CONFIGURATION_TYPES}") - - # Set usage of static runtime for all configurations - foreach(MSVC_CONFIG ${MSVC_CONFIGS}) - string(TOUPPER "CMAKE_CXX_FLAGS_${MSVC_CONFIG}" MSVC_FLAGS) - string(REPLACE "/MD" "/MT" ${MSVC_FLAGS} "${${MSVC_FLAGS}}") - endforeach() - endif() - # "If /Zc:rvalueCast is specified, the compiler follows section 5.4 of the # C++11 standard". We need C++11 for the way we use threads. add_compile_options(/Zc:rvalueCast) From cd10ddf9ae2391046e2300a58162195ed484cefe Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sat, 19 Aug 2023 00:52:58 +0200 Subject: [PATCH 51/77] Remove: last remnants of SunOS (#11210) We have no evidence SunOS has been tried in the last few years, and the code is awkward enough to just remove. --- src/os/unix/crashlog_unix.cpp | 44 ----------------------------------- src/stdafx.h | 10 ++------ 2 files changed, 2 insertions(+), 52 deletions(-) diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index ed46f771e7..691a9a841b 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -19,9 +19,6 @@ #if defined(__GLIBC__) /* Execinfo (and thus making stacktraces) is a GNU extension */ # include -#elif defined(SUNOS) -# include -# include #endif #if defined(__NetBSD__) @@ -70,38 +67,6 @@ class CrashLogUnix : public CrashLog { ); } -#if defined(SUNOS) - /** Data needed while walking up the stack */ - struct StackWalkerParams { - std::back_insert_iterator *output_iterator; ///< Buffer - int counter; ///< We are at counter-th stack level - }; - - /** - * Callback used while walking up the stack. - * @param pc program counter - * @param sig 'active' signal (unused) - * @param params parameters - * @return always 0, continue walking up the stack - */ - static int SunOSStackWalker(uintptr_t pc, int sig, void *params) - { - StackWalkerParams *wp = (StackWalkerParams *)params; - - /* Resolve program counter to file and nearest symbol (if possible) */ - Dl_info dli; - if (dladdr((void *)pc, &dli) != 0) { - fmt::format_to(*wp->output_iterator, " [{:02}] {}({}+0x{:x}) [0x{:x}]\n", - wp->counter, dli.dli_fname, dli.dli_sname, (int)((byte *)pc - (byte *)dli.dli_saddr), (uint)pc); - } else { - fmt::format_to(*wp->output_iterator, " [{:02}] [0x{:x}]\n", wp->counter, (uint)pc); - } - wp->counter++; - - return 0; - } -#endif - void LogStacktrace(std::back_insert_iterator &output_iterator) const override { fmt::format_to(output_iterator, "Stacktrace:\n"); @@ -114,15 +79,6 @@ class CrashLogUnix : public CrashLog { fmt::format_to(output_iterator, " [{:02}] {}\n", i, messages[i]); } free(messages); -#elif defined(SUNOS) - ucontext_t uc; - if (getcontext(&uc) != 0) { - fmt::format_to(output_iterator, " getcontext() failed\n\n"); - return buffer; - } - - StackWalkerParams wp = { &output_iterator, 0 }; - walkcontext(&uc, &CrashLogUnix::SunOSStackWalker, &wp); #else fmt::format_to(output_iterator, " Not supported.\n"); #endif diff --git a/src/stdafx.h b/src/stdafx.h index d727aa2891..6e19bb6393 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -42,14 +42,8 @@ * does not have stdint.h. * For OSX the inclusion is already done in osx_stdafx.h. */ #if !defined(__APPLE__) && (!defined(_MSC_VER) || _MSC_VER >= 1600) -# if defined(SUNOS) - /* SunOS/Solaris does not have stdint.h, but inttypes.h defines everything - * stdint.h defines and we need. */ -# include -# else -# define __STDC_LIMIT_MACROS -# include -# endif +# define __STDC_LIMIT_MACROS +# include #endif #include From 93f4f1e83a57906acd90050ab37ea99c40295987 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 19 Aug 2023 18:38:46 +0000 Subject: [PATCH 52/77] Update: Translations from eints german: 40 changes by Wuzzy2 --- src/lang/german.txt | 57 +++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/lang/german.txt b/src/lang/german.txt index 30e170a28e..66a95d2165 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :Weiß STR_COLOUR_RANDOM :Zufällig ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Dunkelblau +STR_COLOUR_SECONDARY_PALE_GREEN :Hellgrün +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rosa +STR_COLOUR_SECONDARY_YELLOW :Gelb +STR_COLOUR_SECONDARY_RED :Rot +STR_COLOUR_SECONDARY_LIGHT_BLUE :Hellblau +STR_COLOUR_SECONDARY_GREEN :Grün +STR_COLOUR_SECONDARY_DARK_GREEN :Dunkelgrün +STR_COLOUR_SECONDARY_BLUE :Blau +STR_COLOUR_SECONDARY_CREAM :Beige +STR_COLOUR_SECONDARY_MAUVE :Helllila +STR_COLOUR_SECONDARY_PURPLE :Lila +STR_COLOUR_SECONDARY_ORANGE :Orange +STR_COLOUR_SECONDARY_BROWN :Braun +STR_COLOUR_SECONDARY_GREY :Grau +STR_COLOUR_SECONDARY_WHITE :Weiß +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Wie primär # Units used in OpenTTD @@ -608,7 +625,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Betriebs STR_GRAPH_INCOME_CAPTION :{WHITE}Einkommen STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Beförderte Frachteinheiten STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Bewertung der Firmenleistung (Höchstwert: 1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Firmenwert +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Firmenwertdiagramm STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Frachtbeförderungspreise STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Tage unterwegs @@ -1238,6 +1255,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Links STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Mitte STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Rechts +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}Sekunde{P 0 "" n} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Kreditlimit bei Spielbeginn: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximaler Kredit für eine Firma (ohne Berücksichtigung der Inflation) @@ -1366,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Aufträge stand STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalerweise hält ein Fahrzeug an jeder Station, die es passiert. Wird diese Einstellung aktiviert, hält das Fahrzeug nur an den Stationen, die explizit in den Aufträgen angeführt sind. Bedenke, dass dieses nur das Standard-Verhalten für neue Aufträge beschreibt. Einzelne Aufträge können explizit auf jedes gewünschte Verhalten geändert werden STR_CONFIG_SETTING_STOP_LOCATION :Neue Aufträge: Zug hält standardmäßig {STRING} des Bahnsteigs -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Die Position, an der Züge standardmäßig am Bahnsteig anhalten. Bei „am Anfang“ hält der Zug an, sobald er mit allen Waggons in den Bahnhof eingefahren ist. Bei „in der Mitte“ hält er zentral in der Mitte des Bahnsteigs und bei „am Ende“ durchfährt der Zug den Bahnhof soweit wie möglich. Die hier gewählte Einstellung wird bei allen neu erstellten Aufträgen verwendet. Bei bestehenden Aufträgen kann der Haltepunkt jederzeit im Auftragsfenster verändert werden. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Die Position, an der Züge standardmäßig am Bahnsteig anhalten. Bei „am Anfang“ hält der Zug an, sobald er mit allen Waggons in den Bahnhof eingefahren ist. Bei „in der Mitte“ hält er zentral in der Mitte des Bahnsteigs und bei „am Ende“ durchfährt der Zug den Bahnhof soweit wie möglich. Diese Einstellung definiert nur den Standardwert für neue Aufträge. Bei einzelnen Aufträgen kann ihr Halteort gesetzt werden, in dem man auf den Auftragstext klickt ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :am Anfang STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :in der Mitte @@ -1409,8 +1427,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Keine STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Verringert STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Bus- und Lkw-Haltestellen auf städtischen Straßen erlauben: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Erlaubt die Errichtung von Bus- und Lkw-Haltestellen auf städtischen Straßen +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Bus- und Lkw-Haltestellen auf Straßen im Stadteigentum erlauben: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Erlaubt die Errichtung von Bus- und Lkw-Haltestellen auf Straßen im Stadteigentum STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Bus- und Lkw-Haltestellen auf Straßen von Mitbewerbern erlauben: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Erlaube die Errichtung von Bus- und Lkw-Haltestellen auf Straßen, die Mitbewerbern gehören STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Diese Einstellung kann nicht geändert werden, solange Fahrzeuge im Spiel sind @@ -1421,6 +1439,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Unterhaltskoste STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Firmenfarbe zu Spielbeginn: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Wähle die Firmenfarbe zu Spielbeginn +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Sekundärfirmenfarbe zu Spielbeginn: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Initiale Sekundärfarbe für das Unternehmen wählen, falls ein NewGRF verwendet wird, welches sie verwendet. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Flughäfen veralten nie: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Wird diese Option aktiviert, können Flughäfen, die einmal eingeführt wurden, das ganze Spiel über gebaut werden und veralten nie @@ -1623,6 +1643,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Aus STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fenster mit Rechtsklick schließen: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Schließt ein Fenster mittels Rechtsklick. Schaltet Tooltip mit Rechtsklick ab! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nein +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, außer angeheftete STR_CONFIG_SETTING_AUTOSAVE :Autosicherung: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Intervall zwischen automatischen Speicherungen wählen @@ -1877,8 +1900,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Erlaube Städte STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Städte dürfen Bahnübergänge bauen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Erlaube Städten, Bahnübergänge zu bauen -STR_CONFIG_SETTING_NOISE_LEVEL :Stadt kontrolliert Lärmbelastung durch Flughäfen: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Wird diese Option deaktiviert, erlaubt jede Stadt den Bau von maximal zwei Flughäfen (nicht pro Spieler, sondern insgesamt). Wenn aktiviert, ist der Bau von Flughäfen durch die Lärmbelastung begrenzt. Die maximal zumutbare Lärmbelastung hängt von der Stadtgröße, der Flughafengröße und dem Abstand des Flughafens von der Stadtmitte ab +STR_CONFIG_SETTING_NOISE_LEVEL :Flughafenplatzierung anhand des Lärmpegels begrenzen: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Erlaubt Städten, den Bau von Flughäfen aufgrund von Lärmbelastung zu blockieren. Dies basiert auf der Bevölkerungsgröße, der Flughafengröße und dem Abstand des Flughafens von der Stadt. Ist diese Einstellung deaktiviert, werden Städte nur zwei Flughäfen erlauben, es sei denn, die Toleranz der Stadtverwaltung ist auf „Hoch“ gesetzt. STR_CONFIG_SETTING_TOWN_FOUNDING :Städte im Spiel gründen: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Erlaube Spielern die Gründung neuer Städte während des Spiels @@ -1910,7 +1933,7 @@ STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :Abstand zwische STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} Pixel ###setting-zero-is-special STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :deaktiviert -STR_CONFIG_SETTING_SOFT_LIMIT :Maximale Fensteranzahl (nicht angepinnte): {STRING} +STR_CONFIG_SETTING_SOFT_LIMIT :Maximale Fensteranzahl (nicht angehefteter): {STRING} STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Anzahl nicht angehefteter, offener Fenster, bevor alte Fenster automatisch geschlossen werden, um Platz für neue Fenster zu schaffen STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special @@ -1952,9 +1975,9 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Keine STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Größe von Großstädten bei Spielbeginn: {STRING}× STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Durchschnittliche Größe von Großstädten relativ zu normalen Städten bei Spielbeginn -STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Verteilungsgraphen jede {STRING}{NBSP}Sekund{P 0:2 "" en} aktualisieren +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Verteilungsgraphen alle {STRING} aktualisieren STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Zeit zwischen anfolgenden Neuberechnungen der Warenverteilung. Jede Neuberechnung berechnet die Pläne für eine Komponente des Graphen. Das bedeutet, dass ein Wert X für diese Einstellung nicht bedeutet, dass der gesamte Graph alle X Sekunden aktualisiert wird. Nur ein Teil wird es. Je kürzer du die Zeit festlegst, desto mehr CPU-Zeit wird nötig sein, um ihn zu berechnen. Je länger du die Zeit festlegst, desto länger wird es dauern, bis die Frachtverteilung auf neuen Strecken beginnt. -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :{STRING}{NBSP}Sekund{P 0:2 "" en} für Neuberechnung des Verteilungsgraphen nehmen +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :{STRING} für Neuberechnung des Verteilungsgraphen nehmen STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Zeit für jede Neuberechnung einer Warenverteilungskomponente. Wenn eine Neuberechnung gestartet wird, wird ein Thread gestartet, der für diese Anzahl von Sekunden laufen darf. Je kürzer du ihn festlegst, desto wahrscheinlicher ist es, dass der Thread nicht beendet ist, wenn er aber sein sollte. Dann wird das Spiel beendet, sobald dies der Fall ist („Lag“). Je länger du es festlegst, desto länger dauert es, bis die Verteilung aktualisiert wird, wenn sich Routen ändern. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Verteilungsschema für Passagiere: {STRING} @@ -2927,7 +2950,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}3×3-Mus STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Zufall # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Neue Industrie finanzieren +STR_FUND_INDUSTRY_CAPTION :{WHITE}Industriefinanzierung STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Gewünschte Industrie aus der Liste auswählen STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Zufallsindustrien erzeugen STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Das Spielfeld mit zufällig platzierten Industrien füllen @@ -2943,8 +2966,8 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Alle Ind STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Sind Sie sich sicher, dass Sie alle Industrien entfernen wollen? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Produktionskette für {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Produktionskette für {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Produktionskette – {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Produktionskette – {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Zulieferer STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Abnehmer STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Häuser @@ -3545,8 +3568,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Die örtlichen Straßenreparaturen finanzieren.{}Der Straßenverkehr wird bis zu 6 Monate beeinträchtigt.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Eine Statue zu Ehren der eigenen Firma errichten.{}Bewirkt eine permanente Steigerung der Stationsbewertung in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Bau von neuen Gebäuden im Ort finanzieren.{}Bewirkt eine temporäre Steigerung des Ortswachstums in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Für ein Jahr die exklusiven Transportrechte in der Stadt kaufen.{}Die Stadtverwaltung erlaubt dann nur Passagier- und Frachttransporte der eigenen Firma.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Die Stadtverwaltung bestechen, um die eigene Bewertung zu verbessern. Dabei riskiert man allerdings eine harte Strafe, falls man ertappt wird.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Für ein Jahr die exklusiven Transportrechte in der Stadt kaufen.{}Die Stadtverwaltung erlaubt dann nur Passagier- und Frachttransporte der eigenen Firma. Ein erfolgreicher Bestechungsversuch eines Wettbewerbers wird diesen Vertrag widerrufen.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Die Stadtverwaltung bestechen, um die eigene Bewertung zu verbessern und die exklusiven Transportrechte eines Wettbewerbers zu widerrufen. Dabei riskiert man allerdings eine harte Strafe, falls man ertappt wird.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Ziele @@ -4618,8 +4641,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Eine der STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}Debugfenster für KI oder Skripte ist nur auf dem Server verfügbar # AI configuration window -STR_AI_CONFIG_CAPTION_AI :{WHITE}KI Konfiguration -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spielskriptkonfiguration +STR_AI_CONFIG_CAPTION_AI :{WHITE}KI-Einstellungen +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spielskripteinstellungen STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Das Skript, das im nächsten Spiel geladen wird STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Die KIs, die im nächsten Spiel geladen werden STR_AI_CONFIG_HUMAN_PLAYER :Menschlicher Spieler @@ -4869,7 +4892,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Zu viele STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Zu dicht an einem anderen Hafen STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Zu dicht an einem anderen Flughafen STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Station kann nicht umbenannt werden ... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... diese Straße ist in kommunaler Trägerschaft +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... Staße im Stadteigentum STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Straße verläuft in die falsche Richtung STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Bus- und Lkw-Haltestellen können nicht um die Kurve gehen STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... Bus- und Lkw-Haltestellen können keine Abzweigung haben From 8c9ecde964e907156e3bbed2c73a3735d47520a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Sun, 20 Aug 2023 16:33:02 +0200 Subject: [PATCH 53/77] Change: Remove autosave from settings window (#11218) It is broken since 4f4810d and it's also in game options. --- src/lang/english.txt | 3 --- src/table/settings/gui_settings.ini | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 777168e2ac..aff4cbceec 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :No STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Yes STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Yes, except sticky -STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING2} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Use the {STRING2} date format for savegame names STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format of the date in save game filenames ###length 3 diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 8cf0ebfb3c..62ad58d1dc 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -55,9 +55,6 @@ flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC def = 10 min = 0 max = 1440 -str = STR_CONFIG_SETTING_AUTOSAVE -strhelp = STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT -cat = SC_BASIC [SDTC_BOOL] var = gui.threaded_saves From a5aebeb1b59c7687c6b853a4f496b26e55a65831 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 20 Aug 2023 16:59:22 +0200 Subject: [PATCH 54/77] Remove: [Win32] register values in crash.log (#11212) --- src/crashlog.cpp | 6 -- src/crashlog.h | 7 -- src/os/windows/crashlog_win.cpp | 109 -------------------------------- 3 files changed, 122 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index f8f4677ce0..72d7c23d12 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -99,11 +99,6 @@ void CrashLog::LogCompiler(std::back_insert_iterator &output_iterat #endif } -/* virtual */ void CrashLog::LogRegisters(std::back_insert_iterator &output_iterator) const -{ - /* Stub implementation; not all OSes support this. */ -} - /* virtual */ void CrashLog::LogModules(std::back_insert_iterator &output_iterator) const { /* Stub implementation; not all OSes support this. */ @@ -343,7 +338,6 @@ void CrashLog::FillCrashLog(std::back_insert_iterator &output_itera this->LogError(output_iterator, CrashLog::message); this->LogOpenTTDVersion(output_iterator); - this->LogRegisters(output_iterator); this->LogStacktrace(output_iterator); this->LogOSVersion(output_iterator); this->LogCompiler(output_iterator); diff --git a/src/crashlog.h b/src/crashlog.h index 0f28c0d807..8a1a925b21 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -44,13 +44,6 @@ protected: */ virtual void LogStacktrace(std::back_insert_iterator &output_iterator) const = 0; - /** - * Writes information about the data in the registers, if there is - * information about it available. - * @param output_iterator Iterator to write the output to. - */ - virtual void LogRegisters(std::back_insert_iterator &output_iterator) const; - /** * Writes the dynamically linked libraries/modules to the buffer, if there * is information about it available. diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index cc08d692af..219539f52b 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -35,7 +35,6 @@ class CrashLogWindows : public CrashLog { void LogOSVersion(std::back_insert_iterator &output_iterator) const override; void LogError(std::back_insert_iterator &output_iterator, const std::string_view message) const override; void LogStacktrace(std::back_insert_iterator &output_iterator) const override; - void LogRegisters(std::back_insert_iterator &output_iterator) const override; void LogModules(std::back_insert_iterator &output_iterator) const override; public: #if defined(_MSC_VER) @@ -196,114 +195,6 @@ static void PrintModuleInfo(std::back_insert_iterator &output_itera fmt::format_to(output_iterator, "\n"); } -/* virtual */ void CrashLogWindows::LogRegisters(std::back_insert_iterator &output_iterator) const -{ - fmt::format_to(output_iterator, "Registers:\n"); -#ifdef _M_AMD64 - fmt::format_to(output_iterator, - " RAX: {:016X} RBX: {:016X} RCX: {:016X} RDX: {:016X}\n" - " RSI: {:016X} RDI: {:016X} RBP: {:016X} RSP: {:016X}\n" - " R8: {:016X} R9: {:016X} R10: {:016X} R11: {:016X}\n" - " R12: {:016X} R13: {:016X} R14: {:016X} R15: {:016X}\n" - " RIP: {:016X} EFLAGS: {:08X}\n", - ep->ContextRecord->Rax, - ep->ContextRecord->Rbx, - ep->ContextRecord->Rcx, - ep->ContextRecord->Rdx, - ep->ContextRecord->Rsi, - ep->ContextRecord->Rdi, - ep->ContextRecord->Rbp, - ep->ContextRecord->Rsp, - ep->ContextRecord->R8, - ep->ContextRecord->R9, - ep->ContextRecord->R10, - ep->ContextRecord->R11, - ep->ContextRecord->R12, - ep->ContextRecord->R13, - ep->ContextRecord->R14, - ep->ContextRecord->R15, - ep->ContextRecord->Rip, - ep->ContextRecord->EFlags - ); -#elif defined(_M_IX86) - fmt::format_to(output_iterator, - " EAX: {:08X} EBX: {:08X} ECX: {:08X} EDX: {:08X}\n" - " ESI: {:08X} EDI: {:08X} EBP: {:08X} ESP: {:08X}\n" - " EIP: {:08X} EFLAGS: {:08X}\n", - (int)ep->ContextRecord->Eax, - (int)ep->ContextRecord->Ebx, - (int)ep->ContextRecord->Ecx, - (int)ep->ContextRecord->Edx, - (int)ep->ContextRecord->Esi, - (int)ep->ContextRecord->Edi, - (int)ep->ContextRecord->Ebp, - (int)ep->ContextRecord->Esp, - (int)ep->ContextRecord->Eip, - (int)ep->ContextRecord->EFlags - ); -#elif defined(_M_ARM64) - fmt::format_to(output_iterator, - " X0: {:016X} X1: {:016X} X2: {:016X} X3: {:016X}\n" - " X4: {:016X} X5: {:016X} X6: {:016X} X7: {:016X}\n" - " X8: {:016X} X9: {:016X} X10: {:016X} X11: {:016X}\n" - " X12: {:016X} X13: {:016X} X14: {:016X} X15: {:016X}\n" - " X16: {:016X} X17: {:016X} X18: {:016X} X19: {:016X}\n" - " X20: {:016X} X21: {:016X} X22: {:016X} X23: {:016X}\n" - " X24: {:016X} X25: {:016X} X26: {:016X} X27: {:016X}\n" - " X28: {:016X} Fp: {:016X} Lr: {:016X}\n", - ep->ContextRecord->X0, - ep->ContextRecord->X1, - ep->ContextRecord->X2, - ep->ContextRecord->X3, - ep->ContextRecord->X4, - ep->ContextRecord->X5, - ep->ContextRecord->X6, - ep->ContextRecord->X7, - ep->ContextRecord->X8, - ep->ContextRecord->X9, - ep->ContextRecord->X10, - ep->ContextRecord->X11, - ep->ContextRecord->X12, - ep->ContextRecord->X13, - ep->ContextRecord->X14, - ep->ContextRecord->X15, - ep->ContextRecord->X16, - ep->ContextRecord->X17, - ep->ContextRecord->X18, - ep->ContextRecord->X19, - ep->ContextRecord->X20, - ep->ContextRecord->X21, - ep->ContextRecord->X22, - ep->ContextRecord->X23, - ep->ContextRecord->X24, - ep->ContextRecord->X25, - ep->ContextRecord->X26, - ep->ContextRecord->X27, - ep->ContextRecord->X28, - ep->ContextRecord->Fp, - ep->ContextRecord->Lr - ); -#endif - - fmt::format_to(output_iterator, "\n Bytes at instruction pointer:\n"); -#ifdef _M_AMD64 - byte *b = (byte*)ep->ContextRecord->Rip; -#elif defined(_M_IX86) - byte *b = (byte*)ep->ContextRecord->Eip; -#elif defined(_M_ARM64) - byte *b = (byte*)ep->ContextRecord->Pc; -#endif - for (int i = 0; i != 24; i++) { - if (IsBadReadPtr(b, 1)) { - fmt::format_to(output_iterator, " ??"); // OCR: WAS: , 0); - } else { - fmt::format_to(output_iterator, " {:02X}", *b); - } - b++; - } - fmt::format_to(output_iterator, "\n\n"); -} - /* virtual */ void CrashLogWindows::LogStacktrace(std::back_insert_iterator &output_iterator) const { fmt::format_to(output_iterator, "Stack trace:\n"); From 8f6df242c4d66fb4a35d017ec19e858a810e7aae Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 20 Aug 2023 17:08:16 +0200 Subject: [PATCH 55/77] Remove: [Win32] (pointer-only) stack trace in crash.log (#11211) It only contains pointers, which nobody can decipher anyway. So instead, just report "Not supported", like other targets do when they can't print a sane stack trace. --- src/os/windows/crashlog_win.cpp | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 219539f52b..a9fc02209c 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -198,25 +198,7 @@ static void PrintModuleInfo(std::back_insert_iterator &output_itera /* virtual */ void CrashLogWindows::LogStacktrace(std::back_insert_iterator &output_iterator) const { fmt::format_to(output_iterator, "Stack trace:\n"); -#ifdef _M_AMD64 - uint32_t *b = (uint32_t*)ep->ContextRecord->Rsp; -#elif defined(_M_IX86) - uint32_t *b = (uint32_t*)ep->ContextRecord->Esp; -#elif defined(_M_ARM64) - uint32_t *b = (uint32_t*)ep->ContextRecord->Sp; -#endif - for (int j = 0; j != 24; j++) { - for (int i = 0; i != 8; i++) { - if (IsBadReadPtr(b, sizeof(uint32_t))) { - fmt::format_to(output_iterator, " ????????"); // OCR: WAS - , 0); - } else { - fmt::format_to(output_iterator, " {:08X}", *b); - } - b++; - } - fmt::format_to(output_iterator, "\n"); - } - fmt::format_to(output_iterator, "\n"); + fmt::format_to(output_iterator, " Not supported.\n"); } #if defined(_MSC_VER) From f120d2beb8cbbc34ac4d1e7312a656182cf3f006 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 20 Aug 2023 17:16:08 +0200 Subject: [PATCH 56/77] Add: use breakpad to create crash.dmp on MacOS / Linux too (#11202) Normally only the Windows platform could create a crash.dmp, making analysing crash-reports from MacOS / Linux rather tricky. --- .github/workflows/ci-build.yml | 8 ++- .github/workflows/release-linux.yml | 1 + .github/workflows/release-macos.yml | 2 + .github/workflows/release-windows.yml | 1 + CMakeLists.txt | 9 ++++ COMPILING.md | 6 ++- cmake/FindLZO.cmake | 2 +- cmake/LinkPackage.cmake | 3 ++ src/crashlog.cpp | 11 ++++- src/crashlog.h | 6 --- src/os/macosx/crashlog_osx.cpp | 25 +++++++++- src/os/unix/crashlog_unix.cpp | 22 +++++++++ src/os/windows/crashlog_win.cpp | 70 ++++++++++----------------- 13 files changed, 107 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 4f84a69ef3..f7cd10c17e 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -121,6 +121,10 @@ jobs: ${{ matrix.libraries }} \ zlib1g-dev \ # EOF + + sudo vcpkg install \ + breakpad \ + # EOF echo "::endgroup::" env: DEBIAN_FRONTEND: noninteractive @@ -149,7 +153,7 @@ jobs: cd build echo "::group::CMake" - cmake .. ${{ matrix.extra-cmake-parameters }} + cmake .. -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake ${{ matrix.extra-cmake-parameters }} echo "::endgroup::" echo "::group::Build" @@ -205,6 +209,7 @@ jobs: - name: Prepare vcpkg run: | vcpkg install --triplet=${{ matrix.arch }}-osx \ + breakpad \ curl \ liblzma \ libpng \ @@ -290,6 +295,7 @@ jobs: shell: bash run: | vcpkg install --triplet=${{ matrix.arch }}-windows-static \ + breakpad \ liblzma \ libpng \ lzo \ diff --git a/.github/workflows/release-linux.yml b/.github/workflows/release-linux.yml index acfe45c2cf..247cd0b0c3 100644 --- a/.github/workflows/release-linux.yml +++ b/.github/workflows/release-linux.yml @@ -108,6 +108,7 @@ jobs: ln -sf $(pwd)/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3 ./vcpkg install \ + breakpad \ curl[http2] \ fontconfig \ freetype \ diff --git a/.github/workflows/release-macos.yml b/.github/workflows/release-macos.yml index ec82f8653e..7741064bf7 100644 --- a/.github/workflows/release-macos.yml +++ b/.github/workflows/release-macos.yml @@ -53,6 +53,8 @@ jobs: - name: Prepare vcpkg run: | vcpkg install \ + breakpad:x64-osx \ + breakpad:arm64-osx \ curl:x64-osx \ curl:arm64-osx \ liblzma:x64-osx \ diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index c55a4f8d4a..612abc4f72 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -65,6 +65,7 @@ jobs: shell: bash run: | vcpkg install --triplet=${{ matrix.arch }}-windows-static \ + breakpad \ liblzma \ libpng \ lzo \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fc0fe1d16..e699c4d56d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,6 +134,11 @@ else() find_package(CURL) endif() +# Breakpad doesn't support emscripten. +if(NOT EMSCRIPTEN) + find_package(unofficial-breakpad) +endif() + if(NOT OPTION_DEDICATED) if(NOT WIN32) find_package(Allegro) @@ -310,6 +315,10 @@ if(NOT WIN32 AND NOT EMSCRIPTEN) link_package(CURL ENCOURAGED) endif() +if(NOT EMSCRIPTEN) + link_package(unofficial-breakpad TARGET unofficial::breakpad::libbreakpad_client ENCOURAGED) +endif() + if(NOT OPTION_DEDICATED) link_package(Fluidsynth) link_package(SDL) diff --git a/COMPILING.md b/COMPILING.md index be1bad79ab..ef9589366d 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -5,6 +5,7 @@ OpenTTD makes use of the following external libraries: - (encouraged) nlohmann-json: JSON handling +- (encouraged) breakpad: creates minidumps on crash - (encouraged) zlib: (de)compressing of old (0.3.0-1.0.5) savegames, content downloads, heightmaps - (encouraged) liblzma: (de)compressing of savegames (1.1.0 and later) @@ -50,6 +51,7 @@ by following the `Quick Start` instructions of their After this, you can install the dependencies OpenTTD needs. We advise to use the `static` versions, and OpenTTD currently needs the following dependencies: +- breakpad - liblzma - libpng - lzo @@ -59,8 +61,8 @@ the `static` versions, and OpenTTD currently needs the following dependencies: To install both the x64 (64bit) and x86 (32bit) variants (though only one is necessary), you can use: ```ps -.\vcpkg install liblzma:x64-windows-static libpng:x64-windows-static lzo:x64-windows-static nlohmann-json:x64-windows-static zlib:x64-windows-static -.\vcpkg install liblzma:x86-windows-static libpng:x86-windows-static lzo:x86-windows-static nlohmann-json:x86-windows-static zlib:x86-windows-static +.\vcpkg install breakpad:x64-windows-static liblzma:x64-windows-static libpng:x64-windows-static lzo:x64-windows-static nlohmann-json:x64-windows-static zlib:x64-windows-static +.\vcpkg install breakpad:x86-windows-static liblzma:x86-windows-static libpng:x86-windows-static lzo:x86-windows-static nlohmann-json:x86-windows-static zlib:x86-windows-static ``` You can open the folder (as a CMake project). CMake will be detected, and you can compile from there. diff --git a/cmake/FindLZO.cmake b/cmake/FindLZO.cmake index dacd9387d9..20ea4c1b57 100644 --- a/cmake/FindLZO.cmake +++ b/cmake/FindLZO.cmake @@ -55,7 +55,7 @@ find_library(LZO_LIBRARY # name as the optimized file. This is not always the case, but so far # experiences has shown that in those case vcpkg CMake files do the right # thing. -if(VCPKG_TOOLCHAIN AND LZO_LIBRARY) +if(VCPKG_TOOLCHAIN AND LZO_LIBRARY AND LZO_LIBRARY MATCHES "${VCPKG_INSTALLED_DIR}") if(LZO_LIBRARY MATCHES "/debug/") set(LZO_LIBRARY_DEBUG ${LZO_LIBRARY}) string(REPLACE "/debug/lib/" "/lib/" LZO_LIBRARY_RELEASE ${LZO_LIBRARY}) diff --git a/cmake/LinkPackage.cmake b/cmake/LinkPackage.cmake index afbd921cf7..9fb2cf5910 100644 --- a/cmake/LinkPackage.cmake +++ b/cmake/LinkPackage.cmake @@ -3,6 +3,9 @@ function(link_package NAME) if(${NAME}_FOUND) string(TOUPPER "${NAME}" UCNAME) + # Some libraries have a dash, which is not allowed in a preprocessor macro. + string(REPLACE "-" "_" UCNAME "${UCNAME}") + add_definitions(-DWITH_${UCNAME}) # Some libraries' cmake packages (looking at you, SDL2) leave trailing whitespace in the link commands, # which (later) cmake considers to be an error. Work around this with by stripping the incoming string. diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 72d7c23d12..1692f32c64 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -369,9 +369,14 @@ bool CrashLog::WriteCrashLog() return len == written; } +/** + * Write the (crash) dump to a file. + * + * @note Sets \c crashdump_filename when there is a successful return. + * @return 1 iff the crashdump was successfully created, -1 if it failed, 0 if not implemented. + */ /* virtual */ int CrashLog::WriteCrashDump() { - /* Stub implementation; not all OSes support this. */ return 0; } @@ -452,13 +457,15 @@ bool CrashLog::MakeCrashLog() ret = false; } - /* Don't mention writing crash dumps because not all platforms support it. */ + fmt::print("Writing crash dump to disk...\n"); int dret = this->WriteCrashDump(); if (dret < 0) { fmt::print("Writing crash dump failed.\n\n"); ret = false; } else if (dret > 0) { fmt::print("Crash dump written to {}. Please add this file to any bug reports.\n\n", this->crashdump_filename); + } else { + fmt::print("Skipped; missing dependency to create crash dump.\n"); } fmt::print("Writing crash savegame...\n"); diff --git a/src/crashlog.h b/src/crashlog.h index 8a1a925b21..c310689d72 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -73,12 +73,6 @@ public: void FillCrashLog(std::back_insert_iterator &output_iterator) const; bool WriteCrashLog(); - /** - * Write the (crash) dump to a file. - * @note Sets \c crashdump_filename when there is a successful return. - * @return if less than 0, error. If 0 no dump is made, otherwise the dump - * was successful (not all OSes support dumping files). - */ virtual int WriteCrashDump(); bool WriteSavegame(); bool WriteScreenshot(); diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index 8c9c0ebcaf..72ebff316c 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -9,6 +9,7 @@ #include "../../stdafx.h" #include "../../crashlog.h" +#include "../../fileio_func.h" #include "../../string_func.h" #include "../../gamelog.h" #include "../../saveload/saveload.h" @@ -20,6 +21,10 @@ #include #include +#ifdef WITH_UNOFFICIAL_BREAKPAD +# include +#endif + #include "../../safeguards.h" @@ -139,6 +144,22 @@ class CrashLogOSX : public CrashLog { fmt::format_to(output_iterator, "\n"); } +#ifdef WITH_UNOFFICIAL_BREAKPAD + static bool MinidumpCallback(const char* dump_dir, const char* minidump_id, void* context, bool succeeded) + { + CrashLogOSX *crashlog = reinterpret_cast(context); + + crashlog->crashdump_filename = crashlog->CreateFileName(".dmp"); + std::rename(fmt::format("{}/{}.dmp", dump_dir, minidump_id).c_str(), crashlog->crashdump_filename.c_str()); + return succeeded; + } + + int WriteCrashDump() override + { + return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this) ? 1 : -1; + } +#endif + public: /** * A crash log is always generated by signal. @@ -155,8 +176,8 @@ public: std::string message = fmt::format( "Please send the generated crash information and the last (auto)save to the developers. " "This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues.\n\n" - "Generated file(s):\n{}\n{}\n{}", - this->crashlog_filename, this->savegame_filename, this->screenshot_filename); + "Generated file(s):\n{}\n{}\n{}\n{}", + this->crashlog_filename, this->crashdump_filename, this->savegame_filename, this->screenshot_filename); ShowMacDialog(crash_title, message.c_str(), "Quit"); } diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index 691a9a841b..5f8de4cec4 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -9,6 +9,7 @@ #include "../../stdafx.h" #include "../../crashlog.h" +#include "../../fileio_func.h" #include "../../string_func.h" #include "../../gamelog.h" #include "../../saveload/saveload.h" @@ -25,6 +26,10 @@ #include #endif +#ifdef WITH_UNOFFICIAL_BREAKPAD +# include +#endif + #include "../../safeguards.h" /** @@ -84,6 +89,23 @@ class CrashLogUnix : public CrashLog { #endif fmt::format_to(output_iterator, "\n"); } + +#ifdef WITH_UNOFFICIAL_BREAKPAD + static bool MinidumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) + { + CrashLogUnix *crashlog = reinterpret_cast(context); + + crashlog->crashdump_filename = crashlog->CreateFileName(".dmp"); + std::rename(descriptor.path(), crashlog->crashdump_filename.c_str()); + return succeeded; + } + + int WriteCrashDump() override + { + return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this) ? 1 : -1; + } +#endif + public: /** * A crash log is always generated by signal. diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index a9fc02209c..786c7cb9b4 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -23,6 +23,14 @@ #include #include +#if defined(_MSC_VER) +# include +#endif + +#ifdef WITH_UNOFFICIAL_BREAKPAD +# include +#endif + #include "../../safeguards.h" /** @@ -37,8 +45,24 @@ class CrashLogWindows : public CrashLog { void LogStacktrace(std::back_insert_iterator &output_iterator) const override; void LogModules(std::back_insert_iterator &output_iterator) const override; public: + +#ifdef WITH_UNOFFICIAL_BREAKPAD + static bool MinidumpCallback(const wchar_t *dump_dir, const wchar_t *minidump_id, void *context, EXCEPTION_POINTERS *exinfo, MDRawAssertionInfo *assertion, bool succeeded) + { + CrashLogWindows *crashlog = reinterpret_cast(context); + + crashlog->crashdump_filename = crashlog->CreateFileName(".dmp"); + std::rename(fmt::format("{}/{}.dmp", FS2OTTD(dump_dir), FS2OTTD(minidump_id)).c_str(), crashlog->crashdump_filename.c_str()); + return succeeded; + } + + int WriteCrashDump() override + { + return google_breakpad::ExceptionHandler::WriteMinidump(OTTD2FS(_personal_dir), MinidumpCallback, this) ? 1 : -1; + } +#endif + #if defined(_MSC_VER) - int WriteCrashDump() override; void AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const; #else void AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const {} @@ -205,10 +229,6 @@ static void PrintModuleInfo(std::back_insert_iterator &output_itera static const uint MAX_SYMBOL_LEN = 512; static const uint MAX_FRAMES = 64; -#pragma warning(disable:4091) -#include -#pragma warning(default:4091) - void CrashLogWindows::AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const { DllLoader dbghelp(L"dbghelp.dll"); @@ -321,46 +341,6 @@ void CrashLogWindows::AppendDecodedStacktrace(std::back_insert_iteratorcrashdump_filename = this->CreateFileName(".dmp"); - HANDLE file = CreateFile(OTTD2FS(this->crashdump_filename).c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, 0); - HANDLE proc = GetCurrentProcess(); - DWORD procid = GetCurrentProcessId(); - MINIDUMP_EXCEPTION_INFORMATION mdei; - MINIDUMP_USER_STREAM userstream; - MINIDUMP_USER_STREAM_INFORMATION musi; - - userstream.Type = LastReservedStream + 1; - userstream.Buffer = (void*)this->crashlog.data(); - userstream.BufferSize = (ULONG)this->crashlog.size() + 1; - - musi.UserStreamCount = 1; - musi.UserStreamArray = &userstream; - - mdei.ThreadId = GetCurrentThreadId(); - mdei.ExceptionPointers = ep; - mdei.ClientPointers = false; - - funcMiniDumpWriteDump(proc, procid, file, MiniDumpWithDataSegs, &mdei, &musi, nullptr); - ret = 1; - } else { - ret = -1; - } - } - return ret; -} #endif /* _MSC_VER */ extern bool CloseConsoleLogIfActive(); From 352ac264a53e6ec983cc2c4118a00aef2492d014 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 20 Aug 2023 19:09:21 +0200 Subject: [PATCH 57/77] Remove: [Win32] module-list from crash.log (#11219) Only Windows implemented this, and it opens the files to read them to get a CRC. Doing this in a crash-handler is strange at best. Lastly, nobody has actually ever used this information to come to some sort of conclusion. The module-list is used in combination with the crash.dmp, but this information is already embedded in there. --- src/crashlog.cpp | 6 -- src/crashlog.h | 8 --- src/os/windows/crashlog_win.cpp | 108 -------------------------------- 3 files changed, 122 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 1692f32c64..38ba39568b 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -99,11 +99,6 @@ void CrashLog::LogCompiler(std::back_insert_iterator &output_iterat #endif } -/* virtual */ void CrashLog::LogModules(std::back_insert_iterator &output_iterator) const -{ - /* Stub implementation; not all OSes support this. */ -} - /** * Writes OpenTTD's version to the buffer. * @param output_iterator Iterator to write the output to. @@ -343,7 +338,6 @@ void CrashLog::FillCrashLog(std::back_insert_iterator &output_itera this->LogCompiler(output_iterator); this->LogConfiguration(output_iterator); this->LogLibraries(output_iterator); - this->LogModules(output_iterator); this->LogGamelog(output_iterator); this->LogRecentNews(output_iterator); diff --git a/src/crashlog.h b/src/crashlog.h index c310689d72..7f486c2bac 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -44,14 +44,6 @@ protected: */ virtual void LogStacktrace(std::back_insert_iterator &output_iterator) const = 0; - /** - * Writes the dynamically linked libraries/modules to the buffer, if there - * is information about it available. - * @param output_iterator Iterator to write the output to. - */ - virtual void LogModules(std::back_insert_iterator &output_iterator) const; - - void LogOpenTTDVersion(std::back_insert_iterator &output_iterator) const; void LogConfiguration(std::back_insert_iterator &output_iterator) const; void LogLibraries(std::back_insert_iterator &output_iterator) const; diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 786c7cb9b4..5b4005ee51 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -43,7 +43,6 @@ class CrashLogWindows : public CrashLog { void LogOSVersion(std::back_insert_iterator &output_iterator) const override; void LogError(std::back_insert_iterator &output_iterator, const std::string_view message) const override; void LogStacktrace(std::back_insert_iterator &output_iterator) const override; - void LogModules(std::back_insert_iterator &output_iterator) const override; public: #ifdef WITH_UNOFFICIAL_BREAKPAD @@ -112,113 +111,6 @@ public: ); } -struct DebugFileInfo { - uint32_t size; - uint32_t crc32; - SYSTEMTIME file_time; -}; - -static uint32_t _crc_table[256]; - -static void MakeCRCTable() -{ - uint32_t crc, poly = 0xEDB88320L; - int i; - int j; - - for (i = 0; i != 256; i++) { - crc = i; - for (j = 8; j != 0; j--) { - crc = (crc & 1 ? (crc >> 1) ^ poly : crc >> 1); - } - _crc_table[i] = crc; - } -} - -static uint32_t CalcCRC(byte *data, uint size, uint32_t crc) -{ - for (; size > 0; size--) { - crc = ((crc >> 8) & 0x00FFFFFF) ^ _crc_table[(crc ^ *data++) & 0xFF]; - } - return crc; -} - -static void GetFileInfo(DebugFileInfo *dfi, const wchar_t *filename) -{ - HANDLE file; - memset(dfi, 0, sizeof(*dfi)); - - file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, 0); - if (file != INVALID_HANDLE_VALUE) { - byte buffer[1024]; - DWORD numread; - uint32_t filesize = 0; - FILETIME write_time; - uint32_t crc = (uint32_t)-1; - - for (;;) { - if (ReadFile(file, buffer, sizeof(buffer), &numread, nullptr) == 0 || numread == 0) { - break; - } - filesize += numread; - crc = CalcCRC(buffer, numread, crc); - } - dfi->size = filesize; - dfi->crc32 = crc ^ (uint32_t)-1; - - if (GetFileTime(file, nullptr, nullptr, &write_time)) { - FileTimeToSystemTime(&write_time, &dfi->file_time); - } - CloseHandle(file); - } -} - - -static void PrintModuleInfo(std::back_insert_iterator &output_iterator, HMODULE mod) -{ - wchar_t buffer[MAX_PATH]; - DebugFileInfo dfi; - - GetModuleFileName(mod, buffer, MAX_PATH); - GetFileInfo(&dfi, buffer); - fmt::format_to(output_iterator, " {:20s} handle: {:X} size: {} crc: {:8X} date: {}-{:02}-{:02} {:02}:{:02}:{:02}\n", - FS2OTTD(buffer), - (size_t)mod, - dfi.size, - dfi.crc32, - dfi.file_time.wYear, - dfi.file_time.wMonth, - dfi.file_time.wDay, - dfi.file_time.wHour, - dfi.file_time.wMinute, - dfi.file_time.wSecond - ); -} - -/* virtual */ void CrashLogWindows::LogModules(std::back_insert_iterator &output_iterator) const -{ - MakeCRCTable(); - - fmt::format_to(output_iterator, "Module information:\n"); - - HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); - if (proc != nullptr) { - HMODULE modules[100]; - DWORD needed; - BOOL res = EnumProcessModules(proc, modules, sizeof(modules), &needed); - CloseHandle(proc); - if (res) { - size_t count = std::min(needed / sizeof(HMODULE), lengthof(modules)); - - for (size_t i = 0; i != count; i++) PrintModuleInfo(output_iterator, modules[i]); - fmt::format_to(output_iterator, "\n"); - return; - } - } - PrintModuleInfo(output_iterator, nullptr); - fmt::format_to(output_iterator, "\n"); -} - /* virtual */ void CrashLogWindows::LogStacktrace(std::back_insert_iterator &output_iterator) const { fmt::format_to(output_iterator, "Stack trace:\n"); From bc2dfc4691ccb71343780d5e92a1c42115fe0e7f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 20 Aug 2023 18:39:09 +0000 Subject: [PATCH 58/77] Update: Translations from eints turkish: 2 changes by BeratSJ --- src/lang/afrikaans.txt | 3 --- src/lang/arabic_egypt.txt | 3 --- src/lang/basque.txt | 3 --- src/lang/belarusian.txt | 3 --- src/lang/brazilian_portuguese.txt | 3 --- src/lang/bulgarian.txt | 3 --- src/lang/catalan.txt | 3 --- src/lang/chuvash.txt | 1 - src/lang/croatian.txt | 3 --- src/lang/czech.txt | 3 --- src/lang/danish.txt | 3 --- src/lang/dutch.txt | 3 --- src/lang/english_AU.txt | 3 --- src/lang/english_US.txt | 3 --- src/lang/esperanto.txt | 3 --- src/lang/estonian.txt | 3 --- src/lang/faroese.txt | 1 - src/lang/finnish.txt | 3 --- src/lang/french.txt | 3 --- src/lang/frisian.txt | 3 --- src/lang/gaelic.txt | 3 --- src/lang/galician.txt | 3 --- src/lang/german.txt | 3 --- src/lang/greek.txt | 3 --- src/lang/hebrew.txt | 3 --- src/lang/hindi.txt | 1 - src/lang/hungarian.txt | 3 --- src/lang/icelandic.txt | 1 - src/lang/ido.txt | 1 - src/lang/indonesian.txt | 3 --- src/lang/irish.txt | 3 --- src/lang/italian.txt | 3 --- src/lang/japanese.txt | 3 --- src/lang/korean.txt | 3 --- src/lang/latin.txt | 3 --- src/lang/latvian.txt | 3 --- src/lang/lithuanian.txt | 3 --- src/lang/luxembourgish.txt | 3 --- src/lang/macedonian.txt | 1 - src/lang/malay.txt | 3 --- src/lang/maltese.txt | 1 - src/lang/marathi.txt | 1 - src/lang/norwegian_bokmal.txt | 3 --- src/lang/norwegian_nynorsk.txt | 3 --- src/lang/persian.txt | 3 --- src/lang/polish.txt | 3 --- src/lang/portuguese.txt | 3 --- src/lang/romanian.txt | 3 --- src/lang/russian.txt | 3 --- src/lang/serbian.txt | 3 --- src/lang/simplified_chinese.txt | 3 --- src/lang/slovak.txt | 3 --- src/lang/slovenian.txt | 3 --- src/lang/spanish.txt | 3 --- src/lang/spanish_MX.txt | 3 --- src/lang/swedish.txt | 3 --- src/lang/tamil.txt | 3 --- src/lang/thai.txt | 1 - src/lang/traditional_chinese.txt | 3 --- src/lang/turkish.txt | 7 ++----- src/lang/ukrainian.txt | 3 --- src/lang/urdu.txt | 3 --- src/lang/vietnamese.txt | 3 --- src/lang/welsh.txt | 3 --- 64 files changed, 2 insertions(+), 176 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 6735d782b2..59714d273f 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1499,9 +1499,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Af STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Maak venster toe met regter-klik: {STRING} ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Outostoor: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Tyd tussen outomatiese spelstore - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gebruik die {STRING} datum formaat vir gestoorde spel name. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formaat van datum van spaar-speletjie naam ###length 3 diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index a97cb4d428..c7c5f93114 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -1408,9 +1408,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :عدم استخ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :تغلق النافذة عن طريق الطغط على الزر الأيمن في الماوس داخل النافذة. يعطل الملحوظة عند الطغط على الزر الأيمن في الماوس! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :حفظ تلقائي : {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :اختر الوقت بين كل عملية حفظ اتوماتيكية - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :استخدم {STRING} نمط التاريخ لاسم اللعبة المحفوظة ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :طويل - 31 ديسمبر 2008 diff --git a/src/lang/basque.txt b/src/lang/basque.txt index abd61da36c..cdefc5239e 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1442,9 +1442,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Itzalita ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Auto-gordea: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Partida gordetze automatikoaren bitartea aukeratu - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gordetako jokoen izenetan {STRING} data fomatua erabili STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Gordetako fitxeroen dataren formatoa ###length 3 diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index e3eca9696a..5f51182085 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1818,9 +1818,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Зачыняц STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Зачыняць акно пстрычкай правай кнопкай мышы ў яго межах. Пры гэтым адключаецца з'яўленне падказак па правай кнопцы. ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Аўтазахаваньні: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Азначце інтэрвал паміж аўтаматычнымі захаваньнямі - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Выкарыстоўваць {STRING} фармат даты для імёнаў захаваньняў STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Фармат даты ў назвах захаваных гульняў. ###length 3 diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index a40ee4dc3e..e5a882b0ea 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Não STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Sim STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Sim, exceto coladas -STR_CONFIG_SETTING_AUTOSAVE :Auto-salvar: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecione intervalo entre jogos salvos automaticamente - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Use o formato de data {STRING} para criar arquivos de salvamento STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato da data nos nomes dos jogos salvos ###length 3 diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index f134208b2b..940c155b43 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -1465,9 +1465,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Изключе ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Автоматично запазване: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Изберете интервал между автоматично запаметяване на играта - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Използвай {STRING} формат на датата за имена на записаните игри. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Формат на датата във файловете за запис на играта ###length 3 diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index f55b036593..9f0fbcdfcd 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1625,9 +1625,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Tanca la finest STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Tanca una finestra fent-hi un clic amb el botó dret del ratolí. Aquesta opció desactiva els indicadors de funció amb el mateix botó. ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Desada automàtica: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona l'interval entre desades automàtiques de les partides. - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Utilitza el format de data {STRING} per a guardar partides STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format de la data en els noms dels arxius de les partides que es guardin ###length 3 diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 7cc254cb9e..a6ab0e1511 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -720,7 +720,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Сӳнтер ###length 3 - ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :вӑрӑм (2008 раш 31меш) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :кӗске (2008-12-31) diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index ec2a18262a..c714c04e30 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1610,9 +1610,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zatvori prozor STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zatvara prozor nakon desnog klika unutar prozora. S desnim klikom zatvaraju se i upute alata! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automatsko snimanje: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Odaberite interval između automatskog snimanja igre - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Koristi {STRING} format datuma za ime snimljene pozicije STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format datuma u imenima datoteka sa snimljenom igrom ###length 3 diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 2dda0ff829..3fb91a4f80 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1692,9 +1692,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zavírat okno k STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zavírat okno kliknutím pravým tlačítkem na něj. Znemožňuje využívat nápovědu zobrazující se při stisknutí pravého tlačítka myši! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automaticky ukládat: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Zvol frekvenci automatického ukládání - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Pro jméno uložené hry použít {STRING} formát STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formát data v názvu uložené hry ###length 3 diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 37d7a8dfac..20094ad8a7 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nej STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, undtagen klistret -STR_CONFIG_SETTING_AUTOSAVE :Auto gem: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vælg interval mellem automatisk gemte spil - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Brug {STRING} datoformat til navne på gemte spil. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formatet af datoen i gemte spil filnavne ###length 3 diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index d783fb9078..f6485e3dcb 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nee STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, behalve gepind -STR_CONFIG_SETTING_AUTOSAVE :Automatisch opslaan: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Tijdsduur kiezen voor automatische spelopslag - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Datumindeling {STRING} gebruiken voor naamgeving van opgeslagen spellen STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datumindeling in bestandsnamen van opgeslagen spellen ###length 3 diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index d01cd400f4..0c8590bb93 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :No STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Yes STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Yes, except sticky -STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Use the {STRING} date format for savegame names STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format of the date in save game filenames ###length 3 diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index d0d308be77..c3de356d7b 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :No STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Yes STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Yes, except sticky -STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Select interval between automatic game saves - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Use the {STRING} date format for savegame names STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format of the date in save game filenames ###length 3 diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index e7a9f720fc..ac1512ad0d 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -1672,9 +1672,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fermu fenestron STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Fermas fenestron per dekstra klako ene de ĝi. Malebligas ŝpruchelpilon je dekstra klako! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Aŭtomata konservado: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Elektu intervalon inter aŭtomataj konservadoj de la ludo - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Uzu la {STRING.n} datformon por nomoj de konservludoj. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Dataranĝo en dosiernomoj de konservitaj ludoj ###length 3 diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index b7439b4b51..c32fff8305 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -1651,9 +1651,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Aken suletakse STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Sulgeb akna, kui selles paremklõps teha. Lülitab välja paremklõpsuga vihjed! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Salvestusväłp: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vali välpsalvestuste vaheline ajavahemik - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Salvestatud mängu nimes kasutatakse {STRING} kuupäevavormingut STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Kuupäeva vorming salvestatud mängu nimes ###length 3 diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 5ad32e3d46..5714c6121d 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1414,7 +1414,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Sløkt ###length 3 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Nýt {STRING} dato sniði til nøvnini á goymdum spølum STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Sniði fyri dato í fíla navninum á goymdum spølum ###length 3 diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 179a7f0833..cda9c29ad6 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Ei STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Kyllä STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Vain ei-säilyvät -STR_CONFIG_SETTING_AUTOSAVE :Automaattitallennus: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Valitse aikaväli automaattisille pelitallennuksille - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Käytä {STRING} päivämäärämuotoa tallennettujen pelien niminä STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Pelitallenteiden tiedostonimissä käytettävä päivämäärän muoto ###length 3 diff --git a/src/lang/french.txt b/src/lang/french.txt index 6e48736c02..ed90dcc454 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Non STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Oui STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Oui, sauf les fenêtres punaisées -STR_CONFIG_SETTING_AUTOSAVE :Sauvegarde automatique{NBSP}: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Sélectionner l'intervalle de temps entre les sauvegardes automatiques - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Utiliser le format de date {STRING} pour le nom des sauvegardes STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format de la date dans les noms des fichiers de sauvegarde ###length 3 diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 82f06454f8..26489ea1c9 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -1489,9 +1489,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Ut ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automatysk bewarje: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selektearje de tiid tusken automatysk bewarje fan it spul - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Brûk it {STRING} datumformaat yn de nammen fan bewarre spullen STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datumformaat foar de bestânsnammen fan bewarre spullen ###length 3 diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index a4c1d937c2..da8c7156e9 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1680,9 +1680,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Dùin an uinnea STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Dùinidh seo uinneag le briogadh deas ’na broinn. Cuiridh e à comas an gliocas-sgrìn le briogadh deas! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Fèin-sàbhaladh: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Tagh dè cho tric ’s a thèid geamannan a shàbhaladh gu fèin-obrachail - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Fòrmat cinn-latha {STRING} airson ainmean nan geamannan air an sàbhaladh STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Fòrmat a' chinn-latha ann an ainmean faidhle nan geamannan air an sàbhaladh ###length 3 diff --git a/src/lang/galician.txt b/src/lang/galician.txt index a329a31bd7..f4fdc974a7 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1623,9 +1623,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Pechar a fiestr STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Pecha a fiestra facendo botón dereito dentro de ela. Deshabilita a axuda contextual facendo click-dereito! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autogravado: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona o intervalo entre gravados automáticos das partidas - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Empregar o formato de data {STRING} para os nomes das partidas gravadas STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato da data nos nomes das partidas gravadas ###length 3 diff --git a/src/lang/german.txt b/src/lang/german.txt index 66a95d2165..2e789b9510 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nein STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, außer angeheftete -STR_CONFIG_SETTING_AUTOSAVE :Autosicherung: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Intervall zwischen automatischen Speicherungen wählen - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Datumsformat für Spielstandsnamen: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Das Datumsformat für Spielstandsdateien festlegen ###length 3 diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 70daff56d4..29b43535d6 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1699,9 +1699,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Κλείσιμ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Κλείνει το παράθυρο με δεξί πάτημα μέσα του. Απενεργοποιεί την ανάδυση επεξηγήσεων με το δεξί κουμπί! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Αυτόματο σώσιμο: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Επιλέξτε το διάστημα ανάμεσα σε δυο διαδοχικά σωσίματα του παιχνιδιου - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Χρήση της {STRING} ημερολογιακής μορφής στα ονόματα αποθηκευμένων παιχνιδιών STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Μορφή της ημερομηνίας στα αρχεία αποθήκευσης παιχνιδιών ###length 3 diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 8842ea997a..bcabee652d 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1518,9 +1518,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :סגירת חל STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :סוגר חלון על-ידי לחיצה ימנית בתוכו. מבטל הצגת מידע בלחיצה ימנית! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :שמירה אוטומטית: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :בחר פרק זמן בין שמירות אוטומטיות - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :השתמש במבנה התאריך {STRING} בשביל שמות קבצי השמירה. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :פורמט התאריך בשמות קבצים של משחקים שמורים ###length 3 diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index a59c436c7a..ff6ff00782 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -485,7 +485,6 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :अक्षम ###length 3 - ###length 3 diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index ee1070d18b..29101f4f23 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1679,9 +1679,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Ablakok bezár STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :A jobb gombbal való kattintás az ablak területén bezárja az ablakot. Ez a beállítás kikapcsolja a segédletek jobb gombbal való megjelenítését! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automatikus mentés: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Az automatikus mentések között eltelő idő - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Játékmentés dátumformátuma: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :A játékmentésekben használt dátum formátuma ###length 3 diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index e076030dbd..59596642fd 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1413,7 +1413,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Af ###length 3 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Nota dagsetningar á {STRING} formi fyrir vistaða leiki. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Snið á dagsetningu í nöfnum á vistuðum leikjum ###length 3 diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 6d3e289895..298e58717f 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -688,7 +688,6 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora ###length 3 - ###length 3 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index fd5c685721..fc162bc7c5 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -1619,9 +1619,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Tutup jendela d STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Menutup jendela dengan mengklik kanan di dalamnya. Menonaktifkan keterangan alat saat klik kanan! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Simpan otomatis: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Memilih jarak waktu antara menyimpan data game - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gunakan format tanggal {STRING} untuk berkas simpanan STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format tanggal di nama berkas permainan tersimpan ###length 3 diff --git a/src/lang/irish.txt b/src/lang/irish.txt index b0eb29af72..bd1e8c1dc0 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1559,9 +1559,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Dún an fhuinne STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Dúntar fuinneog trí dheas-chliceáil laistigh de. Díchumasaítear leis seo na leideanna uirlise deas-cliceála! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Uathshábháil: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Roghnaigh an t-eatramh idir uathshábhálacha cluichí - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Úsáid an formáid dáta {STRING} d'ainmneacha na gcluichí sábháilte STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formáid an dáta i gcomhadainmneacha na gcluichí sábháilte ###length 3 diff --git a/src/lang/italian.txt b/src/lang/italian.txt index f7f43d3fc9..b782dab925 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1658,9 +1658,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Chiudi finestra STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Consente di chiudere una finestra facendo clic col pulsante destro al suo interno. Disabilita i suggerimenti attivati al clic col pulsante destro! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Salvataggi automatici: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Seleziona l'intervallo fra i salvataggi automatici della partita - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Formato data nei nomi dei salvataggi: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato della data nei nomi dei file delle partite salvate ###length 3 diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 5aa396a927..b65f573c8a 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1614,9 +1614,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右クリック STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :ウィンドウ内で右クリックしてウィンドウを閉じられます。右クリックでツールチップも無効にできます。 ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :オートセーブ: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :オートセーブの間隔を設定します - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :セーブ時の日付フォーマット: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :セーブデータ名にデフォルトで付けられる日付の表記法を指定します。注: 日本の場合、「短」と「ISO標準」に違いはありません ###length 3 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index d64d4dceca..b1aa649ee6 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :아니요 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :예 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :예 (고정한 창 제외) -STR_CONFIG_SETTING_AUTOSAVE :자동 저장: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :게임을 자동으로 저장할 간격을 선택하세요 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :저장 파일 이름으로 {STRING} 날짜 형식을 사용 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :게임 저장 파일 이름에 사용할 날짜 형식을 선택합니다 ###length 3 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index e75f025656..7ff5371534 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1678,9 +1678,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Claudere fenest STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Facit ut globulus muris dexter fenestras claudat. Cave: hac electa, non apparent nuntia adiuvantia globulo dextro. ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Servare automatice: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Eligere crebritatem automatice ludum servandi - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Forma {STRING} diei adhibenda in nominibus ludorum servatorum STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Forma diei in nominibus ludorum servatorum ###length 3 diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index b632cc9870..7a455d05fc 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1597,9 +1597,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Aizvērt logu a STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Labais klikšķis logā aizver logu. Izslēdz paskaidres parādīšanu ar labo klikšķi! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automātiskā saglabāšana: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Izvēlēties spēles automātiskās saglabāšanas starplaikus - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Lietot {STRING} datuma formātu saglabāto spēļu nosaukumos STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datuma formāts spēļu saglabājuma failu nosaukumos ###length 3 diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 2c7a5bc9d0..a8eac2c1de 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1782,9 +1782,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Užverti langą STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Užveria langą dešiniuoju pelės klavišu spustelėjus ant jo. Išjungia patarimą dešiniuoju pelės klavišu spustelėjimu! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automatinis saugojimas: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Laiko tarpsnis tarp automatinių žaidimo išsaugojimų - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Išsaugant žaidimą, pavadinimuose naudoti {STRING} datos formatą STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datos formatas išsaugoto žaidimo failo pavadinime ###length 3 diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 976ca43daf..a9512be084 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -1595,9 +1595,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Fënster mat ri STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Mécht eng Fenster mat engem Rietsklick zou, wann een an d'Fënster klickt. Schalt Tooltips aus déi per Rietsklick gemet ginn! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autospäicheren: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Setz den Interval tëschend automateschen Späicherstänn - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Datumsformat fir Späichernimm: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format vum Datum am Numm vum Späicherstand ###length 3 diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 77bded768e..878123f739 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -992,7 +992,6 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Дебелин ###length 3 - ###length 3 diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 27853ca27d..9f76b33316 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1385,9 +1385,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Matikan ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Simpanan automatik:{STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Pilih jarak waktu antara menyimpankan permainan automatik - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Gunakan format tarikh {STRING} untuk simpanan permainan. ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :panjang (31hb Dis 2008) diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 4bc6925768..f7e98114d0 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -615,7 +615,6 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jinti ###length 3 - ###length 3 diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 78ddb8cb4b..47be4d8a24 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -925,7 +925,6 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE : वाहन ###length 3 - ###length 3 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 4eabfc74a7..2326d60352 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1568,9 +1568,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Lukk vinduet me STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Lukker et vindu ved å høyreklikke i det. Deaktiverer verktøytipset med høyreklikk! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autolagring: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Velg intervall mellom automatiske lagringer av spillet - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Bruk {STRING} datoformat i navn på lagrede spill. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datoformat i lagrede spills filnavn ###length 3 diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 40c8ae7f1d..88751bcca7 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1439,9 +1439,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Av ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autolaging: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vel intervall for automatisk lagring av spel - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Bruk {STRING} datoformat for namning av lagra spel STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Datoformat i namning av lagra spel ###length 3 diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 4a1d72bb22..5b29a1ac12 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -1358,9 +1358,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :خاموش ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :ذخیره خودکار: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :انتخاب فاصله زمانی بین ذخیره کردن های خودکار - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :از این {STRING} برای نام فایل‌های ذخیره استفاده کن ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :طولانی (31st Dec 2008) diff --git a/src/lang/polish.txt b/src/lang/polish.txt index b6674cf3b5..a115728ba2 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2026,9 +2026,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nie STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Tak STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Tak, z wyjątkiem przypiętych -STR_CONFIG_SETTING_AUTOSAVE :Autozapis: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Częstotliwość automatycznego zapisu stanu gry - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Użyj {STRING} formatu daty dla nazw zapisów gry STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format daty w nazwach plików zapisu gry ###length 3 diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index c7e891b319..ef9c7c395d 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Não STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Sim STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Sim, exceto coladas -STR_CONFIG_SETTING_AUTOSAVE :Guardar automaticamente: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Seleccione o intervalo entre gravações automáticas - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Usar formato de data {STRING} para jogos gravados. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato da data nos ficheiros de jogos gravados ###length 3 diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 854717f437..db8a4cc4d3 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1645,9 +1645,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nu STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Da STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Da, mai puțin cele lipite -STR_CONFIG_SETTING_AUTOSAVE :Autosalvare: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Alege intervalul de timp dintre salvările automate - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Foloseşte formatul datei {STRING} pentru numele salvărilor STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formatul datei in numele salvărilor ###length 3 diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 7601bfa895..ed66b9e6b7 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1797,9 +1797,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :нет STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :да STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :да, кроме закреплённых -STR_CONFIG_SETTING_AUTOSAVE :Автосохранение: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Укажите интервал между автоматическими сохранениями - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Использовать {STRING} формат даты для имён сохранений STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Формат даты, использующийся в названиях сохранённых игр ###length 3 diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index af2355cf59..698cd4d34a 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1788,9 +1788,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zatvori prozor STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zatvara prozor tako što klikne desnim klikom unutar nje. Onemogućava dodir sa desnim tasterom miša! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autočuvanje: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Odabir vremenskog intervala između dve automatski sačuvane igre - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Koristiti {STRING} oblik datuma u nazivima sačuvanih igara STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format datuma u imenima fajlova sačuvanih igara ###length 3 diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 0c3fe3dfb4..c995310513 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -1595,9 +1595,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右键关闭窗 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :使用在窗口内按右键关闭该窗口,本功能与右键工具提示不能共存! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :自动保存: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :选择自动存档时间间隔 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :使用 {STRING} 形式的文件名存档 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :游戏存档文件名中日期的格式 ###length 3 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 1cf36067a9..43c4dc913b 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -1700,9 +1700,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zatvoriť okno STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Zatvorí okno kliknutím pravým tlačidlom do vnútra. Prestane ukazovať nápovedu pri kliknutí pravým tlačidlom! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Automatické ukladanie: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vyberte interval pre automatické ukladanie hry - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Použiť {STRING} formát dátumu v názve uloženej hry STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formát dátumu v názvoch uložených hier ###length 3 diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index dee0d98b39..fd6b1c4d6f 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1629,9 +1629,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Izklop STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Zapri okno z desnim klikom: {STRING} ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Samodejno shrani: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Izberi časovni interval samodejnega shranjevanja igre - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Uporabi {STRING} format datuma za imena shranjevanja igre STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format datuma v imenih shranjenih iger ###length 3 diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 1deefedeee..7592c1af15 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1596,9 +1596,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cerrar ventana STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cierra una ventana al hacer clic derecho dentro. ¡Desactiva la descripción emergente al hacer clic derecho! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autoguardado: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Selecciona el intervalo entre guardados automáticos del juego - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Usar formato de fecha {STRING} para los nombres de partidas guardadas STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato de la fecha en el nombre de partidas guardadas ###length 3 diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index b17c102c9b..7fa844874a 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -1596,9 +1596,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cerrar ventana STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cerrar la ventana haciendo clic derecho sobre ella. ¡Desactiva los mensajes de ayuda con clic derecho! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Guardado automático: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Intervalo entre guardados automáticos de la partida - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Usar formato de fecha {STRING} para los nombres de partidas guardadas STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Asignar un formato de fecha como nombre al guardar una partida ###length 3 diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 2c1381def2..363884445a 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Nej STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Ja STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Ja, förutom klistrade -STR_CONFIG_SETTING_AUTOSAVE :Autospara: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Välj intervall mellan automatisk sparande - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Använd {STRING} som datumformat för sparfilsnamn STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format för datum i filnamnen för sparade spel ###length 3 diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index ebff33b635..ded256d64f 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1454,9 +1454,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :அணை ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :தானியங்கிபதிவு: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :தானியங்கி விளையாட்டு சேமிப்புகளுக்கு இடையில் இடைவெளியைத் தேர்ந்தெடுக்கவும் - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :{STRING} தேதி வகையினை பதிவுஆட்டங்கள் பெயர்களுக்கு பயன்படுத்தவும் STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :பதிவு ஆட்டங்கள் கோப்புப் பெயர்களில் உள்ள தேதி வகையினை அமை ###length 3 diff --git a/src/lang/thai.txt b/src/lang/thai.txt index d5f6046834..bcca4f91be 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1487,7 +1487,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :ปิดหน STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :สามารถปิดแถบหน้าต่างด้วยการ คลิ๊กขวา โดยลากเมาส์ไปที่แถบที่ต้องการจะปิดก็พอ ###length 3 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :ใช้รูปแบบวันที่ {STRING} เป็นชื่อเซฟของเกม STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :เพิ่มวันที่ในเกมลงไปในชื่อเซฟเกม เมื่อมีการเซฟเกมจะแนบวันที่ในเกมลงไปในชื่อเซฟเกมด้วยโดยอัตโนมัติ แต่หากผู้เล่นต้องการเปลี่ยนแปลงชื่อเซฟเกมก็สามารถกระทำได้ตามสะดวก ###length 3 diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index f235194c5a..50a895d12f 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1595,9 +1595,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右鍵關閉視 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :在視窗內以右鍵點擊可關閉視窗。可用右鍵關閉工具提示。 ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :自動儲存:{STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :選擇自動存檔的週期。 - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :使用 {STRING} 時間格式作為存檔檔名 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :在存檔的檔名中使用的日期格式。 ###length 3 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 4012f9bbe8..eae30dd054 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1647,9 +1647,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Hayır STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Evet STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Evet, yapışkan hariç -STR_CONFIG_SETTING_AUTOSAVE :Otomatik kaydet: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Otomatik oyun kaydetme sıklığını seçin - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Kaydedilen oyun isimlerinde {STRING} tarih biçimini kullan STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Kaydedilen oyun isimlerinde kullanılan tarih biçimi ###length 3 @@ -1900,8 +1897,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Şehirlerin bü STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Şehirlerde hemzemin geçit yapmaya izin ver: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Etkinleştirildiğinde şehirlerin demiryolu ile karayolunun kesiştiği kavşaklar yapmasına izin verilir -STR_CONFIG_SETTING_NOISE_LEVEL :Kasabalar tarafından kontrol edilen havaalanı gürültü seviyesine izin ver: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Etkisiz hale getirildiğinde, her şehirde iki havaalanı olabilir. Etkinleştirildiğinde ise, bir şehirdeki havaalanı sayısı o şehrin ne kadar gürültüye tahammül edebildiğiyle sınırlıdır; bu da nüfus miktarına, havaalanının büyüklüğüne ve uzaklığına bağlıdır +STR_CONFIG_SETTING_NOISE_LEVEL :Gürültü seviyesine göre havaalanı yerleşimini sınırlayın: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Kasabaların, şehrin nüfusuna ve havalimanı büyüklüğüne ve mesafesine bağlı kabul ettiği gürültü seviyelerine göre havalimanı inşaatını engellemesine izin verin. Bu ayar devre dışı bırakılırsa,kasabaların tutumu "Hoşgörülü" olmadığı sürece kasabalar yalnızca iki havalimanına izin verir. STR_CONFIG_SETTING_TOWN_FOUNDING :Oyunda yeni şehirler kurma: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Bu seçeneği etkinleştirmek, oyuncuların yeni şehirler kurmasına izin verir diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index da08b3043e..e6fdcb52e1 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1743,9 +1743,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Закрити STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Закривати вікно кліком правої кнопки миші по ньому. При цьому віключається поява підказок за правою кнопкою. ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Автозбереження: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Оберіть проміжок між автоматичними збереженнями гри - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Формат дати в іменах файлів збереження: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Формат дати в іменах файлів збереження ###length 3 diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index f47f8e10ce..3f2b7a2c39 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1283,9 +1283,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :آف ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Autosave: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :گیم بچانے کا وقفا چنیں - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :کھیل کو محفوظ کرنے کے لئے تاریخ کا {STRING} طریقہ استعمال کریں ###length 3 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :long (31st Dec 2008) diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 639bf9bed3..2b2d5d8791 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1646,9 +1646,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :Không STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Có STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Có, trừ cửa sổ đang neo -STR_CONFIG_SETTING_AUTOSAVE :Tự động save: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Chọn chu kỳ giữa mỗi lần tự động save - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Sử dụng định dạng ngày {STRING} cho tên file lưu ván chơi. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Định dạng ngày trong tên file lưu ###length 3 diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 819f6a5ea5..c782b95256 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -1522,9 +1522,6 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Cau ffenest wrt STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Cau ffenest wrth dde-glicio tu fewn iddo. Mae hyn yn analluogi dangos gwybodaeth ar dde-clicio! ###length 3 -STR_CONFIG_SETTING_AUTOSAVE :Awtogadw: {STRING} -STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Dewis pa mor aml y dylid awtogadw gemau - STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Defnyddio'r fformat dyddiad {STRING} ar gyfer enwau gemau wedi'u cadw STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Fformat y dyddiad mewn enwau ffeiliau cadw ###length 3 From 45cc3acaf511db567467c53cb697bbd7c33ee723 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 20 Aug 2023 20:57:01 +0200 Subject: [PATCH 59/77] Codechange: [Win32] unify AppendDecodedStacktrace and LogStacktrace (#11220) AppendDecodedStacktrace was already doing the same as LogStacktrace, just with a different name. --- src/os/windows/crashlog_win.cpp | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 5b4005ee51..520c17f25d 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -61,12 +61,6 @@ public: } #endif -#if defined(_MSC_VER) - void AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const; -#else - void AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const {} -#endif /* _MSC_VER */ - /** * A crash log is always generated when it's generated. * @param ep the data related to the exception. @@ -111,17 +105,11 @@ public: ); } -/* virtual */ void CrashLogWindows::LogStacktrace(std::back_insert_iterator &output_iterator) const -{ - fmt::format_to(output_iterator, "Stack trace:\n"); - fmt::format_to(output_iterator, " Not supported.\n"); -} - #if defined(_MSC_VER) static const uint MAX_SYMBOL_LEN = 512; static const uint MAX_FRAMES = 64; -void CrashLogWindows::AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const +/* virtual */ void CrashLogWindows::LogStacktrace(std::back_insert_iterator &output_iterator) const { DllLoader dbghelp(L"dbghelp.dll"); struct ProcPtrs { @@ -146,7 +134,7 @@ void CrashLogWindows::AppendDecodedStacktrace(std::back_insert_iterator &output_iterator) const +{ + fmt::format_to(output_iterator, "Stack trace:\n"); + fmt::format_to(output_iterator, " Not supported.\n"); } #endif /* _MSC_VER */ @@ -279,7 +273,6 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) auto output_iterator = std::back_inserter(log->crashlog); log->FillCrashLog(output_iterator); log->WriteCrashDump(); - log->AppendDecodedStacktrace(output_iterator); log->WriteCrashLog(); log->WriteScreenshot(); log->SendSurvey(); From 8df4aa797945dfc00867ea94e6a0c2f2536eddc7 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 20 Aug 2023 20:46:19 +0100 Subject: [PATCH 60/77] Fix: Road stops should not draw a ground sprite of 0 (#11214) --- src/station_cmd.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index c8fbd43c5a..1d5a64d756 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3174,8 +3174,10 @@ draw_default_foundation: SpriteID image = t->ground.sprite; PaletteID pal = t->ground.pal; image += HasBit(image, SPRITE_MODIFIER_CUSTOM_SPRITE) ? ground_relocation : total_offset; - if (HasBit(pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) pal += ground_relocation; - DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette)); + if (GB(image, 0, SPRITE_WIDTH) != 0) { + if (HasBit(pal, SPRITE_MODIFIER_CUSTOM_SPRITE)) pal += ground_relocation; + DrawGroundSprite(image, GroundSpritePaletteTransform(image, pal, palette)); + } } if (IsDriveThroughStopTile(ti->tile)) { From 6635f809dd9e1116404c9041751690d08181cc5a Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 20 Aug 2023 22:58:49 +0200 Subject: [PATCH 61/77] Fix #11181: attempting to read string as int triggers assertion --- src/strings.cpp | 7 +++-- src/tests/CMakeLists.txt | 1 + src/tests/strings_func.cpp | 52 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/tests/strings_func.cpp diff --git a/src/strings.cpp b/src/strings.cpp index eb04519e8e..959d68dfd5 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -196,8 +196,11 @@ bool HaveDParamChanged(const std::vector &backup) { bool changed = false; for (size_t i = 0; !changed && i < backup.size(); i++) { - if (backup[i].string.has_value()) { - changed = backup[i].string.value() != (const char *)(size_t)_global_string_params.GetParam(i); + bool global_has_string = _global_string_params.GetParamStr(i) != nullptr; + if (global_has_string != backup[i].string.has_value()) return true; + + if (global_has_string) { + changed = backup[i].string.value() != _global_string_params.GetParamStr(i); } else { changed = backup[i].data != _global_string_params.GetParam(i); } diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 6f5134d46f..ef617a82b6 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -2,5 +2,6 @@ add_test_files( landscape_partial_pixel_z.cpp math_func.cpp string_func.cpp + strings_func.cpp test_main.cpp ) diff --git a/src/tests/strings_func.cpp b/src/tests/strings_func.cpp new file mode 100644 index 0000000000..dd70b0a365 --- /dev/null +++ b/src/tests/strings_func.cpp @@ -0,0 +1,52 @@ +/* + * 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 strings_func.cpp Test functionality from strings_func. */ + +#include "../stdafx.h" + +#include "../3rdparty/catch2/catch.hpp" + +#include "../strings_func.h" + +TEST_CASE("HaveDParamChanged") +{ + SetDParam(0, 0); + SetDParamStr(1, "some string"); + + std::vector backup; + CopyOutDParam(backup, 2); + + CHECK(HaveDParamChanged(backup) == false); + + /* A different parameter 0 (both string and numeric). */ + SetDParam(0, 1); + CHECK(HaveDParamChanged(backup) == true); + + SetDParamStr(0, "some other string"); + CHECK(HaveDParamChanged(backup) == true); + + /* Back to the original state, nothing should have changed. */ + SetDParam(0, 0); + CHECK(HaveDParamChanged(backup) == false); + + /* A different parameter 1 (both string and numeric). */ + SetDParamStr(1, "some other string"); + CHECK(HaveDParamChanged(backup) == true); + + SetDParam(1, 0); + CHECK(HaveDParamChanged(backup) == true); + + /* Back to the original state, nothing should have changed. */ + SetDParamStr(1, "some string"); + CHECK(HaveDParamChanged(backup) == false); + + /* Changing paramter 2 should not have any effect, as the backup is only 2 long. */ + SetDParam(2, 3); + CHECK(HaveDParamChanged(backup) == false); + +} From 2cbd76593a8d15482683c66d38341759f93725c4 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 21 Aug 2023 11:42:33 +0100 Subject: [PATCH 62/77] Fix #11215: Assert in NewGRF parameters window (manual parameter mode) (#11217) --- src/newgrf_gui.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index f6aa841972..375cc0572d 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -352,10 +352,9 @@ struct NewGRFParametersWindow : public Window { case WID_NP_BACKGROUND: { if (!this->editable) break; - auto it = this->vscroll->GetScrolledItemFromWidget(this->grf_config->param_info, pt.y, this, WID_NP_BACKGROUND); - if (it == this->grf_config->param_info.end()) break; + uint num = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_NP_BACKGROUND); + if (num >= this->vscroll->GetCount()) break; - uint num = it - this->grf_config->param_info.begin(); if (this->clicked_row != num) { this->CloseChildWindows(WC_QUERY_STRING); this->CloseChildWindows(WC_DROPDOWN_MENU); @@ -367,7 +366,7 @@ struct NewGRFParametersWindow : public Window { int x = pt.x - r.left; if (_current_text_dir == TD_RTL) x = r.Width() - 1 - x; - GRFParameterInfo &par_info = it->has_value() ? it->value() : GetDummyParameterInfo(num); + GRFParameterInfo &par_info = this->GetParameterInfo(num); /* One of the arrows is clicked */ uint32_t old_val = par_info.GetValue(this->grf_config); From 4d4a046d23e6e0439c19298ea00e0f9b7aa73958 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 22 Aug 2023 18:39:08 +0000 Subject: [PATCH 63/77] Update: Translations from eints polish: 2 changes by pAter-exe --- src/lang/polish.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/polish.txt b/src/lang/polish.txt index a115728ba2..57d5bc2a2d 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2276,8 +2276,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Pozwalaj miasto STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Miasta, które mogą budować przejazdy kolejowe: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Aktywacja tej opcji pozwala miastom budować przejazdy kolejowe -STR_CONFIG_SETTING_NOISE_LEVEL :Pozwól miastom kontrolować poziom hałasu dla lotnisk: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Kiedy ta opcja jest wyłączona, w miastach można zbudować 2 lotniska. Kiedy ta opcja jest włączona, liczba lotnisk jest ograniczona przez tolerancję hałasu tego miasta, która zależna jest od populacji oraz rozmiaru lotniska i jego odległości +STR_CONFIG_SETTING_NOISE_LEVEL :Ograniczenie umieszczania lotnisk zależne od poziomu hałasu: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Umożliwia miastom zablokowanie budowy lotnisk ze względu na poziom akceptacji hałasu, który zależy od liczby mieszkańców miasta oraz wielkości i odległości lotniska. Jeśli to ustawienie jest wyłączone, miasta zezwalają tylko na dwa lotniska, chyba że nastawienie władz lokalnych jest ustawione na „Przyjazne” STR_CONFIG_SETTING_TOWN_FOUNDING :Zakładanie miast w grze: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Aktywacja tej opcji umożliwia graczom zakładanie nowych miast w grze From 9aef380c9939095ffbf2f1845fc8053c51855ae7 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 24 Aug 2023 18:38:24 +0000 Subject: [PATCH 64/77] Update: Translations from eints italian: 43 changes by Rivarossi french: 1 change by ottdfevr --- src/lang/french.txt | 2 +- src/lang/italian.txt | 63 ++++++++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/lang/french.txt b/src/lang/french.txt index ed90dcc454..c7c7451035 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1898,7 +1898,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Autoriser la co STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activer ce paramètre pour autoriser les villes à construire des passages à niveau STR_CONFIG_SETTING_NOISE_LEVEL :Limiter les placements des aéroports en fonction du niveau sonore{NBSP}: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Avec ce paramètre désactivé, il peut y avoir deux aéroports dans chaque ville. Avec ce paramètre activé, le nombre d'aéroports dans une ville est limité par le bruit qu'elle accepte, celui-ci dépend de la population, de la taille de l'aéroport et de la distance +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Permettre aux villes de bloquer la construction d'aéroports si le niveau sonore est trop élevé pour celle-ci, ce paramètre est basé sur la population de la ville, la taille de l'aéroport et la distance à laquelle il sera construit. Si ce paramètre est désactivé, chaque ville ne tolérera que deux aéroports sauf si la tolérance des municipalités est définie sur "permissive" STR_CONFIG_SETTING_TOWN_FOUNDING :Fonder des villes en cours de jeu{NBSP}: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Activer ce paramètre permet aux joueurs de fonder de nouvelles villes dans la partie diff --git a/src/lang/italian.txt b/src/lang/italian.txt index b782dab925..d36d2dbe71 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -193,6 +193,23 @@ STR_COLOUR_WHITE :Bianco STR_COLOUR_RANDOM :Casuale ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Blu scuro +STR_COLOUR_SECONDARY_PALE_GREEN :Verde chiaro +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rosa +STR_COLOUR_SECONDARY_YELLOW :Giallo +STR_COLOUR_SECONDARY_RED :Rosso +STR_COLOUR_SECONDARY_LIGHT_BLUE :Azzurro +STR_COLOUR_SECONDARY_GREEN :Verde +STR_COLOUR_SECONDARY_DARK_GREEN :Verde scuro +STR_COLOUR_SECONDARY_BLUE :Blu +STR_COLOUR_SECONDARY_CREAM :Crema +STR_COLOUR_SECONDARY_MAUVE :Malva +STR_COLOUR_SECONDARY_PURPLE :Viola +STR_COLOUR_SECONDARY_ORANGE :Arancione +STR_COLOUR_SECONDARY_BROWN :Marrone +STR_COLOUR_SECONDARY_GREY :Grigio +STR_COLOUR_SECONDARY_WHITE :Bianco +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Come il primario # Units used in OpenTTD @@ -436,7 +453,7 @@ STR_FILE_MENU_EXIT :Esci ###length 4 STR_MAP_MENU_MAP_OF_WORLD :Mappa del mondo STR_MAP_MENU_EXTRA_VIEWPORT :Mini visuale extra -STR_MAP_MENU_LINGRAPH_LEGEND :Legenda rotte commerciali +STR_MAP_MENU_LINGRAPH_LEGEND :Legenda del flusso di merci STR_MAP_MENU_SIGN_LIST :Elenco cartelli # Town menu @@ -609,7 +626,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Grafico STR_GRAPH_INCOME_CAPTION :{WHITE}Grafico ricavi STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unità di carico consegnate STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Valutazione prestazioni compagnie (massima valutazione=1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Valore delle compagnie +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Grafico del valore aziendale STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tariffe di pagamento carichi STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL :{TINY_FONT}{BLACK}Giorni di viaggio @@ -641,7 +658,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Presidente STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Magnate # Performance detail window -STR_PERFORMANCE_DETAIL :{WHITE}Valutazione dettagliata prestazioni +STR_PERFORMANCE_DETAIL :{WHITE}Valutazione dettagliata delle prestazioni STR_PERFORMANCE_DETAIL_KEY :{BLACK}Dettagli STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT}) STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA}) @@ -1272,6 +1289,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Sinistra STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Centro STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Destra +STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "o" i} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Prestito massimo iniziale: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Ammontare massimo di denaro che una compagnia può chiedere in prestito (senza tenere conto dell'inflazione). @@ -1330,7 +1348,7 @@ STR_CONFIG_SETTING_CATCHMENT :Consenti aree d STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Usa aree di copertura di dimensioni differenti a seconda del tipo di stazione o aeroporto. STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Le stazioni delle compagnie possono servire le industrie con stazioni neutrali: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Se abilitata, le industrie con una stazione incorporata (come le piattaforme petrolifere) possono essere servite anche dalle stazioni di proprietà delle compagnie costruite nelle vicinanze. Se disabilitata, queste industrie possono essere servite dalla loro stazione incorporata. Nessuna stazione vicina potrà servirle, né la stazione incorporata potrà servire altro che la sua industria. +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Se attivata, le industrie con stazioni annesse (come le piattaforme petrolifere) possono essere servite anche da stazioni di proprietà dell'azienda costruite nelle vicinanze. Quando è disattivato, queste industrie possono essere servite solo dalle stazioni annesse. Tutte le stazioni aziendali vicine non saranno in grado di servirle e la stazione annessa servirà esclusivamente l'industria a cui è annessa. STR_CONFIG_SETTING_EXTRADYNAMITE :Consenti la rimozione di strade, ponti, etc. delle città: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Rende più facile la rimozione di infrastrutture ed edifici di proprietà delle città. @@ -1443,8 +1461,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Nessuno* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Ridotto STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normale -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Consenti fermate passanti sulle strade delle città: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Consente la costruzione di fermate stradali passanti sulle strade di proprietà della città. +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Consenti fermate passanti sulle strade di proprietà delle città: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permettere la costruzione di fermate stradali passanti sulle strade di proprietà delle città. STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Consenti fermate passanti sulle strade di proprietà degli avversari: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Consente la costruzione di fermate stradali passanti sulle strade di proprietà delle altre compagnie. STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Non è possibile modificare questa impostazione quando esistono veicoli @@ -1455,6 +1473,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Se abilitata, l STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Colore iniziale compagnia: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Imposta il colore predefinito della compagnia, che volendo potrà essere modificato successivamente, anche durante la partità. +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Colore secondario della compagnia di partenza: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Scegliere il colore secondario iniziale per l'azienda, se si utilizza un NewGRF che lo consente. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Non rendere mai obsoleti i tipi di aeroporto: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Se abilitata, dopo la loro introduzione, tutti i tipi di aeroporto rimarranno sempre disponibili. @@ -1657,6 +1677,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Nessuna STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Chiudi finestra con clic destro: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Consente di chiudere una finestra facendo clic col pulsante destro al suo interno. Disabilita i suggerimenti attivati al clic col pulsante destro! ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :No +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Sì +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Sì, ma non appiccicoso STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Formato data nei nomi dei salvataggi: {STRING} STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato della data nei nomi dei file delle partite salvate @@ -1908,8 +1931,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Consente alle c STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Consenti alle città di costruire passaggi a livello: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Abilitando questa impostazione si consente alle città di costruire passaggi a livello -STR_CONFIG_SETTING_NOISE_LEVEL :Consenti controllo rumore aeroporti da parte delle città: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Se disabilitata, ci possono essere al massimo due aeroporti in ogni città. Se abilitata, il numero di aeroporti in città è limitato dal rumore tollerato dalla città, dipendendo così dalla popolazione, dalla distanza e dalla dimensione degli aeroporti +STR_CONFIG_SETTING_NOISE_LEVEL :Limitare il posizionamento dell'aeroporto in base al livello di rumore: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Consente alle città di bloccare la costruzione di aeroporti in base al loro livello di accettazione del rumore, che si basa sulla popolazione della città e sulle dimensioni e la distanza dell'aeroporto. Se questa impostazione è disattivata, le città consentono solo due aeroporti, a meno che l'atteggiamento delle autorità locali non sia impostato su "Permissivo". STR_CONFIG_SETTING_TOWN_FOUNDING :Fondazione città durante la partita: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Abilitando questa impostazione si consente ai giocatori di fondare nuove città durante una partita @@ -1983,9 +2006,9 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Nessuna STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Moltiplicatore iniziale dimensioni metropoli: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Dimensione media delle metropoli in rapporto alle normali città all'inizio della partita. -STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Aggiornare il grafico di distribuzione ogni {STRING}{NBSP}{P 0:2 "secondo" secondi} +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Aggiornare il grafico di distribuzione ogni {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tempo tra i successivi ricalcoli del grafico dei collegamenti. Ogni ricalcolo calcola i piani per un componente del grafico. Ciò significa che un valore X per questa impostazione non significa che l'intero grafico verrà aggiornato ogni X secondi. Solo alcuni componenti lo saranno. Quanto più breve è l'impostazione, tanto più tempo di CPU sarà necessario per il calcolo. Più lungo è il valore impostato, più tempo ci vorrà prima che la distribuzione del carico inizi su nuove rotte. -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Prendere {STRING}{NBSP}{P 0:2 "secondo" secondi} per il ricalcolo del grafico di distribuzione +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Prendere {STRING} per il ricalcolo del grafico di distribuzione STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo necessario per ogni ricalcolo di un componente del grafo dei collegamenti. Quando viene avviato un ricalcolo, viene generato un thread che può essere eseguito per questo numero di secondi. Quanto più breve è il tempo impostato, tanto più è probabile che il thread non finisca quando dovrebbe. In questo caso il gioco si ferma finché non viene terminato ("lag"). Più lungo è il valore impostato, più tempo ci vuole per aggiornare la distribuzione quando i percorsi cambiano. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modalità di distribuzione dei passeggeri: {STRING} @@ -2964,7 +2987,7 @@ STR_FOUND_TOWN_SELECT_LAYOUT_3X3_GRID :{BLACK}Griglia STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Casuale # Fund new industry window -STR_FUND_INDUSTRY_CAPTION :{WHITE}Finanzia nuova industria +STR_FUND_INDUSTRY_CAPTION :{WHITE}Finanziamento dell'industria STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Selezionare l'industria appropriata dalla lista STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Crea industrie casuali STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Copre la mappa con industrie posizionate casualmente @@ -2980,14 +3003,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Rimuovi STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Si è sicuri di voler rimuovere tutte le industrie? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Catena di distribuzione di {G un un' una} {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Catena di distribuzione dei carichi di {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Filiera industriale di {G un un' una} {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Catena di carico {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Produttori STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Consumatori STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Case STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Fare clic sull'industria per visualizzarne fornitori e clienti STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Fare clic sul carico per visualizzarne fornitori e clienti -STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Catena distributiva +STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Catena di distribuzione STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostra la catena di industrie fornitrici e clienti STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Collega alla minimappa STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Seleziona le industrie visualizzate anche sulla minimappa @@ -3582,8 +3605,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{PUSH_COLOUR}{YELLOW}Finanziare la ricostruzione della rete stradale urbana.{}Provoca notevoli disagi al traffico stradale per un periodo fino a 6 mesi.{}{POP_COLOUR}Costo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Costruite una statua in onore della vostra compagnia.{}Fornisce un aumento permanente della valutazione della stazione in questa città..{}{POP_COLOUR}Costo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finanziare la costruzione di nuovi edifici in città.{}Fornisce un incremento temporaneo alla crescita di questa città.{}{POP_COLOUR}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Acquistate 1 anno di diritti esclusivi di trasporto in città..{}Le autorità cittadine non permetteranno a passeggeri e merci di utilizzare le stazioni dei vostri concorrenti..{}{POP_COLOUR}Costo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Corrompere l'autorità locale per aumentare la valutazione, con il rischio di una severa sanzione se si viene scoperti.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{PUSH_COLOUR}{YELLOW}Acquistate 1 anno di diritti esclusivi di trasporto in città..{}Le autorità cittadine non permetteranno a passeggeri e merci di utilizzare le stazioni dei vostri concorrenti. Un concorrente che riuscisse a corrompere le autorità cittadine per acquisire i diritti esclusivi di trasporto causerà l'annullamento di questo contratto.{}{POP_COLOUR}Costo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Corrompere l'autorità locale per aumentare il proprio rating e interrompere i diritti di trasporto esclusivi di un concorrente, con il rischio di una severa sanzione se si viene scoperti.{}{POP_COLOUR}Costo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Obiettivi della {COMPANY} @@ -3893,7 +3916,7 @@ STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Aeromobili disp STR_VEHICLE_LIST_MANAGE_LIST :{BLACK}Gestione veicoli STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Invia istruzioni a tutti i veicoli di questo elenco STR_VEHICLE_LIST_REPLACE_VEHICLES :Rimpiazza veicoli -STR_VEHICLE_LIST_SEND_FOR_SERVICING :Manutenzione +STR_VEHICLE_LIST_SEND_FOR_SERVICING :Inviare alla manutenzione STR_VEHICLE_LIST_CREATE_GROUP :Crea gruppo STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profitto quest'anno: {CURRENCY_LONG} (anno scorso: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] @@ -4655,8 +4678,8 @@ STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}Uno degl STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}La finestra di debug IA/Script è disponibile soltanto per il server # AI configuration window -STR_AI_CONFIG_CAPTION_AI :{WHITE}Configurazione IA -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Configurazione script di gioco +STR_AI_CONFIG_CAPTION_AI :{WHITE}Impostazioni IA +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Impostazioni dello script di gioco STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Lista degli Script che saranno caricati nella prossima partita STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}Lista delle IA che saranno caricate nella prossima partita STR_AI_CONFIG_HUMAN_PLAYER :Giocatore umano @@ -4906,7 +4929,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Troppe a STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Troppo vicino ad un altro molo STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Troppo vicino ad un altro aeroporto STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Impossibile rinominare la stazione... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... questa è una strada di proprietà della città +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... strada di proprietà della città STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... strada rivolta nella direzione sbagliata STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... le fermate passanti non possono trovarsi in curva STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... le fermate passanti non possono avere raccordi From ead52844765dbbaa896e65619bd99f157d819fc1 Mon Sep 17 00:00:00 2001 From: Joan Josep Date: Fri, 25 Aug 2023 12:56:11 +0200 Subject: [PATCH 65/77] Doc: Improve the example given for fall throughs. (#11228) --- CODINGSTYLE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODINGSTYLE.md b/CODINGSTYLE.md index 9c6bfe6e67..b9baf7ba2d 100644 --- a/CODINGSTYLE.md +++ b/CODINGSTYLE.md @@ -180,7 +180,7 @@ switch (a) { case 1: DoSomething(); - /* FALL THROUGH */ + FALLTHROUGH; case 2: DoMore(); @@ -191,7 +191,7 @@ switch (a) { int r = 2; DoEvenMore(a); - /* FALL THROUGH */ + FALLTHROUGH; } case 4: { From a938067d6b4526cdc48fa35140b95f4df9bb398e Mon Sep 17 00:00:00 2001 From: Joan Josep Date: Fri, 25 Aug 2023 14:29:51 +0200 Subject: [PATCH 66/77] Codechange: Invalid depot value is unrelated to invalid station value. (#11227) --- src/depot_type.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/depot_type.h b/src/depot_type.h index 322990c3e3..4e61c1bcbd 100644 --- a/src/depot_type.h +++ b/src/depot_type.h @@ -10,12 +10,10 @@ #ifndef DEPOT_TYPE_H #define DEPOT_TYPE_H -#include "station_type.h" - typedef uint16_t DepotID; ///< Type for the unique identifier of depots. struct Depot; -static const DepotID INVALID_DEPOT = (DepotID)INVALID_STATION; +static const DepotID INVALID_DEPOT = UINT16_MAX; static const uint MAX_LENGTH_DEPOT_NAME_CHARS = 32; ///< The maximum length of a depot name in characters including '\0' From 96fdfb941a0c3f5e8f760b25000bad0ea5c68616 Mon Sep 17 00:00:00 2001 From: Richard Wheeler <2762690+zephyris@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:04:40 +0100 Subject: [PATCH 67/77] Feature: Transparency option for cost and income indicators (#11001) --- src/lang/english.txt | 2 +- src/texteff.cpp | 4 ++-- src/transparency.h | 2 +- src/transparency_gui.cpp | 8 ++++---- src/widget.cpp | 2 +- src/widgets/transparency_widget.h | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index aff4cbceec..caec9c7aa6 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2650,7 +2650,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle t STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. Ctrl+Click to lock STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. Ctrl+Click to lock STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. Ctrl+Click to lock -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Toggle transparency for loading indicators. Ctrl+Click to lock +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Toggle transparency for loading and cost/income text. Ctrl+Click to lock STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Set objects invisible instead of transparent # Linkgraph legend window diff --git a/src/texteff.cpp b/src/texteff.cpp index 43ece0fee7..2b15d68209 100644 --- a/src/texteff.cpp +++ b/src/texteff.cpp @@ -118,10 +118,10 @@ void DrawTextEffects(DrawPixelInfo *dpi) { /* Don't draw the text effects when zoomed out a lot */ if (dpi->zoom > ZOOM_LVL_OUT_8X) return; - + if (IsTransparencySet(TO_TEXT)) return; for (TextEffect &te : _text_effects) { if (te.string_id == INVALID_STRING_ID) continue; - if (te.mode == TE_RISING || (_settings_client.gui.loading_indicators && !IsTransparencySet(TO_LOADING))) { + if (te.mode == TE_RISING || _settings_client.gui.loading_indicators) { CopyInDParam(te.params); ViewportAddString(dpi, ZOOM_LVL_OUT_8X, &te, te.string_id, te.string_id - 1, STR_NULL); } diff --git a/src/transparency.h b/src/transparency.h index 54ba24e933..0c59dd1d71 100644 --- a/src/transparency.h +++ b/src/transparency.h @@ -28,7 +28,7 @@ enum TransparencyOption { TO_BRIDGES, ///< bridges TO_STRUCTURES, ///< other objects such as transmitters and lighthouses TO_CATENARY, ///< catenary - TO_LOADING, ///< loading indicators + TO_TEXT, ///< loading and cost/income text TO_END, TO_INVALID, ///< Invalid transparency option }; diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index 19b39f60fd..8c11803f07 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -50,7 +50,7 @@ public: case WID_TT_BRIDGES: case WID_TT_STRUCTURES: case WID_TT_CATENARY: - case WID_TT_LOADING: { + case WID_TT_TEXT: { uint i = widget - WID_TT_BEGIN; if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, r.left + WidgetDimensions::scaled.fullbevel.left, r.top + WidgetDimensions::scaled.fullbevel.top); break; @@ -58,7 +58,7 @@ public: case WID_TT_BUTTONS: { const Rect fr = r.Shrink(WidgetDimensions::scaled.framerect); for (uint i = WID_TT_BEGIN; i < WID_TT_END; i++) { - if (i == WID_TT_LOADING) continue; // Do not draw button for invisible loading indicators. + if (i == WID_TT_TEXT) continue; // Loading and cost/income text has no invisibility button. const Rect wr = this->GetWidget(i)->GetCurrentRect().Shrink(WidgetDimensions::scaled.fullbevel); DrawFrameRect(wr.left, fr.top, wr.right, fr.bottom, COLOUR_PALE_GREEN, @@ -90,7 +90,7 @@ public: break; } } - if (i == WID_TT_LOADING || i == WID_TT_END) return; + if (i == WID_TT_TEXT|| i == WID_TT_END) return; ToggleInvisibility((TransparencyOption)(i - WID_TT_BEGIN)); if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP); @@ -140,7 +140,7 @@ static const NWidgetPart _nested_transparency_widgets[] = { NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_BRIDGES), SetMinimalSize(43, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BRIDGE, STR_TRANSPARENT_BRIDGES_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_STRUCTURES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRANSMITTER, STR_TRANSPARENT_STRUCTURES_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_CATENARY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_BUILD_X_ELRAIL, STR_TRANSPARENT_CATENARY_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_LOADING), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRAINLIST, STR_TRANSPARENT_LOADING_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_TEXT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRAINLIST, STR_TRANSPARENT_TEXT_TOOLTIP), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 1), EndContainer(), EndContainer(), /* Panel with 'invisibility' buttons. */ diff --git a/src/widget.cpp b/src/widget.cpp index e41dd57cdc..5d2687f97a 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -2316,7 +2316,7 @@ void NWidgetViewport::Draw(const Window *w) if (this->disp_flags & ND_NO_TRANSPARENCY) { TransparencyOptionBits to_backup = _transparency_opt; - _transparency_opt &= (1 << TO_SIGNS) | (1 << TO_LOADING); // Disable all transparency, except textual stuff + _transparency_opt &= (1 << TO_SIGNS) | (1 << TO_TEXT); // Disable all transparency, except textual stuff w->DrawViewport(); _transparency_opt = to_backup; } else { diff --git a/src/widgets/transparency_widget.h b/src/widgets/transparency_widget.h index 2b096e733b..a187eeaa47 100644 --- a/src/widgets/transparency_widget.h +++ b/src/widgets/transparency_widget.h @@ -22,7 +22,7 @@ enum TransparencyToolbarWidgets { WID_TT_BRIDGES, ///< Bridges transparency toggle button. WID_TT_STRUCTURES, ///< Object structure transparency toggle button. WID_TT_CATENARY, ///< Catenary transparency toggle button. - WID_TT_LOADING, ///< Loading indicators transparency toggle button. + WID_TT_TEXT, ///< Loading and cost/income text transparency toggle button. WID_TT_END, ///< End of toggle buttons. /* Panel with buttons for invisibility */ From 6726918ab0eca180f1370a7071034c398f2bff51 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 25 Aug 2023 18:38:04 +0000 Subject: [PATCH 68/77] Update: Translations from eints catalan: 30 changes by J0anJosep --- src/lang/afrikaans.txt | 1 - src/lang/arabic_egypt.txt | 1 - src/lang/basque.txt | 1 - src/lang/belarusian.txt | 1 - src/lang/brazilian_portuguese.txt | 1 - src/lang/bulgarian.txt | 1 - src/lang/catalan.txt | 39 ++++++++++++++++++++++++------- src/lang/croatian.txt | 1 - src/lang/czech.txt | 1 - src/lang/danish.txt | 1 - src/lang/dutch.txt | 1 - src/lang/english_AU.txt | 1 - src/lang/english_US.txt | 1 - src/lang/esperanto.txt | 1 - src/lang/estonian.txt | 1 - src/lang/faroese.txt | 1 - src/lang/finnish.txt | 1 - src/lang/french.txt | 1 - src/lang/gaelic.txt | 1 - src/lang/galician.txt | 1 - src/lang/german.txt | 1 - src/lang/greek.txt | 1 - src/lang/hebrew.txt | 1 - src/lang/hungarian.txt | 1 - src/lang/icelandic.txt | 1 - src/lang/indonesian.txt | 1 - src/lang/irish.txt | 1 - src/lang/italian.txt | 1 - src/lang/japanese.txt | 1 - src/lang/korean.txt | 1 - src/lang/latin.txt | 1 - src/lang/latvian.txt | 1 - src/lang/lithuanian.txt | 1 - src/lang/luxembourgish.txt | 1 - src/lang/malay.txt | 1 - src/lang/norwegian_bokmal.txt | 1 - src/lang/norwegian_nynorsk.txt | 1 - src/lang/persian.txt | 1 - src/lang/polish.txt | 1 - src/lang/portuguese.txt | 1 - src/lang/romanian.txt | 1 - src/lang/russian.txt | 1 - src/lang/serbian.txt | 1 - src/lang/simplified_chinese.txt | 1 - src/lang/slovak.txt | 1 - src/lang/slovenian.txt | 1 - src/lang/spanish.txt | 1 - src/lang/spanish_MX.txt | 1 - src/lang/swedish.txt | 1 - src/lang/thai.txt | 1 - src/lang/traditional_chinese.txt | 1 - src/lang/turkish.txt | 1 - src/lang/ukrainian.txt | 1 - src/lang/urdu.txt | 1 - src/lang/vietnamese.txt | 1 - src/lang/welsh.txt | 1 - 56 files changed, 30 insertions(+), 64 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 59714d273f..9e8347e53c 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -2373,7 +2373,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Skakel d STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Wissel deursigtigheid vir brûe. Ctrl+klik om te sluit STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Wissel deursigtigheid vir strukture soos vuurtorings en seintorings. Ctrl+klik om te sluit STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Wissel deursigtigheid van kraglyne. Ctrl+klik om te sluit. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Wissel deursigtigheid vir laai aanwysers. Ctrl+klik om te sluit STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Stel voorwerpe onsigbaar inplaas van deursigtig # Linkgraph legend window diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index c7c5f93114..6bf4abe1cb 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -2186,7 +2186,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}بدل STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK} بدل الشفافية للجسور. مفتاح كنترول للاغلاق. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}بدل بين الشفافية للعلامات مثل المنارات الضوئية و هواائيات الارسال. مفتاح كنترول لالغلاق. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK} غير شفافية سكك الحديد. مفتاح كنترول للاغلاق. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}غير الشفافية لنسبة التحميل. مفتاح كنترول للاغلاق. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}اخفاء الاجرام تماما بدلا من الشفافية # Linkgraph legend window diff --git a/src/lang/basque.txt b/src/lang/basque.txt index cdefc5239e..a1d2cfd6fc 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -2255,7 +2255,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Geltoki, STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Zubien gardentasuna aldatu. Ktrl+Klik blokeatzeko STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Itsasargi eta antenen gardentasuna aldatu. Ktrl+Klik blokeatzeko STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}katenariaren gardentasuna aldatu. Ktrl+Klik blokeatzeko -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Zama adierazleen gardentasuna aldatu. Ktrl+Klik blokeatzeko STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Objektuak ikusezinak egin, gardenak izan ordez # Linkgraph legend window diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 5f51182085..6ba80ca5f0 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -2720,7 +2720,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Пера STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Пераключыць празрыстасьць для мастоў. Ctrl+клік — заблякаваць. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Пераключыць празрыстасьць для пабудоў кшталту маякоў і антэнаў. Ctrl+клік — заблякаваць. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Пераключыць празрыстасьць для кантактнай сеткі. Ctrl+клік — заблякаваць. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Пераключыць празрыстасьць для індыкатараў загрузкі. Ctrl+клік — заблякаваць. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Зрабіць аб'екты не празрыстымі, а цалкам нябачнымі # Linkgraph legend window diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index e5a882b0ea..088329bef8 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Alternar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Alternar transparência para pontes. Ctrl+Clique para travar STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Alternar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Alternar transparência para catenária. Ctrl+Clique para travar -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Altera transparência para os indicadores de carga. Ctrl+Clique para travar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetivos como invisíveis ao invés de transparentes. # Linkgraph legend window diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 940c155b43..fd075afa52 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -2300,7 +2300,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Изпо STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Използвай прозрачност за мостове. Ctrl+Click за заключване STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Използвай прозрачност за сгради като фарове и антени, може би в бъдеще за украси STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Активирай прозрачност за висящите. CTRL+клик за фиксиране. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Вклучи прозрачност за товарещи указатели. Ctrl+Click за заключване STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Направи обектите невидими вместо прозрачни # Linkgraph legend window diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 9f0fbcdfcd..e2de39349c 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -192,6 +192,23 @@ STR_COLOUR_WHITE :{G=Masculin}Bla STR_COLOUR_RANDOM :Aleatori ###length 17 +STR_COLOUR_SECONDARY_DARK_BLUE :Blau marí +STR_COLOUR_SECONDARY_PALE_GREEN :Verd clar +STR_COLOUR_SECONDARY_SECONDARY_PINK :Rosa +STR_COLOUR_SECONDARY_YELLOW :Groc +STR_COLOUR_SECONDARY_RED :Roig +STR_COLOUR_SECONDARY_LIGHT_BLUE :Blau cel +STR_COLOUR_SECONDARY_GREEN :Verd +STR_COLOUR_SECONDARY_DARK_GREEN :Verd fosc +STR_COLOUR_SECONDARY_BLUE :Blau +STR_COLOUR_SECONDARY_CREAM :Crema +STR_COLOUR_SECONDARY_MAUVE :Malva +STR_COLOUR_SECONDARY_PURPLE :Porpra +STR_COLOUR_SECONDARY_ORANGE :Taronja +STR_COLOUR_SECONDARY_BROWN :Marró +STR_COLOUR_SECONDARY_GREY :Gris +STR_COLOUR_SECONDARY_WHITE :Blanc +STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :El mateix que el primari # Units used in OpenTTD @@ -1367,7 +1384,7 @@ STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :«Sense parada STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalment, un vehicle para a cada estació per la que passa. Activant aquest paràmetre, no pararà a cap estació fins arribar al seu destí. Nota: aquest paràmetre només defineix el valor predeterminat per a les noves ordres. Un cop creada una ordre, aquesta es pot establir manualment al comportament desitjat. STR_CONFIG_SETTING_STOP_LOCATION :Noves ordres de trens: parar per defecte {STRING} de la plataforma -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Estableix en quin lloc de la plataforma els trens pararan per defecte. «Extrem més proper» significa a prop del punt d'entrada, «Al mig» significa al mig de la plataforma, i «Extrem més llunyà» significa lluny del punt d'entrada. Nota: aquest paràmetre només defineix el valor predeterminat per les noves ordres. Un cop creada una ordre, es pot modificar el comportament de forma manual. +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Estableix en quin lloc de la plataforma els trens pararan per defecte. «Extrem més proper» significa a prop del punt d'entrada, «Al mig» significa al mig de la plataforma, i «Extrem més llunyà» significa lluny del punt d'entrada. Nota: aquest paràmetre només defineix el valor predeterminat per les noves ordres. Un cop creada una ordre, es pot modificar el lloc de parada a la plataforma si es fa clic al text de l'ordre. ###length 3 STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :A l'extrem més proper STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :Al mig @@ -1410,8 +1427,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Cap* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reduït STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permet situar parades en carreteres que són propietat de la població: {STRING} -STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permet la construcció de passos a nivell en els carrers propietat de les poblacions +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permet situar parades en carreteres que són propietat de les poblacions: {STRING} +STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permet la construcció de passos a nivell als carrers propietat de les poblacions STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permet circular a través de les parades en carreteres propietat de competidors: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Permet la construcció de passos a nivell en els carrers propietat d'altres companyies STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}No es pot canviar aquest ajustament quan hi ha vehicles @@ -1422,6 +1439,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Quan està acti STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la companyia: {STRING} STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Escolliu el color inicial de la vostra companyia. +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundari inicial de la companyia: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Escolliu un color secundari inicial per a la companyia, per si feu servir un NewGRF que l'habiliti. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Els aeroports mai caduquen: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activant aquesta opció fa que cada tipus d'aeroport estigui disponible per sempre després de la seva introducció @@ -1624,6 +1643,9 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Desactivat STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Tanca la finestra amb un clic dret del ratolí: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Tanca una finestra fent-hi un clic amb el botó dret del ratolí. Aquesta opció desactiva els indicadors de funció amb el mateix botó. ###length 3 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :No +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :Sí +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Sí, excepte les finestres enganxades STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Utilitza el format de data {STRING} per a guardar partides STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Format de la data en els noms dels arxius de les partides que es guardin @@ -1875,8 +1897,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permet a les po STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Les poblacions poden construir passos a nivell: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Activant aquesta opció, les poblacions podran construir passos a nivell. -STR_CONFIG_SETTING_NOISE_LEVEL :Permet a la ciutat controlar el nivell de soroll dels aeroports: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Amb aquesta opció desactivada, no podran haver-hi més de dos aeroports en una mateixa població. Amb aquesta opció activada, el nombre d'aeroports en cada població està limitat pel límit d'acceptació de soroll de la població, que depèn de la mida de l'aeroport i de la distància +STR_CONFIG_SETTING_NOISE_LEVEL :Limita la construcció d'aeroports segons el nivell de soroll: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Permet que les poblacions puguin impedir la construcció d'aeroports a la seva zona en funció del nivell de soroll tolerat, que es basa amb el nombre d'habitants de la població i de la distància i característiques de l'aeroport. Si es desactiva, les poblacions només permetran que es construeixin dos aeroports a la seva zona, excepte si s'estableix l'actitud de l'autoritat local a "Permissiva". STR_CONFIG_SETTING_TOWN_FOUNDING :Fundar poblacions durant la partida: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Activant aquesta opció permets els jugadors fundar noves poblacions durant la partida @@ -2629,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Commuta STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Commuta la transparència dels ponts. Ctrl+Clic per bloquejar STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Commuta la transparència de les estructures com ara fars i antenes. Ctrl+Clic per bloquejar STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Commuta la transparència de la catenària. CTRL+clic per bloquejar -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Commuta la transparència dels indicadors de càrrega. Ctrl+Clic per bloquejar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Alternar entre transparència i invisibilitat dels objectes # Linkgraph legend window @@ -2941,8 +2962,8 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Treu tot STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Esteu segur que voleu treure totes les indústries? # Industry cargoes window -STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial ‒ {STRING} -STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena de càrrega ‒ {STRING} +STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadena industrial - {STRING} +STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadena de càrrega - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Indústries productores STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústries acceptades STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Cases @@ -4867,7 +4888,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Masses e STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Massa prop d'un altre moll STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Massa prop d'un altre aeroport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}No es pot canviar el nom de l'estació... -STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... aquesta carretera és propietat de la població +STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... aquesta carretera és propietat d'una població. STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... sentit de la carretera en la direcció incorrecta STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les estacions d'autobús de pas no poden tenir cantonades STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les estacions d'autobús de pas no poden tenir interseccions diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index c714c04e30..79b31977ab 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -2516,7 +2516,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Namjesti STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Namjesti prozirnost za mostove. Ctrl+klik za zaključavanje STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Namjesti prozirnost za strukture poput svjetionika i antena. Ctrl+klik za zaključavanje. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Aktiviraj prozirnost za viseće žice. Ctrl+klik za zaključavanje -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Namjesti prozirnost za indikatore učitavanja. Ctrl+klik za zaključavanje STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Učini objekte nevidljivima umjesto prozirnima # Linkgraph legend window diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 3fb91a4f80..81e9f02e7d 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -2686,7 +2686,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Změna p STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Změna průhlednosti mostů. Nastavení se zamkne Ctrl+kliknutím STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Změna průhlednosti staveb jako majáků a vysílačů. Nastavení se zamkne Ctrl+kliknutím STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Změna průhlednosti elektrifikace. Nastavení se zamkne Ctrl+kliknutím -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Přepnout zobrazení ukazatelů naložení. Nastavení se zamkne Ctrl+kliknutím STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Objekty budou neviditelné, ne průhledné # Linkgraph legend window diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 20094ad8a7..b1e848f3e5 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Skift ge STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Skift gennemsigtighed for broer. CTRL+Klik for at låse værdi. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Skift gennemsigtighed for strukturer som fyrtårne og antenner. CTRL+Klik for at låse værdi. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Slå transparens til/fra for køreledninger. CTRL+klik for at låse. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Slå gennemsigtighed til/fra for laste-indikatorer. CTRL+Klik for at låse værdi. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gør objekter usynlige i stedet for gennemsigtige # Linkgraph legend window diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index f6485e3dcb..80f03de4a3 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Transparantie voor bruggen aan-uit. Ctrl+klik om vast te zetten. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Transparantie voor gebouwen zoals vuurtorens en zendmasten aan-uit. Ctrl+klik om vast te zetten. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Transparantie voor bovenleiding aan-uit. Ctrl+klik om vast te zetten. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transparantie voor laadpercentages aan-uit. Ctrl+klik om vast te zetten. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Maak objecten onzichtbaar in plaats van transparant # Linkgraph legend window diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 0c8590bb93..2208bff100 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle t STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. Ctrl+Click to lock STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. Ctrl+Click to lock STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. Ctrl+Click to lock -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Toggle transparency for loading indicators. Ctrl+Click to lock STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Set objects invisible instead of transparent # Linkgraph legend window diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index c3de356d7b..ca1a68438f 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle t STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. Ctrl+Click to lock STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. Ctrl+Click to lock STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. Ctrl+Click to lock -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Toggle transparency for loading indicators. Ctrl+Click to lock STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Set objects invisible instead of transparent # Linkgraph legend window diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index ac1512ad0d..29d6dc06b9 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -2639,7 +2639,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Baskulig STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Baskuligi travideblecon de pontoj. Ctrl+Klaku por ŝlosi STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Baskuligi travideblecon de aĵoj kiel lumturoj kaj antenoj. Ctrl+Klaku por ŝlosi STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Baskuligi travideblecon de katenarion. Ctrl+Klaku por ŝlosi -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Baskuligi travideblecon de ŝarĝindikiloj. Ctrl+Klaku por ŝlosi STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Igu objektojn nevideblaj anstataŭ travideblaj # Linkgraph legend window diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index c32fff8305..bd31b8ea35 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -2641,7 +2641,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Vaheta l STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Vaheta sildade läbipaistvust. Ctrl+klõps lukustab STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Vaheta läbipaistvust rajatistel, nagu majakad ja antennid. Ctrl+klõps lukustab STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Õhuliinide läbipaistvuse vahetamine. Ctrl+klõps lukustab -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Vaheta laadimisnäidikute läbipaistvust. Ctrl+klõps lukustab STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Muuda esemed nähtamatuks, mitte läbipaistvaks # Linkgraph legend window diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 5714c6121d..996ae6b458 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -2168,7 +2168,6 @@ STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Tendra/s STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Tendra/sløkk gjøgnumskygni fyri brúgvar. Ctrl+trýst fyri at læsa STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Tendra/sløkk gjøgnumskygni fyri konstruktiónir sum vitar og antennur. Ctrl+trýst fyri at læsa STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Tendra/sløkk gjøgnumskygni fyri ketulinju. Ctrl+trýst fyri at læsa -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Tendra/sløkk gjøgnumskygni fyri lessingar vísarar. Ctrl+trýst fyri at læsa STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ger lutir ósjónligar heldur enn gjøgnumskygdar # Linkgraph legend window diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index cda9c29ad6..a1e09de5fd 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Muuta as STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Muuta siltojen läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Muuta majakoiden ja lähetysmastojen tapaisten rakennelmien läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Muuta sähköratarakenteiden läpinäkyvyyttä. Ctrl+napsautus lukitsee. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Muuta lastausilmaisimien läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Tee kohteista läpinäkyvyyden sijaan näkymättömiä # Linkgraph legend window diff --git a/src/lang/french.txt b/src/lang/french.txt index c7c7451035..d46826529d 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Transparence des ponts.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Transparence des structures telles que phares et antennes.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Transparence des caténaires.{}Ctrl-clic pour verrouiller. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transparence des indicateurs de chargement.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Alterner entre transparence et invisibilité des objets # Linkgraph legend window diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index da8c7156e9..fe7dd8ddd8 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -2543,7 +2543,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toglaich STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toglaich trìd-shoilleireachd nan drochaidean. Ctrl+Briogadh airson glasadh STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toglaich trìd-shoilleireachd nan structaran a leithid thaighean-solais is tùir chraobh-sgaoilidh. Ctrl+Briogadh airson glasadh STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toglaich trìd-shoilleireachd nan càballan-rèile. Ctrl+Briogadh airson glasadh -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Toglaich trìd-shoillearachd nan comharraidhean luchdaidh. Ctrl+Briogadh airson glasadh STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Falaich nithean an àite an dèanamh trìd-shoilleir # Linkgraph legend window diff --git a/src/lang/galician.txt b/src/lang/galician.txt index f4fdc974a7..bf259dd793 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -2626,7 +2626,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Habilita STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Habilitar transparencia para as pontes. CTRL+Click para bloquear STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Habilitar transparencia para estruturas coma faros e antenas. CTRL+Click para bloquear STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Activar a transparencia para a catenaria. CTRL+Click para bloquear -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Activar transparencia para os indicadores de carga. CTRL+Click para bloquear STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Facer os obxectos invisibles en lugar de transparentes # Linkgraph legend window diff --git a/src/lang/german.txt b/src/lang/german.txt index 2e789b9510..1b17160338 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Transparenz für Brücken einstellen. Strg+Klick, um Umschalten zu verhindern bzw. wieder zu erlauben STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Transparenz für Bauten wie Leuchttürme und Sendemasten einstellen. Strg+Klick, um Umschalten zu verhindern bzw. wieder zu erlauben STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Transparenz für Oberleitungen einstellen. Strg+Klick, um Umschalten zu verhindern bzw. wieder zu erlauben -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transparenz für Ladestandsanzeige einstellen. Strg+Klick, um Umschalten zu verhindern bzw. wieder zu erlauben STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Objekte unsichtbar statt transparent machen # Linkgraph legend window diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 29b43535d6..9d2593360e 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -2688,7 +2688,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Εναλ STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για γέφυρες. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για κτίρια όπως φάρους και κεραίες. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για τις συνδέσεις. Ctrl+Κλικ για να την κλειδώσετε -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Εναλλαγή διαφάνειας για τις ενδείξεις φόρτωσης. Ctrl+Κλικ για να την κλειδώσετε STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Επιλέξτε τα αντικείμενα που θα είναι αόρατα αντί για διάφανα # Linkgraph legend window diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index bcabee652d..1d2559b2c8 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -2425,7 +2425,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}שנה STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}שנה שקיפות עבור גשרים. Ctrl+לחיצה לנעילה STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}שנה שקיפות עבור מבנים כגון מיגדלור ואנטנה. Ctrl+לחיצה לנעילה STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}שנה שקיפות עבור עמודי חשמל. Ctrl+לחיצה לנעילה -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}שנה שקיפות עבור מצביעי הטענה. Ctrl+לחיצה לנעילה STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}הסתר במקום הפוך לשקוף # Linkgraph legend window diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 29101f4f23..5c682de726 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -2674,7 +2674,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Építhe STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Hidak átlátszóságának bekapcsolása. Ctrl+kattintással zárolható STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Tereptárgyak (adótornyok, világítótornyok stb.) átlátszóságának bekapcsolása. Ctrl+kattintással zárolható STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Felsővezetékek átlátszóságának bekapcsolása. Ctrl+kattintással zárolható -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Átlátszó rakodásjelző bekapcsolása. Ctrl+kattintással zárolható STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Az objektum ne átlátszó legyen, hanem láthatatlan # Linkgraph legend window diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 59596642fd..99ccc532a9 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -2207,7 +2207,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Virkja/a STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Virkja/afvirkja gegnsæji brúa. Ctrl+smella til að læsa STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Virkja/afvirkja gegnsæji bygginga á borð við vita og möstur. Ctrl+smella til að læsa STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Virkja/afvirkja gegnsæji raflína. CTRL+smella til að læsa. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Virkja/afvirkja gegnsæji hleðslumæla. Ctrl+smella til að læsa STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gera hluti ósýnilega en ekki gagnsæja # Linkgraph legend window diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index fc162bc7c5..ce85731162 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -2616,7 +2616,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Hidup/ma STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Hidup/matikan transparansi jembatan. CTRL+klik untuk mengunci STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Hidup/matikan transparansi struktur bangunan semacam mercusuar dan antena. CTRL+klik untuk mengunci STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Hidup/matikan transparansi katenari CTRL+klik untuk mengunci -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Hidup/matikan indikator proses pemuatan kargo. CTRL+klik untuk mengunci STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Atur obyek menjadi sama sekali tidak nampak daripada transparan. # Linkgraph legend window diff --git a/src/lang/irish.txt b/src/lang/irish.txt index bd1e8c1dc0..df23eb316d 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -2539,7 +2539,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Scorána STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Scoránaigh trédhearcacht do dhroichid. Ctrl+Cliceáil le glasáil. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Scoránaigh trédhearcacht do struchtúir cosúil le tithe solais agus aeróga. Ctrl+Cliceáil le glasáil. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Scoránaigh trédhearcacht do chuair. Ctrl+Cliceáil le glasáil. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Scoránaigh trédhearcacht do tháscairí lódála. Ctrl+Cliceáil le glasáil. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Socraigh go bhfuil nithe dofheicthe seachas trédhearcach # Linkgraph legend window diff --git a/src/lang/italian.txt b/src/lang/italian.txt index d36d2dbe71..a22164fd36 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -2685,7 +2685,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Attiva/d STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Attiva/disattiva la trasparenza dei ponti. CTRL+clic per bloccare STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Attiva/disattiva la trasparenza di strutture come fari e antenne. CTRL+clic per bloccare STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Attiva/disattiva la trasparenza delle catenarie. CTRL+clic per bloccare -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Attiva/disattiva la trasparenza degli indicatori di caricamento. CTRL+clic per bloccare STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Rendi gli oggetti invisibili invece che trasparenti # Linkgraph legend window diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index b65f573c8a..227fae7bed 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -2611,7 +2611,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}社有 STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}橋の透過表示を切り替えます。{}Ctrl+クリックでロックします STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}灯台、電波塔などの透過表示を切り替えます。{}Ctrl+クリックでロックします STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}架線の透過表示を切り替えます。{}Ctrl+クリックでロックします -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}積み降ろしインジケーターの透過表示を切り替えます。{}Ctrl+クリックでロックします STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}透過表示でなく表示オフにする # Linkgraph legend window diff --git a/src/lang/korean.txt b/src/lang/korean.txt index b1aa649ee6..6119ef5f76 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}정거 STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}다리를 보여줄 지 선택합니다. 고정하려면 CTRL+클릭하세요 STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}등대나 안테나 같은 구조물을 보여줄 지 선택합니다. 고정하려면 CTRL+클릭하세요 STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}전차선을 보여줄 지 선택합니다. 고정하려면 CTRL+클릭하세요 -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}적재율을 보여줄 지 선택합니다. 고정하려면 CTRL+클릭하세요 STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}반투명 대신 아예 안 보이게 할 항목을 선택하세요 # Linkgraph legend window diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 7ff5371534..2098840297 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -2555,7 +2555,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Mutare p STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Mutare perluciditatem pontium. Ctrl+Preme ut figatur (non mutabitur globulo perluciditatem mutandi presso) STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Mutare perluciditatem ornamentorum sicut phari et emissoria. Ctrl+Preme ut figatur (non mutabitur globulo perluciditatem mutandi presso) STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Mutare perluciditatem catenariae. Ctrl+Preme ut figatur (non mutabitur globulo perluciditatem mutandi presso) -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Mutare perluciditatem signorum onerandi. Ctrl+Preme ut figatur (non mutabitur globulo perluciditatem mutandi presso) STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Facere ut res invisibles sint, non tantum perlucidae # Linkgraph legend window diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 7a455d05fc..c6147b4e24 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -2588,7 +2588,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Pārslē STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Pārslēgt tiltu caurspīdību. Ctrl+klikšķis, lai slēgtu STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Pārslēgt caurspīdību tādām celtnēm kā bākas un antenas. Ctrl+klikšķis, lai slēgtu STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Pārslēgt piekartroses caurspīdību. Ctrl+klikšķis, lai slēgtu -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Pārslēgt piekraušanas rādītāju caurspīdību. Ctrl+klikšķis, lai slēgtu STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Caurspīdības vietā objektus padarīt neredzamus # Linkgraph legend window diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index a8eac2c1de..e22539d671 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -2755,7 +2755,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Perjungt STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Perjungti tiltų skaidrumą. Spragtelėjus laikant nuspaustą Ctrl klavišą, nuostata bus užrakinta STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Perjungti švyturių, siųstuvų ir panašių statinių skaidrumą. Spragtelėjus laikant nuspaustą Ctrl klavišą, nuostata bus užrakinta STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Perjungti laidų skaidrumą. Spragtelėjus laikant nuspaustą Ctrl klavišą, nuostata bus užrakinta -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Perjungti krovos indikatorių skaidrumą. Spragtelėjus laikant nuspaustą Ctrl klavišą, nuostata bus užrakinta STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Pasirinkti tarp skaidrių ir nematomų objektų # Linkgraph legend window diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index a9512be084..0386f7498f 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -2584,7 +2584,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Wiesselt STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Wiesselt d'Transparenz fir d'Brécken. Ctrl+Klick fir festzesetzen STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Wiesselt d'Transparenz fir d'Gebaier wéi d'Liichttierm oder Antennen. Ctrl+Klick fir festzesetzen STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Wiesselt d'Transparenz fir d'Catenaire. Ctrl+Klick fir festzesetzen -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Wiesselt d'Transparenz fir d'Luedungsindikatoren. Ctrl+Klick fir festzesetzen STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Setzt d'Objeten op onsichtbar amplaz transparent # Linkgraph legend window diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 9f76b33316..a7df785386 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -2100,7 +2100,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Teluskan STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Teluskan jambatan atau tidak. Ctrl+Klik untuk mengunci STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Teluskan objek seperti rumah api atau menara pemancar. Ctrl+Klik untuk mengunci STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Teluskan sistem aliran elektrik atau tidak. Ctrl+Klik untuk mengunci -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Teluskan penunjuk muatan atau tidak. Ctrl+Klik untuk mengunci STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ghaibkan objek dan bukan telus # Linkgraph legend window diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 2326d60352..9755ceadff 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2556,7 +2556,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Gjennoms STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Gjennomsiktige broer. Ctrl+klikk for å låse STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Gjennomsiktige bygg som fyrtårn og antenner. Ctrl+klikk for å låse STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Gjennomsiktige kontaktledninger. Ctrl+klikk for å låse -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Gjennomsiktige lastingsindikatorer. Ctrl+klikk for å låse STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gjør objekter usynlige i stedet for gjennomsiktige # Linkgraph legend window diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 88751bcca7..578b9d1b10 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -2262,7 +2262,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Byt gjen STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Byt gjennomsyn for bruer. Ctrl+klikk for å låsa. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Byt gjennomsyn for bygningar, som fyrtårn og antenner. Ctrl+klikk for å låsa. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Byt gjennomsyn for kjeder. Ctrl+klikk for å låsa. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Byt gjennomsyn for lasteindikatorar. Ctrl+klikk for å låsa. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gjer objekter usynlege istanden for gjennomsiktige # Linkgraph legend window diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 5b29a1ac12..feaf8a2d2e 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -2065,7 +2065,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}فعال STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}فعال/غیر فعال کردن شفافیت برای پل ها. کنترل+کلیک برای قفل کردن STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}فعال/غیر فعال کردن شفافیت برای دستگاه ها نظیر فانوس دریایی و آنتن ها.کنترل+کلیک برای قفل کردن STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}فعال/غیر فعال کردن شفافیت برای جاده ها و ریل ها.کنترل+کلیک برای قفل کردن -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}فعال/غیر فعال کردن شفافیت برای نشانه پر و خالی شدن بار. کنترل+کلیک برای قفل کردن STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}اشیاء به جای شفاف، نامرئی شوند # Linkgraph legend window diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 57d5bc2a2d..563e6f1f4c 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3030,7 +3030,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Przełą STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla mostów. Ctrl+klik, aby zablokować STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla obiektów takich jak latarnie morskie i anteny. Ctrl+klik, aby zablokować STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Przełącz przeźroczystość dla trakcji (linii nośnych). Ctrl+klik, aby zablokować -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Przełącz przeźroczystość dla wskaźników załadunku. Ctrl+klik, aby zablokować STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ustaw obiekty jako niewidoczne zamiast przeźroczyste # Linkgraph legend window diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index ef9c7c395d..0734998673 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Comutar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Comutar transparência para pontes. Ctrl+Clique para bloquear. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Comutar transparência para estruturas como faróis-terrestres e antenas. Ctrl+Clique parabloquear. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Comutar transparência para catenária. Ctrl+Clique para bloquear. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Alterar transparência para indicadores de carga. Ctrl+Clique para bloquear. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objectos como invisíveis em vez de transparentes # Linkgraph legend window diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index db8a4cc4d3..0a06468da4 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -2649,7 +2649,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Comută STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Comută transparenţa pentru poduri. Ctrl+Click pentru blocare STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Comută transparenţa pentru structuri de tip faruri şi antene. Ctrl+Click pentru blocare STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Comută transparenţa pentru catenar. Ctrl+Click pentru blocare -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Comută transparenţa pentru indicatorii de încarcare. Ctrl+Click pentru blocare STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Setează obiectele ca invizibile în loc de transparente # Linkgraph legend window diff --git a/src/lang/russian.txt b/src/lang/russian.txt index ed66b9e6b7..1f8b208ecc 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2813,7 +2813,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Пере STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Переключение прозрачности мостов. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Переключение прозрачности таких сооружений, как маяки и антенны. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Переключение прозрачности контактной сети. Ctrl+щелчок - заблокировать. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Переключение прозрачности индикаторов загрузки. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Сделать объекты не прозрачными, а полностью невидимыми # Linkgraph legend window diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 698cd4d34a..db010ee6d2 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -2777,7 +2777,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Promena STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Promena prozirnosti mostova. Sa Ctrl+klik se zaključava STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Promena prozirnosti građevina poput svetionika i repetitora. Sa Ctrl+klik se zaključava STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Promena prozirnosti kontaktnih mreža. Sa Ctrl+klik se zaključava -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Promena prozirnosti pokazatelja utovara. Sa Ctrl+klik se zaključava STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Čini objekte nevidljivim umesto prozirnim # Linkgraph legend window diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index c995310513..3ab1d4a9df 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -2585,7 +2585,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}调整 STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}调整桥梁是否为透明{}CTRL+点击 锁定 STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}调整灯塔及信号发射塔是否为透明{}CTRL+点击 锁定 STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}调整电气铁路电线是否为透明{}CTRL+点击 锁定 -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}调整装载进度显示是否为透明{}CTRL+点击 锁定 STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}选择设置为:不显示或透明 # Linkgraph legend window diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 43c4dc913b..30a0de0918 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -2695,7 +2695,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Prepnú STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Prepnúť priehľadnosť mostov. Ctrl+klik uzamkne nastavenie STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Prepnúť priehľadnosť objektov ako sú majáky a vysielače. Ctrl+klik uzamkne nastavenie STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Prepnúť priehľadnosť trakčného vedenia. Ctrl+klik uzamkne nastavenie -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Prepnúť priehľadnosť ukazateľov nakladania. Ctrl+klik uzamkne nastavenie STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Nastaviť objekty neviditeľné namiesto priehľadných # Linkgraph legend window diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index fd6b1c4d6f..d9100f8f66 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -2500,7 +2500,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Prozoren STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Prozoren ali navaden pogled mostov. Ctrl+Klik za zaklepanje STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Prozoren ali navaden pogled struktur kot so antene, svetilniki... Ctrl+Klik za zaklepanje STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Preklop prosojnosti za pogone. Ctrl+Klik za zaklepanje -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Preklop na prosojnost za prikaz polnenja. Ctrl+Klik za zaklepanje STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Nastavi predmete nevidne namesto prosojne # Linkgraph legend window diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 7592c1af15..5cde0e9f2c 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -2585,7 +2585,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Ajustar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Ajustar transparencia para puentes. Ctrl+clic para bloquear STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Ajustar transparencia para estructuras como faros o antenas. Ctrl+clic para bloquear STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Ajustar transparencia para catenaria. Ctrl+clic para bloquear -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Ajustar transparencia para los indicadores de carga. Ctrl+clic para bloquear STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Establece los objetos como invisibles en vez de transparentes # Linkgraph legend window diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 7fa844874a..e06a453645 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -2585,7 +2585,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Transparencia de puentes. Ctrl+Clic para bloquear STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Transparencia de estructuras como faros o antenas. Ctrl+Clic para bloquear STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Transparencia de catenaria. Ctrl+Clic para bloquear -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transparencia de indicadores de embarque. Ctrl+Clic para bloquear STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ocultar objetos totalmente # Linkgraph legend window diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 363884445a..a8516f2e3a 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Växla g STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Växla genomskinlighet för broar. Ctrl+klick för att låsa STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Växla genomskinlighet för byggnader såsom fyrar och antenner. Ctrl+klick för att låsa STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Växla genomskinlighet för kontaktledning. Ctrl+klick för att låsa -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Växla genomskinlighet för lastningsindikatorer. Ctrl+klick för att låsa STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gör object osynliga istället för genomskinliga # Linkgraph legend window diff --git a/src/lang/thai.txt b/src/lang/thai.txt index bcca4f91be..d865b51cbb 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -2396,7 +2396,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}เป STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}เปิด/ปิด การโปร่งใสของสะพาน. กด Ctrl+Click สำหรับการล็อก STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}เปิด/ปิด การโปร่งใสของสิ่งปลูกสร้างอย่างเช่น ประภาคารและเสาส่งสัญญาณวิทยุ. กด Ctrl+Click สำหรับการล็อก STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}เปิด/ปิด การโปร่งใสของสายจ่ายไฟรถไฟฟ้า. กด Ctrl+Click สำหรับการล็อก -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}เปิด/ปิด การโปร่งใสของตัวบอกการบรรทุกของ. กด Ctrl+Click สำหรับการล็อก STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}ตั้งให้วัตถุมองไม่เห็นแทนการโปร่งใส # Linkgraph legend window diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 50a895d12f..e051a6c260 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -2586,7 +2586,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}切換 STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}切換橋樑是否透明。按住 CTRL 點選可鎖定 STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}切換公用設施是否透明,如燈塔、天線塔等。按住 CTRL 點選可鎖定 STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}切換供電線是否透明。按住 CTRL 點選可鎖定 -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}切換裝載進度指示是否透明。按住 CTRL 點選可鎖定 STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}讓物件完全隱藏,而非透明顯示 # Linkgraph legend window diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index eae30dd054..448ea888ac 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2651,7 +2651,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}İstasyo STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Köprüler için şeffaflık. Kilitlemek için Ctrl ile tıklayın STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Antenler ve deniz fenerleri için şeffaflık. Kilitlemek için Ctrl ile tıklayın STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Tren elektrik hatları için şeffaflığı aç/kapat. Kilitlemek için Ctrl ile tıklayın -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transparan yükleme göstergesi. Kilitlemek için Ctrl ile tıklayın STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Nesneleri şeffaf değil görünmez yap # Linkgraph legend window diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index e6fdcb52e1..43eb39c60d 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -2738,7 +2738,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Пере STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Переключити прозорість для мостів. Утримуйте Ctrl, щоб заблокувати STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Переключити прозорість для споруд, таких як маяки та антени. Утримуйте Ctrl, щоб заблокувати STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Переключити прозорість для ЛЕП. Утримуйте Ctrl, щоб заблокувати -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Змінити прозорість індикаторів завантаження. Утримуйте Ctrl, щоб заблокувати STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Зробити об'єкти невидимими, а не прозорими # Linkgraph legend window diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 3f2b7a2c39..edf2f30855 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1955,7 +1955,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}تعمی STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}پلوں کی شفافیت کی تدویم کریں۔ محدوظ کرنے کے لئے Ctrl+Click دبائیں STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}بنیادی ڈھانچوں کی شفافیت کی تدویم کریں۔ محدوظ کرنے کے لئے Ctrl+Click دبائیں STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}catenary کی شفافیت کی تدویم کریں۔ محدوظ کرنے کے لئے Ctrl+Click دبائیں -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}لوڈ کرنے کے نشانوں کی شفافیت کی تدویم کریں۔ محدوظ کرنے کے لئے Ctrl+Click دبائیں STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}چیزوں کو شفاف کی بجائے غائب کر دیں # Linkgraph legend window diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 2b2d5d8791..df19d6e25f 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -2650,7 +2650,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Bật hi STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Bật hiệu ứng trong suốt cho cầu. Ctrl+Click để khoá. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Bật hiệu ứng trong suốt cho đèn biển, ăn-ten... Ctrl+Click để khoá. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Bật hiệu ứng trong suốt cho các mắt xích. Ctrl+Click để khoá. -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Bật hiệu ứng trong suốt cho bảng báo hiệu nạp. Ctrl+Click để khoá. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Đặt các đối ẩn đi thay vì trong suốt # Linkgraph legend window diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index c782b95256..95035f7fbf 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -2418,7 +2418,6 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toglu tr STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toglu tryloywder ar gyfer pontydd. Ctrl+Clic i gloi STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toglu tryloywder ar gyfer adeiledau fel goleudai ac antenau. Ctrl+Clic i gloi STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toglu tryloywder ar gyfer gwifrau. Ctrl+Clic i gloi -STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Toglu tryloywder ar gyfer dangosyddion llwytho. Ctrl+Clic i gloi STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gosod gwrthrychau'n anweledig yn hytrach nac yn dryloyw # Linkgraph legend window From f2841e62d91f5d207ff34e765f5466a65e3896d3 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 26 Aug 2023 18:38:15 +0000 Subject: [PATCH 69/77] Update: Translations from eints russian: 1 change by Ln-Wolf turkish: 1 change by densxd portuguese: 1 change by azulcosta polish: 3 changes by pAter-exe --- src/lang/polish.txt | 5 +++-- src/lang/portuguese.txt | 1 + src/lang/russian.txt | 1 + src/lang/turkish.txt | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 563e6f1f4c..be0867cfdb 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3026,10 +3026,11 @@ STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Przełą STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla drzew. Ctrl+klik, aby zablokować STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla budynków miejskich. Ctrl+klik, aby zablokować STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla przedsiębiorstw. Ctrl+klik, aby zablokować -STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Przełącz przeźroczystość dla infrastruktury takiej jak stacje, zajezdnie i posterunki. Ctrl+klik, aby zablokować +STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Przełącz przeźroczystość dla infrastruktury, takiej jak stacje, zajezdnie i posterunki. Ctrl+klik, aby zablokować STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla mostów. Ctrl+klik, aby zablokować STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Przełącz przeźroczystość dla obiektów takich jak latarnie morskie i anteny. Ctrl+klik, aby zablokować STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Przełącz przeźroczystość dla trakcji (linii nośnych). Ctrl+klik, aby zablokować +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Przełącz przeźroczystość dla informacji o ładowaniu oraz kosztach/przychodach. Ctrl+klik, aby zablokować STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Ustaw obiekty jako niewidoczne zamiast przeźroczyste # Linkgraph legend window @@ -3121,7 +3122,7 @@ STR_STATION_CLASS_WAYP_WAYPOINT :Standardowy pos # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Wybór sygnałów -STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Przełącznik pokazujący zaawansowane typy sygnałów +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Przełącz wyświetlanie zaawansowanych typów sygnałów STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sygnalizator bloku (semafor){}Najprostszy typ sygnału pozwalający na przebywanie w jednym bloku wyłącznie jednemu pociągowi naraz STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sygnalizator wejściowy (semafor){}Zielony, póki choć jeden sygnalizator wyjściowy dla kolejnego odcinka trasy jest zielony. W przeciwnym wypadku czerwony. STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sygnalizator wyjściowy (semafor){}Zachowuje się jak sygnalizator blokowy, lecz jest niezbędny do zmiany na poprawny kolor w presygnalizatorach wejściowych i złożonych diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 0734998673..854ca90d92 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2651,6 +2651,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Comutar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Comutar transparência para pontes. Ctrl+Clique para bloquear. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Comutar transparência para estruturas como faróis-terrestres e antenas. Ctrl+Clique parabloquear. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Comutar transparência para catenária. Ctrl+Clique para bloquear. +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Comutar transparência do texto de carregamento e custo/receita. Ctrl+Clique para bloquear. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objectos como invisíveis em vez de transparentes # Linkgraph legend window diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 1f8b208ecc..7a15b4c237 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2813,6 +2813,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Пере STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Переключение прозрачности мостов. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Переключение прозрачности таких сооружений, как маяки и антенны. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Переключение прозрачности контактной сети. Ctrl+щелчок - заблокировать. +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Переключение прозрачности индикаторов погрузки, доходов и расходов. Ctrl+щелчок - заблокировать. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Сделать объекты не прозрачными, а полностью невидимыми # Linkgraph legend window diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 448ea888ac..0ac18bb857 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2651,6 +2651,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}İstasyo STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Köprüler için şeffaflık. Kilitlemek için Ctrl ile tıklayın STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Antenler ve deniz fenerleri için şeffaflık. Kilitlemek için Ctrl ile tıklayın STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Tren elektrik hatları için şeffaflığı aç/kapat. Kilitlemek için Ctrl ile tıklayın +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Yükleme ve maliyet/gelir metni için şeffaflığı değiştirin. Kitlemek için Ctrl+Tıkla STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Nesneleri şeffaf değil görünmez yap # Linkgraph legend window From 29a37c2e0bd545f145c14781b4c9853a1e7ef1a1 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 27 Aug 2023 19:58:31 +0200 Subject: [PATCH 70/77] Change: [Win32] unify the crashlog handler with the other OSes (#11236) While at it, make the crash text a bit more readable, and sync this with MacOS. --- src/os/macosx/crashlog_osx.cpp | 7 ++++--- src/os/windows/crashlog_win.cpp | 33 +++++---------------------------- src/os/windows/ottdres.rc.in | 1 - 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index 72ebff316c..e9f8e156f1 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -174,9 +174,10 @@ public: "A serious fault condition occurred in the game. The game will shut down."; std::string message = fmt::format( - "Please send the generated crash information and the last (auto)save to the developers. " - "This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues.\n\n" - "Generated file(s):\n{}\n{}\n{}\n{}", + "Please send crash.log, crash.dmp, and crash.sav to the developers. " + "This will greatly help debugging.\n\n" + "https://github.com/OpenTTD/OpenTTD/issues.\n\n" + "{}\n{}\n{}\n{}", this->crashlog_filename, this->crashdump_filename, this->savegame_filename, this->screenshot_filename); ShowMacDialog(crash_title, message.c_str(), "Quit"); diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 520c17f25d..31f703cfbe 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -270,12 +270,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) CrashLogWindows *log = new CrashLogWindows(ep); CrashLogWindows::current = log; - auto output_iterator = std::back_inserter(log->crashlog); - log->FillCrashLog(output_iterator); - log->WriteCrashDump(); - log->WriteCrashLog(); - log->WriteScreenshot(); - log->SendSurvey(); + log->MakeCrashLog(); /* Close any possible log files */ CloseConsoleLogIfActive(); @@ -350,17 +345,11 @@ static bool _expanded; static const wchar_t _crash_desc[] = L"A serious fault condition occurred in the game. The game will shut down.\n" - L"Please send the crash information and the crash.dmp file (if any) to the developers.\n" - L"This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues. " - L"The information contained in the report is displayed below.\n" - L"Press \"Emergency save\" to attempt saving the game. Generated file(s):\n" + L"Please send crash.log, crash.dmp, and crash.sav to the developers.\n" + L"This will greatly help debugging.\n\n" + L"https://github.com/OpenTTD/OpenTTD/issues\n\n" L"%s"; -static const wchar_t _save_succeeded[] = - L"Emergency save succeeded.\nIts location is '%s'.\n" - L"Be aware that critical parts of the internal game state may have become " - L"corrupted. The saved game is not guaranteed to work."; - static const wchar_t * const _expand_texts[] = {L"S&how report >>", L"&Hide report <<" }; static void SetWndSize(HWND wnd, int mode) @@ -403,7 +392,7 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA } *p = '\0'; - /* Add path to crash.log and crash.dmp (if any) to the crash window text */ + /* Add path to all files to the crash window text */ size_t len = wcslen(_crash_desc) + 2; len += wcslen(convert_to_fs(CrashLogWindows::current->crashlog_filename, filenamebuf, lengthof(filenamebuf))) + 2; len += wcslen(convert_to_fs(CrashLogWindows::current->crashdump_filename, filenamebuf, lengthof(filenamebuf))) + 2; @@ -434,18 +423,6 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA case 12: // Close CrashLog::AfterCrashLogCleanup(); ExitProcess(2); - case 13: // Emergency save - wchar_t filenamebuf[MAX_PATH * 2]; - if (CrashLogWindows::current->WriteSavegame()) { - convert_to_fs(CrashLogWindows::current->savegame_filename, filenamebuf, lengthof(filenamebuf)); - size_t len = lengthof(_save_succeeded) + wcslen(filenamebuf) + 1; - static wchar_t text[lengthof(_save_succeeded) + MAX_PATH * 2 + 1]; - _snwprintf(text, len, _save_succeeded, filenamebuf); - MessageBox(wnd, text, L"Save successful", MB_ICONINFORMATION); - } else { - MessageBox(wnd, L"Save failed", L"Save failed", MB_ICONINFORMATION); - } - break; case 15: // Expand window to show crash-message _expanded = !_expanded; SetWndSize(wnd, _expanded); diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index 279389a04c..e09d181ed7 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -50,7 +50,6 @@ CAPTION "Fatal Application Failure" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "&Close",12,7,82,60,14 - PUSHBUTTON "&Emergency save",13,158,82,60,14 PUSHBUTTON "",15,238,82,60,14 EDITTEXT 11,7,103,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP From 99e4a14cdf9b489491495a05f5b062d9e5b7d67b Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 27 Aug 2023 18:39:02 +0000 Subject: [PATCH 71/77] Update: Translations from eints english (au): 1 change by krysclarke finnish: 3 changes by hpiirai danish: 1 change by bscargo french: 1 change by glx22 portuguese (brazilian): 1 change by pasantoro --- src/lang/brazilian_portuguese.txt | 1 + src/lang/danish.txt | 1 + src/lang/english_AU.txt | 1 + src/lang/finnish.txt | 5 +++-- src/lang/french.txt | 1 + 5 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 088329bef8..7c9df473b4 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2651,6 +2651,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Alternar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Alternar transparência para pontes. Ctrl+Clique para travar STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Alternar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Alternar transparência para catenária. Ctrl+Clique para travar +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Alternar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetivos como invisíveis ao invés de transparentes. # Linkgraph legend window diff --git a/src/lang/danish.txt b/src/lang/danish.txt index b1e848f3e5..f2c1c66c5a 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -2650,6 +2650,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Skift ge STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Skift gennemsigtighed for broer. CTRL+Klik for at låse værdi. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Skift gennemsigtighed for strukturer som fyrtårne og antenner. CTRL+Klik for at låse værdi. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Slå transparens til/fra for køreledninger. CTRL+klik for at låse. +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Skift gennemsigtighed for indlæsning og pris/indtægtstekst. Ctrl+klik for at låse STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Gør objekter usynlige i stedet for gennemsigtige # Linkgraph legend window diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 2208bff100..0b8328cef6 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -2650,6 +2650,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Toggle t STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Toggle transparency for bridges. Ctrl+Click to lock STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Toggle transparency for structures like lighthouses and antennas. Ctrl+Click to lock STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Toggle transparency for catenary. Ctrl+Click to lock +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Toggle transparency for loading and cost/income text. Ctrl+Click to lock STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Set objects invisible instead of transparent # Linkgraph legend window diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index a1e09de5fd..28550f6220 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1896,8 +1896,8 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Salli kuntien r STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Kunnat saavat rakentaa tasoristeyksiä: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Mikäli käytössä, kunnat voivat rakentaa tasoristeyksiä -STR_CONFIG_SETTING_NOISE_LEVEL :Käytä kuntien hallitsemaa melutasoa lentokentille: {STRING} -STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Mikäli pois käytöstä, kunnassa voi olla kaksi lentokentää. Mikäli käytössä, lentokenttien määrä kunnassa rajoittuu kunnan melurajan mukaan. Meluraja riippuu asukasluvusta ja lentokentän koosta sekä etäisyydestä +STR_CONFIG_SETTING_NOISE_LEVEL :Rajoita lentokenttien sijoittamista melutason perusteella: {STRING} +STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Salli kuntien estää lentokenttien rakentaminen asukaslukuun sekä kentän kokoon ja etäisyyteen perustuvan melunsietotason perusteella. Mikäli ei käytössä, kunnat sallivat vain kaksi lentokenttää, paitsi jos paikallisviranomaisten asenteeksi on asetettu ”salliva” STR_CONFIG_SETTING_TOWN_FOUNDING :Kuntien perustaminen pelissä: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Mikäli käytössä, pelaajat voivat perustaa uusia kuntia @@ -2650,6 +2650,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Muuta as STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Muuta siltojen läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Muuta majakoiden ja lähetysmastojen tapaisten rakennelmien läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Muuta sähköratarakenteiden läpinäkyvyyttä. Ctrl+napsautus lukitsee. +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Muuta lastausilmaisinten sekä kustannus- ja tulotekstien läpinäkyvyyttä. Ctrl+napsautus lukitsee. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Tee kohteista läpinäkyvyyden sijaan näkymättömiä # Linkgraph legend window diff --git a/src/lang/french.txt b/src/lang/french.txt index d46826529d..bf905ef2f1 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -2651,6 +2651,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Transparence des ponts.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Transparence des structures telles que phares et antennes.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Transparence des caténaires.{}Ctrl-clic pour verrouiller. +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Transparence des indicateurs de chargement et des coûts/revenus des véhicules.{}Ctrl-clic pour verrouiller. STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Alterner entre transparence et invisibilité des objets # Linkgraph legend window From b00e483b0fcbecdacbfcc141fef3f64817f32b28 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 27 Aug 2023 21:54:05 +0200 Subject: [PATCH 72/77] Change: recover when possible from crashes during a crash (#11238) --- src/crashlog.cpp | 24 +++---- src/crashlog.h | 13 +++- src/os/macosx/crashlog_osx.cpp | 121 ++++++++++++++++++++++++++----- src/os/unix/crashlog_unix.cpp | 123 +++++++++++++++++++++++++++----- src/os/windows/crashlog_win.cpp | 109 ++++++++++++++++++++++++---- 5 files changed, 330 insertions(+), 60 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 38ba39568b..4f74e493ec 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -367,11 +367,12 @@ bool CrashLog::WriteCrashLog() * Write the (crash) dump to a file. * * @note Sets \c crashdump_filename when there is a successful return. - * @return 1 iff the crashdump was successfully created, -1 if it failed, 0 if not implemented. + * @return True iff the crashdump was successfully created. */ -/* virtual */ int CrashLog::WriteCrashDump() +/* virtual */ bool CrashLog::WriteCrashDump() { - return 0; + fmt::print("No method to create a crash.dmp available.\n"); + return false; } /** @@ -443,7 +444,7 @@ bool CrashLog::MakeCrashLog() fmt::print("Crash log generated.\n\n"); fmt::print("Writing crash log to disk...\n"); - bool bret = this->WriteCrashLog(); + bool bret = this->TryExecute("crashlog", [this]() { return this->WriteCrashLog(); }); if (bret) { fmt::print("Crash log written to {}. Please add this file to any bug reports.\n\n", this->crashlog_filename); } else { @@ -452,18 +453,15 @@ bool CrashLog::MakeCrashLog() } fmt::print("Writing crash dump to disk...\n"); - int dret = this->WriteCrashDump(); - if (dret < 0) { - fmt::print("Writing crash dump failed.\n\n"); - ret = false; - } else if (dret > 0) { + bret = this->TryExecute("crashdump", [this]() { return this->WriteCrashDump(); }); + if (bret) { fmt::print("Crash dump written to {}. Please add this file to any bug reports.\n\n", this->crashdump_filename); } else { - fmt::print("Skipped; missing dependency to create crash dump.\n"); + fmt::print("Writing crash dump failed.\n\n"); } fmt::print("Writing crash savegame...\n"); - bret = this->WriteSavegame(); + bret = this->TryExecute("savegame", [this]() { return this->WriteSavegame(); }); if (bret) { fmt::print("Crash savegame written to {}. Please add this file and the last (auto)save to any bug reports.\n\n", this->savegame_filename); } else { @@ -472,7 +470,7 @@ bool CrashLog::MakeCrashLog() } fmt::print("Writing crash screenshot...\n"); - bret = this->WriteScreenshot(); + bret = this->TryExecute("screenshot", [this]() { return this->WriteScreenshot(); }); if (bret) { fmt::print("Crash screenshot written to {}. Please add this file to any bug reports.\n\n", this->screenshot_filename); } else { @@ -480,7 +478,7 @@ bool CrashLog::MakeCrashLog() fmt::print("Writing crash screenshot failed.\n\n"); } - this->SendSurvey(); + this->TryExecute("survey", [this]() { this->SendSurvey(); return true; }); return ret; } diff --git a/src/crashlog.h b/src/crashlog.h index 7f486c2bac..dc9c2288bc 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -52,6 +52,17 @@ protected: std::string CreateFileName(const char *ext, bool with_dir = true) const; + /** + * Execute the func() and return its value. If any exception / signal / crash happens, + * catch it and return false. This function should, in theory, never not return, even + * in the worst conditions. + * + * @param section_name The name of the section to be executed. Printed when a crash happens. + * @param func The function to call. + * @return true iff the function returned true. + */ + virtual bool TryExecute(std::string_view section_name, std::function &&func) = 0; + public: /** Stub destructor to silence some compilers. */ virtual ~CrashLog() = default; @@ -65,7 +76,7 @@ public: void FillCrashLog(std::back_insert_iterator &output_iterator) const; bool WriteCrashLog(); - virtual int WriteCrashDump(); + virtual bool WriteCrashDump(); bool WriteSavegame(); bool WriteScreenshot(); diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index e9f8e156f1..49b79273c3 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -16,6 +16,7 @@ #include "../../video/video_driver.hpp" #include "macos.h" +#include #include #include #include @@ -37,6 +38,9 @@ #define MAX_STACK_FRAMES 64 +/** The signals we want our crash handler to handle. */ +static constexpr int _signals_to_handle[] = { SIGSEGV, SIGABRT, SIGFPE, SIGBUS, SIGILL, SIGSYS, SIGQUIT }; + /** * OSX implementation for the crash logger. */ @@ -154,12 +158,37 @@ class CrashLogOSX : public CrashLog { return succeeded; } - int WriteCrashDump() override + bool WriteCrashDump() override { - return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this) ? 1 : -1; + return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this); } #endif + /* virtual */ bool TryExecute(std::string_view section_name, std::function &&func) override + { + this->try_execute_active = true; + + /* Setup a longjump in case a crash happens. */ + if (setjmp(this->internal_fault_jmp_buf) != 0) { + fmt::print("Something went wrong when attempting to fill {} section of the crash log.\n", section_name); + + /* Reset the signals and continue on. The handler is responsible for dealing with the crash. */ + sigset_t sigs; + sigemptyset(&sigs); + for (int signum : _signals_to_handle) { + sigaddset(&sigs, signum); + } + sigprocmask(SIG_UNBLOCK, &sigs, nullptr); + + this->try_execute_active = false; + return false; + } + + bool res = func(); + this->try_execute_active = false; + return res; + } + public: /** * A crash log is always generated by signal. @@ -182,52 +211,108 @@ public: ShowMacDialog(crash_title, message.c_str(), "Quit"); } + + /** Buffer to track the long jump set setup. */ + jmp_buf internal_fault_jmp_buf; + + /** Whether we are in a TryExecute block. */ + bool try_execute_active = false; + + /** Points to the current crash log. */ + static CrashLogOSX *current; }; -/** The signals we want our crash handler to handle. */ -static const int _signals_to_handle[] = { SIGSEGV, SIGABRT, SIGFPE, SIGBUS, SIGILL, SIGSYS }; +/* static */ CrashLogOSX *CrashLogOSX::current = nullptr; + +/** + * Set a signal handler for all signals we want to capture. + * + * @param handler The handler to use. + * @return sigset_t A sigset_t containing all signals we want to capture. + */ +static sigset_t SetSignals(void(*handler)(int)) +{ + sigset_t sigs; + sigemptyset(&sigs); + for (int signum : _signals_to_handle) { + sigaddset(&sigs, signum); + } + + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_flags = SA_RESTART; + + sigemptyset(&sa.sa_mask); + sa.sa_handler = handler; + sa.sa_mask = sigs; + + for (int signum : _signals_to_handle) { + sigaction(signum, &sa, nullptr); + } + + return sigs; +} + +/** + * Entry point for a crash that happened during the handling of a crash. + * + * @param signum the signal that caused us to crash. + */ +static void CDECL HandleInternalCrash(int signum) +{ + if (CrashLogOSX::current == nullptr || !CrashLogOSX::current->try_execute_active) { + fmt::print("Something went seriously wrong when creating the crash log. Aborting.\n"); + _exit(1); + } + + longjmp(CrashLogOSX::current->internal_fault_jmp_buf, 1); +} /** * Entry point for the crash handler. - * @note Not static so it shows up in the backtrace. + * * @param signum the signal that caused us to crash. */ -void CDECL HandleCrash(int signum) +static void CDECL HandleCrash(int signum) { - /* Disable all handling of signals by us, so we don't go into infinite loops. */ - for (const int *i = _signals_to_handle; i != endof(_signals_to_handle); i++) { - signal(*i, SIG_DFL); + if (CrashLogOSX::current != nullptr) { + CrashLog::AfterCrashLogCleanup(); + _exit(2); } + /* Capture crashing during the handling of a crash. */ + sigset_t sigs = SetSignals(HandleInternalCrash); + sigset_t old_sigset; + sigprocmask(SIG_UNBLOCK, &sigs, &old_sigset); + if (_gamelog.TestEmergency()) { ShowMacDialog("A serious fault condition occurred in the game. The game will shut down.", "As you loaded an emergency savegame no crash information will be generated.\n", "Quit"); - abort(); + _exit(3); } if (SaveloadCrashWithMissingNewGRFs()) { ShowMacDialog("A serious fault condition occurred in the game. The game will shut down.", "As you loaded an savegame for which you do not have the required NewGRFs no crash information will be generated.\n", "Quit"); - abort(); + _exit(3); } - CrashLogOSX log(signum); - log.MakeCrashLog(); + CrashLogOSX *log = new CrashLogOSX(signum); + CrashLogOSX::current = log; + log->MakeCrashLog(); if (VideoDriver::GetInstance() == nullptr || VideoDriver::GetInstance()->HasGUI()) { - log.DisplayCrashDialog(); + log->DisplayCrashDialog(); } CrashLog::AfterCrashLogCleanup(); - abort(); + _exit(2); } /* static */ void CrashLog::InitialiseCrashLog() { - for (const int *i = _signals_to_handle; i != endof(_signals_to_handle); i++) { - signal(*i, HandleCrash); - } + SetSignals(HandleCrash); } /* static */ void CrashLog::InitThread() diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index 5f8de4cec4..23854d1b0a 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -14,6 +14,7 @@ #include "../../gamelog.h" #include "../../saveload/saveload.h" +#include #include #include @@ -30,8 +31,17 @@ # include #endif +#if defined(__EMSCRIPTEN__) +# include +/* We avoid abort(), as it is a SIGBART, and use _exit() instead. But emscripten doesn't know _exit(). */ +# define _exit emscripten_force_exit +#endif + #include "../../safeguards.h" +/** The signals we want our crash handler to handle. */ +static constexpr int _signals_to_handle[] = { SIGSEGV, SIGABRT, SIGFPE, SIGBUS, SIGILL, SIGQUIT }; + /** * Unix implementation for the crash logger. */ @@ -100,12 +110,37 @@ class CrashLogUnix : public CrashLog { return succeeded; } - int WriteCrashDump() override + bool WriteCrashDump() override { - return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this) ? 1 : -1; + return google_breakpad::ExceptionHandler::WriteMinidump(_personal_dir, MinidumpCallback, this); } #endif + /* virtual */ bool TryExecute(std::string_view section_name, std::function &&func) override + { + this->try_execute_active = true; + + /* Setup a longjump in case a crash happens. */ + if (setjmp(this->internal_fault_jmp_buf) != 0) { + fmt::print("Something went wrong when attempting to fill {} section of the crash log.\n", section_name); + + /* Reset the signals and continue on. The handler is responsible for dealing with the crash. */ + sigset_t sigs; + sigemptyset(&sigs); + for (int signum : _signals_to_handle) { + sigaddset(&sigs, signum); + } + sigprocmask(SIG_UNBLOCK, &sigs, nullptr); + + this->try_execute_active = false; + return false; + } + + bool res = func(); + this->try_execute_active = false; + return res; + } + public: /** * A crash log is always generated by signal. @@ -115,48 +150,104 @@ public: signum(signum) { } + + /** Buffer to track the long jump set setup. */ + jmp_buf internal_fault_jmp_buf; + + /** Whether we are in a TryExecute block. */ + bool try_execute_active = false; + + /** Points to the current crash log. */ + static CrashLogUnix *current; }; -/** The signals we want our crash handler to handle. */ -static const int _signals_to_handle[] = { SIGSEGV, SIGABRT, SIGFPE, SIGBUS, SIGILL }; +/* static */ CrashLogUnix *CrashLogUnix::current = nullptr; + +/** + * Set a signal handler for all signals we want to capture. + * + * @param handler The handler to use. + * @return sigset_t A sigset_t containing all signals we want to capture. + */ +static sigset_t SetSignals(void(*handler)(int)) +{ + sigset_t sigs; + sigemptyset(&sigs); + for (int signum : _signals_to_handle) { + sigaddset(&sigs, signum); + } + + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_flags = SA_RESTART; + + sigemptyset(&sa.sa_mask); + sa.sa_handler = handler; + sa.sa_mask = sigs; + + for (int signum : _signals_to_handle) { + sigaction(signum, &sa, nullptr); + } + + return sigs; +} + +/** + * Entry point for a crash that happened during the handling of a crash. + * + * @param signum the signal that caused us to crash. + */ +static void CDECL HandleInternalCrash(int signum) +{ + if (CrashLogUnix::current == nullptr || !CrashLogUnix::current->try_execute_active) { + fmt::print("Something went seriously wrong when creating the crash log. Aborting.\n"); + _exit(1); + } + + longjmp(CrashLogUnix::current->internal_fault_jmp_buf, 1); +} /** * Entry point for the crash handler. - * @note Not static so it shows up in the backtrace. + * * @param signum the signal that caused us to crash. */ static void CDECL HandleCrash(int signum) { - /* Disable all handling of signals by us, so we don't go into infinite loops. */ - for (const int *i = _signals_to_handle; i != endof(_signals_to_handle); i++) { - signal(*i, SIG_DFL); + if (CrashLogUnix::current != nullptr) { + CrashLog::AfterCrashLogCleanup(); + _exit(2); } + /* Capture crashing during the handling of a crash. */ + sigset_t sigs = SetSignals(HandleInternalCrash); + sigset_t old_sigset; + sigprocmask(SIG_UNBLOCK, &sigs, &old_sigset); + if (_gamelog.TestEmergency()) { fmt::print("A serious fault condition occurred in the game. The game will shut down.\n"); fmt::print("As you loaded an emergency savegame no crash information will be generated.\n"); - abort(); + _exit(3); } if (SaveloadCrashWithMissingNewGRFs()) { fmt::print("A serious fault condition occurred in the game. The game will shut down.\n"); fmt::print("As you loaded an savegame for which you do not have the required NewGRFs\n"); fmt::print("no crash information will be generated.\n"); - abort(); + _exit(3); } - CrashLogUnix log(signum); - log.MakeCrashLog(); + CrashLogUnix *log = new CrashLogUnix(signum); + CrashLogUnix::current = log; + log->MakeCrashLog(); CrashLog::AfterCrashLogCleanup(); - abort(); + _exit(2); } /* static */ void CrashLog::InitialiseCrashLog() { - for (const int *i = _signals_to_handle; i != endof(_signals_to_handle); i++) { - signal(*i, HandleCrash); - } + SetSignals(HandleCrash); } /* static */ void CrashLog::InitThread() diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 31f703cfbe..612f96ab87 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -25,6 +25,8 @@ #if defined(_MSC_VER) # include +#else +# include #endif #ifdef WITH_UNOFFICIAL_BREAKPAD @@ -33,6 +35,21 @@ #include "../../safeguards.h" +/** Exception code used for custom abort. */ +static constexpr DWORD CUSTOM_ABORT_EXCEPTION = 0xE1212012; + +/** + * Forcefully try to terminate the application. + * + * @param exit_code The exit code to return. + */ +static void NORETURN ImmediateExitProcess(uint exit_code) +{ + /* TerminateProcess may fail in some special edge cases; fall back to ExitProcess in this case. */ + TerminateProcess(GetCurrentProcess(), exit_code); + ExitProcess(exit_code); +} + /** * Windows implementation for the crash logger. */ @@ -55,21 +72,65 @@ public: return succeeded; } - int WriteCrashDump() override + bool WriteCrashDump() override { - return google_breakpad::ExceptionHandler::WriteMinidump(OTTD2FS(_personal_dir), MinidumpCallback, this) ? 1 : -1; + return google_breakpad::ExceptionHandler::WriteMinidump(OTTD2FS(_personal_dir), MinidumpCallback, this); } #endif +#if defined(_MSC_VER) + /* virtual */ bool TryExecute(std::string_view section_name, std::function &&func) override + { + this->try_execute_active = true; + bool res; + + __try { + res = func(); + } __except (EXCEPTION_EXECUTE_HANDLER) { + fmt::print("Something went wrong when attempting to fill {} section of the crash log.\n", section_name); + res = false; + } + + this->try_execute_active = false; + return res; + } +#else + /* virtual */ bool TryExecute(std::string_view section_name, std::function &&func) override + { + this->try_execute_active = true; + + /* Setup a longjump in case a crash happens. */ + if (setjmp(this->internal_fault_jmp_buf) != 0) { + fmt::print("Something went wrong when attempting to fill {} section of the crash log.\n", section_name); + + this->try_execute_active = false; + return false; + } + + bool res = func(); + this->try_execute_active = false; + return res; + } +#endif /* _MSC_VER */ + /** * A crash log is always generated when it's generated. * @param ep the data related to the exception. */ - CrashLogWindows(EXCEPTION_POINTERS *ep = nullptr) : ep(ep) {} + CrashLogWindows(EXCEPTION_POINTERS *ep = nullptr) : + ep(ep) + { + } - /** - * Points to the current crash log. - */ +#if !defined(_MSC_VER) + /** Buffer to track the long jump set setup. */ + jmp_buf internal_fault_jmp_buf; +#endif + + /** Whether we are in a TryExecute block. */ + bool try_execute_active = false; + + /** Points to the current crash log. */ static CrashLogWindows *current; }; @@ -248,7 +309,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) if (CrashLogWindows::current != nullptr) { CrashLog::AfterCrashLogCleanup(); - ExitProcess(2); + ImmediateExitProcess(2); } if (_gamelog.TestEmergency()) { @@ -256,7 +317,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) L"A serious fault condition occurred in the game. The game will shut down.\n" L"As you loaded an emergency savegame no crash information will be generated.\n"; MessageBox(nullptr, _emergency_crash, L"Fatal Application Failure", MB_ICONERROR); - ExitProcess(3); + ImmediateExitProcess(3); } if (SaveloadCrashWithMissingNewGRFs()) { @@ -265,7 +326,7 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) L"As you loaded an savegame for which you do not have the required NewGRFs\n" L"no crash information will be generated.\n"; MessageBox(nullptr, _saveload_crash, L"Fatal Application Failure", MB_ICONERROR); - ExitProcess(3); + ImmediateExitProcess(3); } CrashLogWindows *log = new CrashLogWindows(ep); @@ -293,9 +354,32 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) return EXCEPTION_EXECUTE_HANDLER; } +static LONG WINAPI VectoredExceptionHandler(EXCEPTION_POINTERS *ep) +{ + if (CrashLogWindows::current != nullptr && CrashLogWindows::current->try_execute_active) { +#if defined(_MSC_VER) + return EXCEPTION_CONTINUE_SEARCH; +#else + longjmp(CrashLogWindows::current->internal_fault_jmp_buf, 1); +#endif + } + + if (ep->ExceptionRecord->ExceptionCode == 0xC0000374 /* heap corruption */) { + return ExceptionHandler(ep); + } + if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW) { + return ExceptionHandler(ep); + } + if (ep->ExceptionRecord->ExceptionCode == CUSTOM_ABORT_EXCEPTION) { + return ExceptionHandler(ep); + } + + return EXCEPTION_CONTINUE_SEARCH; +} + static void CDECL CustomAbort(int signal) { - RaiseException(0xE1212012, 0, 0, nullptr); + RaiseException(CUSTOM_ABORT_EXCEPTION, 0, 0, nullptr); } /* static */ void CrashLog::InitialiseCrashLog() @@ -309,6 +393,7 @@ static void CDECL CustomAbort(int signal) _set_abort_behavior(0, _WRITE_ABORT_MSG); #endif SetUnhandledExceptionFilter(ExceptionHandler); + AddVectoredExceptionHandler(1, VectoredExceptionHandler); } /* static */ void CrashLog::InitThread() @@ -422,7 +507,7 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA switch (wParam) { case 12: // Close CrashLog::AfterCrashLogCleanup(); - ExitProcess(2); + ImmediateExitProcess(2); case 15: // Expand window to show crash-message _expanded = !_expanded; SetWndSize(wnd, _expanded); @@ -431,7 +516,7 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA return TRUE; case WM_CLOSE: CrashLog::AfterCrashLogCleanup(); - ExitProcess(2); + ImmediateExitProcess(2); } return FALSE; From 5e6b5d981f26a6f4f83c07fdd545a4036506c125 Mon Sep 17 00:00:00 2001 From: Joan Josep Date: Sun, 27 Aug 2023 22:12:44 +0200 Subject: [PATCH 73/77] Codechange: Use existing functions in GetMonthlyInfrastructureCosts. (#11237) --- src/script/api/script_infrastructure.cpp | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/script/api/script_infrastructure.cpp b/src/script/api/script_infrastructure.cpp index bfe78a7b58..3d6bdd2fcc 100644 --- a/src/script/api/script_infrastructure.cpp +++ b/src/script/api/script_infrastructure.cpp @@ -41,24 +41,14 @@ ::Company *c = ::Company::Get((::CompanyID)company); switch (infra_type) { - case INFRASTRUCTURE_RAIL: { - uint32_t count = 0; - for (::RailType rt = ::RAILTYPE_BEGIN; rt != ::RAILTYPE_END; rt++) { - count += c->infrastructure.rail[rt]; - } - return count; - } + case INFRASTRUCTURE_RAIL: + return c->infrastructure.GetRailTotal(); case INFRASTRUCTURE_SIGNALS: return c->infrastructure.signal; - case INFRASTRUCTURE_ROAD: { - uint32_t count = 0; - for (::RoadType rt = ::ROADTYPE_BEGIN; rt != ::ROADTYPE_END; rt++) { - count += c->infrastructure.road[rt]; - } - return count; - } + case INFRASTRUCTURE_ROAD: + return c->infrastructure.GetRoadTotal() + c->infrastructure.GetTramTotal(); case INFRASTRUCTURE_CANAL: return c->infrastructure.water; From d4312c59a4cf5e44d99870d6a40be92bd9ef894c Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Sun, 27 Aug 2023 22:32:11 +0200 Subject: [PATCH 74/77] Codechange: [MacOS] use backtrace() instead of our custom variant (#11233) As mentioned in the comment, we only did it ourselves as we once were compatible with versions before 10.5. But that time has long gone. So let's update the code to a bit more modern approach. --- src/os/macosx/crashlog_osx.cpp | 64 ++++------------------------------ 1 file changed, 7 insertions(+), 57 deletions(-) diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index 49b79273c3..f285bbd0e9 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #ifdef WITH_UNOFFICIAL_BREAKPAD # include @@ -83,67 +84,16 @@ class CrashLogOSX : public CrashLog { void LogStacktrace(std::back_insert_iterator &output_iterator) const override { - /* As backtrace() is only implemented in 10.5 or later, - * we're rolling our own here. Mostly based on - * http://stackoverflow.com/questions/289820/getting-the-current-stack-trace-on-mac-os-x - * and some details looked up in the Darwin sources. */ fmt::format_to(output_iterator, "\nStacktrace:\n"); - void **frame; -#if defined(__ppc__) || defined(__ppc64__) - /* Apple says __builtin_frame_address can be broken on PPC. */ - __asm__ volatile("mr %0, r1" : "=r" (frame)); -#else - frame = (void **)__builtin_frame_address(0); -#endif - - for (int i = 0; frame != nullptr && i < MAX_STACK_FRAMES; i++) { - /* Get IP for current stack frame. */ -#if defined(__ppc__) || defined(__ppc64__) - void *ip = frame[2]; -#else - void *ip = frame[1]; -#endif - if (ip == nullptr) break; - - /* Print running index. */ - fmt::format_to(output_iterator, " [{:02}]", i); - - Dl_info dli; - bool dl_valid = dladdr(ip, &dli) != 0; - - const char *fname = "???"; - if (dl_valid && dli.dli_fname) { - /* Valid image name? Extract filename from the complete path. */ - const char *s = strrchr(dli.dli_fname, '/'); - if (s != nullptr) { - fname = s + 1; - } else { - fname = dli.dli_fname; - } - } - /* Print image name and IP. */ - fmt::format_to(output_iterator, " {:20s} {}", fname, (uintptr_t)ip); - - /* Print function offset if information is available. */ - if (dl_valid && dli.dli_sname != nullptr && dli.dli_saddr != nullptr) { - /* Try to demangle a possible C++ symbol. */ - int status = -1; - char *func_name = abi::__cxa_demangle(dli.dli_sname, nullptr, 0, &status); - - long int offset = (intptr_t)ip - (intptr_t)dli.dli_saddr; - fmt::format_to(output_iterator, " ({} + {})", func_name != nullptr ? func_name : dli.dli_sname, offset); - - free(func_name); - } - fmt::format_to(output_iterator, "\n"); + void *trace[64]; + int trace_size = backtrace(trace, lengthof(trace)); - /* Get address of next stack frame. */ - void **next = (void **)frame[0]; - /* Frame address not increasing or not aligned? Broken stack, exit! */ - if (next <= frame || !IS_ALIGNED(next)) break; - frame = next; + char **messages = backtrace_symbols(trace, trace_size); + for (int i = 0; i < trace_size; i++) { + fmt::format_to(output_iterator, "{}\n", messages[i]); } + free(messages); fmt::format_to(output_iterator, "\n"); } From be9a690f41811a507676f5af38924b5ce3e89c76 Mon Sep 17 00:00:00 2001 From: Joan Josep Date: Mon, 28 Aug 2023 00:20:37 +0200 Subject: [PATCH 75/77] Fix #9642: Keep infrastructure totals when overbuilding road depots. (#11229) --- src/road_cmd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 212f0cd60f..00394750a9 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1195,12 +1195,12 @@ CommandCost CmdBuildRoadDepot(DoCommandFlag flags, TileIndex tile, RoadType rt, dep->build_date = TimerGameCalendar::date; MakeRoadDepot(tile, _current_company, dep->index, dir, rt); MakeDefaultName(dep); + + /* A road depot has two road bits. */ + UpdateCompanyRoadInfrastructure(rt, _current_company, ROAD_DEPOT_TRACKBIT_FACTOR); } MarkTileDirtyByTile(tile); - - /* A road depot has two road bits. */ - UpdateCompanyRoadInfrastructure(rt, _current_company, ROAD_DEPOT_TRACKBIT_FACTOR); } cost.AddCost(_price[PR_BUILD_DEPOT_ROAD]); From de5e338a760c0e01c1c42e0cb1922808752583e8 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 28 Aug 2023 00:49:12 +0200 Subject: [PATCH 76/77] Change: mention in MacOS / Windows crashlog popup when files couldn't be generated (#11239) For example, if the crash.sav couldn't be created, and the TryExcept detected an issue, write out that the file is not available in the popup. --- src/crashlog.cpp | 31 ++++++++++++++----------------- src/crashlog.h | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 4f74e493ec..1ea5b877ac 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -425,18 +425,16 @@ void CrashLog::SendSurvey() const * Makes the crash log, writes it to a file and then subsequently tries * to make a crash dump and crash savegame. It uses DEBUG to write * information like paths to the console. - * @return true when everything is made successfully. */ -bool CrashLog::MakeCrashLog() +void CrashLog::MakeCrashLog() { /* Don't keep looping logging crashes. */ static bool crashlogged = false; - if (crashlogged) return false; + if (crashlogged) return; crashlogged = true; crashlog.reserve(65536); auto output_iterator = std::back_inserter(crashlog); - bool ret = true; fmt::print("Crash encountered, generating crash log...\n"); this->FillCrashLog(output_iterator); @@ -444,43 +442,42 @@ bool CrashLog::MakeCrashLog() fmt::print("Crash log generated.\n\n"); fmt::print("Writing crash log to disk...\n"); - bool bret = this->TryExecute("crashlog", [this]() { return this->WriteCrashLog(); }); - if (bret) { + bool ret = this->TryExecute("crashlog", [this]() { return this->WriteCrashLog(); }); + if (ret) { fmt::print("Crash log written to {}. Please add this file to any bug reports.\n\n", this->crashlog_filename); } else { fmt::print("Writing crash log failed. Please attach the output above to any bug reports.\n\n"); - ret = false; + this->crashlog_filename = "(failed to write crash log)"; } fmt::print("Writing crash dump to disk...\n"); - bret = this->TryExecute("crashdump", [this]() { return this->WriteCrashDump(); }); - if (bret) { + ret = this->TryExecute("crashdump", [this]() { return this->WriteCrashDump(); }); + if (ret) { fmt::print("Crash dump written to {}. Please add this file to any bug reports.\n\n", this->crashdump_filename); } else { fmt::print("Writing crash dump failed.\n\n"); + this->crashdump_filename = "(failed to write crash dump)"; } fmt::print("Writing crash savegame...\n"); - bret = this->TryExecute("savegame", [this]() { return this->WriteSavegame(); }); - if (bret) { + ret = this->TryExecute("savegame", [this]() { return this->WriteSavegame(); }); + if (ret) { fmt::print("Crash savegame written to {}. Please add this file and the last (auto)save to any bug reports.\n\n", this->savegame_filename); } else { - ret = false; fmt::print("Writing crash savegame failed. Please attach the last (auto)save to any bug reports.\n\n"); + this->savegame_filename = "(failed to write crash savegame)"; } fmt::print("Writing crash screenshot...\n"); - bret = this->TryExecute("screenshot", [this]() { return this->WriteScreenshot(); }); - if (bret) { + ret = this->TryExecute("screenshot", [this]() { return this->WriteScreenshot(); }); + if (ret) { fmt::print("Crash screenshot written to {}. Please add this file to any bug reports.\n\n", this->screenshot_filename); } else { - ret = false; fmt::print("Writing crash screenshot failed.\n\n"); + this->screenshot_filename = "(failed to write crash screenshot)"; } this->TryExecute("survey", [this]() { this->SendSurvey(); return true; }); - - return ret; } /** diff --git a/src/crashlog.h b/src/crashlog.h index dc9c2288bc..2bff7cf2cc 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -82,7 +82,7 @@ public: void SendSurvey() const; - bool MakeCrashLog(); + void MakeCrashLog(); /** * Initialiser for crash logs; do the appropriate things so crashes are From b0d7cfaa3dbe61af4a3e2d5955fd0ebdc5c60648 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 28 Aug 2023 12:14:11 +0200 Subject: [PATCH 77/77] Change: [Win32] don't allocate 192KiB of memory on the stack on crash (#11240) Heap is out of the question, as it might be corrupted. Allocating this much on stack is silly. So instead, allocate virtual pages to write the information in. --- src/os/windows/crashlog_win.cpp | 71 ++++++++++++++++++--------------- src/os/windows/ottdres.rc.in | 10 ++--- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 612f96ab87..210b6057e6 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -433,7 +433,7 @@ static const wchar_t _crash_desc[] = L"Please send crash.log, crash.dmp, and crash.sav to the developers.\n" L"This will greatly help debugging.\n\n" L"https://github.com/OpenTTD/OpenTTD/issues\n\n" - L"%s"; + L"%s\n%s\n%s\n%s\n"; static const wchar_t * const _expand_texts[] = {L"S&how report >>", L"&Hide report <<" }; @@ -462,44 +462,51 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA { switch (msg) { case WM_INITDIALOG: { + size_t crashlog_length = CrashLogWindows::current->crashlog.size() + 1; + /* Reserve extra space for LF to CRLF conversion. */ + crashlog_length += std::count(CrashLogWindows::current->crashlog.begin(), CrashLogWindows::current->crashlog.end(), '\n'); + + const size_t filename_count = 4; + const size_t filename_buf_length = MAX_PATH + 1; + const size_t crash_desc_buf_length = lengthof(_crash_desc) + filename_buf_length * filename_count + 1; + /* We need to put the crash-log in a separate buffer because the default - * buffer in MB_TO_WIDE is not large enough (512 chars) */ - wchar_t filenamebuf[MAX_PATH * 2]; - wchar_t crash_msgW[65536]; - /* Convert unix -> dos newlines because the edit box only supports that properly :( */ - const char *unix_nl = CrashLogWindows::current->crashlog.data(); - char dos_nl[65536]; - char *p = dos_nl; + * buffer in MB_TO_WIDE is not large enough (512 chars). + * Use VirtualAlloc to allocate pages for the buffer to avoid overflowing the stack. + * Avoid the heap in case the crash is because the heap became corrupted. */ + const size_t total_length = crash_desc_buf_length * sizeof(wchar_t) + + crashlog_length * sizeof(wchar_t) + + filename_buf_length * sizeof(wchar_t) * filename_count + + crashlog_length; + void *raw_buffer = VirtualAlloc(nullptr, total_length, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + + wchar_t *crash_desc_buf = reinterpret_cast(raw_buffer); + wchar_t *crashlog_buf = crash_desc_buf + crash_desc_buf_length; + wchar_t *filename_buf = crashlog_buf + crashlog_length; + char *crashlog_dos_nl = reinterpret_cast(filename_buf + filename_buf_length * filename_count); + + /* Convert unix -> dos newlines because the edit box only supports that properly. */ + const char *crashlog_unix_nl = CrashLogWindows::current->crashlog.data(); + char *p = crashlog_dos_nl; char32_t c; - while ((c = Utf8Consume(&unix_nl)) && p < lastof(dos_nl) - 4) { // 4 is max number of bytes per character + while ((c = Utf8Consume(&crashlog_unix_nl))) { if (c == '\n') p += Utf8Encode(p, '\r'); p += Utf8Encode(p, c); } *p = '\0'; - /* Add path to all files to the crash window text */ - size_t len = wcslen(_crash_desc) + 2; - len += wcslen(convert_to_fs(CrashLogWindows::current->crashlog_filename, filenamebuf, lengthof(filenamebuf))) + 2; - len += wcslen(convert_to_fs(CrashLogWindows::current->crashdump_filename, filenamebuf, lengthof(filenamebuf))) + 2; - len += wcslen(convert_to_fs(CrashLogWindows::current->screenshot_filename, filenamebuf, lengthof(filenamebuf))) + 1; - - static wchar_t text[lengthof(_crash_desc) + 3 * MAX_PATH * 2 + 7]; - int printed = _snwprintf(text, len, _crash_desc, convert_to_fs(CrashLogWindows::current->crashlog_filename, filenamebuf, lengthof(filenamebuf))); - if (printed < 0 || (size_t)printed > len) { - MessageBox(wnd, L"Catastrophic failure trying to display crash message. Could not perform text formatting.", L"OpenTTD", MB_ICONERROR); - return FALSE; - } - if (convert_to_fs(CrashLogWindows::current->crashdump_filename, filenamebuf, lengthof(filenamebuf))[0] != L'\0') { - wcscat(text, L"\n"); - wcscat(text, filenamebuf); - } - if (convert_to_fs(CrashLogWindows::current->screenshot_filename, filenamebuf, lengthof(filenamebuf))[0] != L'\0') { - wcscat(text, L"\n"); - wcscat(text, filenamebuf); - } - - SetDlgItemText(wnd, 10, text); - SetDlgItemText(wnd, 11, convert_to_fs(dos_nl, crash_msgW, lengthof(crash_msgW))); + _snwprintf( + crash_desc_buf, + crash_desc_buf_length, + _crash_desc, + convert_to_fs(CrashLogWindows::current->crashlog_filename, filename_buf + filename_buf_length * 0, filename_buf_length), + convert_to_fs(CrashLogWindows::current->crashdump_filename, filename_buf + filename_buf_length * 1, filename_buf_length), + convert_to_fs(CrashLogWindows::current->savegame_filename, filename_buf + filename_buf_length * 2, filename_buf_length), + convert_to_fs(CrashLogWindows::current->screenshot_filename, filename_buf + filename_buf_length * 3, filename_buf_length) + ); + + SetDlgItemText(wnd, 10, crash_desc_buf); + SetDlgItemText(wnd, 11, convert_to_fs(crashlog_dos_nl, crashlog_buf, crashlog_length)); SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE); SetWndSize(wnd, -1); } return TRUE; diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index e09d181ed7..101df4c317 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -44,16 +44,16 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT // Dialog // -100 DIALOG DISCARDABLE 0, 0, 305, 101 +100 DIALOG DISCARDABLE 0, 0, 305, 109 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Fatal Application Failure" FONT 8, "MS Sans Serif" BEGIN - PUSHBUTTON "&Close",12,7,82,60,14 - PUSHBUTTON "",15,238,82,60,14 - EDITTEXT 11,7,103,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL | + PUSHBUTTON "&Close",12,7,90,60,14 + PUSHBUTTON "",15,238,90,60,14 + EDITTEXT 11,7,111,291,118,ES_MULTILINE | ES_READONLY | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP - LTEXT "",10,36,5,262,72 + LTEXT "",10,36,5,262,80 ICON 100,IDC_STATIC,9,9,20,20 END