From ff5e0673417940daed47917947ed63fef135ff67 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 31 Aug 2025 23:04:48 +0100 Subject: [PATCH 001/280] Fix 7b60e5ccad: Badge filters were only applied to trains. (#14565) --- src/build_vehicle_gui.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 1e76cfb8b1..51c5160cc8 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1436,12 +1436,14 @@ struct BuildVehicleWindow : Window { this->eng_list.clear(); BadgeTextFilter btf(this->string_filter, GSF_ROADVEHICLES); + BadgeDropdownFilter bdf(this->badge_filter_choices); for (const Engine *e : Engine::IterateType(VEH_ROAD)) { if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue; if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->u.road.roadtype, this->filter.roadtype)) continue; + if (!bdf.Filter(e->badges)) continue; /* Filter by name or NewGRF extra text */ if (!FilterByText(e) && !btf.Filter(e->badges)) continue; @@ -1460,11 +1462,13 @@ struct BuildVehicleWindow : Window { this->eng_list.clear(); BadgeTextFilter btf(this->string_filter, GSF_SHIPS); + BadgeDropdownFilter bdf(this->badge_filter_choices); for (const Engine *e : Engine::IterateType(VEH_SHIP)) { if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_SHIP, _local_company)) continue; + if (!bdf.Filter(e->badges)) continue; /* Filter by name or NewGRF extra text */ if (!FilterByText(e) && !btf.Filter(e->badges)) continue; @@ -1486,6 +1490,7 @@ struct BuildVehicleWindow : Window { const Station *st = this->listview_mode ? nullptr : Station::GetByTile(TileIndex(this->window_number)); BadgeTextFilter btf(this->string_filter, GSF_AIRCRAFT); + BadgeDropdownFilter bdf(this->badge_filter_choices); /* Make list of all available planes. * Also check to see if the previously selected plane is still available, @@ -1497,6 +1502,7 @@ struct BuildVehicleWindow : Window { if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_company)) continue; /* First VEH_END window_numbers are fake to allow a window open for all different types at once */ if (!this->listview_mode && !CanVehicleUseStation(eid, st)) continue; + if (!bdf.Filter(e->badges)) continue; /* Filter by name or NewGRF extra text */ if (!FilterByText(e) && !btf.Filter(e->badges)) continue; From 4c77026167f74eefbb1e05282312f059a06b384f Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 1 Sep 2025 04:42:09 +0000 Subject: [PATCH 002/280] Update: Translations from eints galician: 2 changes by pvillaverde vietnamese: 24 changes by MagicalDrizzle french: 1 change by ottdfevr --- src/lang/french.txt | 2 +- src/lang/galician.txt | 2 ++ src/lang/vietnamese.txt | 27 ++++++++++++++++++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/lang/french.txt b/src/lang/french.txt index 3fd9d237d8..9293c7bc0d 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1326,7 +1326,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Vitesse de cons STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limite le nombre d'actions de constructions pour les IAs STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Pannes des véhicules{NBSP}: {STRING} -STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Contrôle la fréquence des pannes des véhicule incorrectement entretenus +STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Contrôle la fréquence des pannes des véhicules incorrectement entretenus STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Multiplicateur de subvention{NBSP}: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Définit combien rapportent les lignes subventionnées diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 16ca764ffc..4859d6aff2 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1691,6 +1691,8 @@ STR_CONFIG_SETTING_SCROLLMODE_LMB :Move-lo mapa co STR_CONFIG_SETTING_SMOOTH_SCROLLING :Desprazamento de vista suave: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a vista principal se despraza a unha posición específica cando se fai clic no minimapa ou cando se emprega un comando para desprazarse a un obxecto específico sobre o mapa. Se se activa, a vista desprázase suavemente, se se desactiva salta directamente +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT :Comportamento tradicional de selección do menú da barra de ferramentas: {STRING} +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT_HELPTEXT :Escoller o comportamento de selección dos menús da barra de ferramentas. Se está desactivado, os menús permanecerán abertos ata que se faga unha selección. Se está activado, os menús activaranse ao soltar o botón do rato. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Mostrar medidas ao usar as ferramentas de construción: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Amosa as distancias en cadros e as diferencias de cota ao arrastrar durante as operacións de construción diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 06ce12df3c..b9a9bdfb91 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -622,8 +622,14 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Biểu STR_GRAPH_LAST_24_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}24 phút cuối STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}72 phút cuối +STR_GRAPH_LAST_288_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}288 phút cuối +STR_GRAPH_LAST_24_MONTHS :{TINY_FONT}{BLACK}2 năm (theo từng tháng) +STR_GRAPH_LAST_24_QUARTERS :{TINY_FONT}{BLACK}6 năm (theo từng quý) +STR_GRAPH_LAST_24_YEARS :{TINY_FONT}{BLACK}24 năm (theo từng năm) +STR_GRAPH_TOGGLE_RANGE :Bật/tắt đồ thị cho khoảng dữ liệu này +STR_GRAPH_SELECT_SCALE :Chỉnh tỷ lệ chiều ngang của đồ thị STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Bảng Giá Cước Vận Chuyển Hàng Hóa STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Số ngày trong trung chuyển @@ -631,8 +637,8 @@ STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLA STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Tiền trả khi vận chuyển 10 đơn vị (hay 10,000 lít) hàng hóa trên mỗi 20 ô STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Toàn bộ STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Không -STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Hiển thị toàn bộ loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng -STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Không hiển thị các loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Hiển thị toàn bộ loại hàng trên đồ thị +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Không hiển thị các loại hàng trên đồ thị STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Bật/tắt đồ thị cho hàng hóa này STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} @@ -642,6 +648,9 @@ STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Đã vận chuy STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Đã giao STR_GRAPH_INDUSTRY_RANGE_WAITING :Đang chờ... +STR_GRAPH_TOWN_CARGO_CAPTION :{WHITE}{TOWN} - Lịch sử hàng hoá +STR_GRAPH_TOWN_RANGE_PRODUCED :Nguồn cung +STR_GRAPH_TOWN_RANGE_TRANSPORTED :Đã vận chuyển STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Hiện chi tiết đánh giá chỉ số năng suất @@ -1033,6 +1042,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysi STR_GAME_OPTIONS_CURRENCY_LVL :Lát-vi-a Lats STR_GAME_OPTIONS_CURRENCY_PTE :Escudo Bồ Đào Nha STR_GAME_OPTIONS_CURRENCY_UAH :Hryvnia Ukraina +STR_GAME_OPTIONS_CURRENCY_VND :Việt Nam Đồng STR_GAME_OPTIONS_AUTOSAVE_FRAME :Lưu tự động STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :Lựa chọn khoảng thời gian tự động lưu @@ -1680,6 +1690,8 @@ STR_CONFIG_SETTING_SCROLLMODE_LMB :Kéo cuộn b STR_CONFIG_SETTING_SMOOTH_SCROLLING :Cuộn uyển chuyển cửa sổ: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Điều khiển cách màn hình chính cuộn tới vị trí cụ thể khi nháy chuột vào bản đồ nhỏ hoặc khi gõ lệnh cuộn tới đối tượng trên bản đồ. Nếu bật, thì sẽ cuộn trượt, nếu tắt thì nhảy thẳng tới vị trí đó. +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT :Hành vi khi chọn menu từ thanh công cụ truyền thông: {STRING} +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT_HELPTEXT :Chọn hành vi lựa chọn của menu thanh công cụ. Nếu tắt, menu thanh công cụ sẽ còn hiển thị cho đến khi đã chọn một lựa chọn. Nếu bật, menu thanh công cụ sẽ hiển thị khi thả nút chuột. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Hiện bảng đo lường khi dùng các công cụ xây dựng: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Hiển thị khoảng cách ô và chênh lệch độ cao khi kéo thả trong khi xây dựng @@ -3698,6 +3710,8 @@ STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Xem trun STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Chính quyền địa phương STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Xem thông tin về Chính quyền địa phương STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Đổi tên đô thị +STR_TOWN_VIEW_CARGO_GRAPH :Đồ thị hàng hoá +STR_TOWN_VIEW_CARGO_GRAPH_TOOLTIP :Hiển thị đồ thị lịch sử hàng hoá của thị trấn STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Mở rộng STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Tăng quy mô đô thị @@ -5248,6 +5262,11 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Điểu STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... hai đầu cầu phải được gá vào đất STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... cầu quá dài STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Cầu có thể vượt quá phạm vi bản đồ +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Cầu quá thấp cho ga +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Cầu quá thấp cho điểm dừng chân +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Cầu quá thấp cho phao +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường ray +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Không thể đào hầm ở đây... @@ -5403,7 +5422,7 @@ STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Không c STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}Không có điểm dừng phù hợp với xe kéo rơ moóc.{}Xe kéo rơ moóc cần điểm dừng ngắn trên đường, không phải bến dừng STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Không thể hạ cánh máy bay tại bãi đỗ trực thăng này STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Không thể hạ cánh trực thăng ở sân bay này -STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Không có điểm mốc tàu hỏa +STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Không có điểm mốc đường ray STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}Không có điểm mốc đường bộ STR_ERROR_NO_BUOY :{WHITE}Không có cái phao nào @@ -5864,6 +5883,8 @@ STR_SAVEGAME_NAME_SPECTATOR :Tham quan, {1:S # Viewport strings STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN_CITY :{TOWN} {CITY_ICON} +STR_VIEWPORT_TOWN_CITY_POP :{TOWN} ({COMMA}) {CITY_ICON} STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} # Simple strings to get specific types of data From 73045f9b0ee8c65eb9b6d3755a332fb788833b73 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 1 Sep 2025 09:44:33 +0100 Subject: [PATCH 003/280] Fix #13922: Ensure music track no widget is wide enough for track no. (#14566) --- src/music_gui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 8c7e031e30..28eef61c4f 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -711,6 +711,7 @@ struct MusicWindow : public Window { case WID_M_TRACK_NR: { Dimension d = GetStringBoundingBox(STR_MUSIC_TRACK_NONE); + d = maxdim(d, GetStringBoundingBox(GetString(STR_MUSIC_TRACK_DIGIT, GetParamMaxDigits(2, FS_SMALL), 2))); d.width += padding.width; d.height += padding.height + WidgetDimensions::scaled.fullbevel.bottom; size = maxdim(size, d); From 960b840291c1c633c2e906ff584b03dd63e172c9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 1 Sep 2025 18:52:55 +0100 Subject: [PATCH 004/280] Fix 6d6e64b1f0: Road stop properties 0x13/0x14 were not skipped properly. (#14567) These properties where changed to be variable length for consistency, but ignoring them treated them as fixed length. --- src/newgrf/newgrf_act0_roadstops.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/newgrf/newgrf_act0_roadstops.cpp b/src/newgrf/newgrf_act0_roadstops.cpp index f260b48289..7c54d12cc9 100644 --- a/src/newgrf/newgrf_act0_roadstops.cpp +++ b/src/newgrf/newgrf_act0_roadstops.cpp @@ -51,9 +51,7 @@ static ChangeInfoResult IgnoreRoadStopProperty(uint prop, ByteReader &buf) case 0x13: case 0x14: - buf.ReadWord(); - buf.ReadWord(); - buf.ReadWord(); + buf.Skip(buf.ReadExtendedByte()); break; case 0x16: // Badge list From fce2748bb72be1cdb3fd17a9b83fc0c57cde32af Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 2 Sep 2025 04:39:43 +0000 Subject: [PATCH 005/280] Update: Translations from eints portuguese: 5 changes by jcteotonio --- src/lang/portuguese.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 7a9eb0a6d8..4753c1ecb6 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -201,7 +201,7 @@ STR_COLOUR_SECONDARY_GREEN :Verde STR_COLOUR_SECONDARY_DARK_GREEN :Verde Escuro STR_COLOUR_SECONDARY_BLUE :Azul STR_COLOUR_SECONDARY_CREAM :Creme -STR_COLOUR_SECONDARY_MAUVE :Lilás +STR_COLOUR_SECONDARY_MAUVE :Malva STR_COLOUR_SECONDARY_PURPLE :Roxo STR_COLOUR_SECONDARY_ORANGE :Laranja STR_COLOUR_SECONDARY_BROWN :Castanho @@ -737,7 +737,7 @@ STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Seleccio STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Seleccionar programa 'Ezy Street' STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Seleccionar programa 'Personalizado 1' STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccionar programa 'Personalizado 2' -STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar programa aleatório +STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar reprodução aleatória STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de selecção de faixas de música # Playlist window @@ -1398,8 +1398,8 @@ STR_CONFIG_SETTING_PERCENTAGE :{COMMA}% STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS :Ângulo de inclínação para veículos rodoviários: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_SLOPE_STEEPNESS_HELPTEXT :Declive de um mosaico inclinado para um veiculo de estrada. Valores mais altos tornam mais difícil de subir. -STR_CONFIG_SETTING_FORBID_90_DEG :Proibir comboios fazer curvas de 90º: {STRING} -STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Curvas de 90 graus ocorrem quando uma pista horizontal é diretamente seguida por outra vertical num mosaico adjacente, fazendo com que o comboio vire 90 graus quando atravessa a fronteira dos mosaicos, ao invés dos habituais 45 graus para outras combinações de pistas +STR_CONFIG_SETTING_FORBID_90_DEG :Proibir comboios de fazer curvas de 90º: {STRING} +STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :Curvas de 90 graus ocorrem quando uma linha horizontal é diretamente seguida por outra vertical num mosaico adjacente, fazendo com que o comboio vire 90 graus quando atravessa a aresta dos mosaicos, ao invés dos habituais 45 graus para outras combinações de linhas STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Permitir juntar estações não adjacentes: {STRING} STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Permite acrescentar partes a uma estação sem tocar diretamente nas partes já existentes, fazendo Ctrl+Clique enquanto coloca as novas partes @@ -3883,7 +3883,7 @@ STR_STATION_VIEW_GROUP_D_S_V :Destino-Origem- STR_STATION_VIEW_GROUP_D_V_S :Destino-Via-Origem ###length 8 -STR_CARGO_RATING_APPALLING :Inexistente +STR_CARGO_RATING_APPALLING :Péssimo STR_CARGO_RATING_VERY_POOR :Muito Fraco STR_CARGO_RATING_POOR :Fraco STR_CARGO_RATING_MEDIOCRE :Medíocre From 7a6e04561d196901687fcd0305aef47e6064903a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Tue, 2 Sep 2025 12:58:31 +0200 Subject: [PATCH 006/280] Fix #14278, ccd586a7: [Script] Don't set members inside operator new() (#14568) --- src/3rdparty/squirrel/squirrel/sqapi.cpp | 4 ++-- src/3rdparty/squirrel/squirrel/sqarray.h | 2 +- src/3rdparty/squirrel/squirrel/sqclass.h | 6 +++--- src/3rdparty/squirrel/squirrel/sqclosure.h | 6 +++--- src/3rdparty/squirrel/squirrel/sqfuncproto.h | 5 +++-- src/3rdparty/squirrel/squirrel/sqobject.cpp | 3 ++- src/3rdparty/squirrel/squirrel/sqobject.h | 13 +++++-------- src/3rdparty/squirrel/squirrel/sqstate.cpp | 2 +- src/3rdparty/squirrel/squirrel/sqtable.h | 2 +- src/3rdparty/squirrel/squirrel/squserdata.h | 2 +- 10 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp index 18b31ad990..da031552e7 100644 --- a/src/3rdparty/squirrel/squirrel/sqapi.cpp +++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp @@ -58,7 +58,7 @@ HSQUIRRELVM sq_open(SQInteger initialstacksize) SQVM *v; sq_new(ss, SQSharedState); v = (SQVM *)SQ_MALLOC(sizeof(SQVM)); - new (v) SQVM(ss); + new (v, sizeof(SQVM)) SQVM(ss); ss->_root_vm = v; if(v->Init(nullptr, initialstacksize)) { return v; @@ -76,7 +76,7 @@ HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize) ss=_ss(friendvm); v= (SQVM *)SQ_MALLOC(sizeof(SQVM)); - new (v) SQVM(ss); + new (v, sizeof(SQVM)) SQVM(ss); if(v->Init(friendvm, initialstacksize)) { friendvm->Push(v); diff --git a/src/3rdparty/squirrel/squirrel/sqarray.h b/src/3rdparty/squirrel/squirrel/sqarray.h index 13ae11619c..80e77d3692 100644 --- a/src/3rdparty/squirrel/squirrel/sqarray.h +++ b/src/3rdparty/squirrel/squirrel/sqarray.h @@ -13,7 +13,7 @@ private: public: static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){ SQArray *newarray=(SQArray*)SQ_MALLOC(sizeof(SQArray)); - new (newarray) SQArray(ss,nInitialSize); + new (newarray, sizeof(SQArray)) SQArray(ss,nInitialSize); return newarray; } #ifndef NO_GARBAGE_COLLECTOR diff --git a/src/3rdparty/squirrel/squirrel/sqclass.h b/src/3rdparty/squirrel/squirrel/sqclass.h index b1b8fa5c63..d79bcf6c76 100644 --- a/src/3rdparty/squirrel/squirrel/sqclass.h +++ b/src/3rdparty/squirrel/squirrel/sqclass.h @@ -34,7 +34,7 @@ struct SQClass : public CHAINABLE_OBJ public: static SQClass* Create(SQSharedState *ss,SQClass *base) { SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass)); - new (newclass) SQClass(ss, base); + new (newclass, sizeof(SQClass)) SQClass(ss, base); return newclass; } ~SQClass(); @@ -90,7 +90,7 @@ public: SQInteger size = calcinstancesize(theclass); SQInstance *newinst = (SQInstance *)SQ_MALLOC(size); - new (newinst) SQInstance(ss, theclass,size); + new (newinst, size) SQInstance(ss, theclass,size); if(theclass->_udsize) { newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize); } @@ -100,7 +100,7 @@ public: { SQInteger size = calcinstancesize(_class); SQInstance *newinst = (SQInstance *)SQ_MALLOC(size); - new (newinst) SQInstance(ss, this,size); + new (newinst, size) SQInstance(ss, this,size); if(_class->_udsize) { newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize); } diff --git a/src/3rdparty/squirrel/squirrel/sqclosure.h b/src/3rdparty/squirrel/squirrel/sqclosure.h index 671e47c1be..13693c5643 100644 --- a/src/3rdparty/squirrel/squirrel/sqclosure.h +++ b/src/3rdparty/squirrel/squirrel/sqclosure.h @@ -11,7 +11,7 @@ private: public: static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){ SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure)); - new (nc) SQClosure(ss,func); + new (nc, sizeof(SQClosure)) SQClosure(ss,func); return nc; } void Release() override { @@ -49,7 +49,7 @@ private: public: static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){ SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator)); - new (nc) SQGenerator(ss,closure); + new (nc, sizeof(SQGenerator)) SQGenerator(ss,closure); return nc; } ~SQGenerator() @@ -85,7 +85,7 @@ public: static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func) { SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure)); - new (nc) SQNativeClosure(ss,func); + new (nc, sizeof(SQNativeClosure)) SQNativeClosure(ss,func); return nc; } SQNativeClosure *Clone() diff --git a/src/3rdparty/squirrel/squirrel/sqfuncproto.h b/src/3rdparty/squirrel/squirrel/sqfuncproto.h index a2cdb94fd1..3fb90f4c1a 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncproto.h +++ b/src/3rdparty/squirrel/squirrel/sqfuncproto.h @@ -99,8 +99,9 @@ public: { SQFunctionProto *f; //I compact the whole class and members in a single memory allocation - f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams)); - new (f) SQFunctionProto(ninstructions, nliterals, nparameters, nfunctions, noutervalues, nlineinfos, nlocalvarinfos, ndefaultparams); + SQInteger size = _FUNC_SIZE(ninstructions, nliterals, nparameters, nfunctions, noutervalues, nlineinfos, nlocalvarinfos, ndefaultparams); + f = (SQFunctionProto *)sq_vm_malloc(size); + new (f, size) SQFunctionProto(ninstructions, nliterals, nparameters, nfunctions, noutervalues, nlineinfos, nlocalvarinfos, ndefaultparams); return f; } void Release() override { diff --git a/src/3rdparty/squirrel/squirrel/sqobject.cpp b/src/3rdparty/squirrel/squirrel/sqobject.cpp index 9fc3ae3545..668da50a92 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.cpp +++ b/src/3rdparty/squirrel/squirrel/sqobject.cpp @@ -91,7 +91,8 @@ SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx) SQWeakRef *SQRefCounted::GetWeakRef(SQObjectType type) { if(!_weakref) { - sq_new(_weakref,SQWeakRef); + _weakref = (SQWeakRef *)sq_vm_malloc(sizeof(SQWeakRef)); + new (_weakref, sizeof(SQWeakRef)) SQWeakRef(); _weakref->_obj._type = type; _weakref->_obj._unVal.pRefCounted = this; } diff --git a/src/3rdparty/squirrel/squirrel/sqobject.h b/src/3rdparty/squirrel/squirrel/sqobject.h index d9bce1732d..2551bc2aa4 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.h +++ b/src/3rdparty/squirrel/squirrel/sqobject.h @@ -64,22 +64,19 @@ struct SQRefCounted virtual void Release()=0; /* Placement new/delete to prevent memory leaks if constructor throws an exception. */ - inline void *operator new(size_t size, SQRefCounted *place) + inline void *operator new([[maybe_unused]] size_t size, void *ptr, [[maybe_unused]] size_t real_size) { - place->size = size; - return place; + assert(size <= real_size); + return ptr; } - inline void operator delete(void *ptr, SQRefCounted *place) + inline void operator delete(void *ptr, void *, size_t real_size) { - SQ_FREE(ptr, place->size); + SQ_FREE(ptr, real_size); } /* Never used but required. */ inline void operator delete(void *) { NOT_REACHED(); } - -private: - size_t size = 0; }; struct SQWeakRef : SQRefCounted diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index f75c466da0..30306a075a 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -553,7 +553,7 @@ SQString *SQStringTable::Add(std::string_view new_string) } SQString *t=(SQString *)SQ_MALLOC(len+sizeof(SQString)); - new (t) SQString(new_string); + new (t, len+sizeof(SQString)) SQString(new_string); t->_next = _strings[slot]; _strings[slot] = t; _slotused++; diff --git a/src/3rdparty/squirrel/squirrel/sqtable.h b/src/3rdparty/squirrel/squirrel/sqtable.h index 6bdda15773..c5cc4f3984 100644 --- a/src/3rdparty/squirrel/squirrel/sqtable.h +++ b/src/3rdparty/squirrel/squirrel/sqtable.h @@ -46,7 +46,7 @@ public: static SQTable* Create(SQSharedState *ss,SQInteger nInitialSize) { SQTable *newtable = (SQTable*)SQ_MALLOC(sizeof(SQTable)); - new (newtable) SQTable(ss, nInitialSize); + new (newtable, sizeof(SQTable)) SQTable(ss, nInitialSize); newtable->_delegate = nullptr; return newtable; } diff --git a/src/3rdparty/squirrel/squirrel/squserdata.h b/src/3rdparty/squirrel/squirrel/squserdata.h index 108c0f8f1e..5345e13163 100644 --- a/src/3rdparty/squirrel/squirrel/squserdata.h +++ b/src/3rdparty/squirrel/squirrel/squserdata.h @@ -14,7 +14,7 @@ struct SQUserData : SQDelegable static SQUserData* Create(SQSharedState *ss, SQInteger size) { SQUserData* ud = (SQUserData*)SQ_MALLOC(sizeof(SQUserData)+(size-1)); - new (ud) SQUserData(ss, size); + new (ud, sizeof(SQUserData)+(size-1)) SQUserData(ss, size); return ud; } #ifndef NO_GARBAGE_COLLECTOR From dd426bb8c71547482240d24ef787c7fcba53c0bc Mon Sep 17 00:00:00 2001 From: Cornelius Diekmann <1486029+diekmann@users.noreply.github.com> Date: Tue, 2 Sep 2025 13:55:08 +0200 Subject: [PATCH 007/280] Codefix f6555cf: fix comment track vs. tile (#14571) --- src/rail_map.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rail_map.h b/src/rail_map.h index ca13eaf271..5b06a2cb57 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -217,9 +217,9 @@ inline void SetTrackReservation(Tile t, TrackBits b) /** * Try to reserve a specific track on a tile - * @pre IsPlainRailTile(t) && HasTrack(tile, t) + * @pre IsPlainRailTile(tile) && HasTrack(tile, t) * @param tile the tile - * @param t the rack to reserve + * @param t the track to reserve * @return true if successful */ inline bool TryReserveTrack(Tile tile, Track t) @@ -236,7 +236,7 @@ inline bool TryReserveTrack(Tile tile, Track t) /** * Lift the reservation of a specific track on a tile - * @pre IsPlainRailTile(t) && HasTrack(tile, t) + * @pre IsPlainRailTile(tile) && HasTrack(tile, t) * @param tile the tile * @param t the track to free */ From 7d4282b341aa25a37abcfd982b9f12c6b13ede74 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 2 Sep 2025 20:18:33 +0100 Subject: [PATCH 008/280] Fix #14569: Ensure music playlist window is large enough. (#14570) Take number of tracks allowed in custom playlist into account, instead of just the number of tracks loaded. --- src/music_gui.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 28eef61c4f..1d9316f424 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -539,10 +539,10 @@ struct MusicTrackSelectionWindow : public Window { Dimension d = {0, 0}; for (const auto &song : _music.music_set) { - Dimension d2 = GetStringBoundingBox(GetString(STR_PLAYLIST_TRACK_NAME, song.tracknr, 2, song.songname)); - d.width = std::max(d.width, d2.width); - d.height += d2.height; + d = maxdim(d, GetStringBoundingBox(GetString(STR_PLAYLIST_TRACK_NAME, song.tracknr, 2, song.songname))); } + d.height *= std::max(NUM_SONGS_AVAILABLE, NUM_SONGS_PLAYLIST); + d.width += padding.width; d.height += padding.height; size = maxdim(size, d); From 736998b5951539dbc75b672af45406d8d6ffd799 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 2 Sep 2025 21:48:24 +0100 Subject: [PATCH 009/280] Codechange: Use span instead of raw pointer for animated cursors. (#14575) This allows the terminator entry to be removed. --- src/gfx.cpp | 16 +++++------ src/gfx_func.h | 2 +- src/gfx_type.h | 7 +++-- src/table/animcursors.h | 60 +++++++++++++++-------------------------- 4 files changed, 33 insertions(+), 52 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index e7ab98b22f..8dfc5683fa 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1659,15 +1659,15 @@ static void SetCursorSprite(CursorID cursor, PaletteID pal) static void SwitchAnimatedCursor() { - const AnimCursor *cur = _cursor.animate_cur; - - if (cur == nullptr || cur->sprite == AnimCursor::LAST) cur = _cursor.animate_list; + if (_cursor.animate_cur == std::end(_cursor.animate_list)) { + _cursor.animate_cur = std::begin(_cursor.animate_list); + } assert(!_cursor.sprites.empty()); - SetCursorSprite(cur->sprite, _cursor.sprites[0].image.pal); + SetCursorSprite(_cursor.animate_cur->sprite, _cursor.sprites[0].image.pal); - _cursor.animate_timeout = cur->display_time; - _cursor.animate_cur = cur + 1; + _cursor.animate_timeout = _cursor.animate_cur->display_time; + ++_cursor.animate_cur; } void CursorTick() @@ -1710,11 +1710,11 @@ void SetMouseCursor(CursorID sprite, PaletteID pal) * @param table Array of animation states. * @see SetMouseCursor */ -void SetAnimatedMouseCursor(const AnimCursor *table) +void SetAnimatedMouseCursor(std::span table) { assert(!_cursor.sprites.empty()); _cursor.animate_list = table; - _cursor.animate_cur = nullptr; + _cursor.animate_cur = std::end(table); _cursor.sprites[0].image.pal = PAL_NONE; SwitchAnimatedCursor(); } diff --git a/src/gfx_func.h b/src/gfx_func.h index 885f72ccf9..7820db9b35 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -169,7 +169,7 @@ void DrawOverlappedWindowForAll(int left, int top, int right, int bottom); void SetMouseCursorBusy(bool busy); void SetMouseCursor(CursorID cursor, PaletteID pal); -void SetAnimatedMouseCursor(const AnimCursor *table); +void SetAnimatedMouseCursor(std::span table); void CursorTick(); void UpdateCursorSize(); bool ChangeResInGame(int w, int h); diff --git a/src/gfx_type.h b/src/gfx_type.h index 4434690bdd..e689aaf0a8 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -108,8 +108,7 @@ enum WindowKeyCodes : uint16_t { /** A single sprite of a list of animated cursors */ struct AnimCursor { - static const CursorID LAST = std::numeric_limits::max(); - CursorID sprite; ///< Must be set to LAST_ANIM when it is the last sprite of the loop + CursorID sprite; ///< Must be set to LAST_ANIM when it is the last sprite of the loop uint8_t display_time; ///< Amount of ticks this sprite will be shown }; @@ -139,8 +138,8 @@ struct CursorVars { Point draw_pos, draw_size; ///< position and size bounding-box for drawing - const AnimCursor *animate_list; ///< in case of animated cursor, list of frames - const AnimCursor *animate_cur; ///< in case of animated cursor, current frame + std::span animate_list{}; ///< in case of animated cursor, list of frames + std::span::iterator animate_cur = std::end(animate_list); ///< in case of animated cursor, current frame uint animate_timeout; ///< in case of animated cursor, number of ticks to show the current cursor bool visible; ///< cursor is visible diff --git a/src/table/animcursors.h b/src/table/animcursors.h index ed25691a5e..f51b9e0ee2 100644 --- a/src/table/animcursors.h +++ b/src/table/animcursors.h @@ -14,67 +14,49 @@ * is to be displayed. */ -/** - * Creates two array entries that define one - * status of the cursor. - * @param Sprite The Sprite to be displayed - * @param display_time The Number of ticks to display the sprite - */ -#define ANIM_CURSOR_LINE(Sprite, display_time) { Sprite, display_time }, - -/** - * This indicates the termination of the cursor list - */ -#define ANIM_CURSOR_END() ANIM_CURSOR_LINE(AnimCursor::LAST, 0) - /** * Animated cursor elements for demolition */ -static const AnimCursor _demolish_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_FIRST, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_1, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_2, 8) - ANIM_CURSOR_LINE(SPR_CURSOR_DEMOLISH_LAST, 8) - ANIM_CURSOR_END() +static constexpr AnimCursor _demolish_animcursor[] = { + {SPR_CURSOR_DEMOLISH_FIRST, 8}, + {SPR_CURSOR_DEMOLISH_1, 8}, + {SPR_CURSOR_DEMOLISH_2, 8}, + {SPR_CURSOR_DEMOLISH_LAST, 8}, }; /** * Animated cursor elements for lower land */ -static const AnimCursor _lower_land_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_LOWERLAND_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _lower_land_animcursor[] = { + {SPR_CURSOR_LOWERLAND_FIRST, 10}, + {SPR_CURSOR_LOWERLAND_1, 10}, + {SPR_CURSOR_LOWERLAND_LAST, 29}, }; /** * Animated cursor elements for raise land */ -static const AnimCursor _raise_land_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_RAISELAND_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _raise_land_animcursor[] = { + {SPR_CURSOR_RAISELAND_FIRST, 10}, + {SPR_CURSOR_RAISELAND_1, 10}, + {SPR_CURSOR_RAISELAND_LAST, 29}, }; /** * Animated cursor elements for the goto icon */ -static const AnimCursor _order_goto_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_FIRST, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_1, 10) - ANIM_CURSOR_LINE(SPR_CURSOR_PICKSTATION_LAST, 29) - ANIM_CURSOR_END() +static constexpr AnimCursor _order_goto_animcursor[] = { + {SPR_CURSOR_PICKSTATION_FIRST, 10}, + {SPR_CURSOR_PICKSTATION_1, 10}, + {SPR_CURSOR_PICKSTATION_LAST, 29}, }; /** * Animated cursor elements for the build signal icon */ -static const AnimCursor _build_signals_animcursor[] = { - ANIM_CURSOR_LINE(SPR_CURSOR_BUILDSIGNALS_FIRST, 20) - ANIM_CURSOR_LINE(SPR_CURSOR_BUILDSIGNALS_LAST, 20) - ANIM_CURSOR_END() +static constexpr AnimCursor _build_signals_animcursor[] = { + {SPR_CURSOR_BUILDSIGNALS_FIRST, 20}, + {SPR_CURSOR_BUILDSIGNALS_LAST, 20}, }; /** @@ -82,7 +64,7 @@ static const AnimCursor _build_signals_animcursor[] = { * definitions we have above. This is the only thing that is * accessed directly from other files */ -static const AnimCursor * const _animcursors[] = { +static constexpr std::span _animcursors[] = { _demolish_animcursor, _lower_land_animcursor, _raise_land_animcursor, From 5602555a7a9d7be1806698cf592ed8ec427a6cd6 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 3 Sep 2025 04:38:23 +0000 Subject: [PATCH 010/280] Update: Translations from eints danish: 8 changes by New-Authentication --- src/lang/danish.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 49e5f6e7dc..620588e63b 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3648,7 +3648,7 @@ STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Den ænd STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Det ændrede køretøj kapacitet til '{1:ENGINE}' når det ikke er inde i et depot eller genmontering STR_BROKEN_VEHICLE_LENGTH :{WHITE}Toget '{VEHICLE}' fra selskabet '{COMPANY}' har ugyldig længde. Det skyldes sandsynligvis at problem med en NewGRF. Risiko for at spillet mister synkronisering eller går ned. -STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' indeholder forkert information +STR_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' indeholder forkert information STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' forårsagede en uendelig løkke i produktions-callback'en. STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returnerede ukendt/ugyldigt resultat {2:HEX} @@ -4734,8 +4734,8 @@ STR_ORDER_FULL_LOAD :{SPACE}(Fuld la STR_ORDER_FULL_LOAD_ANY :{SPACE}(Fuld last vilkårlig type fragt) STR_ORDER_NO_LOAD :{SPACE}(Ingen last) STR_ORDER_UNLOAD :{SPACE}(Los og medtag fragt) -STR_ORDER_UNLOAD_FULL_LOAD :(Los og vent på fuld last) -STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Los og vent på fuld last af hvilken som helst type fragt) +STR_ORDER_UNLOAD_FULL_LOAD :{SPACE}(Los af og vent på fuld last) +STR_ORDER_UNLOAD_FULL_LOAD_ANY :{SPACE}(Los og vent på fuld last af hvilken som helst type fragt) STR_ORDER_UNLOAD_NO_LOAD :(Los og efterlad tom) STR_ORDER_TRANSFER :{SPACE}(Overfør og last fragt) STR_ORDER_TRANSFER_FULL_LOAD :{SPACE}(Overfør og vent på fuld last) @@ -4750,8 +4750,8 @@ STR_ORDER_AUTO_REFIT :{SPACE}(Auto-ti STR_ORDER_FULL_LOAD_REFIT :{SPACE}(Fuld last med auto-tilpas til {STRING}) STR_ORDER_FULL_LOAD_ANY_REFIT :{SPACE}(Fuld vilkårlig last med auto-tilpas til {STRING}) STR_ORDER_UNLOAD_REFIT :(Los og medtag last med auto-tilpas til {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Los og vent på fuld last med auto-tilpas til {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Los og vent på fuld vilkårlig last med auto-tilpas til {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :{SPACE}(Los og vent på fuld last med auto-tilpas til {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :{SPACE}(Los og vent på fuld vilkårlig last med auto-tilpas til {STRING}) STR_ORDER_TRANSFER_REFIT :(Overfør og medtag last med auto-tilpas til {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_REFIT :{SPACE}(Overfør og vent på fuld last med auto-tilpas til {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :{SPACE}(Overfør og vent på fuld vilkårlig last med auto-tilpas til {STRING}) @@ -4762,9 +4762,9 @@ STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :{SPACE}(Ingen l STR_ORDER_AUTO_REFIT_ANY :tilgængelig last ###length 3 -STR_ORDER_STOP_LOCATION_NEAR_END :[nærmeste ende] -STR_ORDER_STOP_LOCATION_MIDDLE :[midten] -STR_ORDER_STOP_LOCATION_FAR_END :[fjerneste ende] +STR_ORDER_STOP_LOCATION_NEAR_END :{SPACE}[nær ende] +STR_ORDER_STOP_LOCATION_MIDDLE :{SPACE}[midten] +STR_ORDER_STOP_LOCATION_FAR_END :{SPACE}[fjerneste ende] STR_ORDER_OUT_OF_RANGE :{RED} (Næste destination er uden for område) From 80f672d5b43a972844d7646b16878973326bc2c5 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Wed, 3 Sep 2025 12:52:15 +0200 Subject: [PATCH 011/280] Codechange: Remove redundant data members from YAPF ship node. (#14577) --- src/pathfinder/yapf/yapf_node_ship.hpp | 15 ++------------- src/pathfinder/yapf/yapf_ship.cpp | 4 ++-- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/pathfinder/yapf/yapf_node_ship.hpp b/src/pathfinder/yapf/yapf_node_ship.hpp index a6eae6a12e..8b79a6a47e 100644 --- a/src/pathfinder/yapf/yapf_node_ship.hpp +++ b/src/pathfinder/yapf/yapf_node_ship.hpp @@ -16,19 +16,8 @@ #include "yapf_node.hpp" /** Yapf Node for ships */ -template -struct CYapfShipNodeT : CYapfNodeT> { - typedef CYapfNodeT> base; - - TileIndex segment_last_tile; - Trackdir segment_last_td; - - void Set(CYapfShipNodeT *parent, TileIndex tile, Trackdir td, bool is_choice) - { - this->base::Set(parent, tile, td, is_choice); - this->segment_last_tile = tile; - this->segment_last_td = td; - } +template +struct CYapfShipNodeT : CYapfNodeT> { }; /* now define two major node types (that differ by key type) */ diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 2c3b26d39d..a5f1ef67a2 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -72,7 +72,7 @@ public: /** Called by YAPF to detect if node ends in the desired destination. */ inline bool PfDetectDestination(Node &n) { - return this->PfDetectDestinationTile(n.segment_last_tile, n.segment_last_td); + return this->PfDetectDestinationTile(n.GetTile(), n.GetTrackdir()); } inline bool PfDetectDestinationTile(TileIndex tile, Trackdir trackdir) @@ -101,7 +101,7 @@ public: return true; } - n.estimate = n.cost + OctileDistanceCost(n.segment_last_tile, n.segment_last_td, destination_tile); + n.estimate = n.cost + OctileDistanceCost(n.GetTile(), n.GetTrackdir(), destination_tile); assert(n.estimate >= n.parent->estimate); return true; } From f3951214c164babf40212ce41339a2e12d42d01d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 3 Sep 2025 18:22:50 +0100 Subject: [PATCH 012/280] Codechange: Shuffle MusicSongInfo members to reduce alignment padding. (#14580) --- src/base_media_music.h | 14 +++++++------- src/music_gui.cpp | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/base_media_music.h b/src/base_media_music.h index 86b3e8cad7..9907ca4ecd 100644 --- a/src/base_media_music.h +++ b/src/base_media_music.h @@ -33,14 +33,14 @@ enum MusicTrackType : uint8_t { /** Metadata about a music track. */ struct MusicSongInfo { - std::string songname; ///< name of song displayed in UI - uint8_t tracknr; ///< track number of song displayed in UI - std::string filename; ///< file on disk containing song (when used in MusicSet class) + std::string songname; ///< name of song displayed in UI + std::string filename; ///< file on disk containing song (when used in MusicSet class) + int cat_index; ///< entry index in CAT file, for filetype==MTT_MPSMIDI + int override_start; ///< MIDI ticks to skip over in beginning + int override_end; ///< MIDI tick to end the song at (0 if no override) + uint8_t tracknr; ///< track number of song displayed in UI MusicTrackType filetype; ///< decoder required for song file - int cat_index; ///< entry index in CAT file, for filetype==MTT_MPSMIDI - bool loop; ///< song should play in a tight loop if possible, never ending - int override_start; ///< MIDI ticks to skip over in beginning - int override_end; ///< MIDI tick to end the song at (0 if no override) + bool loop; ///< song should play in a tight loop if possible, never ending }; template <> struct BaseSetTraits { diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 1d9316f424..22c0a09d0e 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -39,8 +39,8 @@ struct MusicSystem { struct PlaylistEntry : MusicSongInfo { - const MusicSet *set; ///< music set the song comes from - uint set_index; ///< index of song in set + const MusicSet *set; ///< music set the song comes from + uint set_index; ///< index of song in set PlaylistEntry(const MusicSet *set, uint set_index) : MusicSongInfo(set->songinfo[set_index]), set(set), set_index(set_index) { } bool IsValid() const { return !this->songname.empty(); } From 5d15c8b8ab81a1b3e5cc2415319a3b31fbcb80f5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 3 Sep 2025 19:02:26 +0100 Subject: [PATCH 013/280] Fix: Wrong row may be selected in music playlists. (#14581) Include frame offset when clicking on music playlist to ensure the correct row is selected. --- src/music_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 22c0a09d0e..80229e5c37 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -582,13 +582,13 @@ struct MusicTrackSelectionWindow : public Window { { switch (widget) { case WID_MTS_LIST_LEFT: { // add to playlist - int y = this->GetRowFromWidget(pt.y, widget, 0, GetCharacterHeight(FS_SMALL)); + int y = this->GetRowFromWidget(pt.y, widget, WidgetDimensions::scaled.framerect.top, GetCharacterHeight(FS_SMALL)); _music.PlaylistAdd(y); break; } case WID_MTS_LIST_RIGHT: { // remove from playlist - int y = this->GetRowFromWidget(pt.y, widget, 0, GetCharacterHeight(FS_SMALL)); + int y = this->GetRowFromWidget(pt.y, widget, WidgetDimensions::scaled.framerect.top, GetCharacterHeight(FS_SMALL)); _music.PlaylistRemove(y); break; } From 4ed4a8b60222ede692496bd7b582c687ed70a9d9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 4 Sep 2025 02:56:19 +0100 Subject: [PATCH 014/280] Codechange: Remove MusicSystem::displayed_playlist. (#14582) It is not actually used for display, and is basically a copy of the standard playlist with duplicated maintenance. --- src/music_gui.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 80229e5c37..b368fb3742 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -59,7 +59,6 @@ struct MusicSystem { }; Playlist active_playlist{}; ///< current play order of songs, including any shuffle - Playlist displayed_playlist{}; ///< current playlist as displayed in GUI, never in shuffled order Playlist music_set{}; ///< all songs in current music set, in set order PlaylistChoices selected_playlist{}; @@ -152,9 +151,8 @@ void MusicSystem::ChangePlaylist(PlaylistChoices pl) if (pl != PLCH_THEMEONLY) _settings_client.music.playlist = pl; if (_game_mode != GM_MENU || pl == PLCH_THEMEONLY) { - this->displayed_playlist = this->standard_playlists[pl]; - this->active_playlist = this->displayed_playlist; this->selected_playlist = pl; + this->active_playlist = this->standard_playlists[this->selected_playlist]; this->playlist_position = 0; if (_settings_client.music.shuffle) this->Shuffle(); @@ -211,7 +209,7 @@ void MusicSystem::Shuffle() _settings_client.music.shuffle = true; uint set_index = this->GetSetIndex(); - this->active_playlist = this->displayed_playlist; + this->active_playlist = this->standard_playlists[this->selected_playlist]; for (size_t i = 0; i < this->active_playlist.size(); i++) { size_t shuffle_index = InteractiveRandom() % (this->active_playlist.size() - i); std::swap(this->active_playlist[i], this->active_playlist[i + shuffle_index]); @@ -230,7 +228,7 @@ void MusicSystem::Unshuffle() _settings_client.music.shuffle = false; uint set_index = this->GetSetIndex(); - this->active_playlist = this->displayed_playlist; + this->active_playlist = this->standard_playlists[this->selected_playlist]; this->SetPositionBySetIndex(set_index); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); @@ -338,7 +336,6 @@ void MusicSystem::PlaylistAdd(size_t song_index) /* Add it to the appropriate playlist, and the display */ this->standard_playlists[this->selected_playlist].push_back(entry); - this->displayed_playlist.push_back(entry); /* Add it to the active playlist, if playback is shuffled select a random position to add at */ if (this->active_playlist.empty()) { @@ -346,7 +343,7 @@ void MusicSystem::PlaylistAdd(size_t song_index) if (this->IsPlaying()) this->Play(); } else if (this->IsShuffle()) { /* Generate a random position between 0 and n (inclusive, new length) to insert at */ - size_t maxpos = this->displayed_playlist.size(); + size_t maxpos = this->active_playlist.size() + 1; size_t newpos = InteractiveRandom() % maxpos; this->active_playlist.insert(this->active_playlist.begin() + newpos, entry); /* Make sure to shift up the current playback position if the song was inserted before it */ @@ -374,7 +371,6 @@ void MusicSystem::PlaylistRemove(size_t song_index) /* Remove from "simple" playlists */ PlaylistEntry song = pl[song_index]; pl.erase(pl.begin() + song_index); - this->displayed_playlist.erase(this->displayed_playlist.begin() + song_index); /* Find in actual active playlist (may be shuffled) and remove, * if it's the current song restart playback */ From 8d96ea1a5e2d91382eb05cfe6957a968f444dd86 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 4 Sep 2025 03:18:26 +0100 Subject: [PATCH 015/280] Fix #14584: Crash due to drawing non-existent orders of new vehicle. (#14585) When the vehicle list window is grouped by orders, no check was made that vehicle's order list existed. --- src/vehicle_gui.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 3b1896cfff..5a0f6846f2 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1682,14 +1682,16 @@ static void DrawSmallOrderList(const Vehicle *v, int left, int right, int y, uin } /** Draw small order list in the vehicle GUI, but without the little black arrow. This is used for shared order groups. */ -static void DrawSmallOrderList(const OrderList &orderlist, int left, int right, int y, uint order_arrow_width) +static void DrawSmallOrderList(const OrderList *orderlist, int left, int right, int y, uint order_arrow_width) { + if (orderlist == nullptr) return; + bool rtl = _current_text_dir == TD_RTL; int l_offset = rtl ? 0 : order_arrow_width; int r_offset = rtl ? order_arrow_width : 0; int i = 0; - for (const Order &order : orderlist.GetOrders()) { + for (const Order &order : orderlist->GetOrders()) { if (order.IsType(OT_GOTO_STATION)) { DrawString(left + l_offset, right - r_offset, y, GetString(STR_STATION_NAME, order.GetDestination()), TC_BLACK, SA_LEFT, false, FS_SMALL); @@ -1844,7 +1846,7 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int DrawVehicleImage(vehgroup.vehicles_begin[i], {image_left + WidgetDimensions::scaled.hsep_wide * i, ir.top, image_right, ir.bottom}, selected_vehicle, EIT_IN_LIST, 0); } - if (show_orderlist) DrawSmallOrderList(*(vehgroup.vehicles_begin[0])->orders, olr.left, olr.right, ir.top + GetCharacterHeight(FS_SMALL), this->order_arrow_width); + if (show_orderlist) DrawSmallOrderList(vehgroup.vehicles_begin[0]->orders, olr.left, olr.right, ir.top + GetCharacterHeight(FS_SMALL), this->order_arrow_width); DrawString(ir.left, ir.right, ir.top + WidgetDimensions::scaled.framerect.top, GetString(STR_JUST_COMMA, vehgroup.NumVehicles()), TC_BLACK); break; From 6613da5d7e5b963f86909847c53656bdaf44425c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 4 Sep 2025 22:11:02 +0100 Subject: [PATCH 016/280] Fix #14586, Fix 069ff846e4: Empty station tile layouts incorrectly substituted with default layouts. (#14587) It is no longer possible for a layout to be missing, so the nullptr check should have been removed. --- src/station_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0dc0158eb0..cd59fed02d 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3316,7 +3316,7 @@ static void DrawTile_Station(TileInfo *ti) palette = PALETTE_TO_GREY; } - if (layout == nullptr && (t == nullptr || t->GetSequence().empty())) t = GetStationTileLayout(GetStationType(ti->tile), gfx); + if (layout == nullptr && t == nullptr) t = GetStationTileLayout(GetStationType(ti->tile), gfx); /* don't show foundation for docks */ if (ti->tileh != SLOPE_FLAT && !IsDock(ti->tile)) { From 122023be8d3080ab144f987596fcebe163456ffe Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 5 Sep 2025 04:39:06 +0000 Subject: [PATCH 017/280] Update: Translations from eints danish: 10 changes by New-Authentication french: 1 change by ottdfevr --- src/lang/danish.txt | 20 ++++++++++---------- src/lang/french.txt | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 620588e63b..7100f485c6 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -951,7 +951,7 @@ STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLAC STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tilskudsordning tilbagetrukket:{}{}{STRING} fra {STRING} til {STRING} modtager ikke længere tilskud. STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tilskudsordning i udbud:{}{}Første {STRING} fra {STRING} til {STRING} vil udløse et {UNITS_YEARS_OR_MINUTES}s tilskud fra den lokale myndighed! ###length 4 -STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Servicetilskud tildelt til {STRING}!{}{}{STRING} fra {STRING} til {STRING} vil betale 50% ekstra for de næste {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Servicetilskud tildelt {STRING}!{}{}{STRING} fra {STRING} til {STRING} vil betale 50% ekstra for de næste {UNITS_YEARS_OR_MINUTES}! STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Servicetilskud tildelt {STRING}!{}{}{STRING} fra {STRING} til {STRING} vil betale dobbelt takster for den næste {UNITS_YEARS_OR_MINUTES}! STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Tilskudsordning tildelt {STRING}!{}{}{STRING} fra {STRING} til {STRING} betaler tredobbelte takster for de næste {UNITS_YEARS_OR_MINUTES}! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Tilskudsordning tildelt {STRING}!{}{}{STRING} fra {STRING} til {STRING} betaler firedobbelt takster for de næste {UNITS_YEARS_OR_MINUTES}! @@ -1096,7 +1096,7 @@ STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :Automatiseret undersøgelse STR_GAME_OPTIONS_PARTICIPATE_SURVEY :Deltag i automatiseret undersøgelse STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :Når det er aktiveret, sender OpenTTD en undersøgelse, når du forlader et spil -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :Om GPDR og privatliv +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Om undersøgelse og privatliv STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :Dette åbner en browser med mere information om den automatiserede undersøgelse STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :Forhåndsvisning af undersøgelsesresultat STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :Vis undersøgelsesresultatet af det aktuelle spil @@ -2051,7 +2051,7 @@ STR_CONFIG_SETTING_SOFT_LIMIT :Vinduesbegræsn STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Antal ikke klæbende vinduer åbnet før gamle vinduer automatisk bliver lukket for at gøre plads til nye vinduer STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special -STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :deaktiveret +STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Deaktiveret STR_CONFIG_SETTING_ZOOM_MIN :Maksimalt zoom-in niveau: {STRING} STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Maximalt zoom-in niveau for skærmbilledet. Højere zoom niveau vil øge hukommelseskravet @@ -2970,7 +2970,7 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Vælg re # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Bygning af vandveje STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Vandveje -STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Byg kanaler. Tryk på Shift for kun at vise omkostningsestimat +STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Byg kanaler. Ctrl+Klik+Træk for at vælge området diagonalt. Tryk på Shift for kun at vise omkostningsestimat STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Byg en sluse. Shift skifter mellem at bygge og vise prisoverslag. STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Byg en skibsdok (til køb og servicering af skibe). Shift skifter mellem at bygge og vise prisoverslag. STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Byg en havn. Ctrl muliggør sammenslutning af stationer. Shift skifter mellem at bygge og vise prisoverslag. @@ -3652,7 +3652,7 @@ STR_NEWGRF_BUGGY :{WHITE}NewGRF ' STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' forårsagede en uendelig løkke i produktions-callback'en. STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returnerede ukendt/ugyldigt resultat {2:HEX} -STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' returnerede ugyldig godstype i produktion-callback ved {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' returnerede ugyldig godstype i produktion-callback ved {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO : @@ -3804,7 +3804,7 @@ STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Tilskuds STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} fra {STRING} til {STRING}{YELLOW} ({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- Ingen - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Tilskudsordninger der allerede er vundet: -STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} fra {STRING} til {STRING}{YELLOW} ({COMPANY}{YELLOW}, indtil {STRING}) +STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} fra {STRING} til {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING}) STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klik på servicen for at centrere skærmen over industrien/byen. Ctrl+Klik åbner et nyt vindue ved industriens/byens lokalitet. STR_SUBSIDIES_OFFERED_EXPIRY_DATE :ved {DATE_SHORT} STR_SUBSIDIES_OFFERED_EXPIRY_TIME :inden {UNITS_MONTHS_OR_MINUTES} @@ -4460,7 +4460,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Vis flye STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer om toget STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Vis køretøjets detaljer STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer omkring skibet -STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljet omkring flyet +STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljet omkring flyet. Ctrl+Klik for at vise flyets gruppe ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Togets nuværende aktivitet - klik for at stoppe/starte toget @@ -4723,7 +4723,7 @@ STR_ORDER_REFIT_ORDER :{SPACE}(Tilpas STR_ORDER_REFIT_STOP_ORDER :{SPACE}(Tilpas til {STRING} og stop) STR_ORDER_STOP_ORDER :(Stop) -STR_ORDER_WAIT_TO_UNBUNCH :(vent med at afkoble) +STR_ORDER_WAIT_TO_UNBUNCH :{SPACE}(vent med at afkoble) STR_ORDER_GO_TO_STATION :{STRING} {STATION} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Kan ikke bruge station){POP_COLOUR} {STRING} {STATION} @@ -4982,7 +4982,7 @@ STR_GAME_SAVELOAD_NOT_AVAILABLE : Date: Fri, 5 Sep 2025 14:05:02 +0100 Subject: [PATCH 018/280] Codefix: Use of nullptr instead of std::nullopt. (#14590) --- src/os/windows/win32.cpp | 2 +- src/video/cocoa/cocoa_wnd.mm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index ba4e2aa539..2e005d2e9b 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -407,7 +407,7 @@ std::optional GetCurrentLocale(const char *) if (GetLocaleInfoA(userUiLocale, LOCALE_SISO639LANGNAME, lang, static_cast(std::size(lang))) == 0 || GetLocaleInfoA(userUiLocale, LOCALE_SISO3166CTRYNAME, country, static_cast(std::size(country))) == 0) { /* Unable to retrieve the locale. */ - return nullptr; + return std::nullopt; } /* Format it as 'en_us'. */ return fmt::format("{}_{}", std::string_view{lang, 2}, std::string_view{country, 2}); diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index 99e3dc3f3b..43f8ee266b 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -401,7 +401,7 @@ void CocoaDialog(std::string_view title, std::string_view message, std::string_v bool wasstarted = _cocoa_video_started; if (VideoDriver::GetInstance() == nullptr) { CocoaSetupApplication(); // Setup application before showing dialog - } else if (!_cocoa_video_started && VideoDriver::GetInstance()->Start({}) != nullptr) { + } else if (!_cocoa_video_started && VideoDriver::GetInstance()->Start({}).has_value()) { fmt::print(stderr, "{}: {}\n", title, message); return; } From 244a2673043b7f75e6012d823fe02b447475b512 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 5 Sep 2025 20:02:00 +0100 Subject: [PATCH 019/280] Codechange: Give better names to water tile layouts. (#14592) --- src/table/water_land.h | 64 +++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/table/water_land.h b/src/table/water_land.h index d96aa979fe..9bb843b3a1 100644 --- a/src/table/water_land.h +++ b/src/table/water_land.h @@ -26,115 +26,115 @@ */ #define TILE_SPRITE_LINE(img, dtss) { {img, PAL_NONE}, dtss }, -static const DrawTileSeqStruct _shipdepot_display_seq_1[] = { +static const DrawTileSeqStruct _shipdepot_display_ne_seq[] = { TILE_SEQ_LINE( 0, 15, 0, 16, 1, 0x14, 0xFE8 | (1 << PALETTE_MODIFIER_COLOUR)) }; -static const DrawTileSeqStruct _shipdepot_display_seq_2[] = { +static const DrawTileSeqStruct _shipdepot_display_sw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 16, 1, 0x14, 0xFEA) TILE_SEQ_LINE( 0, 15, 0, 16, 1, 0x14, 0xFE6 | (1 << PALETTE_MODIFIER_COLOUR)) }; -static const DrawTileSeqStruct _shipdepot_display_seq_3[] = { +static const DrawTileSeqStruct _shipdepot_display_nw_seq[] = { TILE_SEQ_LINE( 15, 0, 0, 1, 0x10, 0x14, 0xFE9 | (1 << PALETTE_MODIFIER_COLOUR)) }; -static const DrawTileSeqStruct _shipdepot_display_seq_4[] = { +static const DrawTileSeqStruct _shipdepot_display_se_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 1, 16, 0x14, 0xFEB) TILE_SEQ_LINE( 15, 0, 0, 1, 16, 0x14, 0xFE7 | (1 << PALETTE_MODIFIER_COLOUR)) }; static const DrawTileSpriteSpan _shipdepot_display_data[][DEPOT_PART_END] = { { // AXIS_X - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_seq_1) // DEPOT_PART_NORTH - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_seq_2) // DEPOT_PART_SOUTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_ne_seq) // DEPOT_PART_NORTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_sw_seq) // DEPOT_PART_SOUTH }, { // AXIS_Y - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_seq_3) // DEPOT_PART_NORTH - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_seq_4) // DEPOT_PART_SOUTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_nw_seq) // DEPOT_PART_NORTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_se_seq) // DEPOT_PART_SOUTH }, }; -static const DrawTileSeqStruct _lock_display_seq_0[] = { +static const DrawTileSeqStruct _lock_display_middle_ne_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 0 + 1) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 4 + 1) }; -static const DrawTileSeqStruct _lock_display_seq_1[] = { +static const DrawTileSeqStruct _lock_display_middle_se_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 0) TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 4) }; -static const DrawTileSeqStruct _lock_display_seq_2[] = { +static const DrawTileSeqStruct _lock_display_middle_sw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 0 + 2) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 4 + 2) }; -static const DrawTileSeqStruct _lock_display_seq_3[] = { +static const DrawTileSeqStruct _lock_display_middle_nw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 0 + 3) TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 4 + 3) }; -static const DrawTileSeqStruct _lock_display_seq_0b[] = { +static const DrawTileSeqStruct _lock_display_lower_ne_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 8 + 1) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 12 + 1) }; -static const DrawTileSeqStruct _lock_display_seq_1b[] = { +static const DrawTileSeqStruct _lock_display_lower_se_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x1, 0x10, 0x14, 8) TILE_SEQ_LINE( 0xF, 0, 0, 0x1, 0x10, 0x14, 12) }; -static const DrawTileSeqStruct _lock_display_seq_2b[] = { +static const DrawTileSeqStruct _lock_display_lower_sw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 8 + 2) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 12 + 2) }; -static const DrawTileSeqStruct _lock_display_seq_3b[] = { +static const DrawTileSeqStruct _lock_display_lower_nw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 8 + 3) TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 12 + 3) }; -static const DrawTileSeqStruct _lock_display_seq_0t[] = { +static const DrawTileSeqStruct _lock_display_upper_ne_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 16 + 1) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 20 + 1) }; -static const DrawTileSeqStruct _lock_display_seq_1t[] = { +static const DrawTileSeqStruct _lock_display_upper_se_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x1, 0x10, 0x14, 16) TILE_SEQ_LINE( 0xF, 0, 0, 0x1, 0x10, 0x14, 20) }; -static const DrawTileSeqStruct _lock_display_seq_2t[] = { +static const DrawTileSeqStruct _lock_display_upper_sw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 16 + 2) TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 20 + 2) }; -static const DrawTileSeqStruct _lock_display_seq_3t[] = { +static const DrawTileSeqStruct _lock_display_upper_nw_seq[] = { TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 16 + 3) TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 20 + 3) }; static const DrawTileSpriteSpan _lock_display_data[][DIAGDIR_END] = { { // LOCK_PART_MIDDLE - TILE_SPRITE_LINE(1, _lock_display_seq_0) // NE - TILE_SPRITE_LINE(0, _lock_display_seq_1) // SE - TILE_SPRITE_LINE(2, _lock_display_seq_2) // SW - TILE_SPRITE_LINE(3, _lock_display_seq_3) // NW + TILE_SPRITE_LINE(1, _lock_display_middle_ne_seq) // NE + TILE_SPRITE_LINE(0, _lock_display_middle_se_seq) // SE + TILE_SPRITE_LINE(2, _lock_display_middle_sw_seq) // SW + TILE_SPRITE_LINE(3, _lock_display_middle_nw_seq) // NW }, { // LOCK_PART_LOWER - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_0b) // NE - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_1b) // SE - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_2b) // SW - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_3b) // NW + TILE_SPRITE_LINE(0xFDD, _lock_display_lower_ne_seq) // NE + TILE_SPRITE_LINE(0xFDD, _lock_display_lower_se_seq) // SE + TILE_SPRITE_LINE(0xFDD, _lock_display_lower_sw_seq) // SW + TILE_SPRITE_LINE(0xFDD, _lock_display_lower_nw_seq) // NW }, { // LOCK_PART_UPPER - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_0t) // NE - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_1t) // SE - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_2t) // SW - TILE_SPRITE_LINE(0xFDD, _lock_display_seq_3t) // NW + TILE_SPRITE_LINE(0xFDD, _lock_display_upper_ne_seq) // NE + TILE_SPRITE_LINE(0xFDD, _lock_display_upper_se_seq) // SE + TILE_SPRITE_LINE(0xFDD, _lock_display_upper_sw_seq) // SW + TILE_SPRITE_LINE(0xFDD, _lock_display_upper_nw_seq) // NW }, }; From 64dbb9383be86b65caefc4ff3b6c4c2db366707f Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 6 Sep 2025 04:38:23 +0000 Subject: [PATCH 020/280] Update: Translations from eints chinese (traditional): 1 change by KogentaSan danish: 28 changes by New-Authentication portuguese: 30 changes by jcteotonio --- src/lang/danish.txt | 56 ++++++++++++++--------------- src/lang/portuguese.txt | 60 ++++++++++++++++---------------- src/lang/traditional_chinese.txt | 2 +- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 7100f485c6..a66c7331fa 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -669,7 +669,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Rutesupervisor STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Direktør STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Administrerende direktør STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Forretningschef -STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Præsident +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Direktør STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON :Matador # Performance detail window @@ -947,8 +947,8 @@ STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Åbn gru STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST :{WHITE}{STATION} accepterer ikke længere: {CARGO_LIST} STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION} accepterer nu: {CARGO_LIST} -STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Licitation af tilskudsordning udløbet:{}{}{STRING} fra {STRING} til {STRING} vil ikke længere udløse tilskud. -STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tilskudsordning tilbagetrukket:{}{}{STRING} fra {STRING} til {STRING} modtager ikke længere tilskud. +STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Licitation af tilskudsordning udløbet:{}{}{STRING} fra {STRING} til {STRING} vil ikke længere udløse tilskud +STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tilskudsordning tilbagetrukket:{}{}{STRING} fra {STRING} til {STRING} modtager ikke længere tilskud STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tilskudsordning i udbud:{}{}Første {STRING} fra {STRING} til {STRING} vil udløse et {UNITS_YEARS_OR_MINUTES}s tilskud fra den lokale myndighed! ###length 4 STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Servicetilskud tildelt {STRING}!{}{}{STRING} fra {STRING} til {STRING} vil betale 50% ekstra for de næste {UNITS_YEARS_OR_MINUTES}! @@ -1123,7 +1123,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :Yderligere info STR_GAME_OPTIONS_ONLINE_CONTENT :Hent indhold STR_GAME_OPTIONS_ONLINE_CONTENT_TOOLTIP :Søg efter nyt og opdateret indhold, der skal downloades -STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(ingen plugins til at integrere med sociale platforme installeret) +STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :(ingen plugins til at integrere med sociale platforme installeret) STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{STRING} ({STRING}) STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :Platform: @@ -1238,7 +1238,7 @@ STR_CITY_APPROVAL_TOLERANT :Tolerant STR_CITY_APPROVAL_HOSTILE :Fjendtlig STR_CITY_APPROVAL_PERMISSIVE :Passiv (ingen indvirkning på virksomhedens handlinger) -STR_WARNING_NO_SUITABLE_AI :{WHITE}Der blev ikke fundet en egnet computer-spiller...{}Du kan downloade flere forskellige computer-spillere gennem 'Online Indhold'. +STR_WARNING_NO_SUITABLE_AI :{WHITE}Der blev ikke fundet en egnet computer-spiller...{}{}Du kan downloade flere forskellige computer-spillere gennem 'Online Indhold' # Settings tree in the Game Options window STR_CONFIG_SETTING_FILTER_TITLE :Filterstreng: @@ -2103,9 +2103,9 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :PANSRET last-kl STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Distributionsmodel for andre lastklasser: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"asymmetrisk" betyder, at vilkårlige mængder last kan sendes i begge retninger. "manuel" betyder, at der ikke finder nogen automatisk distribution sted for disse laster ###length 3 -STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuel -STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymmetrisk -STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symmetrisk +STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manuel +STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asymmetrisk +STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Symmetrisk STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Distributionsnøjagtighed: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Jo højere du sætter denne indstilling, jo mere CPU-tid vil beregningen af forbindelsesgrafen tage. Hvis den tager for længe, kan du opleve lag. Hvis du derimod sætter indstillingen til en lav værdi, vil distributionen være unøjagtig, og du kan opleve last ikke blive sendt til de steder, du forventer @@ -2356,10 +2356,10 @@ STR_FACE_LOAD :{BLACK}Hent STR_FACE_LOAD_TOOLTIP :{BLACK}Hent favoritansigt STR_FACE_LOAD_DONE :{WHITE}Dit favoritansigt er indlæst fra OpenTTD konfigurationsfilen. STR_FACE_FACECODE :{BLACK}Spiller ansigts nr. -STR_FACE_FACECODE_TOOLTIP :{BLACK}Vis og/eller indstil spillers ansigtsnummer +STR_FACE_FACECODE_TOOLTIP :{BLACK}Vis og/eller indstil spillers ansigtskode på firmaets direktør STR_FACE_FACECODE_CAPTION :{WHITE}Vis og/eller indstil spillers ansigtsnummer -STR_FACE_FACECODE_SET :{WHITE}Ny præsidents ansigt er sat -STR_FACE_FACECODE_ERR :{WHITE}Præsidentens ansigtskode kunne ikke angives - skal være en gyldig etiket og nummer +STR_FACE_FACECODE_SET :{WHITE}Nyt direktøransigt er valgt +STR_FACE_FACECODE_ERR :{WHITE}Direktørens ansigtskode kunne ikke angives - skal være en gyldig etiket og nummer STR_FACE_SAVE :{BLACK}Gem STR_FACE_SAVE_TOOLTIP :{BLACK}Gem favoritansigt STR_FACE_SAVE_DONE :{WHITE}Dette ansigt bliver gemt som din favorit i OpenTTD konfigurationsfilen. @@ -2654,7 +2654,7 @@ STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} ha STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} har ændret sit navn til {STRING} STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gav {CURRENCY_LONG} til {STRING} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Serveren har lukket ned for dette spil -STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Serveren genstarter...{}Vent venligst... +STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Serveren genstarter...{}{}Vent venligst... STR_NETWORK_MESSAGE_KICKED :*** {STRING} blev smidt ud. Grund: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Server registrering mislykkedes @@ -3642,15 +3642,15 @@ STR_NEWGRF_LIST_COMPATIBLE :{YELLOW}Har fun STR_NEWGRF_LIST_MISSING :{RED}Manglende filer # NewGRF 'it's broken' warnings -STR_NEWGRF_BROKEN :{WHITE}Denne NewGRFs opførsel '{0:STRING}' vil sandsynligvis forårsage at spillet går ned. -STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Den ændrer status for '{1:ENGINE}' når den ikke er i depot -STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Den ændrer toglængden for '{1:ENGINE}' mens den ikke er i depot -STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Det ændrede køretøj kapacitet til '{1:ENGINE}' når det ikke er inde i et depot eller genmontering +STR_NEWGRF_BROKEN :{WHITE}Denne NewGRFs opførsel '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' vil sandsynligvis forårsage at spillet går ud af synkronisering og/eller går ned +STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Den ændrer status for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' når den ikke er i depot +STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Den ændrer toglængden for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' mens den ikke er i depot +STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Det ændrede køretøj kapacitet til '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' når det ikke er inde i et depot eller genmontering STR_BROKEN_VEHICLE_LENGTH :{WHITE}Toget '{VEHICLE}' fra selskabet '{COMPANY}' har ugyldig længde. Det skyldes sandsynligvis at problem med en NewGRF. Risiko for at spillet mister synkronisering eller går ned. STR_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' indeholder forkert information STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. -STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' forårsagede en uendelig løkke i produktions-callback'en. +STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' forårsagede en uendelig løkke i produktions-callback'en STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returnerede ukendt/ugyldigt resultat {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' returnerede ugyldig godstype i produktion-callback ved {2:HEX} @@ -4457,9 +4457,9 @@ STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Vis skib STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Vis flyets ordrer. Ctrl+Klik for at vise flyets tidsplan ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer om toget -STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Vis køretøjets detaljer -STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer omkring skibet +STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer om toget. Ctrl+Klik for at vise togets gruppe +STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Vis køretøjets detaljer. Ctrl+Klik for at vise køretøjets gruppe +STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljer omkring skibet. Ctrl+Klik for at vise skipets gruppe STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Vis detaljet omkring flyet. Ctrl+Klik for at vise flyets gruppe ###length VEHICLE_TYPES @@ -4721,7 +4721,7 @@ STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT STR_ORDER_REFIT_ORDER :{SPACE}(Tilpas til {STRING}) STR_ORDER_REFIT_STOP_ORDER :{SPACE}(Tilpas til {STRING} og stop) -STR_ORDER_STOP_ORDER :(Stop) +STR_ORDER_STOP_ORDER :{SPACE}(Stop) STR_ORDER_WAIT_TO_UNBUNCH :{SPACE}(vent med at afkoble) @@ -4736,11 +4736,11 @@ STR_ORDER_NO_LOAD :{SPACE}(Ingen l STR_ORDER_UNLOAD :{SPACE}(Los og medtag fragt) STR_ORDER_UNLOAD_FULL_LOAD :{SPACE}(Los af og vent på fuld last) STR_ORDER_UNLOAD_FULL_LOAD_ANY :{SPACE}(Los og vent på fuld last af hvilken som helst type fragt) -STR_ORDER_UNLOAD_NO_LOAD :(Los og efterlad tom) +STR_ORDER_UNLOAD_NO_LOAD :{SPACE}(Los og efterlad tom) STR_ORDER_TRANSFER :{SPACE}(Overfør og last fragt) STR_ORDER_TRANSFER_FULL_LOAD :{SPACE}(Overfør og vent på fuld last) STR_ORDER_TRANSFER_FULL_LOAD_ANY :{SPACE}(Overfør og vent på fuld last af hvilken som helst type fragt) -STR_ORDER_TRANSFER_NO_LOAD :(Overfør og efterlad tom) +STR_ORDER_TRANSFER_NO_LOAD :{SPACE}(Overfør og efterlad tom) STR_ORDER_NO_UNLOAD :{SPACE}(Los ikke og last fragt) STR_ORDER_NO_UNLOAD_FULL_LOAD :{SPACE}(Los ikke og vent på fuld last) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :{SPACE}(Los ikke af og vent på fuld last af hvilken som helst type) @@ -4749,10 +4749,10 @@ STR_ORDER_NO_UNLOAD_NO_LOAD :{SPACE}(Los ikk STR_ORDER_AUTO_REFIT :{SPACE}(Auto-tilpas til {STRING}) STR_ORDER_FULL_LOAD_REFIT :{SPACE}(Fuld last med auto-tilpas til {STRING}) STR_ORDER_FULL_LOAD_ANY_REFIT :{SPACE}(Fuld vilkårlig last med auto-tilpas til {STRING}) -STR_ORDER_UNLOAD_REFIT :(Los og medtag last med auto-tilpas til {STRING}) +STR_ORDER_UNLOAD_REFIT :{SPACE}(Los og medtag last med auto-tilpas til {STRING}) STR_ORDER_UNLOAD_FULL_LOAD_REFIT :{SPACE}(Los og vent på fuld last med auto-tilpas til {STRING}) STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :{SPACE}(Los og vent på fuld vilkårlig last med auto-tilpas til {STRING}) -STR_ORDER_TRANSFER_REFIT :(Overfør og medtag last med auto-tilpas til {STRING}) +STR_ORDER_TRANSFER_REFIT :{SPACE}(Overfør og medtag last med auto-tilpas til {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_REFIT :{SPACE}(Overfør og vent på fuld last med auto-tilpas til {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :{SPACE}(Overfør og vent på fuld vilkårlig last med auto-tilpas til {STRING}) STR_ORDER_NO_UNLOAD_REFIT :{SPACE}(Ingen losning og medtag last med with auto-tilpas til {STRING}) @@ -4790,9 +4790,9 @@ STR_TIMETABLE_TRAVEL_FOR_SPEED :Rejs mod {STRIN STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Køreplan (for {STRING}, ikke skemalagt) STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Køreplan (for {STRING}, ikke skemalagt) med på de fleste {VELOCITY} STR_TIMETABLE_STAY_FOR_ESTIMATED :{SPACE}(ophold for {STRING}, ikke skemalagt) -STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(rejse for {STRING}, ikke skemalagt) +STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :{SPACE}(rejse for {STRING}, ikke skemalagt) STR_TIMETABLE_STAY_FOR :{SPACE}og vent i {STRING} -STR_TIMETABLE_AND_TRAVEL_FOR :og rejs i {STRING} +STR_TIMETABLE_AND_TRAVEL_FOR :{SPACE}og rejs i {STRING} STR_TIMETABLE_APPROX_TIME :{BLACK}Denne tidsplan vil tage ca {STRING} at fuldføre STR_TIMETABLE_TOTAL_TIME :{BLACK}Denne køreplan vil tage {STRING} at fuldføre @@ -5422,7 +5422,7 @@ STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Der er i STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}Der er ingen stop, der er egnede til leddelte vejkøretøjer.{}Leddelte vejkøretøjer kræver et gennemkørselsstop, ikke et slutstop STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Dette fly kan ikke lande på denne heliport STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Denne helikopter kan ikke lande i denne lufthavn -STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Der er ikke noget Jernbane vejpunkt +STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Der er ikke noget jernbane-rutepunkt STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}Der er intet rutepunkt STR_ERROR_NO_BUOY :{WHITE}Der er ingen bøje diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 4753c1ecb6..2e61cb585e 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -492,7 +492,7 @@ STR_GRAPH_MENU_INCOME_GRAPH :Rendimentos STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Carga entregue STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Histórico de avaliação STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Valor da empresa -STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas por carga +STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Tarifas por tipo de carga # Company league menu STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Classificação de empresas @@ -608,8 +608,8 @@ STR_MONTH_NOV :Novembro STR_MONTH_DEC :Dezembro # Graph window -STR_GRAPH_KEY_BUTTON :{BLACK}Chave -STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar chave dos gráficos +STR_GRAPH_KEY_BUTTON :{BLACK}Legenda +STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar legenda dos gráficos estatísticos STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING} STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM} STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} @@ -632,11 +632,11 @@ STR_GRAPH_LAST_24_YEARS :{TINY_FONT}{BLA STR_GRAPH_TOGGLE_RANGE :Alternar o gráfico para este intervalo de dados STR_GRAPH_SELECT_SCALE :Alterar a escala horizontal do gráfico -STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas por carga +STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas por tipo de carga STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados -STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Tudo +STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Todos STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Nenhum STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todas as cargas no gráfico STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não mostrar cargas no gráfico @@ -656,7 +656,7 @@ STR_GRAPH_TOWN_RANGE_TRANSPORTED :Transportado STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Exibir classificações detalhadas de desempenho # Graph key window -STR_GRAPH_KEY_CAPTION :{WHITE}Chave dos gráficos da empresa +STR_GRAPH_KEY_CAPTION :{WHITE}Legenda dos gráficos da empresa STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Alternar o gráfico desta empresa # Company league window @@ -2286,7 +2286,7 @@ STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunida # Cheat window STR_CHEATS :{WHITE}Opções da 'sandbox' STR_CHEAT_MONEY :{LTBLUE}Aumentar dinheiro em {CURRENCY_LONG} -STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando como empresa: {ORANGE}{COMMA} +STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogar como a empresa: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Escavadora mágica (remove indústrias, objetos imóveis): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Os túneis podem cruzar-se: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Aviões a jato não irão ter acidentes (frequentes) em aeroportos pequenos: {ORANGE}{STRING} @@ -2295,7 +2295,7 @@ STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Editar a STR_CHEAT_CHANGE_DATE :{LTBLUE}Alterar data: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Alterar ano atual STR_CHEAT_SETUP_PROD :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING} -STR_CHEAT_STATION_RATING :{LTBLUE}Fixar as classificações da estação em 100%: {ORANGE}{STRING} +STR_CHEAT_STATION_RATING :{LTBLUE}Afixar as classificações da estação em 100%: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Novo Esquema de Cores @@ -3068,7 +3068,7 @@ STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Cobrir o STR_FOUND_TOWN_LOAD_FROM_FILE :{BLACK}Carregar de um ficheiro STR_FOUND_TOWN_LOAD_FROM_FILE_TOOLTIP :{BLACK}Importar dados da localidade de um ficheiro JSON STR_FOUND_TOWN_EXPAND_ALL_TOWNS :{BLACK}Expandir todas as localidades -STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fazer com que todas as localidades cresçam ligeiramente +STR_FOUND_TOWN_EXPAND_ALL_TOWNS_TOOLTIP :{BLACK}Fazer com que todas as localidades cresçam de forma ligeira STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Nome da localidade: STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Introduza o nome da localidade @@ -3124,7 +3124,7 @@ STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clique na indústria para ver os seus fornecedores e clientes STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clique na mercadoria para ver os seus fornecedores e clientes STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia da Indústria -STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar indústrias a fornecer e aceitar mercadorias +STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar indústrias a fornecer e a aceitar mercadorias STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao mapa pequeno STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também seleccionar as indústrias mostradas no mapa pequeno STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga @@ -3815,7 +3815,7 @@ STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_O # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Livro de História STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Livro de História Global -STR_STORY_BOOK_SPECTATOR :Livro de Histórico Global +STR_STORY_BOOK_SPECTATOR :Livro de Histórias Global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Página nº {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Saltar para uma pagina especifica escolhendo-a nesta lista @@ -3883,7 +3883,7 @@ STR_STATION_VIEW_GROUP_D_S_V :Destino-Origem- STR_STATION_VIEW_GROUP_D_V_S :Destino-Via-Origem ###length 8 -STR_CARGO_RATING_APPALLING :Péssimo +STR_CARGO_RATING_APPALLING :Horrível STR_CARGO_RATING_VERY_POOR :Muito Fraco STR_CARGO_RATING_POOR :Fraco STR_CARGO_RATING_MEDIOCRE :Medíocre @@ -4481,12 +4481,12 @@ STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Sem energi STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Esperando por caminho livre STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Longe de mais do próximo destino -STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {0:STATION} +STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:STATION} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - Sem ordens -STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {0:WAYPOINT} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Dirige-se para {0:DEPOT} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Manutenção em {0:DEPOT} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}{1:VELOCITY} - Desagrupar e efetuar manutenção em {0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:WAYPOINT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Manutenção {G 0 em no na nos nas} {0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}{1:VELOCITY} - Desagrupar e efetuar manutenção {G 0 em no na nos nas} {0:DEPOT} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar a {0:STATION} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar a {0:WAYPOINT} @@ -4997,10 +4997,10 @@ STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... não STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... a imagem é demasiado grande STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Aviso de redimensionamento -STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Redimensionar muito o mapa não é recomendado. Continuar com o processo de geração? +STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Não é recomendado redimensionar demasiado o mapa. Continuar com o processo de geração? # Soundset messages -STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Só foi encontrado um conjunto de sons de reserva. Se deseja sons, instale um conjunto de sons através do sistema de descarregamento de conteúdo. +STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Só foi encontrado um conjunto de sons de reserva. Se deseja efeitos sonoros no jogo, instale um conjunto de sons através do sistema de descarregamento de conteúdo. # Screenshot related messages STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Captura de ecrã enorme @@ -5855,23 +5855,23 @@ STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA STR_FORMAT_INDUSTRY_NAME :{1:STRING} de {0:TOWN} ###length 2 -STR_FORMAT_BUOY_NAME :Boia de {TOWN} -STR_FORMAT_BUOY_NAME_SERIAL :Boia de {TOWN} #{COMMA} +STR_FORMAT_BUOY_NAME :{G=f}Boia de {TOWN} +STR_FORMAT_BUOY_NAME_SERIAL :{G=f}Boia de {TOWN} #{COMMA} ###length 2 -STR_FORMAT_WAYPOINT_NAME :Ponto de controlo {TOWN} -STR_FORMAT_WAYPOINT_NAME_SERIAL :Ponto de controlo {TOWN}#{COMMA} +STR_FORMAT_WAYPOINT_NAME :{G=m}Ponto de controlo de {TOWN} +STR_FORMAT_WAYPOINT_NAME_SERIAL :{G=m}Ponto de controlo de {TOWN}#{COMMA} ###length 6 -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} +STR_FORMAT_DEPOT_NAME_TRAIN :{G=m}Depósito Ferroviário de {TOWN} +STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :{G=m}Depósito Ferroviário de {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE :{G=f}Garagem Rodoviária de {TOWN} +STR_FORMAT_DEPOT_NAME_ROAD_VEHICLE_SERIAL :{G=f}Garagem Rodoviária de {TOWN} #{COMMA} +STR_FORMAT_DEPOT_NAME_SHIP :{G=m}Estaleiro Naval de {TOWN} +STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :{G=m}Estaleiro Naval de {TOWN} #{COMMA} ###next-name-looks-similar -STR_FORMAT_DEPOT_NAME_AIRCRAFT :Hangar de {STATION} +STR_FORMAT_DEPOT_NAME_AIRCRAFT :{G=m}Hangar de {STATION} # _SERIAL version of AIRACRAFT doesn't exist STR_UNKNOWN_STATION :estação desconhecida diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 6a440b8eeb..c0ae38f14a 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -2616,7 +2616,7 @@ STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :已有人使用 STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :密碼錯誤 STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :不在允許名單內 STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :已請求的驗證方式均不可用 -STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :DoCommand 內含錯誤的 company-id +STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :DoCommand 內含錯誤的公司 ID STR_NETWORK_ERROR_CLIENT_KICKED :被伺服器踢除 STR_NETWORK_ERROR_CLIENT_CHEATER :想試著作弊 STR_NETWORK_ERROR_CLIENT_SERVER_FULL :伺服器已滿 From f82bd95faf4a91cafeaf5fa2893c32966c4e2b1f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 7 Sep 2025 04:37:41 +0000 Subject: [PATCH 021/280] Update: Translations from eints portuguese: 25 changes by jcteotonio --- src/lang/portuguese.txt | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 2e61cb585e..7de80229ae 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -449,7 +449,7 @@ STR_SETTINGS_MENU_GAME_OPTIONS :Opções do Jog STR_SETTINGS_MENU_AI_SETTINGS :Definições de IA STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Definições de script de jogo STR_SETTINGS_MENU_NEWGRF_SETTINGS :Definições NewGRF -STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opções da 'sandbox' +STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opções de Simulação Livre STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opções de Transparência STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostrar nomes de localidades STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Mostrar nomes de estações @@ -764,7 +764,7 @@ STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Grande magnata STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnata do século STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} STR_HIGHSCORE_STATS :{BIG_FONT}"{STRING}" ({COMMA}) -STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}{COMPANY} conquista o estatuto de '{STRING}'! +STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}{COMPANY} alcança o estatuto de '{STRING}'! STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}{PRESIDENT_NAME} de {COMPANY} conquista o estatuto de '{STRING}'! # Smallmap window @@ -857,13 +857,13 @@ STR_MESSAGE_NEWS_FORMAT :{STRING} - {S STR_NEWS_MESSAGE_CAPTION :{WHITE}Mensagem -STR_NEWS_FIRST_TRAIN_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro comboio chega a {STATION}! -STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro autocarro chega a {STATION}! -STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro camião chega a {STATION}! -STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de passageiros chega a {STATION}! -STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de mercadorias chega a {STATION}! -STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro navio chega a {STATION}! -STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeira aeronave chega a {STATION}! +STR_NEWS_FIRST_TRAIN_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro comboio chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro autocarro chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro camião chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de passageiros chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de mercadorias chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro navio chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeira aeronave chega {G a ao à aos às} {STATION}! STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Acidente de Comboios!{}{COMMA} pessoa{P "" s} morre{P u ram} na explosão após a colisão! STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Acidente com Veículo Rodoviário!{}Condutor morre na explosão após a colisão com um comboio! @@ -1035,7 +1035,7 @@ STR_GAME_OPTIONS_CURRENCY_IRR :Rial Iraniano STR_GAME_OPTIONS_CURRENCY_RUB :Novo Rublo Russo STR_GAME_OPTIONS_CURRENCY_MXN :Peso Mexicano STR_GAME_OPTIONS_CURRENCY_NTD :Novo Dólar Taiwanês -STR_GAME_OPTIONS_CURRENCY_CNY :Renminbi chinês +STR_GAME_OPTIONS_CURRENCY_CNY :Remimbi chinês STR_GAME_OPTIONS_CURRENCY_HKD :Dólar de Hong Kong STR_GAME_OPTIONS_CURRENCY_INR :Rupia Indiana STR_GAME_OPTIONS_CURRENCY_IDR :Rupia Indonésia @@ -1660,7 +1660,7 @@ STR_CONFIG_SETTING_STATION_SPREAD :Espalhamento da STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Área máxima pela qual uma estação pode estar distribuída. Nota que valores elevados irão abrandar o jogo STR_CONFIG_SETTING_SERVICEATHELIPAD :Manutenção automática de helicópteros em heliportos: {STRING} -STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Efectuar manutenção aos helicópteros após cada aterragem, mesmo que não haja hangar no aeroporto +STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Efetuar manutenção aos helicópteros após cada aterragem, mesmo que não haja um hangar no aeroporto STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Ligar ferramentas de paisagem com as de construção: {STRING} STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Quando se abre a barra de construção para um tipo de transporte, abrir também a barra de terraplanagem @@ -1681,7 +1681,7 @@ STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREY_TO_RED :Cinza para verm STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREYSCALE :Escala de cinza STR_CONFIG_SETTING_SCROLLMODE :Comportamento de deslocação da janela de exibição: {STRING} -STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento na deslocação do mapa. As opções de "posição do rato bloqueada" não funcionam em todos os sistemas, tais como versões baseadas na web, ecrãs sensíveis ao toque, Linux com Wayland, e outros. +STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamento na deslocação do mapa. As opções de "posição do rato bloqueada" não funcionam em todos os sistemas, tais como versões web, com ecrã táctil, Wayland em Linux e outros. ###length 4 STR_CONFIG_SETTING_SCROLLMODE_DEFAULT :Mover janela de exibição com Botão Direito Rato, posição do rato bloqueada STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mover mapa com Botão Direito Rato, posição do rato bloqueada @@ -2032,7 +2032,7 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Quadrático (or STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Criação de árvores no decorrer do jogo: {STRING} -STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar o aparecimento aleatório de árvores durante o jogo. Isto poderá afectar indústrias que dependem do crescimento de árvores, como as madeireiras +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar o crescimento espontâneo de novas árvores durante o jogo. Isto poderá afetar indústrias que dependem de árvores, como as serrações ###length 4 STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Crescer mas não espalhar {RED}(inutiliza a serração) STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Crescer mas espalhar apenas nas florestas tropicais @@ -2093,7 +2093,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Tamanho relativ STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Atualizar o gráfico de distribuição a cada {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tempo de intervalo entre recalculos subsequentes do gráfico de ligações. Cada recalculo calcula os planos para um componente do gráfico. Isso significa que um valor X para esta configuração não significa que todo o gráfico será atualizado a cada X segundos. Apenas algum componente será. Quanto mais curto escolher, mais tempo de CPU será necessário para calcular. Quanto mais tempo for definido, mais tempo levará até que a distribuição de carga inicie nas novas rotas STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Usar {STRING} para recalcular o gráfico de distribuição -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto para cada recalculo de um componente de gráfico de ligação. Quando um recalculo é iniciado, um encadeamento é gerado e pode ser executado nesse número de segundos. Quanto mais curto você definir, mais provável será que o encadeamento não seja concluído quando deveria. Então o jogo para até que aconteça ("lag"). Quanto mais tempo você definir, mais tempo levará para a distribuição ser atualizada quando as rotas mudarem +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto para cada recalculo de um componente de gráfico de ligação. Quando um recalculo é iniciado, um encadeamento é gerado e pode ser executado nesse número de segundos. Quanto mais curto você definir, mais provável será que o encadeamento não seja concluído quando deveria. Então o jogo para até que possa continuar. Quanto mais tempo você definir, mais tempo levará para a distribuição ser atualizada quando as rotas mudarem STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para os passageiros: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo numero de passageiros irá de uma estação A para uma estação B e de B para A. "Assimétrico" significa que um numero arbitrário de passageiros poderá seguir em qualquer direção. "Manual" significa que nenhuma distribuição automática terá lugar para passageiros @@ -2284,7 +2284,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Reportar STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunidade # Cheat window -STR_CHEATS :{WHITE}Opções da 'sandbox' +STR_CHEATS :{WHITE}Opções de Simulação Livre STR_CHEAT_MONEY :{LTBLUE}Aumentar dinheiro em {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogar como a empresa: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Escavadora mágica (remove indústrias, objetos imóveis): {ORANGE}{STRING} @@ -3759,7 +3759,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Subornar a autoridade local para aumentar a sua avaliação e anular o direito de transporte exclusivo da concorrência, correndo o risco de uma penalidade severa se for apanhado.{}{POP_COLOUR}Custo: {CURRENCY_LONG} # Goal window -STR_GOALS_CAPTION :{WHITE}{COMPANY} Objectivos +STR_GOALS_CAPTION :{WHITE}Objetivos de {COMPANY} STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objetivos globais STR_GOALS_SPECTATOR :Objectivos Globais STR_GOALS_GLOBAL_BUTTON :{BLACK}Global @@ -3936,7 +3936,7 @@ STR_FINANCES_SECTION_SHIP_RUNNING_COSTS :{GOLD}Navios STR_FINANCES_SECTION_INFRASTRUCTURE :{GOLD}Infraestrutura STR_FINANCES_SECTION_TRAIN_REVENUE :{GOLD}Comboios STR_FINANCES_SECTION_ROAD_VEHICLE_REVENUE :{GOLD}Veículos Rodoviários -STR_FINANCES_SECTION_AIRCRAFT_REVENUE :{GOLD}Aeronave +STR_FINANCES_SECTION_AIRCRAFT_REVENUE :{GOLD}Aeronaves STR_FINANCES_SECTION_SHIP_REVENUE :{GOLD}Navios STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Juros do Empréstimo STR_FINANCES_SECTION_OTHER :{GOLD}Outros @@ -4472,26 +4472,26 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação a # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}A carregar / descarregar STR_VEHICLE_STATUS_LEAVING :{LTBLUE}A partir -STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Em espera por desagrupar +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Em espera para desagrupar STR_VEHICLE_STATUS_CRASHED :{RED}Acidentado! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariado STR_VEHICLE_STATUS_STOPPED :{RED}Parado STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}{VELOCITY} - A parar STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Sem energia -STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Esperando por caminho livre +STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}A esperar por caminho livre STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Longe de mais do próximo destino STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:STATION} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - Sem ordens STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:WAYPOINT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Dirige-se para {G 0 "" "o " "a " "os " "as "}{0:DEPOT} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Manutenção {G 0 em no na nos nas} {0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Efetuar manutenção {G 0 em no na nos nas} {0:DEPOT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}{1:VELOCITY} - Desagrupar e efetuar manutenção {G 0 em no na nos nas} {0:DEPOT} -STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar a {0:STATION} -STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar a {0:WAYPOINT} -STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Não é possível chegar a {0:DEPOT} -STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar a {0:DEPOT} +STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar {G 0 a ao à aos às} {0:STATION} +STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar {G 0 a ao à aos às} {0:WAYPOINT} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Não é possível chegar {G 0 a ao à aos às} {0:DEPOT} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Não é possível chegar {G 0 a ao à aos às} {0:DEPOT} # Vehicle stopped/started animations STR_VEHICLE_COMMAND_STOPPED :{RED}Parou @@ -4980,7 +4980,7 @@ STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Impossível esc STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Falha ao verificar integridade de dados STR_GAME_SAVELOAD_ERROR_PATCHPACK :Salvar o jogo é feito com uma versão modificada STR_GAME_SAVELOAD_NOT_AVAILABLE : -STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}O jogo foi salvo numa versão sem suporte para eléctricos. Todos os elétricos foram removidos. +STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}O jogo foi guardado numa versão sem suporte para elétricos. Todos os elétricos foram removidos. # Map generation messages STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Geração do mapa cancelada...{}{}... não existem locais adequados para localidades From 80541a7682a6e47ff39acf3b6b2c826327e115b6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Sep 2025 14:11:05 +0100 Subject: [PATCH 022/280] Fix c02ef3e456: [AI] Incorrect infrastructure cost for road/tram tiles. (#14596) Infrastructure total count should be split between road and tram pieces. --- src/script/api/script_infrastructure.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/script/api/script_infrastructure.cpp b/src/script/api/script_infrastructure.cpp index 523caebe21..17e65e932b 100644 --- a/src/script/api/script_infrastructure.cpp +++ b/src/script/api/script_infrastructure.cpp @@ -104,8 +104,9 @@ case INFRASTRUCTURE_ROAD: { Money cost; uint32_t road_total = c->infrastructure.GetRoadTotal(); + uint32_t tram_total = c->infrastructure.GetTramTotal(); for (::RoadType rt = ::ROADTYPE_BEGIN; rt != ::ROADTYPE_END; rt++) { - cost += RoadMaintenanceCost(rt, c->infrastructure.road[rt], road_total); + cost += RoadMaintenanceCost(rt, c->infrastructure.road[rt], RoadTypeIsRoad(rt) ? road_total : tram_total); } return cost; } From 89a90080c5393e3a10ea645ae5641cc8d802e610 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Sep 2025 16:44:54 +0100 Subject: [PATCH 023/280] Codechange: Split table data out of rail.cpp (#14597) --- src/rail.cpp | 134 +-------------------------------------- src/signal.cpp | 2 + src/table/CMakeLists.txt | 2 + src/table/signal_data.h | 29 +++++++++ src/table/track_data.h | 119 ++++++++++++++++++++++++++++++++++ 5 files changed, 154 insertions(+), 132 deletions(-) create mode 100644 src/table/signal_data.h create mode 100644 src/table/track_data.h diff --git a/src/rail.cpp b/src/rail.cpp index c5e0d7a6cb..e09f1b4e20 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -15,140 +15,10 @@ #include "company_base.h" #include "engine_base.h" +#include "table/track_data.h" + #include "safeguards.h" -/* XXX: Below 3 tables store duplicate data. Maybe remove some? */ -/* Maps a trackdir to the bit that stores its status in the map arrays, in the - * direction along with the trackdir */ -extern const uint8_t _signal_along_trackdir[TRACKDIR_END] = { - 0x8, 0x8, 0x8, 0x2, 0x4, 0x1, 0, 0, - 0x4, 0x4, 0x4, 0x1, 0x8, 0x2 -}; - -/* Maps a trackdir to the bit that stores its status in the map arrays, in the - * direction against the trackdir */ -extern const uint8_t _signal_against_trackdir[TRACKDIR_END] = { - 0x4, 0x4, 0x4, 0x1, 0x8, 0x2, 0, 0, - 0x8, 0x8, 0x8, 0x2, 0x4, 0x1 -}; - -/* Maps a Track to the bits that store the status of the two signals that can - * be present on the given track */ -extern const uint8_t _signal_on_track[] = { - 0xC, 0xC, 0xC, 0x3, 0xC, 0x3 -}; - -/* Maps a diagonal direction to the all trackdirs that are connected to any - * track entering in this direction (including those making 90 degree turns) - */ -extern const TrackdirBits _exitdir_reaches_trackdirs[] = { - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N, // DIAGDIR_NE - TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E, // DIAGDIR_SE - TRACKDIR_BIT_X_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S, // DIAGDIR_SW - TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W // DIAGDIR_NW -}; - -extern const Trackdir _next_trackdir[TRACKDIR_END] = { - TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_LOWER_E, TRACKDIR_UPPER_E, TRACKDIR_RIGHT_S, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, - TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_LOWER_W, TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N -}; - -/* Maps a trackdir to all trackdirs that make 90 deg turns with it. */ -extern const TrackdirBits _track_crosses_trackdirs[TRACK_END] = { - TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_Y_NW, // TRACK_X - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW, // TRACK_Y - TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, // TRACK_UPPER - TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, // TRACK_LOWER - TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E, // TRACK_LEFT - TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E // TRACK_RIGHT -}; - -/* Maps a track to all tracks that make 90 deg turns with it. */ -extern const TrackBits _track_crosses_tracks[] = { - TRACK_BIT_Y, // TRACK_X - TRACK_BIT_X, // TRACK_Y - TRACK_BIT_VERT, // TRACK_UPPER - TRACK_BIT_VERT, // TRACK_LOWER - TRACK_BIT_HORZ, // TRACK_LEFT - TRACK_BIT_HORZ // TRACK_RIGHT -}; - -/* Maps a trackdir to the (4-way) direction the tile is exited when following - * that trackdir */ -extern const DiagDirection _trackdir_to_exitdir[TRACKDIR_END] = { - DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE, - DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, -}; - -extern const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = { - {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW}, - {TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W}, - {INVALID_TRACKDIR, TRACKDIR_LOWER_E, TRACKDIR_LOWER_W, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, TRACKDIR_LEFT_N}, - {TRACKDIR_RIGHT_N, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR} -}; - -extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = { - {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW}, - {INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR}, - {TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W}, - {TRACKDIR_LEFT_N, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N} -}; - -extern const Trackdir _track_direction_to_trackdir[][DIR_END] = { - {INVALID_TRACKDIR, TRACKDIR_X_NE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_NW}, - {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W, INVALID_TRACKDIR}, - {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W, INVALID_TRACKDIR}, - {TRACKDIR_LEFT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR}, - {TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR} -}; - -extern const Trackdir _dir_to_diag_trackdir[] = { - TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW, -}; - -extern const TrackBits _corner_to_trackbits[] = { - TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER, -}; - -extern const TrackdirBits _uphill_trackdirs[] = { - TRACKDIR_BIT_NONE , ///< 0 SLOPE_FLAT - TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 1 SLOPE_W -> inclined for diagonal track - TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 2 SLOPE_S -> inclined for diagonal track - TRACKDIR_BIT_X_SW , ///< 3 SLOPE_SW - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 4 SLOPE_E -> inclined for diagonal track - TRACKDIR_BIT_NONE , ///< 5 SLOPE_EW - TRACKDIR_BIT_Y_SE , ///< 6 SLOPE_SE - TRACKDIR_BIT_NONE , ///< 7 SLOPE_WSE -> leveled - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 8 SLOPE_N -> inclined for diagonal track - TRACKDIR_BIT_Y_NW , ///< 9 SLOPE_NW - TRACKDIR_BIT_NONE , ///< 10 SLOPE_NS - TRACKDIR_BIT_NONE , ///< 11 SLOPE_NWS -> leveled - TRACKDIR_BIT_X_NE , ///< 12 SLOPE_NE - TRACKDIR_BIT_NONE , ///< 13 SLOPE_ENW -> leveled - TRACKDIR_BIT_NONE , ///< 14 SLOPE_SEN -> leveled - TRACKDIR_BIT_NONE , ///< 15 invalid - TRACKDIR_BIT_NONE , ///< 16 invalid - TRACKDIR_BIT_NONE , ///< 17 invalid - TRACKDIR_BIT_NONE , ///< 18 invalid - TRACKDIR_BIT_NONE , ///< 19 invalid - TRACKDIR_BIT_NONE , ///< 20 invalid - TRACKDIR_BIT_NONE , ///< 21 invalid - TRACKDIR_BIT_NONE , ///< 22 invalid - TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 23 SLOPE_STEEP_S -> inclined for diagonal track - TRACKDIR_BIT_NONE , ///< 24 invalid - TRACKDIR_BIT_NONE , ///< 25 invalid - TRACKDIR_BIT_NONE , ///< 26 invalid - TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 27 SLOPE_STEEP_W -> inclined for diagonal track - TRACKDIR_BIT_NONE , ///< 28 invalid - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 29 SLOPE_STEEP_N -> inclined for diagonal track - TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 30 SLOPE_STEEP_E -> inclined for diagonal track -}; - /** * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile. */ diff --git a/src/signal.cpp b/src/signal.cpp index c9a1d7d017..f6af4d5268 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -17,6 +17,8 @@ #include "company_base.h" #include "pbs.h" +#include "table/signal_data.h" + #include "safeguards.h" diff --git a/src/table/CMakeLists.txt b/src/table/CMakeLists.txt index 6b25662a09..e4114d94ce 100644 --- a/src/table/CMakeLists.txt +++ b/src/table/CMakeLists.txt @@ -28,12 +28,14 @@ add_files( road_land.h roadtypes.h roadveh_movement.h + signal_data.h sprites.h station_land.h strgen_tables.h string_colours.h town_land.h townname.h + track_data.h track_land.h train_sprites.h tree_land.h diff --git a/src/table/signal_data.h b/src/table/signal_data.h new file mode 100644 index 0000000000..27281911b8 --- /dev/null +++ b/src/table/signal_data.h @@ -0,0 +1,29 @@ +/* + * 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 signal_data.h Data related to rail signals. */ + +/* XXX: Below 3 tables store duplicate data. Maybe remove some? */ +/* Maps a trackdir to the bit that stores its status in the map arrays, in the + * direction along with the trackdir */ +extern const uint8_t _signal_along_trackdir[TRACKDIR_END] = { + 0x8, 0x8, 0x8, 0x2, 0x4, 0x1, 0, 0, + 0x4, 0x4, 0x4, 0x1, 0x8, 0x2 +}; + +/* Maps a trackdir to the bit that stores its status in the map arrays, in the + * direction against the trackdir */ +extern const uint8_t _signal_against_trackdir[TRACKDIR_END] = { + 0x4, 0x4, 0x4, 0x1, 0x8, 0x2, 0, 0, + 0x8, 0x8, 0x8, 0x2, 0x4, 0x1 +}; + +/* Maps a Track to the bits that store the status of the two signals that can + * be present on the given track */ +extern const uint8_t _signal_on_track[] = { + 0xC, 0xC, 0xC, 0x3, 0xC, 0x3 +}; diff --git a/src/table/track_data.h b/src/table/track_data.h new file mode 100644 index 0000000000..3724184585 --- /dev/null +++ b/src/table/track_data.h @@ -0,0 +1,119 @@ +/* + * 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 track_data.h Data related to rail tracks. */ + +/* Maps a diagonal direction to the all trackdirs that are connected to any + * track entering in this direction (including those making 90 degree turns) + */ +extern const TrackdirBits _exitdir_reaches_trackdirs[] = { + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_LOWER_E | TRACKDIR_BIT_LEFT_N, // DIAGDIR_NE + TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_LEFT_S | TRACKDIR_BIT_UPPER_E, // DIAGDIR_SE + TRACKDIR_BIT_X_SW | TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_RIGHT_S, // DIAGDIR_SW + TRACKDIR_BIT_Y_NW | TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_LOWER_W // DIAGDIR_NW +}; + +extern const Trackdir _next_trackdir[TRACKDIR_END] = { + TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_LOWER_E, TRACKDIR_UPPER_E, TRACKDIR_RIGHT_S, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, + TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_LOWER_W, TRACKDIR_UPPER_W, TRACKDIR_RIGHT_N, TRACKDIR_LEFT_N +}; + +/* Maps a trackdir to all trackdirs that make 90 deg turns with it. */ +extern const TrackdirBits _track_crosses_trackdirs[TRACK_END] = { + TRACKDIR_BIT_Y_SE | TRACKDIR_BIT_Y_NW, // TRACK_X + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_X_SW, // TRACK_Y + TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, // TRACK_UPPER + TRACKDIR_BIT_RIGHT_N | TRACKDIR_BIT_RIGHT_S | TRACKDIR_BIT_LEFT_N | TRACKDIR_BIT_LEFT_S, // TRACK_LOWER + TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E, // TRACK_LEFT + TRACKDIR_BIT_UPPER_W | TRACKDIR_BIT_UPPER_E | TRACKDIR_BIT_LOWER_W | TRACKDIR_BIT_LOWER_E // TRACK_RIGHT +}; + +/* Maps a track to all tracks that make 90 deg turns with it. */ +extern const TrackBits _track_crosses_tracks[] = { + TRACK_BIT_Y, // TRACK_X + TRACK_BIT_X, // TRACK_Y + TRACK_BIT_VERT, // TRACK_UPPER + TRACK_BIT_VERT, // TRACK_LOWER + TRACK_BIT_HORZ, // TRACK_LEFT + TRACK_BIT_HORZ // TRACK_RIGHT +}; + +/* Maps a trackdir to the (4-way) direction the tile is exited when following + * that trackdir */ +extern const DiagDirection _trackdir_to_exitdir[TRACKDIR_END] = { + DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE, + DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE, +}; + +extern const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = { + {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW}, + {TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W}, + {INVALID_TRACKDIR, TRACKDIR_LOWER_E, TRACKDIR_LOWER_W, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, TRACKDIR_LEFT_N}, + {TRACKDIR_RIGHT_N, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR} +}; + +extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = { + {TRACKDIR_X_NE, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, TRACKDIR_Y_NW}, + {INVALID_TRACKDIR, TRACKDIR_UPPER_E, TRACKDIR_UPPER_W, INVALID_TRACKDIR}, + {TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W}, + {TRACKDIR_LEFT_N, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, TRACKDIR_RIGHT_N} +}; + +extern const Trackdir _track_direction_to_trackdir[][DIR_END] = { + {INVALID_TRACKDIR, TRACKDIR_X_NE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_X_SW, INVALID_TRACKDIR, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_SE, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_Y_NW}, + {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_UPPER_W, INVALID_TRACKDIR}, + {INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_E, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LOWER_W, INVALID_TRACKDIR}, + {TRACKDIR_LEFT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_LEFT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR}, + {TRACKDIR_RIGHT_N, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR, TRACKDIR_RIGHT_S, INVALID_TRACKDIR, INVALID_TRACKDIR, INVALID_TRACKDIR} +}; + +extern const Trackdir _dir_to_diag_trackdir[] = { + TRACKDIR_X_NE, TRACKDIR_Y_SE, TRACKDIR_X_SW, TRACKDIR_Y_NW, +}; + +extern const TrackBits _corner_to_trackbits[] = { + TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER, +}; + +extern const TrackdirBits _uphill_trackdirs[] = { + TRACKDIR_BIT_NONE , ///< 0 SLOPE_FLAT + TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 1 SLOPE_W -> inclined for diagonal track + TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 2 SLOPE_S -> inclined for diagonal track + TRACKDIR_BIT_X_SW , ///< 3 SLOPE_SW + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 4 SLOPE_E -> inclined for diagonal track + TRACKDIR_BIT_NONE , ///< 5 SLOPE_EW + TRACKDIR_BIT_Y_SE , ///< 6 SLOPE_SE + TRACKDIR_BIT_NONE , ///< 7 SLOPE_WSE -> leveled + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 8 SLOPE_N -> inclined for diagonal track + TRACKDIR_BIT_Y_NW , ///< 9 SLOPE_NW + TRACKDIR_BIT_NONE , ///< 10 SLOPE_NS + TRACKDIR_BIT_NONE , ///< 11 SLOPE_NWS -> leveled + TRACKDIR_BIT_X_NE , ///< 12 SLOPE_NE + TRACKDIR_BIT_NONE , ///< 13 SLOPE_ENW -> leveled + TRACKDIR_BIT_NONE , ///< 14 SLOPE_SEN -> leveled + TRACKDIR_BIT_NONE , ///< 15 invalid + TRACKDIR_BIT_NONE , ///< 16 invalid + TRACKDIR_BIT_NONE , ///< 17 invalid + TRACKDIR_BIT_NONE , ///< 18 invalid + TRACKDIR_BIT_NONE , ///< 19 invalid + TRACKDIR_BIT_NONE , ///< 20 invalid + TRACKDIR_BIT_NONE , ///< 21 invalid + TRACKDIR_BIT_NONE , ///< 22 invalid + TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 23 SLOPE_STEEP_S -> inclined for diagonal track + TRACKDIR_BIT_NONE , ///< 24 invalid + TRACKDIR_BIT_NONE , ///< 25 invalid + TRACKDIR_BIT_NONE , ///< 26 invalid + TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 27 SLOPE_STEEP_W -> inclined for diagonal track + TRACKDIR_BIT_NONE , ///< 28 invalid + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 29 SLOPE_STEEP_N -> inclined for diagonal track + TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 30 SLOPE_STEEP_E -> inclined for diagonal track +}; From 16cd420e4cfbd5f317b7b859a065af0d859123e1 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 8 Sep 2025 04:40:24 +0000 Subject: [PATCH 024/280] Update: Translations from eints portuguese: 44 changes by jcteotonio portuguese (brazilian): 6 changes by jcteotonio --- src/lang/brazilian_portuguese.txt | 12 ++--- src/lang/portuguese.txt | 88 +++++++++++++++---------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index e938478664..d13c513960 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2324,8 +2324,8 @@ STR_LIVERY_DIESEL :Locomotiva Dies STR_LIVERY_ELECTRIC :Locomotiva Elétrica STR_LIVERY_MONORAIL :Locomotiva Monotrilho STR_LIVERY_MAGLEV :Locomotiva Maglev -STR_LIVERY_DMU :DMU -STR_LIVERY_EMU :EMU +STR_LIVERY_DMU :Trem-unidade Diesel +STR_LIVERY_EMU :Trem-unidade Elétrico STR_LIVERY_PASSENGER_WAGON_STEAM :Vagão de Passageiros (Vapor) STR_LIVERY_PASSENGER_WAGON_DIESEL :Vagão de Passageiros (Diesel) STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Vagão de Passageiros (Elétrico) @@ -4834,10 +4834,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Agendado STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre esperado e agendado -STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} -STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} -STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} s -STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} s +STR_TIMETABLE_ARRIVAL_DATE :C: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :P: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :C: {COLOUR}{COMMA} s +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :P: {COLOUR}{COMMA} s # Date window (for timetable) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 7de80229ae..f3afbfa846 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -160,7 +160,7 @@ STR_ABBREV_TOFFEE :CM STR_ABBREV_BATTERIES :BA STR_ABBREV_PLASTIC :PL STR_ABBREV_FIZZY_DRINKS :RF -STR_ABBREV_ALL :TUDO +STR_ABBREV_ALL :TODOS # 'Mode' of transport for cargoes STR_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s} @@ -297,10 +297,10 @@ STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir # Show engines button ###length VEHICLE_TYPES -STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Mostrar escondido -STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}Mostrar escondido -STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Mostrar escondido -STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Mostrar escondido +STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN :{BLACK}Mostrar escondidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_ROAD_VEHICLE :{BLACK}Mostrar escondidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP :{BLACK}Mostrar escondidos +STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT :{BLACK}Mostrar escondidos ###length VEHICLE_TYPES STR_SHOW_HIDDEN_ENGINES_VEHICLE_TRAIN_TOOLTIP :{BLACK}Ao ativar este botão, os veículos ferroviários ocultos também serão exibidos @@ -543,7 +543,7 @@ STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre o 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de elementos visuais STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar as caixas envolventes -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Ativar coloração dos blocos sujos +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Realçar / atenuar blocos sujos STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alternar contornos dos grupos de botões ###length 31 @@ -643,13 +643,13 @@ STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não mos STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alternar o gráfico para este tipo de carga STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} -STR_GRAPH_INDUSTRY_CAPTION :{WHITE}{INDUSTRY} - Histórico da Carga +STR_GRAPH_INDUSTRY_CAPTION :{WHITE}Histórico da Carga - {INDUSTRY} STR_GRAPH_INDUSTRY_RANGE_PRODUCED :Produzido STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Transportado STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Entregue STR_GRAPH_INDUSTRY_RANGE_WAITING :Em Espera -STR_GRAPH_TOWN_CARGO_CAPTION :{WHITE}{TOWN} - Histórico da Carga +STR_GRAPH_TOWN_CARGO_CAPTION :{WHITE}Histórico da Carga - {TOWN} STR_GRAPH_TOWN_RANGE_PRODUCED :Abastecimento STR_GRAPH_TOWN_RANGE_TRANSPORTED :Transportado @@ -1538,7 +1538,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veículos nunca STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quando ativo, todos os modelos de veículos permanecerão disponíveis para sempre após a sua introdução STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Unidades de cronometragem: {STRING} -STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecione as unidades de cronometragem do jogo. Isto não pode ser alterado posteriormente.{}{}O uso baseado no calendário é a experiência clássica do OpenTTD, em que um ano corresponde a 12 meses e cada mês tem 28 a 31 dias.{}{}No tempo baseado no relógio de parede, o movimento de veículos, a produção de carga e as finanças baseiam-se em incrementos de um minuto, o que equivale a um mês de 30 dias no modo baseado no calendário. Estes são agrupados em períodos de 12 minutos, equivalentes a um ano no modo baseado em calendário.{}{}Em ambos os modos há sempre um calendário clássico, que é usado para datas de introdução de veículos, casas e outras infraestruturas +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecione as unidades de cronometragem do jogo. Isto não pode ser alterado posteriormente.{}{}A opção de calendário é baseada na experiência clássica do OpenTTD, em que um ano corresponde a 12 meses e cada mês tem 28 a 31 dias.{}{}Na opção de relógio de parede, o movimento de veículos, a produção de carga e as finanças baseiam-se em incrementos de um minuto, o que equivale a um mês de 30 dias na opção de calendário. Estes são agrupados em períodos de 12 minutos, equivalentes a um ano na opção de calendário.{}{}Em ambos as opções existe sempre um calendário clássico, que é usado para datas de introdução de veículos, casas e outras infraestruturas ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendário STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Relógio de parede @@ -2322,10 +2322,10 @@ STR_LIVERY_DEFAULT :Pintura Padrão STR_LIVERY_STEAM :Locomotivas a Vapor STR_LIVERY_DIESEL :Locomotivas Diesel STR_LIVERY_ELECTRIC :Locomotivas Eléctricas -STR_LIVERY_MONORAIL :Motoras Monocarril -STR_LIVERY_MAGLEV :Motoras Maglev (Levitação Magnética) -STR_LIVERY_DMU :DMU -STR_LIVERY_EMU :EMU +STR_LIVERY_MONORAIL :Locomotivas em Monocarril +STR_LIVERY_MAGLEV :Locomotivas Maglev (Levitação Magnética) +STR_LIVERY_DMU :Unidade Múltipla a Diesel +STR_LIVERY_EMU :Unidade Múltipla Elétrica STR_LIVERY_PASSENGER_WAGON_STEAM :Carruagem de Passageiros (Vapor) STR_LIVERY_PASSENGER_WAGON_DIESEL :Carruagem de Passageiros (Diesel) STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Carruagem de Passageiros (Eléctrica) @@ -2334,12 +2334,12 @@ STR_LIVERY_PASSENGER_WAGON_MAGLEV :Carruagem de Pa STR_LIVERY_FREIGHT_WAGON :Vagão de Carga STR_LIVERY_BUS :Autocarros STR_LIVERY_TRUCK :Camiões -STR_LIVERY_PASSENGER_SHIP :Navio de passageiros -STR_LIVERY_FREIGHT_SHIP :Navio cargueiro +STR_LIVERY_PASSENGER_SHIP :Navio de Passageiros +STR_LIVERY_FREIGHT_SHIP :Navio Cargueiro STR_LIVERY_HELICOPTER :Helicóptero STR_LIVERY_SMALL_PLANE :Avião de Pequenas Dimensões STR_LIVERY_LARGE_PLANE :Avião de Grandes Dimensões -STR_LIVERY_PASSENGER_TRAM :Elétrico de passageiros +STR_LIVERY_PASSENGER_TRAM :Elétrico de Passageiros STR_LIVERY_FREIGHT_TRAM :Eléctrico de Mercadorias # Face selection window @@ -3019,7 +3019,7 @@ STR_LANDSCAPING_TOOLBAR :{WHITE}Terreno STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Baixar um canto do terreno. Clique+Arraste para rebaixar o primeiro canto selecionado e nivelar o terreno da área selecionada para a nova altura do canto. Ctrl+Clique+Arraste para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Elevar um canto do terreno. Clique+Arrastar para elevar o primeiro canto selecionado e nivelar a área selecionada com a altura do novo canto. Ctrl+Clique+Arrastar para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivelar uma área de terreno até a altura do primeiro canto selecionado. Ctrl+Clique+Arrastar para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para uso futuro. Ctrl+Clique+Arrastar para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para usar no futuro. Ctrl+Clique+Arrastar para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Selecção de Objecto @@ -3566,8 +3566,8 @@ STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parâmet # Sprite aligner window STR_SPRITE_ALIGNER_CAPTION_NO_ACTION :{WHITE}Alinhando elemento visual: ({STRING}:{NUM}) -STR_SPRITE_ALIGNER_CAPTION_ACTIONA :{WHITE}Alinhando sprite: Ação 0xA, {COMMA} ({STRING}:{NUM}) -STR_SPRITE_ALIGNER_CAPTION_ACTION5 :{WHITE}Alinhando sprite: Ação 0x5, tipo {HEX}, {COMMA} ({STRING}:{NUM}) +STR_SPRITE_ALIGNER_CAPTION_ACTIONA :{WHITE}Alinhando elemento visual: Ação 0xA, {COMMA} ({STRING}:{NUM}) +STR_SPRITE_ALIGNER_CAPTION_ACTION5 :{WHITE}Alinhando elemento visual: Ação 0x5, tipo {HEX}, {COMMA} ({STRING}:{NUM}) STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Gráfico seguinte STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Proceder ao elemento visual normal seguinte, ignorando quaisquer elemento visual pseudo/recolorido/tipo-de-letra e dando a volta no fim STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Ir para o gráfico @@ -3737,9 +3737,9 @@ STR_LOCAL_AUTHORITY_DO_IT_BUTTON :{BLACK}Aplicar STR_LOCAL_AUTHORITY_DO_IT_TOOLTIP :{BLACK}Realizar a ação destacada na lista acima ###length 8 -STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Fazer uma campanha publicitária pequena -STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Fazer uma campanha publicitária média -STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Fazer uma campanha publicitária grande +STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Iniciar uma campanha publicitária pequena +STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Iniciar uma campanha publicitária média +STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Iniciar uma campanha publicitária grande STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Financiar a reconstrução das estradas locais STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Construir estátua do proprietário da empresa STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Financiar novos edifícios @@ -3828,7 +3828,7 @@ STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Referênci # Station list window STR_STATION_LIST_TOOLTIP :{BLACK}Nomes de estação - clique no nome para centrar a visualização na estação. Ctrl+Clique para abrir um novo visualizador na localização da estação STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE_TOOLTIP :{BLACK}Ctrl+Clique para selecionar múltiplos itens -STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Estações +STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Estaç{P ão ões} STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Nenhuma - @@ -3964,8 +3964,8 @@ STR_COMPANY_VIEW_CAPTION :{WHITE}{COMPANY STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDENT_NAME}{}{GOLD}(Presidente) STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurada em: {WHITE}{NUM} -STR_COMPANY_VIEW_INAUGURATED_TITLE_WALLCLOCK :{GOLD}Inaugurada: {WHITE}{NUM} (período {NUM}) -STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cores: +STR_COMPANY_VIEW_INAUGURATED_TITLE_WALLCLOCK :{GOLD}Inaugurada em: {WHITE}{NUM} (período {NUM}) +STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Esquema de Cores: STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Veículos: STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} comboio{P "" s} STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} veículo{P "" s} rodoviário{P "" s} @@ -3982,7 +3982,7 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT :{WHITE}{COMMA} STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Nenhuma STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir sede -STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir sede da empresa +STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir a sede da empresa STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da empresa STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede @@ -3996,9 +3996,9 @@ STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Fazer a STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nova Cara STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Seleccione uma nova cara para o presidente -STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Cores +STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Esquema de Cores STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos -STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Empresa +STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Nome da Empresa STR_COMPANY_VIEW_COMPANY_NAME_TOOLTIP :{BLACK}Alterar nome da empresa STR_COMPANY_VIEW_PRESIDENT_NAME_BUTTON :{BLACK}Nome do Presidente STR_COMPANY_VIEW_PRESIDENT_NAME_TOOLTIP :{BLACK}Alterar nome do presidente @@ -4167,7 +4167,7 @@ STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Custo de STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Custo de Circulação: {GOLD}{CURRENCY_LONG}/período STR_PURCHASE_INFO_CAPACITY :{BLACK}Capacidade: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(adaptável) -STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Concebido: {GOLD}{NUM}{BLACK} Vida útil: {GOLD}{COMMA} ano{P "" s} +STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Concebido em: {GOLD}{NUM}{BLACK} Vida útil: {GOLD}{COMMA} ano{P "" s} STR_PURCHASE_INFO_RELIABILITY :{BLACK}Fiabilidade máxima: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Custo: {GOLD}{CURRENCY_LONG} STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo da adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) @@ -5590,7 +5590,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_WILLS_2_8_0_STEAM :Wills 2-8-0 (Va STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (Vapor) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_GINZU_A4_STEAM :Ginzu 'A4' (Vapor) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_8P_STEAM :SH '8P' (Vapor) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Manley-Morel DMU (Diesel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Unidade Múltipla Manley-Morel (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_DASH_DIESEL :'Dash' (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_HENDRY_25_DIESEL :SH/Hendry '25' (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_UU_37_DIESEL :UU '37' (Diesel) @@ -5606,33 +5606,33 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Eléct STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Eléctrico) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Eléctrico) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Carruagem de passageiros +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Carruagem de Passageiros STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :Cisterna de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :Vagão de Gado STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GOODS_VAN :Vagão de Bens STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_GRAIN_HOPPER :Vagão de Cereais -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :Vagão de madeira +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WOOD_TRUCK :Vagão de Madeira STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_IRON_ORE_HOPPER :Vagão de Minério de Ferro -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :Vagão de aço +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_STEEL_TRUCK :Vagão de Aço STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_ARMORED_VAN :Vagão Blindado STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FOOD_VAN :Vagão Alimentar STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PAPER_TRUCK :Vagão de Papel STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COPPER_ORE_HOPPER :Vagão de Minério de Cobre -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :Cisterna de água +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :Cisterna de Água STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :Vagão de Fruta -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :Vagão de borracha -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :Vagão de açúcar +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :Vagão de Borracha +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :Vagão de Açúcar STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Vagão de Algodão Doce -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Vagão de caramelo +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Vagão de Caramelo STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :Vagão de Bolhas STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :Cisterna de Xarope de Cola STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Vagão de Doces STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Vagão de Brinquedos STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagão de Baterias STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Vagão de plástico +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Vagão de Plástico STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Eléctrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Eléctrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 @@ -5787,17 +5787,17 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BUBBLE_TRUCK :Camião de Bolh STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BUBBLE_TRUCK :Camião de Bolhas Wizzowow ###length 11 -STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Petroleiro MPS -STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Petroleiro CS-Inc. +STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Navio petroleiro MPS +STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Navio petroleiro CS-Inc. STR_VEHICLE_NAME_SHIP_MPS_PASSENGER_FERRY :Navio de passageiros MPS STR_VEHICLE_NAME_SHIP_FFP_PASSENGER_FERRY :Navio de passageiros FFP STR_VEHICLE_NAME_SHIP_BAKEWELL_300_HOVERCRAFT :Hidroflutuador Bakewell 300 STR_VEHICLE_NAME_SHIP_CHUGGER_CHUG_PASSENGER :Navio de passageiros Chugger-Chug STR_VEHICLE_NAME_SHIP_SHIVERSHAKE_PASSENGER_FERRY :Navio de passageiros Shivershake -STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Cargueiro Yate -STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Cargueiro Bakewell -STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Navio de carga MightyMover -STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Navio de carga Powernaut +STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Navio cargueiro Yate +STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Navio cargueiro Bakewell +STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Navio cargueiro MightyMover +STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Navio cargueiro Powernaut ###length 41 STR_VEHICLE_NAME_AIRCRAFT_SAMPSON_U52 :Sampson U52 From 43842f0bccfc8e236252ab7ce7e3d542efe51158 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 8 Sep 2025 21:42:49 +0100 Subject: [PATCH 025/280] Fix: Don't add spacing in rail/road type dropdowns if no badges are present. (#14598) --- src/newgrf_badge_gui.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index dcf5460e36..0c6b1f82de 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -205,22 +205,29 @@ public: uint Width() const override { + if (this->dim.width == 0) return this->TBase::Width(); return this->dim.width + WidgetDimensions::scaled.hsep_wide + this->TBase::Width(); } int OnClick(const Rect &r, const Point &pt) const override { - bool rtl = TEnd ^ (_current_text_dir == TD_RTL); - return this->TBase::OnClick(r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), pt); + if (this->dim.width == 0) { + return this->TBase::OnClick(r, pt); + } else { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + return this->TBase::OnClick(r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), pt); + } } void Draw(const Rect &full, const Rect &r, bool sel, int click_result, Colours bg_colour) const override { - bool rtl = TEnd ^ (_current_text_dir == TD_RTL); - - DrawBadgeColumn(r.WithWidth(this->dim.width, rtl), 0, *this->gui_classes, this->badges, this->feature, this->introduction_date, PAL_NONE); - - this->TBase::Draw(full, r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), sel, click_result, bg_colour); + if (this->dim.width == 0) { + this->TBase::Draw(full, r, sel, click_result, bg_colour); + } else { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + DrawBadgeColumn(r.WithWidth(this->dim.width, rtl), 0, *this->gui_classes, this->badges, this->feature, this->introduction_date, PAL_NONE); + this->TBase::Draw(full, r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), sel, click_result, bg_colour); + } } private: From 5f84ff5c3f0f736e139eea13a2b0b4a6895bcf28 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 8 Sep 2025 21:43:31 +0100 Subject: [PATCH 026/280] Change: Allow bridges over docks. (#14594) --- src/lang/english.txt | 1 + src/saveload/saveload.h | 2 ++ src/station_cmd.cpp | 23 ++++++++++++++++++++--- src/table/station_land.h | 11 ++++++++++- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index af027e3b9b..e6c6a3d291 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brid STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index ca2d16841f..2dfb49dc32 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -409,6 +409,8 @@ enum SaveLoadVersion : uint16_t { SLV_TOWN_SUPPLY_HISTORY, ///< 358 PR#14461 Town supply history. SLV_STATIONS_UNDER_BRIDGES, ///< 359 PR#14477 Allow stations under bridges. + SLV_DOCKS_UNDER_BRIDGES, ///< 360 PR#14594 Allow docks under bridges. + SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index cd59fed02d..333460b53b 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -864,7 +864,7 @@ static StringID GetBridgeTooLowMessageForStationType(StationType type) STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP, // Truck STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP, // Bus INVALID_STRING_ID, // Oilrig - INVALID_STRING_ID, // Dock + STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK, // Dock STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY, // Buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT, // RailWaypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT, // RoadWaypoint @@ -940,6 +940,21 @@ CommandCost IsRoadStationBridgeAboveOk(TileIndex tile, const RoadStopSpec *spec, return IsStationBridgeAboveOk(tile, bridgeable_info, type, layout, GetBridgeHeight(rampsouth), STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); } +/** + * Test if a dock can be built below a bridge. + * @param tile Tile to test. + * @param layout Layout piece of station to test. + * @return Command result. + */ +static CommandCost IsDockBridgeAboveOk(TileIndex tile, StationGfx layout) +{ + if (!IsBridgeAbove(tile)) return CommandCost(); + + TileIndex rampsouth = GetSouthernBridgeEnd(tile); + auto bridgeable_info = GetStationBridgeableTileInfo(StationType::Dock); + return IsStationBridgeAboveOk(tile, bridgeable_info, StationType::Dock, layout, GetBridgeHeight(rampsouth), STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); +} + /** * Checks if a rail station can be built at the given tile. * @param tile_cur Tile to check. @@ -2872,7 +2887,8 @@ CommandCost CmdBuildDock(DoCommandFlags flags, TileIndex tile, StationID station CommandCost ret = CheckIfAuthorityAllowsNewStation(tile, flags); if (ret.Failed()) return ret; - if (IsBridgeAbove(tile)) return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); + ret = IsDockBridgeAboveOk(tile, to_underlying(direction)); + if (ret.Failed()) return ret; CommandCost cost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_STATION_DOCK]); ret = Command::Do(flags, tile); @@ -2885,7 +2901,8 @@ CommandCost CmdBuildDock(DoCommandFlags flags, TileIndex tile, StationID station return CommandCost(STR_ERROR_SITE_UNSUITABLE); } - if (IsBridgeAbove(tile_cur)) return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); + ret = IsDockBridgeAboveOk(tile_cur, GFX_DOCK_BASE_WATER_PART + to_underlying(DiagDirToAxis(direction))); + if (ret.Failed()) return ret; /* Get the water class of the water tile before it is cleared.*/ WaterClass wc = GetWaterClass(tile_cur); diff --git a/src/table/station_land.h b/src/table/station_land.h index b33bf8ff4e..2552e6f761 100644 --- a/src/table/station_land.h +++ b/src/table/station_land.h @@ -919,6 +919,15 @@ static const BridgeableTileInfo _station_bridgeable_info_waypoint[] = { {2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis waypoint. }; +static const BridgeableTileInfo _station_bridgeable_info_dock[] = { + {2, {}}, // Northeast slope. + {2, {}}, // Southeast slope. + {2, {}}, // Southwest slope. + {2, {}}, // Northwest slope. + {3, {}}, // X-axis part on water. + {3, {}}, // Y-axis part on water. +}; + static const BridgeableTileInfo _station_bridgeable_info_buoy[] = { {1, {}}, }; @@ -947,7 +956,7 @@ static const std::array, to_underlying(Stati _station_bridgeable_info_roadstop, // Truck _station_bridgeable_info_roadstop, // Bus {}, // Oilrig - {}, // Dock + _station_bridgeable_info_dock, // Dock _station_bridgeable_info_buoy, // Buoy _station_bridgeable_info_waypoint, // RailWaypoint _station_bridgeable_info_road_waypoint, // RoadWaypoint From 033114da8cd4b813eebe14b0b1427f261bf78918 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 9 Sep 2025 04:38:39 +0000 Subject: [PATCH 027/280] Update: Translations from eints italian: 64 changes by Boh132Boh portuguese: 172 changes by jcteotonio --- src/lang/italian.txt | 65 +++++++- src/lang/portuguese.txt | 344 ++++++++++++++++++++-------------------- 2 files changed, 236 insertions(+), 173 deletions(-) diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 77aff5df7c..e3f80fa5c2 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -452,6 +452,9 @@ STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opzioni sandbox STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opzioni trasparenza STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Mostra nomi città STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Mostra nomi stazioni +STR_SETTINGS_MENU_STATION_NAMES_LORRY :Stazione dei camion +STR_SETTINGS_MENU_STATION_NAMES_BUS :Fermate del bus +STR_SETTINGS_MENU_STATION_NAMES_PLANE :Aeroporti STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Mostra nomi waypoint STR_SETTINGS_MENU_SIGNS_DISPLAYED :Mostra cartelli STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Mostra nomi e cartelli degli avversari @@ -614,6 +617,7 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unità d STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Valutazione prestazioni compagnie (massima valutazione=1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Grafico del valore aziendale +STR_GRAPH_LAST_24_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Ultimi 24 minuti STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Ultimi 72 minuti @@ -629,7 +633,13 @@ STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Non most STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Attiva/disattiva il grafico per il tipo di carico STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} +STR_GRAPH_INDUSTRY_CAPTION :{WHITE}{INDUSTRY} - Storico delle merci +STR_GRAPH_INDUSTRY_RANGE_PRODUCED :Prodotto +STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Trasportato +STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Consegnato +STR_GRAPH_INDUSTRY_RANGE_WAITING :In attesa +STR_GRAPH_TOWN_RANGE_TRANSPORTED :Trasportato STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostra valutazione dettagliata prestazioni @@ -2021,7 +2031,12 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Non permessa STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permessa STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permessa, disposizione strade personalizzata +STR_CONFIG_SETTING_HOUSE_PLACER :Posizionare le singole case nelle città: {STRING} +STR_CONFIG_SETTING_HOUSE_PLACER_HELPTEXT :Attivare questa impostazione permette ai giocatori di posizionare le case manualmente ###length 3 +STR_CONFIG_SETTING_HOUSE_PLACER_FORBIDDEN :Non consentito +STR_CONFIG_SETTING_HOUSE_PLACER_ALLOWED :Consentito +STR_CONFIG_SETTING_HOUSE_PLACER_FULLY_CONSTRUCTED :Permesso, completamente costruito STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Generazione passeggeri e posta: {STRING} STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Quantità di carichi (passeggeri e posta) prodotta dalle case in relazione alla popolazione della città.{}Quadratica: Una città grande il doppio genera il quadruplo di passeggeri.{}Lineare: Una città grande il doppio genera il doppio di passeggeri @@ -2219,6 +2234,8 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... non STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}... Il driver della GPU ha mandato in crash il gioco. Accelerazione hardware disattivata # Intro window +STR_INTRO_CAPTION :{WHITE}OpenTTD +STR_INTRO_VERSION :OpenTTD {REV} STR_INTRO_NEW_GAME :{BLACK}Nuova partita STR_INTRO_LOAD_GAME :{BLACK}Carica partita @@ -2359,8 +2376,11 @@ STR_FACE_FACECODE_ERR :{WHITE}Impossib STR_FACE_SAVE :{BLACK}Salva STR_FACE_SAVE_TOOLTIP :{BLACK}Salva come faccia preferita STR_FACE_SAVE_DONE :{WHITE}La faccia corrente è stata salvata come preferita nel file di configurazione di OpenTTD +STR_FACE_SETTING_TOGGLE :{STRING} {ORANGE}{STRING} +STR_FACE_SETTING_NUMERIC :{STRING} {ORANGE}{NUM} / {NUM} STR_FACE_YES :Sì STR_FACE_NO :No +STR_FACE_STYLE :Stile: STR_FACE_HAIR :Capelli: STR_FACE_EYEBROWS :Sopracciglia: STR_FACE_EYECOLOUR :Colore occhi: @@ -2837,16 +2857,27 @@ STR_PICKER_MODE_USED_TOOLTIP :Attiva/disattiv STR_PICKER_MODE_SAVED :Salvato STR_PICKER_MODE_SAVED_TOOLTIP :Attiva/disattiva la visualizzazione solo degli elementi salvati +STR_PICKER_PREVIEW_SHRINK :- +STR_PICKER_PREVIEW_SHRINK_TOOLTIP :Riduce l'altezza delle aneprime. Ctrl+Click per ridurre al minimo +STR_PICKER_PREVIEW_EXPAND :+ +STR_PICKER_PREVIEW_EXPAND_TOOLTIP :Aumenta l'altezza delle anteprime. Ctrl+Click per aumentare al massimo STR_PICKER_STATION_CLASS_TOOLTIP :Seleziona una classe di stazioni da visualizzare STR_PICKER_STATION_TYPE_TOOLTIP :Seleziona un tipo di stazione da costruire. Ctrl+Click per aggiungere o rimuovere dagli oggetti salvati +STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :Seleziona una classe di fermate dell'autobus da visualizzare +STR_PICKER_ROADSTOP_BUS_TYPE_TOOLTIP :Seleziona un tipo di fermata dell'autobus da costrure. Ctrl+Click per aggiungere o rimuovere elementi salvati STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :Seleziona una classe di stazioni dei camion da visualizzare STR_PICKER_ROADSTOP_TRUCK_TYPE_TOOLTIP :Seleziona un tipo di stazione dei camion da costruire. Ctrl+Click per aggiungere o rimuovere dagli oggetti salvati STR_PICKER_OBJECT_CLASS_TOOLTIP :Seleziona una classe di oggetti da visualizzare STR_PICKER_OBJECT_TYPE_TOOLTIP :Seleziona un tipo d'oggetto da costruire. Ctrl+Clic per aggiungere o rimuovere in elementi salvati. Ctrl+Clic+trascinamento per selezionare l'area in diagonale. Premere anche Shift per mostrare solo la stima dei costi. +STR_PICKER_HOUSE_CLASS_TOOLTIP :Seleziona una zona cittadina da mostrare STR_PICKER_HOUSE_TYPE_TOOLTIP :Seleziona un tipo di casa da costruire. Ctrl+Click per aggiungere o rimuovere dagli oggetti salvati STR_HOUSE_PICKER_CAPTION :Selezione casa +STR_HOUSE_PICKER_NAME :{BLACK}Nome: {ORANGE}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Popolazione: {ORANGE}{NUM} +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carichi accettati: {ORANGE} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carichi prodotti: {ORANGE}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Bordo STR_HOUSE_PICKER_CLASS_ZONE2 :Periferie @@ -3057,6 +3088,11 @@ STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Selezion STR_FOUND_TOWN_CITY :{BLACK}Metropoli STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Le metropoli crescono più rapidamente delle normali città.{}A seconda delle impostazioni, sono più grandi quando vengono fondate. +STR_FOUND_TOWN_EXPAND_MODE :{YELLOW}Espansione cittadina: +STR_FOUND_TOWN_EXPAND_BUILDINGS :Edifici +STR_FOUND_TOWN_EXPAND_BUILDINGS_TOOLTIP :Aumenta gli edifici delle città +STR_FOUND_TOWN_EXPAND_ROADS :Strade +STR_FOUND_TOWN_EXPAND_ROADS_TOOLTIP :Aumenta le strade delle città STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Disposizione strade: STR_FOUND_TOWN_SELECT_LAYOUT_TOOLTIP :{BLACK}Seleziona la disposizione delle strade per questa città @@ -3137,6 +3173,9 @@ STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :Terreno spoglio STR_LAI_CLEAR_DESCRIPTION_GRASS :Erba STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campi STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto +STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS :Rocce ricoperte di neve +STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND :Terreno accidentato ricoperto di neve +STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS :Erba ricoperta di neve STR_LAI_RAIL_DESCRIPTION_TRACK :Ferrovia STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrovia con segnali di blocco @@ -3291,6 +3330,7 @@ STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Salva sc STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Carica scenario STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carica heightmap STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Salva Heightmap +STR_SAVELOAD_LOAD_TOWN_DATA :{WHITE}Carica i dati relativi alle città STR_SAVELOAD_HOME_BUTTON_TOOLTIP :{BLACK}Fare clic qui per spostarsi nella cartella di salvataggio predefinita STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} liber{P o i} STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Elenco delle unità, delle cartelle e dei file delle partite salvate @@ -3302,6 +3342,7 @@ STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salva la STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carica STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carica la partita selezionata STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carica l'heightmap selezionata +STR_SAVELOAD_LOAD_TOWN_DATA_TOOLTIP :{BLACK}Carica i dati relativi alle città selezionati STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Dettagli partita STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Informazioni non disponibili STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} @@ -3663,9 +3704,14 @@ STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centra l STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autorità locale STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Mostra informazioni sull'autorità locale STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Cambia il nome della città +STR_TOWN_VIEW_CARGO_GRAPH :Grafo delle merci STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Espandi STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Aumenta la dimensione della città +STR_TOWN_VIEW_EXPAND_BUILDINGS_BUTTON :{BLACK}Espandi gli edifici +STR_TOWN_VIEW_EXPAND_BUILDINGS_TOOLTIP :{BLACK}Aumenta gli edifici della città +STR_TOWN_VIEW_EXPAND_ROADS_BUTTON :{BLACK}Espandi le strade +STR_TOWN_VIEW_EXPAND_ROADS_TOOLTIP :{BLACK}Aumenta le strade della città STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Elimina STR_TOWN_VIEW_DELETE_TOOLTIP :{BLACK}Elimina completamente questa città @@ -3910,6 +3956,7 @@ STR_COMPANY_VIEW_CAPTION :{WHITE}{COMPANY STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDENT_NAME}{}{GOLD}(Presidente) STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurata nel: {WHITE}{NUM} +STR_COMPANY_VIEW_INAUGURATED_TITLE_WALLCLOCK :{GOLD}Inaugurato: {WHITE}{NUM} (period {NUM}) STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Schema colori: STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Veicoli: STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tren{P o i} @@ -3997,6 +4044,9 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produce: STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Richiede: +STR_INDUSTRY_VIEW_ACCEPT_CARGO_SUFFIX :{YELLOW}{0:STRING}{BLACK}{3:STRING} +STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT_SUFFIX :{YELLOW}{0:STRING}{BLACK}: {1:CARGO_SHORT} {3:STRING} in attesa +STR_INDUSTRY_VIEW_ACCEPT_CARGO_NOSUFFIX :{YELLOW}{0:STRING} STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT_NOSUFFIX :{YELLOW}{0:STRING}{BLACK}: {1:CARGO_SHORT} In attesa... STR_CONFIG_GAME_PRODUCTION :{WHITE}Cambia produzione (multiplo di 8, fino a 2040) @@ -4655,6 +4705,8 @@ STR_ORDER_ROAD_VEHICLE_DEPOT :Deposito autome STR_ORDER_SHIP_DEPOT :Deposito navale ###next-name-looks-similar +STR_ORDER_GO_TO_NEAREST_HANGAR_FORMAT :{STRING} l'hangar più vicino +STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} più vicino {STRING} STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} STR_ORDER_REFIT_ORDER :(Riadatta per {STRING}) @@ -4753,6 +4805,7 @@ STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Elimina STR_TIMETABLE_CHANGE_SPEED :{BLACK}Cambia limite di velocità STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Cambia l'impostazione del limite di velocità per l'ordine selezionato. Ctrl+Clic lo imposta per tutti gli ordini +STR_TIMETABLE_CHANGE_SPEED_QUERY :Cambia limite di velocità STR_TIMETABLE_CLEAR_SPEED :{BLACK}Elimina limite di velocità STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Elimina l'impostazione del limite di velocità per l'ordine selezionato. Ctrl+Clic la rimuove da tutti gli ordini @@ -4954,6 +5007,7 @@ STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Richiest STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreno inclinato nella direzione sbagliata STR_ERROR_CAN_T_DO_THIS :{WHITE}Impossibile farlo... STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}L'edificio deve essere demolito prima +STR_ERROR_BUILDING_IS_PROTECTED :{WHITE}...vl'edificio è protetto STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Impossibile ripulire l'area... STR_ERROR_SITE_UNSUITABLE :{WHITE}... sito inadatto STR_ERROR_ALREADY_BUILT :{WHITE}... già costruito @@ -5192,6 +5246,7 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Inizio e STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... gli estremi del ponte devono trovarsi entrambi sul terreno STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte troppo lungo STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Il ponte terminerebbe fuori dalla mappa +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Ponte troppo basso per una fermata # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Impossibile costruire il tunnel qui... @@ -5278,6 +5333,10 @@ STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Impossib STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Impossibile vendere l'aeromobile... ###length VEHICLE_TYPES +STR_ERROR_CAN_T_SELL_ALL_TRAIN :{WHITE}Impossibile vendere tutti i veicoli ferroviari... +STR_ERROR_CAN_T_SELL_ALL_ROAD_VEHICLE :{WHITE}Impossibile vendere tutti gli automezzi... +STR_ERROR_CAN_T_SELL_ALL_SHIP :{WHITE}Impossibile vendere tutte le navi... +STR_ERROR_CAN_T_SELL_ALL_AIRCRAFT :{WHITE}Impossibile vendere tutti gli aeromobili... ###length VEHICLE_TYPES STR_ERROR_CAN_T_AUTOREPLACE_ROAD_VEHICLE :{WHITE}Non puoi rimpiazzare automaticamente gli autoveicoli... @@ -5800,7 +5859,9 @@ STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STR STR_SAVEGAME_NAME_SPECTATOR :Spettatore, {1:STRING} # Viewport strings -STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN_CITY :{TOWN} {CITY_ICON} +STR_VIEWPORT_TOWN_CITY_POP :{TOWN} ({COMMA}) {CITY_ICON} STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} # Simple strings to get specific types of data @@ -5862,3 +5923,5 @@ STR_SHIP :{BLACK}{SHIP} STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY}) +STR_BADGE_FILTER_ANY_LABEL :Qualunque {STRING} +STR_BADGE_FILTER_IS_LABEL :{STRING} è {STRING} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index f3afbfa846..3e27e239ea 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -275,10 +275,10 @@ STR_LIST_FILTER_TITLE :{BLACK}Filtro: STR_LIST_FILTER_OSKTITLE :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista STR_LIST_FILTER_TOOLTIP :{BLACK}Insira uma ou mais palavras-chave para filtrar a lista -STR_TOOLTIP_GROUP_ORDER :{BLACK}Seleccionar ordem de agrupamento +STR_TOOLTIP_GROUP_ORDER :{BLACK}Selecionar ordem de agrupamento STR_TOOLTIP_SORT_ORDER :{BLACK}Selecione a direção de ordenação (descendente/ascendente) -STR_TOOLTIP_SORT_CRITERIA :{BLACK}Seleccione critério de ordenação -STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Seleccione o critério de filtragem/procura +STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecione critério de ordenação +STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecione o critério de filtragem/procura STR_BUTTON_SORT_BY :{BLACK}Ordenar por STR_BUTTON_CATCHMENT :{BLACK}Cobertura STR_TOOLTIP_CATCHMENT :{BLACK}Alternar exibição da área de cobertura @@ -511,8 +511,8 @@ STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Construção de STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construção de Maglev # Road construction menu -STR_ROAD_MENU_ROAD_CONSTRUCTION :Construir estradas -STR_ROAD_MENU_TRAM_CONSTRUCTION :Construção de carris para eléctricos +STR_ROAD_MENU_ROAD_CONSTRUCTION :Construção de estrada +STR_ROAD_MENU_TRAM_CONSTRUCTION :Construção de carris para elétricos # Waterways construction menu STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construção de hidrovia @@ -543,7 +543,7 @@ STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre o 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de elementos visuais STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar as caixas envolventes -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Realçar / atenuar blocos sujos +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Realçar/Atenuar blocos sujos STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alternar contornos dos grupos de botões ###length 31 @@ -726,19 +726,19 @@ STR_MUSIC_TRACK :{TINY_FONT}{BLA STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Título STR_MUSIC_SHUFFLE :{TINY_FONT}{BLACK}Baralhar STR_MUSIC_PROGRAM :{TINY_FONT}{BLACK}Programa -STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Mudar para a faixa anterior da selecção -STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Mudar para a faixa seguinte da selecção +STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK :{BLACK}Mudar para a faixa anterior da seleção +STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION :{BLACK}Mudar para a faixa seguinte da seleção STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC :{BLACK}Parar a reprodução de música STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC :{BLACK}Iniciar reprodução de música STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC :{BLACK}Arraste os cursores para ajustar o volume da música e efeitos sonoros -STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Seleccionar programa 'todas as faixas' -STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Seleccionar programa 'estilo antigo' -STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Seleccionar programa 'estilo moderno' -STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Seleccionar programa 'Ezy Street' -STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Seleccionar programa 'Personalizado 1' -STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Seleccionar programa 'Personalizado 2' +STR_MUSIC_TOOLTIP_SELECT_ALL_TRACKS_PROGRAM :{BLACK}Selecionar programa 'todas as faixas' +STR_MUSIC_TOOLTIP_SELECT_OLD_STYLE_MUSIC :{BLACK}Selecionar programa 'estilo antigo' +STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Selecionar programa 'estilo moderno' +STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Selecionar programa 'Ezy Street' +STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 1' +STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 2' STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar reprodução aleatória -STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de selecção de faixas de música +STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de seleção de faixas de música # Playlist window STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programa musical - '{STRING}' @@ -748,7 +748,7 @@ STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLA STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Limpar STR_PLAYLIST_CHANGE_SET :{BLACK}Mudar conjunto STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa atual (apenas Personalizado 1 ou Personalizado 2) -STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Mudar selecção musical para outro conjunto instalado +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Mudar seleção musical para outro conjunto instalado STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa atual (apenas Personalização 1 ou Personalização 2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique numa faixa para a remover da lista (apenas Personalização 1 ou Personalização 2) @@ -802,8 +802,8 @@ STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLA STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Rotas de Transporte STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Floresta STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Estação Ferroviária -STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Estação de Camiões -STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Estação de Autocarros +STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Terminal de Carga para Camiões +STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Paragem de Autocarros STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Aeroporto/Heliporto STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Doca STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Terreno Irregular @@ -821,7 +821,7 @@ STR_SMALLMAP_LEGENDA_DESERT :{TINY_FONT}{BLA STR_SMALLMAP_LEGENDA_SNOW :{TINY_FONT}{BLACK}Neve STR_SMALLMAP_TOOLTIP_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Alternar exibição dos nomes das localidades -STR_SMALLMAP_CENTER_TOOLTIP :{BLACK}Centrar o mapa na posição actual +STR_SMALLMAP_CENTER_TOOLTIP :{BLACK}Centrar o mapa na posição atual STR_SMALLMAP_INDUSTRY :{TINY_FONT}{STRING} ({NUM}) STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STRING} STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY} @@ -860,8 +860,8 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Mensagem STR_NEWS_FIRST_TRAIN_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro comboio chega {G a ao à aos às} {STATION}! STR_NEWS_FIRST_BUS_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro autocarro chega {G a ao à aos às} {STATION}! STR_NEWS_FIRST_TRUCK_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro camião chega {G a ao à aos às} {STATION}! -STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de passageiros chega {G a ao à aos às} {STATION}! -STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro eléctrico de mercadorias chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_PASSENGER_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro elétrico de passageiros chega {G a ao à aos às} {STATION}! +STR_NEWS_FIRST_CARGO_TRAM_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro elétrico de mercadorias chega {G a ao à aos às} {STATION}! STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeiro navio chega {G a ao à aos às} {STATION}! STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeira aeronave chega {G a ao à aos às} {STATION}! @@ -1061,7 +1061,7 @@ STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :Selecionar a L STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM}% concluído) STR_GAME_OPTIONS_FULLSCREEN :Ecrã Inteiro -STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :Seleccione esta opção para jogar o OpenTTD em modo de ecrã inteiro +STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :Selecione esta opção para jogar o OpenTTD no modo de ecrã inteiro STR_GAME_OPTIONS_RESOLUTION :Resolução do ecrã STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :Selecione a resolução do ecrã que deseja utilizar @@ -1118,7 +1118,7 @@ STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :Selecione o con STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :Informação adicional sobre o conjunto de sons base STR_GAME_OPTIONS_BASE_MUSIC :Conjunto de música base -STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :Seleccione o conjunto de música base a usar +STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :Selecione o conjunto de música base a usar STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :Informação adicional sobre o conjunto de música base STR_GAME_OPTIONS_ONLINE_CONTENT :Obter Conteúdo @@ -1538,7 +1538,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veículos nunca STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quando ativo, todos os modelos de veículos permanecerão disponíveis para sempre após a sua introdução STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Unidades de cronometragem: {STRING} -STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecione as unidades de cronometragem do jogo. Isto não pode ser alterado posteriormente.{}{}A opção de calendário é baseada na experiência clássica do OpenTTD, em que um ano corresponde a 12 meses e cada mês tem 28 a 31 dias.{}{}Na opção de relógio de parede, o movimento de veículos, a produção de carga e as finanças baseiam-se em incrementos de um minuto, o que equivale a um mês de 30 dias na opção de calendário. Estes são agrupados em períodos de 12 minutos, equivalentes a um ano na opção de calendário.{}{}Em ambos as opções existe sempre um calendário clássico, que é usado para datas de introdução de veículos, casas e outras infraestruturas +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecione as unidades de cronometragem do jogo. Isto não pode ser alterado posteriormente.{}{}A opção de calendário é baseada na experiência clássica do OpenTTD, em que um ano corresponde a 12 meses e cada mês tem 28 a 31 dias.{}{}Na opção de relógio de parede, o movimento de veículos, a produção de carga e as finanças baseiam-se em incrementos de um minuto, o que equivale a um mês de 30 dias na opção de calendário. Estes são agrupados em períodos de 12 minutos, equivalentes a um ano na opção de calendário.{}{}Em ambas as opções existe sempre um calendário clássico, que é usado para datas de introdução de veículos, casas e outras infraestruturas ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendário STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Relógio de parede @@ -1757,7 +1757,7 @@ STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Pausar automati STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Quando ativo, o jogo ficará em pausa automaticamente num novo jogo, permitindo o estudo ao pormenor do mapa STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Durante pausa permitir: {STRING} -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Seleccionar que acções podem ser feitas enquanto o jogo está em pausa +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Selecionar que ações podem ser feitas enquanto o jogo está em pausa ###length 4 STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Nenhuma ação STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Todas as ações, exceto construção @@ -1768,7 +1768,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar a lista av STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativar a utilização de listas avançadas de veículos para o agrupamento de veículos STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} -STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleccionar se os indicadores de carga são mostrados acima de veículos em carga ou descarga +STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Selecionar se os indicadores de carga são mostrados acima de veículos em carga ou descarga STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para horários: {STRING} STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nos horários dos veículos @@ -1781,10 +1781,10 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar horários previstos de chegada e partida nas tabelas de horários STR_CONFIG_SETTING_QUICKGOTO :Criação rápida de ordens de veículos: {STRING} -STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-seleccionar o 'cursor Ir Para' ao abrir a janela de ordens +STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-selecionar o 'cursor Ir Para' ao abrir a janela de ordens STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou abrir jogo): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de carril seleccionado após o início ou carregamento de um jogo. 'primeiro disponível' selecciona o tipo mais antigo de carril, 'último disponível' selecciona o tipo mais recente de carril e 'mais utilizado' selecciona o tipo mais utilizado actualmente +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de carril selecionado após o início ou carregamento de um jogo. 'primeiro disponível' seleciona o tipo mais antigo de carril, 'último disponível' seleciona o tipo mais recente de carril e 'mais utilizado' seleciona o tipo mais utilizado atualmente ###length 3 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível @@ -1980,7 +1980,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, ma STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao Ctrl+Arrastar os sinais. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Usar automaticamente sinais clássicos antes de: {STRING} -STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o ano em que sinais eléctricos podem ser usados para os carris. Antes deste ano, sinais não-eléctricos serão usados (que têm a mesma funcionalidade, mas aspecto diferente) +STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o ano em que sinais elétricos podem ser usados para os carris. Antes deste ano, sinais não-elétricos serão usados (que têm a mesma funcionalidade, mas com aparência diferente) STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Alternar entre tipos de sinais: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecione os tipos de sinais a percorrer com a ferramenta de sinais ao usar Ctrl+Clique num sinal já construído @@ -2032,7 +2032,7 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :Quadrático (or STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Linear STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Criação de árvores no decorrer do jogo: {STRING} -STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar o crescimento espontâneo de novas árvores durante o jogo. Isto poderá afetar indústrias que dependem de árvores, como as serrações +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlar o aparecimento espontâneo de novas árvores durante o jogo. Isto poderá afetar indústrias que dependem de árvores, como as serrações ###length 4 STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Crescer mas não espalhar {RED}(inutiliza a serração) STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Crescer mas espalhar apenas nas florestas tropicais @@ -2130,21 +2130,21 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Unidades do jog STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Nós STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidades de potência dos veículos: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Quando a potência de um veículo é mostrada no interface de utilizador, mostrar na unidade seleccionada +STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Quando a potência de um veículo é mostrada no interface de utilizador, mostrar na unidade selecionada ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (hp) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Métrico (hp) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Unidades de peso: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Quando os pesos são mostrados no interface de utilizador, mostrar na unidade seleccionada +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Quando um peso é mostrado na interface de utilizador, mostrar na unidade selecionada ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (short ton) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Métrico (t/tonelada) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Unidades de volume: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Quando os volumes são mostrados no interface de utilizador, mostrar na unidade seleccionada +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Quando uma quantidade de volume é mostrada na interface de utilizador, mostrar na unidade selecionada ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (gal) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Métrico (l) @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Métrico (kgf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quando as alturas são mostradas no interface de utilizador, mostrar na unidade seleccionada +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quando as alturas são mostradas no interface de utilizador, mostrar na unidade selecionada ###length 3 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft/pé) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) @@ -2252,7 +2252,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecion STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Abrir tabela de classificações STR_INTRO_TOOLTIP_HELP :{BLACK}Obter acesso a documentação e recursos online -STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verificar conteúdo novo e actualizado para descarga +STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verificar conteúdo novo e atualizado para descarga STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' STR_INTRO_BASESET :{BLACK}O conjunto de gráficos base selecionado tem {NUM} elemento{P "" s} visua{P l is} em falta. Por favor, verifique se existem atualizações para este conjunto. @@ -2311,7 +2311,7 @@ STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Exibir c STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de aeronaves STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Escolher a cor primária para o esquema selecionado. Ctrl+Clique para definir esta cor para todos os esquemas STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Escolher a cor secundária para o esquema selecionado. Ctrl+Clique para definir essa cor para todos os esquemas -STR_LIVERY_PANEL_TOOLTIP :{BLACK}Seleccione o esquema de cores a alterar, ou esquemas múltiplos utilizando a tecla Ctrl com o botão esquerdo do rato. Marque a caixa para comutar a utilização do esquema de cores +STR_LIVERY_PANEL_TOOLTIP :{BLACK}Selecione o esquema de cores a alterar, ou esquemas múltiplos com Ctrl+Clique. Marque a caixa para usar o esquema de cores STR_LIVERY_TRAIN_GROUP_EMPTY :Não estão configurados grupos de comboios STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Não estão configurados grupos de veículos rodoviários STR_LIVERY_SHIP_GROUP_EMPTY :Não estão configurados grupos de navios @@ -2340,12 +2340,12 @@ STR_LIVERY_HELICOPTER :Helicóptero STR_LIVERY_SMALL_PLANE :Avião de Pequenas Dimensões STR_LIVERY_LARGE_PLANE :Avião de Grandes Dimensões STR_LIVERY_PASSENGER_TRAM :Elétrico de Passageiros -STR_LIVERY_FREIGHT_TRAM :Eléctrico de Mercadorias +STR_LIVERY_FREIGHT_TRAM :Elétrico de Mercadorias # Face selection window -STR_FACE_CAPTION :{WHITE}Selecção de Cara -STR_FACE_CANCEL_TOOLTIP :{BLACK}Cancelar selecção da nova cara -STR_FACE_OK_TOOLTIP :{BLACK}Aceitar selecção da nova cara +STR_FACE_CAPTION :{WHITE}Seleção de Cara +STR_FACE_CANCEL_TOOLTIP :{BLACK}Cancelar seleção da nova cara +STR_FACE_OK_TOOLTIP :{BLACK}Aceitar seleção da nova cara STR_FACE_NEW_FACE_BUTTON :{BLACK}Nova Cara STR_FACE_NEW_FACE_TOOLTIP :{BLACK}Gerar nova cara aleatoriamente @@ -2420,7 +2420,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Versão STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Endereço do servidor: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Código de convite: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de início: {WHITE}{DATE_SHORT} -STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data actual: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data atual: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Tempo de jogo: {WHITE}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de Jogo: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protegido por palavra-chave! @@ -2451,7 +2451,7 @@ STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Introduz STR_NETWORK_START_SERVER_CAPTION :{WHITE}Iniciar novo jogo STR_NETWORK_START_SERVER_NEW_GAME_NAME :{BLACK}Nome do jogo: -STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}O nome do jogo será mostrado aos outros jogadores no menu de selecção de jogos multi-jogador +STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}O nome do jogo será mostrado aos outros jogadores no menu de seleção de jogos multi-jogador STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Definir palavra-chave STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Proteja o jogo com uma senha se não desejar que pessoas indesejadas se juntem @@ -2669,12 +2669,12 @@ STR_CONTENT_TYPE_CAPTION :{BLACK}Tipo STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Tipo de conteúdo STR_CONTENT_NAME_CAPTION :{BLACK}Nome STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Nome do conteúdo -STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Clique numa linha para ver detalhes{}Clique na caixa de verificação para a seleccionar para descarregamento -STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Seleccionar tudo +STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Clique numa linha para ver detalhes{}Clique na caixa de verificação para a selecionar para descarregamento +STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Selecionar tudo STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo para ser descarregado -STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Sel. actualizações -STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo que seja actualização ao conteúdo existente a ser descarregado -STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Desseleccionar tudo +STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Sel. atualizações +STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo que seja atualização ao conteúdo existente a ser descarregado +STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Desselecionar tudo STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo que não deva ser descarregado STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Pesquisar em páginas externas STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Escolher conteúdo não disponível no serviço de conteúdo do OpenTTD em páginas não associadas ao OpenTTD @@ -2684,14 +2684,14 @@ STR_CONTENT_FILTER_TITLE :{BLACK}Filtrar STR_CONTENT_OPEN_URL :{BLACK}Página da Internet STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Visitar a página de Internet para este conteúdo STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Descarregar -STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Iniciar a descarga do conteúdo seleccionado +STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Iniciar a descarga do conteúdo selecionado STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Tamanho total da descarga: {WHITE}{BYTES} STR_CONTENT_DETAIL_TITLE :{SILVER}INFO DE CONTEÚDO ###length 5 -STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Não seleccionou isto para ser descarregado -STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Seleccionou isto para ser descarregado -STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta dependência foi seleccionada para ser descarregada +STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Não selecionou isto para ser descarregado +STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Selecionou isto para ser descarregado +STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta dependência foi selecionada para ser descarregada STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Já tem isto STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Este conteúdo é desconhecido e não pode ser descarregado no OpenTTD @@ -2702,7 +2702,7 @@ STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Descri STR_CONTENT_DETAIL_URL :{SILVER}URL: {WHITE}{STRING} STR_CONTENT_DETAIL_TYPE :{SILVER}Tipo: {WHITE}{STRING} STR_CONTENT_DETAIL_FILESIZE :{SILVER}Tamanho da descarga: {WHITE}{BYTES} -STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF :{SILVER}Seleccionado devido a: {WHITE}{STRING} +STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF :{SILVER}Selecionado devido a: {WHITE}{STRING} STR_CONTENT_DETAIL_DEPENDENCIES :{SILVER}Dependências: {WHITE}{STRING} STR_CONTENT_DETAIL_TAGS :{SILVER}Etiquetas: {WHITE}{STRING} STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD foi compilado sem suporte de "zlib"... @@ -2824,13 +2824,13 @@ STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecion STR_WAYPOINT_CAPTION :{WHITE}Ponto de controlo # Rail station construction window -STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Selecção de Estação +STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Seleção de Estação STR_STATION_BUILD_ORIENTATION :{BLACK}Orientação -STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação da estação ferroviária +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação ferroviária STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Número de linhas -STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Seleccionar o número de linhas da estação ferroviária +STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Selecionar o número de linhas da estação ferroviária STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Tamanho da plataforma -STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Seleccionar o tamanho da estação ferroviária +STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Selecionar o tamanho da estação ferroviária STR_STATION_BUILD_DRAG_DROP :{BLACK}Arrastar STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Construir estação arrastando @@ -2852,8 +2852,8 @@ STR_PICKER_WAYPOINT_CLASS_TOOLTIP :Selecionar uma STR_PICKER_WAYPOINT_TYPE_TOOLTIP :Escolher um tipo de ponto de controlo para construir. Ctrl+Clique para adicionar ou remover nos itens guardados STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :Selecionar uma classe de estação rodoviária para mostrar STR_PICKER_ROADSTOP_BUS_TYPE_TOOLTIP :Escolher um tipo de estação rodoviária para construir. Ctrl+Clique para adicionar ou remover nos itens guardados -STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :Selecionar uma classe de estação de camiões para mostrar -STR_PICKER_ROADSTOP_TRUCK_TYPE_TOOLTIP :Escolher um tipo de estação de camiões para construir. Ctrl+Clique para adicionar ou remover nos itens guardados +STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :Selecionar uma classe de terminal de carga para camiões para mostrar +STR_PICKER_ROADSTOP_TRUCK_TYPE_TOOLTIP :Escolher um tipo de terminal de carga para camiões para construir. Ctrl+Clique para adicionar ou remover nos itens guardados STR_PICKER_OBJECT_CLASS_TOOLTIP :Selecionar uma classe de objeto para mostrar STR_PICKER_OBJECT_TYPE_TOOLTIP :Selecione um tipo de objeto para construir. Ctrl+Clique para adicionar ou remover nos itens guardados. Ctrl+Clique+Arrastar para selecionar a área diagonalmente. Pressione também Shift para apenas mostrar o custo estimado STR_PICKER_HOUSE_CLASS_TOOLTIP :Selecione uma zona de localidade para mostrar @@ -2888,28 +2888,28 @@ STR_STATION_CLASS_WAYP :Pontos de contr STR_STATION_CLASS_WAYP_WAYPOINT :Ponto de controlo padrão # Signal window -STR_BUILD_SIGNAL_CAPTION :{WHITE}Selecção de Sinal +STR_BUILD_SIGNAL_CAPTION :{WHITE}Seleção de Sinal STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinal de bloco (semáforo){}Este é o tipo mais básico de sinal. Permite apenas a passagem de um comboio dentro de um bloco de linha ao mesmo tempo. STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (semáforo){}Apresenta-se verde enquanto existir um ou mais sinais de saída verdes no seguimento da linha. Caso contrário, ficará vermelho. STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combinado (semáforo){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite a construção de ramificações complexas de pré-sinais. STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto (semáforo){}Permite que vários comboios passem simultaneamente um bloco de linha, desde que consigam reservar um caminho seguro sem prejudicar o veículo seguinte. Os sinais de trajeto padrão podem ser cruzados no sentido contrário. STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (semáforo){}Funciona de maneira similar a um sinal de trajeto, mas não pode ser cruzado no sentido contrário. -STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Normal(eléctrico){}Este é o tipo mais básico de sinal. Permite apenas a passagem de um comboio de cada vez dentro da mesma divisão de linha. -STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (eléctrico){}Apresenta-se verde enquanto existir um ou mais sinais de saída verdes no seguimento da linha. De outro modo ficará vermelho. -STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (eléctrico){}Funciona da mesma forma que o sinal normal, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. -STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (eléctrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais. +STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Normal(elétrico){}Este é o tipo mais básico de sinal. Permite apenas a passagem de um comboio de cada vez dentro da mesma divisão de linha. +STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (elétrico){}Apresenta-se verde enquanto existir um ou mais sinais de saída verdes no seguimento da linha. De outro modo ficará vermelho. +STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (elétrico){}Funciona da mesma forma que o sinal normal, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. +STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (elétrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais. STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (elétrico){}Permite que vários comboios passem simultaneamente um bloco de linha, desde que consigam reservar um caminho seguro sem prejudicar o veículo seguinte. Os sinais de trajeto padrão podem ser cruzados no sentido contrário. -STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (eléctrico){}Um sinal de trajeto que permite que mais de um comboio passe simultaneamente uma divisão de linha, desde que consiga reservar um caminho para onde possa parar posteriormente sem prejudicar o seguinte. Os sinais de sentido único não podem ser cruzados no sentido contrário. +STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (elétrico){}Um sinal de trajeto que permite que mais de um comboio passe simultaneamente uma divisão de linha, desde que consiga reservar um caminho para onde possa parar posteriormente sem prejudicar o seguinte. Os sinais de sentido único não podem ser cruzados no sentido contrário. STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter Sinal{}Clique num sinal existente para convertê-lo no tipo e variante de sinal selecionado. Ctrl+Clique para mudar a variante existente. Pressione também Shift para apenas mostrar o custo estimado STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Distância entre os sinais quando se arrasta STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Reduzir a distância entre os sinais quando se arrasta STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar a distância entre os sinais quando se arrasta # Bridge selection window -STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Seleccione Ponte Ferroviária -STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Seleccionar Ponte Rodoviária -STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Selecção de ponte - clique na ponte desejada para a construir +STR_SELECT_RAIL_BRIDGE_CAPTION :{WHITE}Selecione Ponte Ferroviária +STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Selecionar Ponte Rodoviária +STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Seleção de ponte - clique na ponte desejada para a construir STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{STRING},{} {WHITE}{CURRENCY_LONG} @@ -2926,7 +2926,7 @@ STR_BRIDGE_TUBULAR_SILICON :Tubular, Silíc # Road construction toolbar 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_TRAM_CONSTRUCTION_CAPTION :{WHITE}Construção de linha de elétrico STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construir secção de estrada. Ctrl+Clique para remover secção de estrada. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para elétricos. Ctrl+Clique para remover secção de carris de elétricos. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl+Clique para remover secção de estrada. Pressione também Shift para apenas mostrar o custo estimado @@ -2935,9 +2935,9 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}Construir ponto de controlo na estrada. Ctrl+Clique para selecionar outro ponto de controlo para se unir. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Construir ponto de controlo na linha de elétrico. Ctrl+Clique para selecionar outro ponto de controlo para se unir. Pressione também Shift para apenas mostrar o custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir paragem de autocarros. Ctrl+Clique para selecionar outra estação para fazer a união. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir terminal de carga para camiões. Ctrl+Clique para selecionar outra estação para fazer a união. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o 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 rodoviária. Pressione também Shift para apenas mostrar o custo estimado @@ -2945,7 +2945,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressione também Shift para mostrar apenas o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para elétricos. Pressione também Shift para apenas mostrar o 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_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar construir/remover linhas de elétricos e sinais STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Converter/Atualizar o tipo de estrada. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Converter/Atualizar o tipo de carril para elétricos. Pressione também Shift para apenas mostrar o custo estimado @@ -2959,14 +2959,14 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orienta 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 -STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Seleccionar a orientação da estação de autocarros +STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da paragem de autocarros +STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da paragem de autocarros STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga -STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de camiões -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos de Passageiros -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Seleccionar orientação da estação de eléctricos -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Eléctricos -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Seleccionar orientação da estação de eléctricos +STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do terminal de carga para camiões +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Elétricos de Passageiros +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de elétricos +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Elétricos +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de elétricos # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de hidrovia @@ -2992,8 +2992,8 @@ STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Aeroport STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Construir aeroporto. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado # Airport construction window -STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Selecção de Aeroporto -STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Seleccionar tamanho/tipo de aeroporto +STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Seleção de Aeroporto +STR_STATION_BUILD_AIRPORT_TOOLTIP :{BLACK}Selecionar tamanho/tipo de aeroporto STR_STATION_BUILD_AIRPORT_CLASS_LABEL :{BLACK}Classe do aeroporto STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Disposição {NUM} @@ -3022,7 +3022,7 @@ STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Nivelar STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar terreno para usar no futuro. Ctrl+Clique+Arrastar para selecionar a área na diagonal. Pressione também Shift para apenas mostrar o custo estimado # Object construction window -STR_OBJECT_BUILD_CAPTION :{WHITE}Selecção de Objecto +STR_OBJECT_BUILD_CAPTION :{WHITE}Seleção de Objeto STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Pré-visualização do objecto STR_OBJECT_BUILD_SIZE :{BLACK}Tamanho: {GOLD}{NUM} x {NUM} mosaicos @@ -3081,7 +3081,7 @@ STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Pequena STR_FOUND_TOWN_INITIAL_SIZE_MEDIUM_BUTTON :{BLACK}Média STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Grande STR_FOUND_TOWN_SIZE_RANDOM :{BLACK}Aleatório -STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Seleccione o tamanho da localidade +STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Selecione o tamanho da localidade STR_FOUND_TOWN_CITY :{BLACK}Cidade STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Cidades crescem mais depressa do que as localidades normais{}Dependendo da configuração, são maiores aquando da sua fundação @@ -3092,7 +3092,7 @@ STR_FOUND_TOWN_EXPAND_ROADS :Estradas STR_FOUND_TOWN_EXPAND_ROADS_TOOLTIP :Aumentar as estradas das localidades STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Disposição de estradas na localidade: -STR_FOUND_TOWN_SELECT_LAYOUT_TOOLTIP :{BLACK}Seleccione disposição das estradas utilizada para esta localidade +STR_FOUND_TOWN_SELECT_LAYOUT_TOOLTIP :{BLACK}Selecione disposição das estradas utilizada para esta localidade STR_FOUND_TOWN_SELECT_LAYOUT_ORIGINAL :{BLACK}Original STR_FOUND_TOWN_SELECT_LAYOUT_BETTER_ROADS :{BLACK}Estradas melhores STR_FOUND_TOWN_SELECT_LAYOUT_2X2_GRID :{BLACK}Grelha 2x2 @@ -3126,7 +3126,7 @@ STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING} STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia da Indústria STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Mostrar indústrias a fornecer e a aceitar mercadorias STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao mapa pequeno -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também seleccionar as indústrias mostradas no mapa pequeno +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também selecionar as indústrias mostradas no mapa pequeno STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecione a carga que pretende mostrar STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Selecione a indústria @@ -3141,7 +3141,7 @@ STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Receitas STR_LAND_AREA_INFORMATION_OWNER_N_A :N/D STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Proprietário: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Dono da estrada: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da linha de eléctrico: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da linha de elétrico: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Dono da linha férrea: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoridade local: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nenhuma @@ -3205,7 +3205,7 @@ STR_LAI_ROAD_DESCRIPTION_ROAD_WITH_STREETLIGHTS :Estrada com ilu STR_LAI_ROAD_DESCRIPTION_TREE_LINED_ROAD :Estrada com árvores 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 +STR_LAI_ROAD_DESCRIPTION_TRAMWAY :Linha de elétrico # Houses come directly from their building names STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION :{STRING} (em construção) @@ -3217,8 +3217,8 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactos STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Estação ferroviária STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar STR_LAI_STATION_DESCRIPTION_AIRPORT :Aeroporto -STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Estação de camiões -STR_LAI_STATION_DESCRIPTION_BUS_STATION :Estação de autocarros +STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Terminal de Carga para Camiões +STR_LAI_STATION_DESCRIPTION_BUS_STATION :Paragem de autocarros STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Doca STR_LAI_STATION_DESCRIPTION_BUOY :Boia STR_LAI_STATION_DESCRIPTION_WAYPOINT :Ponto de controlo @@ -3271,9 +3271,9 @@ STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Taxa de STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Número de tiques simulados por segundo STR_FRAMERATE_RATE_BLITTER :{BLACK}Taxa de fotogramas dos gráficos: {STRING} STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de fotogramas de video renderizados por segundo -STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factor de velocidade actual do jogo: {DECIMAL}x +STR_FRAMERATE_SPEED_FACTOR :{BLACK}Fator de velocidade atual do jogo: {DECIMAL}x STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Quão rápido o jogo está a ser executado, comparado com a velocidade esperada na taxa de simulação normal -STR_FRAMERATE_CURRENT :{WHITE}Actual +STR_FRAMERATE_CURRENT :{WHITE}Atual STR_FRAMERATE_AVERAGE :{WHITE}Média STR_FRAMERATE_MEMORYUSE :{WHITE}Memória STR_FRAMERATE_DATA_POINTS :{BLACK}Dados baseados em {COMMA} medições @@ -3335,12 +3335,12 @@ STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades, diretórios e ficheiros de jogos guardados STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Nome escolhido para guardar o jogo STR_SAVELOAD_DELETE_BUTTON :{BLACK}Eliminar -STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Eliminar o jogo guardado seleccionado +STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Eliminar o jogo guardado selecionado STR_SAVELOAD_SAVE_BUTTON :{BLACK}Guardar -STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Guardar o jogo actual, usando o nome escolhido +STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Guardar o jogo atual, usando o nome escolhido STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carregar o jogo selecionado -STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carregar mapa de alturas seleccionado +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carregar mapa de alturas selecionado STR_SAVELOAD_LOAD_TOWN_DATA_TOOLTIP :{BLACK}Carregar dados da localidade selecionada STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível @@ -3357,7 +3357,7 @@ STR_SAVELOAD_OSKTITLE :{BLACK}Introduz # World generation STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Gerador de Mapas STR_MAPGEN_MAPSIZE :{BLACK}Dim. do mapa: -STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Seleccionar o tamanho do mapa em mosaicos. O numero de mosaicos disponiveis será ligeiramente menor +STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecionar o tamanho do mapa em mosaicos. O número de mosaicos disponíveis será ligeiramente menor STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Num. de localidades: STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selecionar a densidade das cidades, ou um número personalizado @@ -3487,31 +3487,31 @@ STR_NEWGRF_SETTINGS_CAPTION :{WHITE}Definiç STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}Informação detalhada do NewGRF STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}Ficheiros NewGRF ativos STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}Ficheiros NewGRF inativos -STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Seleccionar predefinição: +STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Selecionar predefinição: STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtro: -STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Carrega a predefinição seleccionada +STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Carrega a predefinição selecionada STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Guardar STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Guarda a lista numa predefinição STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Eliminar -STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Elimina a predefinição seleccionada +STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Elimina a predefinição selecionada STR_NEWGRF_SETTINGS_ADD :{BLACK}Adicionar STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Adicionar o ficheiro NewGRF selecionado à sua configuração STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Reler ficheiros -STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Actualiza a lista de ficheiros NewGRF disponíveis +STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Atualiza a lista de ficheiros NewGRF disponíveis STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Remover -STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Remove o ficheiro NewGRF seleccionado da lista +STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Remove o ficheiro NewGRF selecionado da lista STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Para Cima -STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Move o ficheiro NewGRF seleccionado para cima na lista +STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Move o ficheiro NewGRF selecionado para cima na lista STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Para Baixo -STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Move o ficheiro NewGRF seleccionado para baixo na lista -STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Actualiza -STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Actualiza ficheiros NewGRF para os quais tens uma versão mais recente instalada +STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Move o ficheiro NewGRF selecionado para baixo na lista +STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Atualiza +STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Atualiza ficheiros NewGRF para os quais tens uma versão mais recente instalada STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Uma lista dos ficheiros NewGRF que estão instalados STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Mostrar parâmetros STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Alternar paleta -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF seleccionado.{}Alterne quando os gráficos deste NewGRF aparecerem a cor-de-rosa no jogo +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF selecionado.{}Utilize esta opção quando os gráficos deste NewGRF aparecerem incorretamente a cor-de-rosa durante o jogo STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Encontrar conteúdo em falta online @@ -3537,11 +3537,11 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatí # NewGRF save preset window STR_SAVE_PRESET_CAPTION :{WHITE}Gravar predefinição -STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de predefinições disponíveis, selecciona uma para a copiar para o nome da gravação abaixo +STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de predefinições disponíveis, seleciona uma para a copiar para o nome da gravação abaixo STR_SAVE_PRESET_TITLE :{BLACK}Intriduza um nome para a predefinição -STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nome seleccionado actualmente para gravação da predefinição +STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nome selecionado atualmente para gravação da predefinição STR_SAVE_PRESET_SAVE :{BLACK}Grava -STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Grava a predefinição com o nome seleccionado +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Grava a predefinição com o nome selecionado # NewGRF parameters window STR_BASEGRF_PARAMETERS_CAPTION :{WHITE}Alterar os parâmetros dos gráficos base @@ -3574,7 +3574,7 @@ STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Ir para STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Ir para o gráfico seguinte. Se o gráfico não for um gráfico normal, proceder ao gráfico normal seguinte STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Gráfico anterior STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Proceder ao elemento visual normal anterior, ignorando quaisquer elemento visual pseudo/recolorido/tipo-de-letra e dando a volta no início -STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do gráfico seleccionado actualmente. O alinhamento é ignorado a desenhar este gráfico +STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Representação do gráfico selecionado atualmente. O alinhamento é ignorado a desenhar este gráfico STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}Desloca o gráfico, alterando os intervalos X e Y. Ctrl+Clique desloca o gráfico 8 unidades de uma só vez STR_SPRITE_ALIGNER_SPRITE :{STRING}:{NUM} @@ -3832,7 +3832,7 @@ STR_STATION_LIST_CAPTION :{WHITE}{COMPANY STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- Nenhuma - -STR_STATION_LIST_SELECT_ALL_FACILITIES_TOOLTIP :{BLACK}Seleccionar todas as instalações +STR_STATION_LIST_SELECT_ALL_FACILITIES_TOOLTIP :{BLACK}Selecionar todas as instalações STR_STATION_LIST_CARGO_FILTER_ALL_AND_NO_RATING :Todos os tipos de carga e sem classificação STR_STATION_LIST_CARGO_FILTER_MULTIPLE :Múltiplos tipos de carga STR_STATION_LIST_CARGO_FILTER_NO_CARGO_TYPES :Sem tipos de carga @@ -3995,7 +3995,7 @@ STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}Aquisiç STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Fazer a aquisição hostil desta empresa STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nova Cara -STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Seleccione uma nova cara para o presidente +STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecione uma nova cara para o presidente STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Esquema de Cores STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Nome da Empresa @@ -4120,8 +4120,8 @@ STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COM STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupos - Clique em um grupo para listar todos os veículos do grupo. Clique+Arraste para organizar a hierarquia STR_GROUP_CREATE_TOOLTIP :{BLACK}Clique para criar um grupo -STR_GROUP_DELETE_TOOLTIP :{BLACK}Remover o grupo seleccionado -STR_GROUP_RENAME_TOOLTIP :{BLACK}Mudar o nome do grupo seleccionado +STR_GROUP_DELETE_TOOLTIP :{BLACK}Remover o grupo selecionado +STR_GROUP_RENAME_TOOLTIP :{BLACK}Mudar o nome do grupo selecionado STR_GROUP_LIVERY_TOOLTIP :{BLACK}Alterar a imagem do grupo selecionado STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para proteger este grupo da auto-substituição global. Ctrl+Clique para proteger também sub-grupos @@ -4137,7 +4137,7 @@ STR_GROUP_PROFIT_THIS_YEAR :Lucro deste ano STR_GROUP_PROFIT_THIS_PERIOD :Lucro neste período: STR_GROUP_PROFIT_LAST_YEAR :Lucro no último ano: STR_GROUP_PROFIT_LAST_PERIOD :Lucro no último período: -STR_GROUP_OCCUPANCY :Utilização actual: +STR_GROUP_OCCUPANCY :Utilização atual: STR_GROUP_OCCUPANCY_VALUE :{NUM}% # Build vehicle window @@ -4209,7 +4209,7 @@ STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e adaptar carga da aeronave ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o veículo ferroviário seleccionado. Pressione também Shift para apenas mostrar o custo estimado +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o veículo ferroviário selecionado. Pressione também Shift para apenas mostrar o custo estimado STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o veículo rodoviário selecionado. Pressione também Shift para apenas mostrar o custo estimado STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o navio selecionado. Pressione também Shift para apenas mostrar o custo estimado STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar a aeronave selecionada. Pressione também Shift para apenas mostrar o custo estimado @@ -4382,18 +4382,18 @@ STR_REPLACE_VEHICLE_ROAD_VEHICLE :Veículo rodovi STR_REPLACE_VEHICLE_SHIP :Navio STR_REPLACE_VEHICLE_AIRCRAFT :Aeronave -STR_REPLACE_LEFT_ARRAY_TOOLTIP :{BLACK}Seleccione o tipo de motor a substituir -STR_REPLACE_RIGHT_ARRAY_TOOLTIP :{BLACK}Seleccione o novo tipo de motor para substituir o que seleccionou à esquerda +STR_REPLACE_LEFT_ARRAY_TOOLTIP :{BLACK}Selecione o tipo de locomotiva a substituir +STR_REPLACE_RIGHT_ARRAY_TOOLTIP :{BLACK}Selecione o novo tipo de locomotiva para substituir o que selecionou à esquerda STR_REPLACE_VEHICLES_START :{BLACK}Iniciar Subst. de Veículos STR_REPLACE_VEHICLES_NOW :Substituir todos os veículos agora STR_REPLACE_VEHICLES_WHEN_OLD :Substituir apenas veículos velhos -STR_REPLACE_START_BUTTON_TOOLTIP :{BLACK}Pressione para iniciar a substituição do tipo de motor que seleccionou à esquerda, com o tipo de motor seleccionado à direita +STR_REPLACE_START_BUTTON_TOOLTIP :{BLACK}Pressione para iniciar a substituição do tipo de locomotiva que selecionou à esquerda, com o tipo de motor selecionado à direita STR_REPLACE_NOT_REPLACING :{BLACK}Não substituindo -STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Nenhum veículo seleccionado +STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Nenhum veículo selecionado STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando velho STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Subst. de Veículos -STR_REPLACE_STOP_BUTTON_TOOLTIP :{BLACK}Pressione para parar a subsituição do tipo de motor que seleccionou à esquerda +STR_REPLACE_STOP_BUTTON_TOOLTIP :{BLACK}Pressione para parar a substituição do tipo de locomotiva que selecionou à esquerda STR_REPLACE_ENGINE_WAGON_SELECT_TOOLTIP :{BLACK}Alternar entre a janela de substituição de locomotivas e a janela de substituição de vagões STR_REPLACE_ENGINES :Locomotivas @@ -4406,9 +4406,9 @@ STR_REPLACE_RAILTYPE_TOOLTIP :{BLACK}Selecion STR_REPLACE_ROADTYPE_TOOLTIP :{BLACK}Selecione o tipo de estrada para o qual deseja efectuar a substituição dos motores ###next-name-looks-similar -STR_REPLACE_REPLACE_INFO_TAB_TOOLTIP :{BLACK}Exibe o tipo de motor que substituirá o que está seleccionado à esquerda, se algum +STR_REPLACE_REPLACE_INFO_TAB_TOOLTIP :{BLACK}Exibe o tipo de locomotiva que substituirá o que está selecionado à esquerda, se algum estiver selecionado STR_REPLACE_RAIL_VEHICLES :Comboios -STR_REPLACE_ELRAIL_VEHICLES :Comboios eléctricos +STR_REPLACE_ELRAIL_VEHICLES :Comboios elétricos STR_REPLACE_MONORAIL_VEHICLES :Monocarris STR_REPLACE_MAGLEV_VEHICLES :Maglevs @@ -4523,7 +4523,7 @@ STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Lucro ne STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Lucro neste período: {LTBLUE}{CURRENCY_LONG} (último período: {CURRENCY_LONG}) {BLACK}Performance mín.: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilidade: {LTBLUE}{COMMA}% {BLACK}Avarias desde a última manutenção: {LTBLUE}{COMMA} -STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Fabricado em: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Capacidade: {LTBLUE}Nenhuma{STRING} STR_VEHICLE_INFO_CAPACITY :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{STRING} STR_VEHICLE_INFO_CAPACITY_MULT :{BLACK}Capacidade: {LTBLUE}{CARGO_LONG}{STRING} (x{NUM}) @@ -4556,8 +4556,8 @@ STR_QUERY_RENAME_SHIP_CAPTION :{WHITE}Renomear STR_QUERY_RENAME_AIRCRAFT_CAPTION :{WHITE}Renomear aeronave # Extra buttons for train details windows -STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Construído: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} -STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} Fabricado em: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE :{LTBLUE}{ENGINE}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT :{BLACK}Carga total (capacidade) deste comboio: STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY :{LTBLUE}{CARGO_LONG} ({CARGO_SHORT}) @@ -4580,7 +4580,7 @@ STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacida # Vehicle refit STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Adaptar) -STR_REFIT_TITLE :{GOLD}Seleccionar tipo de carga: +STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga: STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Lucro da conversão: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} @@ -4588,10 +4588,10 @@ STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nova cap STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecionar os veículos a readaptar. Clique+Arrastar para selecionar múltiplos veículos. Clique num espaço vazio para selecionar o veículo inteiro. Ctrl+Clique para selecionar um veículo e cadeia seguinte ###length VEHICLE_TYPES -STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Seleccionar tipo de carga do comboio +STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga do comboio STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecione o tipo de carga para o veículo STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga do navio -STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Seleccionar tipo de carga da aeronave +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga da aeronave ###length VEHICLE_TYPES STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Converter comboio @@ -4600,10 +4600,10 @@ STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Adaptar STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Adaptar aeronave ###length VEHICLE_TYPES -STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Converter comboio para transportar a carga seleccionada -STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reconverter veículo para transportar o tipo de carga seleccionado +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Converter comboio para transportar a carga selecionada +STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Reconverter veículo rodoviário para transportar o tipo de carga selecionado STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar navio para transportar a carga selecionada -STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Converter aeronave para transportar a carga seleccionada +STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Converter aeronave para transportar a carga selecionada # Order view STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Ordens) @@ -4622,24 +4622,24 @@ STR_ORDER_GO_TO :Ir para STR_ORDER_GO_NON_STOP_TO :Ir, sem parar, para STR_ORDER_GO_VIA :Ir por STR_ORDER_GO_NON_STOP_VIA :Ir, sem parar, por -STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Mudar o comportamento de paragem da ordem seleccionada +STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Mudar o comportamento de paragem da ordem selecionada STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Encher de qq. carga STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carregar se disponível STR_ORDER_DROP_FULL_LOAD_ALL :Encher de todas as cargas STR_ORDER_DROP_FULL_LOAD_ANY :Encher de qq. carga STR_ORDER_DROP_NO_LOADING :Sem carga -STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Mudar o comportamento de carga da ordem seleccionada +STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Mudar o comportamento de carga da ordem selecionada STR_ORDER_TOGGLE_UNLOAD :{BLACK}Descarregar todas STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :Descarregar se aceite STR_ORDER_DROP_UNLOAD :Descarregar todas STR_ORDER_DROP_TRANSFER :Transferir STR_ORDER_DROP_NO_UNLOADING :Sem descarga -STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Mudar o comportamento de descarga da ordem seleccionada +STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Mudar o comportamento de descarga da ordem selecionada STR_ORDER_REFIT :{BLACK}Adaptar -STR_ORDER_REFIT_TOOLTIP :{BLACK}Seleccionar o tipo de carga a adaptar nesta ordem. Pressionar Ctrl e botão-esquerdo do rato para remover a instrução de adaptação +STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar o tipo de carga a adaptar nesta ordem. Pressionar Ctrl e botão-esquerdo do rato para remover a instrução de adaptação STR_ORDER_REFIT_AUTO :{BLACK}Adaptar na estação STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione qual o tipo de mercadoria para o qual auto-adaptar nesta ordem. Ctrl+Clique para remover ordem de adaptação. Auto-adaptação só será realizada se o veículo a aceitar STR_ORDER_DROP_REFIT_AUTO :Mercadoria fixa @@ -4689,7 +4689,7 @@ STR_ORDERS_SKIP_BUTTON :{BLACK}Saltar STR_ORDERS_SKIP_TOOLTIP :{BLACK}Saltar a ordem atual, e iniciar a próxima. Ctrl+Clique para saltar até à ordem selecionada STR_ORDERS_DELETE_BUTTON :{BLACK}Eliminar -STR_ORDERS_DELETE_TOOLTIP :{BLACK}Eliminar a ordem seleccionada +STR_ORDERS_DELETE_TOOLTIP :{BLACK}Eliminar a ordem selecionada STR_ORDERS_DELETE_ALL_TOOLTIP :{BLACK}Eliminar todas as ordens STR_ORDERS_STOP_SHARING_BUTTON :{BLACK}Parar de partilhar STR_ORDERS_STOP_SHARING_TOOLTIP :{BLACK}Parar a partilha de lista de ordens. Ctrl+Clique para também remover todas as ordens para este veículo @@ -4780,7 +4780,7 @@ STR_TIMETABLE_TITLE :{WHITE}{VEHICLE STR_TIMETABLE_ORDER_VIEW :{BLACK}Ordens STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Mudar para visualização de ordens -STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique numa ordem para a seleccionar. +STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique numa ordem para a selecionar. STR_TIMETABLE_NO_TRAVEL :Não viaja STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; calendarizadas por próxima ordem manual) @@ -4799,7 +4799,7 @@ STR_TIMETABLE_APPROX_TIME :{BLACK}Este hor STR_TIMETABLE_TOTAL_TIME :{BLACK}Este horário vai levar {STRING} a concluir STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Este horário vai levar pelo menos {STRING} a concluir (nem tudo está programado) -STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Este veículo está actualmente a andar a horas +STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Atualmente este veículo está pontual STR_TIMETABLE_STATUS_LATE :{BLACK}Este veículo está presentemente atrasado {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está presentemente adiantado {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou @@ -4843,10 +4843,10 @@ STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :P: {COLOUR}{COM # Date window (for timetable) STR_DATE_CAPTION :{WHITE}Marcar data STR_DATE_SET_DATE :{BLACK}Marcar data -STR_DATE_SET_DATE_TOOLTIP :{BLACK}Use a data seleccionada como ponto de partida do horário -STR_DATE_DAY_TOOLTIP :{BLACK}Seleccione um dia -STR_DATE_MONTH_TOOLTIP :{BLACK}Seleccione um mês -STR_DATE_YEAR_TOOLTIP :{BLACK}Seleccione um ano +STR_DATE_SET_DATE_TOOLTIP :{BLACK}Use a data selecionada como ponto de partida do horário +STR_DATE_DAY_TOOLTIP :{BLACK}Selecione um dia +STR_DATE_MONTH_TOOLTIP :{BLACK}Selecione um mês +STR_DATE_YEAR_TOOLTIP :{BLACK}Selecione um ano # AI debug window @@ -4886,9 +4886,9 @@ STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervalo entre o arranque dos competidores: {ORANGE}{COMMA} minuto{P "" s} STR_AI_CONFIG_MOVE_UP :{BLACK}Mover para cima -STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA seleccionada para cima +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA selecionada para cima STR_AI_CONFIG_MOVE_DOWN :{BLACK}Mover para baixo -STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA seleccionada para baixo +STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA selecionada para baixo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script de jogo STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros @@ -4904,14 +4904,14 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configur STR_AI_LIST_CAPTION :{WHITE}Disponível {STRING} STR_AI_LIST_CAPTION_AI :IAs STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de jogo -STR_AI_LIST_TOOLTIP :{BLACK}Clique para seleccionar um script +STR_AI_LIST_TOOLTIP :{BLACK}Clique para selecionar um script STR_AI_LIST_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING} STR_AI_LIST_VERSION :{LTBLUE}Versão: {ORANGE}{NUM} STR_AI_LIST_URL :{LTBLUE}URL: {ORANGE}{STRING} STR_AI_LIST_ACCEPT :{BLACK}Aceitar -STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Seleccionar script marcado +STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Selecionar o script realçado STR_SCREENSHOT_CAPTION :{WHITE}Tirar uma captura de ecrã STR_SCREENSHOT_SCREENSHOT :{BLACK}Captura de ecrã normal @@ -5106,9 +5106,9 @@ STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Altera o # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Não é possível construir estação ferroviária aqui... -STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Não é possível construir estação de autocarros... +STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Não é possível construir paragem de autocarros... STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Não é possível construir estação de carregamento de camiões... -STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Não é possível construir estação de passageiros para eléctricos... +STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Não é possível construir estação de passageiros para elétricos... STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Não é possível construir estação de carga para elétricos... STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Não é possível construir doca aqui... STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Não é possível construir aeroporto aqui... @@ -5134,15 +5134,15 @@ STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Não é STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}É preciso remover a estação primeiro STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover estação... -STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Impossível remover paragem de eléctricos de passageiros +STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Impossível remover paragem de elétricos de passageiros STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover estação de elétricos de mercadorias... STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Deverá remover a paragem rodoviária primeiro STR_ERROR_THERE_IS_NO_STATION :{WHITE}... não há nenhuma estação aqui STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Precisa de demolir a estação primeiro -STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Precisa de demolir a estação de autocarros primeiro +STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Precisa de demolir a paragem de autocarros primeiro STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Precisa de demolir a estação de carga primeiro -STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de eléctricos primeiro +STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de elétricos primeiro STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de elétricos primeiro STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Deverá demolir a doca primeiro STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Precisa de demolir o aeroporto primeiro @@ -5225,13 +5225,13 @@ STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Não é STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Deverá remover a estrada primeiro STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... estradas de sentido único não podem ter junções STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Não é possível construir estrada aqui... -STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Não é possível construir carris para eléctricos neste local... +STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Não é possível construir carris para elétricos neste local... STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Não é possível remover estrada daqui... -STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Não é possível remover carris para eléctricos deste local... +STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Não é possível remover carris para elétricos deste local... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... não há estrada -STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... não há carris para eléctricos +STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... não há carris para elétricos STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Não é possível converter aqui o tipo de estrada... -STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Não é possível converter aqui o tipo de carril para eléctricos... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Não é possível converter aqui o tipo de carril para elétricos... STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Estrada não adequada STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Linha de elétrico não adequada @@ -5399,7 +5399,7 @@ STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Não é STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}Não é possível modificar esta ordem... STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Impossível mover esta ordem... STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Impossível saltar esta ordem... -STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossível saltar ordem seleccionada... +STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossível saltar ordem selecionada... STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... veiculo não pode ir a todas as estações STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... veiculo não pode ir a essa estação STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... um veículo a partilhar esta ordem não pode ir a essa estação @@ -5415,7 +5415,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... o av # Extra messages which go on the third line of errors, explaining why orders failed STR_ERROR_NO_RAIL_STATION :{WHITE}Não existe estação ferroviária STR_ERROR_NO_BUS_STATION :{WHITE}Não existe paragem de autocarro -STR_ERROR_NO_TRUCK_STATION :{WHITE}Não existe estação de camiões +STR_ERROR_NO_TRUCK_STATION :{WHITE}Não existe terminal de carga para camiões STR_ERROR_NO_DOCK :{WHITE}Não existe doca STR_ERROR_NO_AIRPORT :{WHITE}Não existe aeroporto/heliporto STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Não existem paragens com tipo de estrada compatível @@ -5449,12 +5449,12 @@ STR_DESKTOP_SHORTCUT_COMMENT :Um jogo de simu STR_BASEGRAPHICS_DOS_DESCRIPTION :Gráficos originais da edição DOS de Transport Tycoon Deluxe. STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Gráficos originais da edição DOS (Alemã) de Transport Tycoon Deluxe. STR_BASEGRAPHICS_WIN_DESCRIPTION :Gráficos originais da edição Windows de Transport Tycoon Deluxe. -STR_BASESOUNDS_DOS_DESCRIPTION :Sons originais da edição DOS de Transport Tycoon Deluxe. -STR_BASESOUNDS_WIN_DESCRIPTION :Sons originais da edição Windows de Transport Tycoon Deluxe. +STR_BASESOUNDS_DOS_DESCRIPTION :Efeitos sonoros originais da edição DOS de Transport Tycoon Deluxe. +STR_BASESOUNDS_WIN_DESCRIPTION :Efeitos sonoros originais da edição Windows de Transport Tycoon Deluxe. STR_BASESOUNDS_NONE_DESCRIPTION :Um conjunto de sons vazio. STR_BASEMUSIC_WIN_DESCRIPTION :Música original da edição Windows de Transport Tycoon Deluxe. STR_BASEMUSIC_DOS_DESCRIPTION :Música original da edição DOS de Transport Tycoon Deluxe. -STR_BASEMUSIC_TTO_DESCRIPTION :Música original da edição DOS de Transport Tycoon (Original/Editor de Mundo) +STR_BASEMUSIC_TTO_DESCRIPTION :Música original da edição DOS de Transport Tycoon (Original) e Transport Tycoon: World Editor STR_BASEMUSIC_NONE_DESCRIPTION :Um conjunto de música vazio. ##id 0x2000 @@ -5590,7 +5590,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_WILLS_2_8_0_STEAM :Wills 2-8-0 (Va STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_CHANEY_JUBILEE_STEAM :Chaney 'Jubilee' (Vapor) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_GINZU_A4_STEAM :Ginzu 'A4' (Vapor) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_8P_STEAM :SH '8P' (Vapor) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :Unidade Múltipla Manley-Morel (Diesel) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MANLEY_MOREL_DMU_DIESEL :UMD Manley-Morel (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_DASH_DIESEL :'Dash' (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_HENDRY_25_DIESEL :SH/Hendry '25' (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_UU_37_DIESEL :UU '37' (Diesel) @@ -5602,10 +5602,10 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KELLING_3100_DIESEL :Kelling 3100 (D STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_TURNER_TURBO_DIESEL :Turner Turbo (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_1000_DIESEL :MJS 1000 (Diesel) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_125_DIESEL :SH '125' (Diesel) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_30_ELECTRIC :SH '30' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Elétrico) STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Carruagem de Passageiros STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagão de Carvão @@ -5633,8 +5633,8 @@ STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Vagão de Brinq STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagão de Baterias STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Vagão de Plástico -STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Carruagem de Passageiros STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Correio @@ -5663,10 +5663,10 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Vagão de Brinq STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Vagão de Baterias STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :Vagão de Plástico -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (Eléctrico) -STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Eléctrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV2_CYCLOPS_ELECTRIC :Lev2 'Cyclops' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' (Elétrico) +STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Carruagem de Passageiros STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Correio @@ -5859,8 +5859,8 @@ STR_FORMAT_BUOY_NAME :{G=f}Boia de {T STR_FORMAT_BUOY_NAME_SERIAL :{G=f}Boia de {TOWN} #{COMMA} ###length 2 -STR_FORMAT_WAYPOINT_NAME :{G=m}Ponto de controlo de {TOWN} -STR_FORMAT_WAYPOINT_NAME_SERIAL :{G=m}Ponto de controlo de {TOWN}#{COMMA} +STR_FORMAT_WAYPOINT_NAME :{G=m}Ponto de Controlo de {TOWN} +STR_FORMAT_WAYPOINT_NAME_SERIAL :{G=m}Ponto de Controlo de {TOWN} #{COMMA} ###length 6 STR_FORMAT_DEPOT_NAME_TRAIN :{G=m}Depósito Ferroviário de {TOWN} From eb09d1841880a92b393a8a0cdc112e98eedc0f9d Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 10 Sep 2025 04:36:50 +0000 Subject: [PATCH 028/280] Update: Translations from eints english (au): 1 change by krysclarke swedish: 1 change by robert-i chinese (traditional): 1 change by KogentaSan vietnamese: 1 change by KhoiCanDev greek: 1 change by gh658804 russian: 1 change by Ln-Wolf finnish: 1 change by hpiirai portuguese: 76 changes by jcteotonio portuguese (brazilian): 1 change by pasantoro polish: 4 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 1 + src/lang/english_AU.txt | 1 + src/lang/finnish.txt | 1 + src/lang/greek.txt | 1 + src/lang/polish.txt | 7 +- src/lang/portuguese.txt | 151 +++++++++++++++--------------- src/lang/russian.txt | 1 + src/lang/swedish.txt | 1 + src/lang/traditional_chinese.txt | 1 + src/lang/vietnamese.txt | 1 + 10 files changed, 88 insertions(+), 78 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index d13c513960..575278bd37 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -5265,6 +5265,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... pont STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Ponte é muito baixa para uma estação STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Ponte é muito baixa para uma parada rodoviária +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é muito baixa para a doca STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Ponte é muito baixa para uma boia STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle ferroviário STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle rodoviário diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 1a5f2caa9f..4b89c39bdc 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brid STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 61e718665d..ec7a5c9b20 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... silt STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Silta päättyisi kartan ulkopuolelle STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Silta on liian matala aseman ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Silta on liian matala pysäkin ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Silta on liian matala sataman ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Silta on liian matala poijun ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Silta on liian matala rautatien reittipisteen ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Silta on liian matala tien reittipisteen ylle diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 05f9143d14..cd47e7c7e8 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -5365,6 +5365,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... η STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Η γέφυρα θα καταλήξει εκτός χάρτη STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σταθμό STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Η γέφυρα είναι πολύ χαμηλή για οδική στάση +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Η γέφυρα είναι πολύ χαμηλή για αποβάθρα STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σημαδούρα STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σιδηροδρομικό σημείο αναφοράς STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για οδικό σημείο αναφοράς diff --git a/src/lang/polish.txt b/src/lang/polish.txt index af8c6e5836..809fa5bb69 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -5427,14 +5427,14 @@ STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}Lokalne STR_ERROR_BRIBE_FAILED :{WHITE}Twoja próba przekupstwa została wykryta przez miejscowych śledczych # Levelling errors -STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Nie można tutaj podnieść lądu... -STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Nie można tutaj obniżyć lądu... +STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Nie można tutaj podnieść terenu... +STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Nie można tutaj obniżyć terenu... STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}Nie można tutaj wyrównać terenu... STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}Wykop zniszczyłby tunel STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... już na poziomie morza STR_ERROR_TOO_HIGH :{WHITE}... zbyt wysoko STR_ERROR_ALREADY_LEVELLED :{WHITE}... już wyrównany -STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Potem most powyżej byłby zbyt wysoko. +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Most nad nim byłby zbyt wysoki. # Company related errors STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Nie można zmienić nazwy firmy... @@ -5650,6 +5650,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... za d STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Koniec mostu poza mapą STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Most jest zbyt niski dla stacji STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Most jest zbyt niski dla przystanku +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Most jest zbyt niski dla portu STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Most jest zbyt niski dla boi STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku kolejowego STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku drogowego diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 3e27e239ea..fabfeef87a 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -309,7 +309,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_SHIP_TOOLTIP :{BLACK}Ao ativa STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ao ativar este botão, os aviões ocultos também serão exibidos # Query window -STR_BUTTON_DEFAULT :{BLACK}Padrão +STR_BUTTON_DEFAULT :{BLACK}Predefinição STR_BUTTON_CANCEL :{BLACK}Cancelar STR_BUTTON_OK :{BLACK}Confirmar @@ -373,7 +373,7 @@ STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Lucro médio es STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Lucro médio neste período # Group by options for vehicle list -STR_GROUP_BY_NONE :Nenhuma +STR_GROUP_BY_NONE :Nenhum STR_GROUP_BY_SHARED_ORDERS :Ordens partilhadas # Order button in shared orders vehicle list @@ -508,14 +508,14 @@ STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY :Financiar nova STR_RAIL_MENU_RAILROAD_CONSTRUCTION :Construção de caminhos-de-ferro STR_RAIL_MENU_ELRAIL_CONSTRUCTION :Construção de caminhos-de-ferro eletrificados STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Construção de monocarris -STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construção de Maglev +STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construção de linhas maglev # Road construction menu -STR_ROAD_MENU_ROAD_CONSTRUCTION :Construção de estrada +STR_ROAD_MENU_ROAD_CONSTRUCTION :Construção de estradas STR_ROAD_MENU_TRAM_CONSTRUCTION :Construção de carris para elétricos # Waterways construction menu -STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construção de hidrovia +STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION :Construção de vias fluviais # Aairport construction menu STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION :Construção de aeroportos @@ -866,10 +866,10 @@ STR_NEWS_FIRST_SHIP_ARRIVAL :{BIG_FONT}{BLAC STR_NEWS_FIRST_AIRCRAFT_ARRIVAL :{BIG_FONT}{BLACK}Cidadãos celebram . . .{}Primeira aeronave chega {G a ao à aos às} {STATION}! STR_NEWS_TRAIN_CRASH :{BIG_FONT}{BLACK}Acidente de Comboios!{}{COMMA} pessoa{P "" s} morre{P u ram} na explosão após a colisão! -STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Acidente com Veículo Rodoviário!{}Condutor morre na explosão após a colisão com um comboio! -STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Acidente com Veículo Rodoviário{}{COMMA} pessoa{P "" s} morre{P u ram} na explosão após a colisão com um comboio! +STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER :{BIG_FONT}{BLACK}Acidente Rodoviário!{}Condutor morre na explosão após a colisão com comboio! +STR_NEWS_ROAD_VEHICLE_CRASH :{BIG_FONT}{BLACK}Acidente Rodoviário!{}{COMMA} pessoa{P "" s} morre{P u ram} na explosão após a colisão com comboio! STR_NEWS_AIRCRAFT_CRASH :{BIG_FONT}{BLACK}Acidente de Aeronave!{}{COMMA} pessoa{P "" s} morre{P u ram} na explosão em {STATION}! -STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Acidente de Aeronave!{}Avião ficou sem combustível, {COMMA} pessoa{P "" s} morre{P u ram} no incêndio! +STR_NEWS_PLANE_CRASH_OUT_OF_FUEL :{BIG_FONT}{BLACK}Acidente Aéreo!{}Aeronave ficou sem combustível, {COMMA} pessoa{P "" s} morre{P u ram} no incêndio! STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLACK}Acidente de Zepelim em {STATION}! STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}Veículo rodoviário destruído em colisão com OVNI! @@ -887,7 +887,7 @@ STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLAC STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} foi encerrada por credores e todos os ativos foram vendidos! STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Nova empresa de transportes! STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} inicia construção em {TOWN}! -STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} foi comprada por {STRING} por um valor não revelado! +STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} foi adquirida por {STRING} por um valor não declarado! STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Presidente) STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} subsidiou a construção da nova localidade de {TOWN}! @@ -939,9 +939,9 @@ STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque a ordem de adaptação falhou STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Renovação automática falhou para {VEHICLE}{}{STRING} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Novo modelo de {STRING} agora disponível! +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} agora disponíve{G 0 l l l is is}! STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Novo modelo de {STRING} agora disponível! - {ENGINE} +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} agora disponíve{G 0 l l l is is}! - {ENGINE} STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Abrir a janela de grupo focada no grupo do veículo @@ -960,8 +960,8 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLAC STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Tráfego caótico em {TOWN}!{}{}Iniciativa de reconstrução das estradas financiada por {STRING} provoca 6 meses de sofrimento aos motoristas! STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Tráfego caótico em {TOWN}!{}{}Iniciativa de reconstrução das estradas financiada por {STRING} provoca 6 minutos de sofrimento aos motoristas! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopólio dos Transportes! -STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}A autoridade local de {TOWN} assinou um contrato com {STRING} por 12 meses de direitos exclusivos de transporte! -STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}A autoridade local de {TOWN} assinou um contrato com {STRING} por 12 minutos de direitos exclusivos de transporte! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}A autoridade local de {TOWN} assinou um contrato com {STRING} por 12 meses de direitos de exclusividade de transporte! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}A autoridade local de {TOWN} assinou um contrato com {STRING} por 12 minutos de direitos de exclusividade de transporte! # Extra view window STR_EXTRA_VIEWPORT_TITLE :{WHITE}Visualizador {COMMA} @@ -1222,7 +1222,7 @@ STR_SUBSIDY_X4 :x4 STR_CLIMATE_TEMPERATE_LANDSCAPE :Terreno temperado STR_CLIMATE_SUB_ARCTIC_LANDSCAPE :Terreno subárctico STR_CLIMATE_SUB_TROPICAL_LANDSCAPE :Terreno subtropical -STR_CLIMATE_TOYLAND_LANDSCAPE :Terreno terra dos brinquedos +STR_CLIMATE_TOYLAND_LANDSCAPE :Terreno da terra dos brinquedos ###length 7 STR_TERRAIN_TYPE_VERY_FLAT :Muito Plano @@ -2753,7 +2753,7 @@ STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Comutar 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 +STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetos como invisíveis em vez de transparentes # Linkgraph legend window STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Legenda de Fluxo de Carga @@ -2795,10 +2795,10 @@ STR_JOIN_WAYPOINT_CREATE_SPLIT_WAYPOINT :{YELLOW}Constru STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Desativado pois não existem atualmente veículos disponíveis para esta infraestrutura # Rail construction toolbar -STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construção de caminhos-de-ferro -STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construção de caminhos-de-ferro eletrificados -STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construção de monocarris -STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construção de Maglev +STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Construção de Caminhos-de-ferro +STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construção de Caminhos-de-ferro Eletrificados +STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construção de Monocarris +STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construção de Linhas Maglev STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl+Clique para remover a linha férrea. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl+Clique para remover a via férrea. Pressione também Shift para apenas mostrar o custo estimado @@ -2895,7 +2895,7 @@ STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combinado (semáforo){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite a construção de ramificações complexas de pré-sinais. STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto (semáforo){}Permite que vários comboios passem simultaneamente um bloco de linha, desde que consigam reservar um caminho seguro sem prejudicar o veículo seguinte. Os sinais de trajeto padrão podem ser cruzados no sentido contrário. STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (semáforo){}Funciona de maneira similar a um sinal de trajeto, mas não pode ser cruzado no sentido contrário. -STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Normal(elétrico){}Este é o tipo mais básico de sinal. Permite apenas a passagem de um comboio de cada vez dentro da mesma divisão de linha. +STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Normal (elétrico){}Este é o tipo mais básico de sinal. Permite apenas a passagem de um comboio de cada vez dentro da mesma secção de linha. STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (elétrico){}Apresenta-se verde enquanto existir um ou mais sinais de saída verdes no seguimento da linha. De outro modo ficará vermelho. STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (elétrico){}Funciona da mesma forma que o sinal normal, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (elétrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais. @@ -2925,8 +2925,8 @@ STR_BRIDGE_TUBULAR_SILICON :Tubular, Silíc # Road construction toolbar -STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Construção de estradas -STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Construção de linha de elétrico +STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Construção de Estradas +STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Construção de Linhas de Elétrico STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construir secção de estrada. Ctrl+Clique para remover secção de estrada. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para elétricos. Ctrl+Clique para remover secção de carris de elétricos. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl+Clique para remover secção de estrada. Pressione também Shift para apenas mostrar o custo estimado @@ -2938,7 +2938,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir paragem de autocarros. Ctrl+Clique para selecionar outra estação para fazer a união. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir terminal de carga para camiões. Ctrl+Clique para selecionar outra estação para fazer a união. Pressione também Shift para apenas mostrar o custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir terminal de carga para elétricos. Ctrl+Clique para selecionar outra estação para fazer a união. Pressione também Shift para apenas mostrar o 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 rodoviária. Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para elétricos. Pressione também Shift para apenas mostrar o custo estimado @@ -2961,15 +2961,15 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecion # Road vehicle station construction window STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da paragem de autocarros STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da paragem de autocarros -STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga +STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação do terminal de carga para camiões STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do terminal de carga para camiões -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Elétricos de Passageiros -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de elétricos -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Elétricos -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de elétricos +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Paragem de Elétricos de Passageiros +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da paragem de elétricos de passageiros +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação do Terminal de Carga para Elétricos +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do terminal de carga para elétricos # Waterways toolbar (last two for SE only) -STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de hidrovia +STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Vias Fluviais STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Canais STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canais. Ctrl+Clique+Arrastar para selecionar a área diagonalmente. Pressione também Shift para apenas mostrar o custo estimado STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir eclusas. Pressione também Shift para apenas mostrar o custo estimado @@ -3727,8 +3727,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Renomear Locali # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}Autoridade local de {TOWN} -STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zona -STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Mostrar a zona dentro dos limites da autoridade local +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Região +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Mostrar a área da região onde é exercida a autoridade local STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Classificações de empresas de transporte: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Ações disponíveis: @@ -3743,7 +3743,7 @@ STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Iniciar uma cam STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Financiar a reconstrução das estradas locais STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Construir estátua do proprietário da empresa STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Financiar novos edifícios -STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar exclusividade da rede de transportes +STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Negociar exclusividade da rede de transportes STR_LOCAL_AUTHORITY_ACTION_BRIBE :Subornar a autoridade local ###next-name-looks-similar @@ -3754,9 +3754,9 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Financiar a reconstrução da rede urbana de estradas.{}Provoca uma perturbação considerável no tráfego rodoviário até 6 minutos.{}{POP_COLOUR}Custo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construir uma estátua em honra da sua empresa.{}Produz um aumento permanente na avaliação das estações nesta localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Financiar a construção de novos edifícios na localidade.{}Produz um aumento temporário do crescimento desta localidade.{}{POP_COLOUR}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Comprar os direitos exclusivos de transporte na localidade por 12 meses.{}A autoridade local não permitirá que passageiros e cargas usem as estações dos concorrentes. Um suborno bem sucedido feito por um concorrente irá cancelar este contrato.{}{POP_COLOUR}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Comprar os direitos exclusivos de transporte na localidade por 12 minutos.{}A autoridade local não permitirá que passageiros e cargas usem as estações dos concorrentes. Um suborno bem sucedido feito por um concorrente irá cancelar este contrato.{}{POP_COLOUR}Custo: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Subornar a autoridade local para aumentar a sua avaliação e anular o direito de transporte exclusivo da concorrência, correndo o risco de uma penalidade severa se for apanhado.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Negociar os direitos exclusivos de transporte na localidade por 12 meses.{}A autoridade local não permitirá que passageiros e cargas usem as estações da concorrência. Um suborno bem sucedido feito pela concorrência irá cancelar este contrato.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Negociar os direitos exclusivos de transporte na localidade por 12 minutos.{}A autoridade local não permitirá que passageiros e cargas usem as estações da concorrência. Um suborno bem sucedido feito pela concorrência irá cancelar este contrato.{}{POP_COLOUR}Custo: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborne a autoridade local para aumentar a sua avaliação e anular os direitos de exclusividade da concorrência, correndo o risco de uma penalização severa se for apanhado.{}{POP_COLOUR}Custo: {CURRENCY_LONG} # Goal window STR_GOALS_CAPTION :{WHITE}Objetivos de {COMPANY} @@ -3909,7 +3909,7 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não per STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização do ponto de controlo. Ctrl+Clique para abrir um novo visualizador na localização do ponto de controlo STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Mudar o nome do ponto de controlo -STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da boia. Ctrl+Clique para abrir um novo visualizador na localização da boia +STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização principal na localização da boia. Ctrl+Clique para abrir um novo visualizador na localização da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da boia STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controlo @@ -4147,14 +4147,14 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Novos Veículos STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Novos Veículos Monocarril STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Novos Veículos Maglev -STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos veículos rodoviários -STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novos elétricos +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Veículos Rodoviários +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novos Elétricos # Vehicle availability ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Novos Veículos Ferroviários -STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novos veículos rodoviários -STR_BUY_VEHICLE_SHIP_CAPTION :Novos navios +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novos Veículos Rodoviários +STR_BUY_VEHICLE_SHIP_CAPTION :Novos Navios STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nova aeronave STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT} @@ -4197,10 +4197,10 @@ STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de seleção de aeronaves. Clique numa aeronave para informações. Ctrl+Clique para mostrar/ocultar este tipo de aeronave ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Comprar veículo -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar veículo -STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar navio -STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar aeronave +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Comprar Veículo +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Comprar Veículo +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar Navio +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar Aeronave ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reconverter veiculo @@ -4344,18 +4344,18 @@ STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Está p # Engine preview window STR_ENGINE_PREVIEW_CAPTION :{WHITE}Mensagem de um fabricante de veículos -STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Projectámos um novo modelo de {STRING} - gostaria de ter um ano de exclusividade de uso deste veículo, de modo a que possamos avaliar o seu desempenho antes de o disponibilizar globalmente? +STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Desenvolvemos u{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} - estaria interessado num ano de exclusividade de uso deste{G 0 "" "" "" s s} veículo{G 0 "" "" "" s s}, de modo a que possamos avaliar o {G 0 "seu " "seu " "seu " "" ""}desempenho antes de o{G 0 "" "" "" s s} disponibilizar globalmente? -STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :locomotiva ferroviária -STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :locomotiva de caminhos-de-ferro electrificados -STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :locomotiva monocarril -STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotiva maglev +STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=f}locomotiva ferroviária +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :{G=f}locomotiva elétrica ferroviária +STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}locomotiva monocarril +STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotiva maglev -STR_ENGINE_PREVIEW_ROAD_VEHICLE :veículo rodoviário -STR_ENGINE_PREVIEW_TRAM_VEHICLE :elétrico +STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=m}veículo rodoviário +STR_ENGINE_PREVIEW_TRAM_VEHICLE :{G=m}elétrico -STR_ENGINE_PREVIEW_AIRCRAFT :aeronave -STR_ENGINE_PREVIEW_SHIP :navio +STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave +STR_ENGINE_PREVIEW_SHIP :{G=m}navio STR_ENGINE_PREVIEW_COST_WEIGHT :Custo: {CURRENCY_LONG} Peso: {WEIGHT_SHORT} STR_ENGINE_PREVIEW_COST_MAX_SPEED :Custo: {CURRENCY_LONG} Velocidade Máx.: {VELOCITY} @@ -4824,7 +4824,7 @@ STR_TIMETABLE_CHANGE_SPEED_QUERY :Alterar limite STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique para limpar a velocidade para todas as ordens. -STR_TIMETABLE_RESET_LATENESS :{BLACK}Apagar Contador Atraso +STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar Contador de Atrasos STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar o contador de atraso, para que o veículo esteja pontual. Ctrl+Clique para reiniciar o grupo todo, para que o último veículo esteja pontual e todos os outros estejam adiantados. STR_TIMETABLE_AUTOFILL :{BLACK}Preencher automaticamente @@ -4916,7 +4916,7 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}Selecion STR_SCREENSHOT_CAPTION :{WHITE}Tirar uma captura de ecrã STR_SCREENSHOT_SCREENSHOT :{BLACK}Captura de ecrã normal STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Ampliação máxima -STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Ampliação padrão +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Captura de ecrã com ampliação predefinida STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Mapa completo STR_SCREENSHOT_HEIGHTMAP_SCREENSHOT :{BLACK}Mapa de alturas STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Captura de ecrã do minimapa @@ -5107,9 +5107,9 @@ STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Altera o # Station construction related errors STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Não é possível construir estação ferroviária aqui... STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Não é possível construir paragem de autocarros... -STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Não é possível construir estação de carregamento de camiões... +STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Não é possível construir terminal de carga para camiões... STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Não é possível construir estação de passageiros para elétricos... -STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Não é possível construir estação de carga para elétricos... +STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Não é possível construir terminal de carga para elétricos... STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Não é possível construir doca aqui... STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Não é possível construir aeroporto aqui... @@ -5135,15 +5135,15 @@ STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}É preci STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover estação... STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Impossível remover paragem de elétricos de passageiros -STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover estação de elétricos de mercadorias... +STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover terminal de elétricos de mercadorias... STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Deverá remover a paragem rodoviária primeiro STR_ERROR_THERE_IS_NO_STATION :{WHITE}... não há nenhuma estação aqui STR_ERROR_MUST_DEMOLISH_RAILROAD :{WHITE}Precisa de demolir a estação primeiro STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Precisa de demolir a paragem de autocarros primeiro -STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Precisa de demolir a estação de carga primeiro -STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de elétricos primeiro -STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Precisa demolir estação de elétricos primeiro +STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Precisa de demolir o terminal de carga para camiões primeiro +STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Precisa demolir paragem de elétricos de passageiros primeiro +STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Precisa demolir terminal de carga para elétricos primeiro STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Deverá demolir a doca primeiro STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Precisa de demolir o aeroporto primeiro @@ -5258,13 +5258,14 @@ STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Deverá STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Não é possível iniciar e finalizar no mesmo ponto STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Extremos da ponte não estão ao mesmo nível STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Ponte muito baixa para o terreno -STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}Ponte é demasiado alta para este terreno. +STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}A ponte é demasiado alta para este terreno. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início e fim devem estar alinhados STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos os extremos da ponte devem estar em terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para uma estação STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para uma paragem rodoviária +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é demasiado baixa para a doca STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para uma boia STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para um ponto de controlo ferroviário STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para um ponto de controlo rodoviário @@ -5272,14 +5273,14 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... STR_ERROR_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}O sítio não é adequado para a entrada do túnel -STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Deverá demolir o túnel primeiro +STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Precisa de demolir o túnel primeiro STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Há outro túnel no caminho STR_ERROR_TUNNEL_THROUGH_MAP_BORDER :{WHITE}O túnel terminaria fora do mapa STR_ERROR_UNABLE_TO_EXCAVATE_LAND :{WHITE}Não é possível escavar o terreno para o outro lado do túnel STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... túnel demasiado longo # Object related errors -STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... demasiados objectos +STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... demasiados objetos STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Não é possível construir objecto... STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objecto no caminho STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sede de empresa no caminho @@ -5454,7 +5455,7 @@ STR_BASESOUNDS_WIN_DESCRIPTION :Efeitos sonoros STR_BASESOUNDS_NONE_DESCRIPTION :Um conjunto de sons vazio. STR_BASEMUSIC_WIN_DESCRIPTION :Música original da edição Windows de Transport Tycoon Deluxe. STR_BASEMUSIC_DOS_DESCRIPTION :Música original da edição DOS de Transport Tycoon Deluxe. -STR_BASEMUSIC_TTO_DESCRIPTION :Música original da edição DOS de Transport Tycoon (Original) e Transport Tycoon: World Editor +STR_BASEMUSIC_TTO_DESCRIPTION :Música original das edições DOS de Transport Tycoon (Original) e de Transport Tycoon: World Editor STR_BASEMUSIC_NONE_DESCRIPTION :Um conjunto de música vazio. ##id 0x2000 @@ -5787,17 +5788,17 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BUBBLE_TRUCK :Camião de Bolh STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BUBBLE_TRUCK :Camião de Bolhas Wizzowow ###length 11 -STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Navio petroleiro MPS -STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Navio petroleiro CS-Inc. -STR_VEHICLE_NAME_SHIP_MPS_PASSENGER_FERRY :Navio de passageiros MPS -STR_VEHICLE_NAME_SHIP_FFP_PASSENGER_FERRY :Navio de passageiros FFP +STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Navio Petroleiro MPS +STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Navio Petroleiro CS-Inc. +STR_VEHICLE_NAME_SHIP_MPS_PASSENGER_FERRY :Navio de Passageiros MPS +STR_VEHICLE_NAME_SHIP_FFP_PASSENGER_FERRY :Navio de Passageiros FFP STR_VEHICLE_NAME_SHIP_BAKEWELL_300_HOVERCRAFT :Hidroflutuador Bakewell 300 -STR_VEHICLE_NAME_SHIP_CHUGGER_CHUG_PASSENGER :Navio de passageiros Chugger-Chug -STR_VEHICLE_NAME_SHIP_SHIVERSHAKE_PASSENGER_FERRY :Navio de passageiros Shivershake -STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Navio cargueiro Yate -STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Navio cargueiro Bakewell -STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Navio cargueiro MightyMover -STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Navio cargueiro Powernaut +STR_VEHICLE_NAME_SHIP_CHUGGER_CHUG_PASSENGER :Navio de Passageiros Chugger-Chug +STR_VEHICLE_NAME_SHIP_SHIVERSHAKE_PASSENGER_FERRY :Navio de Passageiros Shivershake +STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Navio Cargueiro Yate +STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Navio Cargueiro Bakewell +STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Navio Cargueiro MightyMover +STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Navio Cargueiro Powernaut ###length 41 STR_VEHICLE_NAME_AIRCRAFT_SAMPSON_U52 :Sampson U52 diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 63dbadd6f8..2d0e505fc2 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -5451,6 +5451,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... мо STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Мост выходит за пределы карты STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Высота моста недостаточна для строительства станции STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Высота моста недостаточна для строительства остановки +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Высота моста недостаточна для строительства пристани STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Высота моста недостаточна для установки буя STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 200775d49a..2c6970bc7f 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... för STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bron slutar utanför kartans gränser STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bro för låg för station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bro för låg för depå +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bron är för låg för en kaj STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bro för låg för boj STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bro för låg för järnvägsriktmärke STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bro för låg för vägriktmärke diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index c0ae38f14a..170d5abcd6 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}…… STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}橋的終點將會在地圖外 STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}橋樑過低,無法興建車站 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}橋樑過低,無法興建車站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}橋樑過低,無法興建碼頭 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}橋樑過低,無法放置浮標 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index b9a9bdfb91..7df1dfc6b8 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... cầ STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Cầu có thể vượt quá phạm vi bản đồ STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Cầu quá thấp cho ga STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Cầu quá thấp cho điểm dừng chân +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Cầu quá thấp để xây dựng cảng STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Cầu quá thấp cho phao STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường ray STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường From e10200efa456bc7691e13ca9b72dd02ee11034c1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Sep 2025 18:41:56 +0100 Subject: [PATCH 029/280] Change: Allow bridges over locks. (#14595) The bridge must be at least 2 levels higher than the lock. --- src/lang/english.txt | 1 + src/saveload/saveload.h | 1 + src/table/water_land.h | 55 +++++++++++++++++++++++------------------ src/water_cmd.cpp | 31 ++++++++++++++++++++--- src/water_map.h | 6 +++-- 5 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index e6c6a3d291..dcd008c392 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge i STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 2dfb49dc32..85cf3cf7ca 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -410,6 +410,7 @@ enum SaveLoadVersion : uint16_t { SLV_STATIONS_UNDER_BRIDGES, ///< 359 PR#14477 Allow stations under bridges. SLV_DOCKS_UNDER_BRIDGES, ///< 360 PR#14594 Allow docks under bridges. + SLV_LOCKS_UNDER_BRIDGES, ///< 361 PR#14595 Allow locks under bridges. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/table/water_land.h b/src/table/water_land.h index 9bb843b3a1..2c32b972c6 100644 --- a/src/table/water_land.h +++ b/src/table/water_land.h @@ -55,64 +55,71 @@ static const DrawTileSpriteSpan _shipdepot_display_data[][DEPOT_PART_END] = { }, }; +static constexpr uint8_t LOCK_HEIGHT_LOWER_REAR = 6; ///< Sub-tile height of rear wall of lower part. +static constexpr uint8_t LOCK_HEIGHT_LOWER_FRONT = 10; ///< Sub-tile height of front wall of lower part. +static constexpr uint8_t LOCK_HEIGHT_MIDDLE_REAR = 6; ///< Sub-tile height of rear wall of middle part. +static constexpr uint8_t LOCK_HEIGHT_MIDDLE_FRONT = 10; ///< Sub-tile height of front wall of middle part. +static constexpr uint8_t LOCK_HEIGHT_UPPER_REAR = 6; ///< Sub-tile height of rear wall of upper part. +static constexpr uint8_t LOCK_HEIGHT_UPPER_FRONT = 6; ///< Sub-tile height of front wall of upper part. + static const DrawTileSeqStruct _lock_display_middle_ne_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 0 + 1) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 4 + 1) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_MIDDLE_REAR, 0 + 1) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_MIDDLE_FRONT, 4 + 1) }; static const DrawTileSeqStruct _lock_display_middle_se_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 0) - TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 4) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_MIDDLE_REAR, 0) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_MIDDLE_FRONT, 4) }; static const DrawTileSeqStruct _lock_display_middle_sw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 0 + 2) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 4 + 2) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_MIDDLE_REAR, 0 + 2) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_MIDDLE_FRONT, 4 + 2) }; static const DrawTileSeqStruct _lock_display_middle_nw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 0 + 3) - TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 4 + 3) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_MIDDLE_REAR, 0 + 3) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_MIDDLE_FRONT, 4 + 3) }; static const DrawTileSeqStruct _lock_display_lower_ne_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 8 + 1) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 12 + 1) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_LOWER_REAR, 8 + 1) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_LOWER_FRONT, 12 + 1) }; static const DrawTileSeqStruct _lock_display_lower_se_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x1, 0x10, 0x14, 8) - TILE_SEQ_LINE( 0xF, 0, 0, 0x1, 0x10, 0x14, 12) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_LOWER_REAR, 8) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_LOWER_FRONT, 12) }; static const DrawTileSeqStruct _lock_display_lower_sw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 8 + 2) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 12 + 2) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_LOWER_REAR, 8 + 2) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_LOWER_FRONT, 12 + 2) }; static const DrawTileSeqStruct _lock_display_lower_nw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 8 + 3) - TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 12 + 3) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_LOWER_REAR, 8 + 3) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_LOWER_FRONT, 12 + 3) }; static const DrawTileSeqStruct _lock_display_upper_ne_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 16 + 1) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 20 + 1) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_UPPER_REAR, 16 + 1) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_UPPER_FRONT, 20 + 1) }; static const DrawTileSeqStruct _lock_display_upper_se_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x1, 0x10, 0x14, 16) - TILE_SEQ_LINE( 0xF, 0, 0, 0x1, 0x10, 0x14, 20) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_UPPER_REAR, 16) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_UPPER_FRONT, 20) }; static const DrawTileSeqStruct _lock_display_upper_sw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 0x10, 1, 0x14, 16 + 2) - TILE_SEQ_LINE( 0, 0xF, 0, 0x10, 1, 0x14, 20 + 2) + TILE_SEQ_LINE(0, 0, 0, TILE_SIZE, 1, LOCK_HEIGHT_UPPER_REAR, 16 + 2) + TILE_SEQ_LINE(0, 15, 0, TILE_SIZE, 1, LOCK_HEIGHT_UPPER_FRONT, 20 + 2) }; static const DrawTileSeqStruct _lock_display_upper_nw_seq[] = { - TILE_SEQ_LINE( 0, 0, 0, 1, 0x10, 0x14, 16 + 3) - TILE_SEQ_LINE( 0xF, 0, 0, 1, 0x10, 0x14, 20 + 3) + TILE_SEQ_LINE( 0, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_UPPER_REAR, 16 + 3) + TILE_SEQ_LINE(15, 0, 0, 1, TILE_SIZE, LOCK_HEIGHT_UPPER_FRONT, 20 + 3) }; static const DrawTileSpriteSpan _lock_display_data[][DIAGDIR_END] = { diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 47cdcf9b08..39a06374e1 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -301,6 +301,21 @@ static CommandCost RemoveShipDepot(TileIndex tile, DoCommandFlags flags) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_CLEAR_DEPOT_SHIP]); } +/** + * Get the minimal height required for a bridge above a lock part. + * @param lock_part the lock part. + * @return the minimal bridge height. + */ +static uint8_t GetLockPartMinimalBridgeHeight(LockPart lock_part) +{ + static constexpr uint8_t MINIMAL_BRIDGE_HEIGHT[LOCK_PART_END] = { + 2, // LOCK_PART_MIDDLE + 3, // LOCK_PART_LOWER + 2, // LOCK_PART_UPPER + }; + return MINIMAL_BRIDGE_HEIGHT[to_underlying(lock_part)]; +} + /** * Builds a lock. * @param tile Central tile of the lock. @@ -348,8 +363,11 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlags } WaterClass wc_upper = IsWaterTile(tile + delta) ? GetWaterClass(tile + delta) : WATER_CLASS_CANAL; - if (IsBridgeAbove(tile) || IsBridgeAbove(tile - delta) || IsBridgeAbove(tile + delta)) { - return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); + for (LockPart lock_part = LOCK_PART_MIDDLE; TileIndex t : {tile, tile - delta, tile + delta}) { + if (IsBridgeAbove(t) && GetBridgeHeight(GetSouthernBridgeEnd(t)) < GetTileMaxZ(t) + GetLockPartMinimalBridgeHeight(lock_part)) { + return CommandCost(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK); + } + ++lock_part; } if (flags.Test(DoCommandFlag::Execute)) { @@ -939,6 +957,9 @@ static void DrawTile_Water(TileInfo *ti) case WATER_TILE_LOCK: DrawWaterLock(ti); + DrawBridgeMiddle(ti, DiagDirToAxis(GetLockDirection(ti->tile)) == AXIS_X + ? BridgePillarFlags{BridgePillarFlag::EdgeNE, BridgePillarFlag::EdgeSW} + : BridgePillarFlags{BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}); break; case WATER_TILE_DEPOT: @@ -1412,9 +1433,13 @@ static CommandCost TerraformTile_Water(TileIndex tile, DoCommandFlags flags, int return Command::Do(flags, tile); } -static CommandCost CheckBuildAbove_Water(TileIndex tile, DoCommandFlags flags, Axis, int) +static CommandCost CheckBuildAbove_Water(TileIndex tile, DoCommandFlags flags, Axis, int height) { if (IsWater(tile) || IsCoast(tile)) return CommandCost(); + if (IsLock(tile)) { + if (GetTileMaxZ(tile) + GetLockPartMinimalBridgeHeight(GetLockPart(tile)) <= height) return CommandCost(); + return CommandCost(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK); + } return Command::Do(flags, tile); } diff --git a/src/water_map.h b/src/water_map.h index b3a7a335f3..2c424d44b1 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -66,7 +66,9 @@ enum LockPart : uint8_t { LOCK_PART_MIDDLE = 0, ///< Middle part of a lock. LOCK_PART_LOWER = 1, ///< Lower part of a lock. LOCK_PART_UPPER = 2, ///< Upper part of a lock. + LOCK_PART_END, }; +DECLARE_INCREMENT_DECREMENT_OPERATORS(LockPart); bool IsPossibleDockingTile(Tile t); @@ -323,10 +325,10 @@ inline DiagDirection GetLockDirection(Tile t) * @return The part. * @pre IsTileType(t, MP_WATER) && IsLock(t) */ -inline uint8_t GetLockPart(Tile t) +inline LockPart GetLockPart(Tile t) { assert(IsLock(t)); - return GB(t.m5(), WBL_LOCK_PART_BEGIN, WBL_LOCK_PART_COUNT); + return static_cast(GB(t.m5(), WBL_LOCK_PART_BEGIN, WBL_LOCK_PART_COUNT)); } /** From fe9093df96003c30ced6a89948b979dda2502414 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 11 Sep 2025 04:37:58 +0000 Subject: [PATCH 030/280] Update: Translations from eints english (us): 1 change by 2TallTyler korean: 1 change by telk5093 hungarian: 1 change by vargaviktor danish: 2 changes by New-Authentication dutch: 1 change by nicobresseleers portuguese: 12 changes by jcteotonio --- src/lang/danish.txt | 3 ++- src/lang/dutch.txt | 1 + src/lang/english_US.txt | 1 + src/lang/hungarian.txt | 1 + src/lang/korean.txt | 1 + src/lang/portuguese.txt | 24 ++++++++++++------------ 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/lang/danish.txt b/src/lang/danish.txt index a66c7331fa..96bc87d1f6 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3649,7 +3649,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Det ænd STR_BROKEN_VEHICLE_LENGTH :{WHITE}Toget '{VEHICLE}' fra selskabet '{COMPANY}' har ugyldig længde. Det skyldes sandsynligvis at problem med en NewGRF. Risiko for at spillet mister synkronisering eller går ned. STR_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' indeholder forkert information -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{1:ENGINE}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Fragt-/tilpasningsinformation for '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' afviger fra indkøbslisten efter konstruktion. Dette kan medføre, at autofornyelse ikke fungerer korrekt. STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' forårsagede en uendelig løkke i produktions-callback'en STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} returnerede ukendt/ugyldigt resultat {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' returnerede ugyldig godstype i produktion-callback ved {2:HEX} @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... broe STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Broen ville slutte udenfor kortet STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Broen er for lav til en station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Broen er for lav til et vej stoppested +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er for lav til havnen STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er for lav til en bøje STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 289cb7d249..6e6a14ad45 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brug STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Brug zou eindigen buiten de kaart STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Brug te laag voor station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Brug te laag voor halte +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}De brug is te laag voor haven STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Brug te laag voor boei STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Brug te laag voor spoorroutepunt STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Brug te laag voor wegroutepunt diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index f802ead397..96f899e5e7 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -5264,6 +5264,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brid STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index bad6198650..69da512597 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -5328,6 +5328,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... a h STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A híd a térképen túl végződne STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A híd túl alacsony az állomáshoz STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A híd túl alacsony a megállóhoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A híd túl alacsony a kikötőhöz STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A híd túl alacsony a bójához STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A híd túl alacsony a vasúti ellenőrzőponthoz STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}BA híd túl alacsony az útponthoz diff --git a/src/lang/korean.txt b/src/lang/korean.txt index e8c02bd942..943a35c782 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -5265,6 +5265,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... 다 STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}다리 끝이 지도 밖을 넘어갑니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}다리 밑에 역을 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}다리 밑에 도로 정류장을 두기에는 다리 높이가 너무 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}다리 밑에 부표를 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}다리 밑에 철도 경유지를 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}다리 밑에 도로 경유지를 두기에는 다리 높이가 너무 낮습니다 diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index fabfeef87a..d6304ead95 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -802,8 +802,8 @@ STR_SMALLMAP_LEGENDA_AIRCRAFT :{TINY_FONT}{BLA STR_SMALLMAP_LEGENDA_TRANSPORT_ROUTES :{TINY_FONT}{BLACK}Rotas de Transporte STR_SMALLMAP_LEGENDA_FOREST :{TINY_FONT}{BLACK}Floresta STR_SMALLMAP_LEGENDA_RAILROAD_STATION :{TINY_FONT}{BLACK}Estação Ferroviária -STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Terminal de Carga para Camiões -STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Paragem de Autocarros +STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}Terminal de Carga para Camiões/Elétricos +STR_SMALLMAP_LEGENDA_BUS_STATION :{TINY_FONT}{BLACK}Paragem de Autocarros/Elétricos de Passageiros STR_SMALLMAP_LEGENDA_AIRPORT_HELIPORT :{TINY_FONT}{BLACK}Aeroporto/Heliporto STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLACK}Doca STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Terreno Irregular @@ -827,7 +827,7 @@ STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STR STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY} STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN} STR_SMALLMAP_DISABLE_ALL :{BLACK}Nenhum -STR_SMALLMAP_ENABLE_ALL :{BLACK}Tudo +STR_SMALLMAP_ENABLE_ALL :{BLACK}Todos STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altura STR_SMALLMAP_SHOW_INDUSTRY_NAMES :{BLACK}Mostrar nomes das indústrias STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não mostrar indústrias no mapa @@ -939,9 +939,9 @@ STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque a ordem de adaptação falhou STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Renovação automática falhou para {VEHICLE}{}{STRING} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} agora disponíve{G 0 l l l is is}! +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} disponíve{G 0 l l l is is}! STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLACK}{ENGINE} -STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} agora disponíve{G 0 l l l is is}! - {ENGINE} +STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}U{G 0 m m ma ns mas} nov{G 0 "o modelo de" o a os as} {STRING} est{G 0 á á á am am} disponíve{G 0 l l l is is}! - {ENGINE} STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}Abrir a janela de grupo focada no grupo do veículo @@ -5004,7 +5004,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Só foi # Screenshot related messages STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Captura de ecrã enorme -STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}A captura vai ter uma resolução de {COMMA} x {COMMA} pixeis. Pode demorar um bocado para realizar a captura. Deseja continuar? +STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}A captura vai ter uma resolução de {COMMA} x {COMMA} pixeis. Pode demorar algum tempo para realizar a captura. Deseja continuar? STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}Mapa de alturas guardado com sucesso como '{STRING}'. O pico mais alto é {NUM} STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Captura de ecrã gravada para o disco como '{STRING}' com sucesso @@ -5257,18 +5257,18 @@ STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Não é STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Deverá demolir a ponte primeiro STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Não é possível iniciar e finalizar no mesmo ponto STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Extremos da ponte não estão ao mesmo nível -STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Ponte muito baixa para o terreno +STR_ERROR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}A ponte é demasiado baixa para o terreno. STR_ERROR_BRIDGE_TOO_HIGH_FOR_TERRAIN :{WHITE}A ponte é demasiado alta para este terreno. STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início e fim devem estar alinhados STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos os extremos da ponte devem estar em terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para uma estação -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para uma paragem rodoviária +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para a estação +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para a paragem rodoviária STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é demasiado baixa para a doca -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para uma boia -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para um ponto de controlo ferroviário -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para um ponto de controlo rodoviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para a boia +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo ferroviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo rodoviário # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... From d095526406f68190c02d1649c6336cec66ceb488 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 11 Sep 2025 12:31:34 +0100 Subject: [PATCH 031/280] Codechange: Range-check rail/road/tram maps by size instead of constant. (#14602) * Compare against the size of the array instead of the constant used to define the array. * `type_map` alias now uses auto to avoid defining the type each time. * `_cur_gps.grffile->railtype_map` is now aliased to `type_map` to simplify and standardise. --- src/newgrf/newgrf_act0_railtypes.cpp | 18 ++++++++++-------- src/newgrf/newgrf_act0_roadtypes.cpp | 12 ++++++------ src/newgrf/newgrf_act3.cpp | 7 ++++--- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/newgrf/newgrf_act0_railtypes.cpp b/src/newgrf/newgrf_act0_railtypes.cpp index 9db6f6c7b5..0ab9fdbb9e 100644 --- a/src/newgrf/newgrf_act0_railtypes.cpp +++ b/src/newgrf/newgrf_act0_railtypes.cpp @@ -29,14 +29,15 @@ static ChangeInfoResult RailTypeChangeInfo(uint first, uint last, int prop, Byte ChangeInfoResult ret = CIR_SUCCESS; extern RailTypeInfo _railtypes[RAILTYPE_END]; + const auto &type_map = _cur_gps.grffile->railtype_map; - if (last > RAILTYPE_END) { - GrfMsg(1, "RailTypeChangeInfo: Rail type {} is invalid, max {}, ignoring", last, RAILTYPE_END); + if (last > std::size(type_map)) { + GrfMsg(1, "RailTypeChangeInfo: Rail type {} is invalid, max {}, ignoring", last, std::size(type_map)); return CIR_INVALID_ID; } for (uint id = first; id < last; ++id) { - RailType rt = _cur_gps.grffile->railtype_map[id]; + RailType rt = type_map[id]; if (rt == INVALID_RAILTYPE) return CIR_INVALID_ID; RailTypeInfo *rti = &_railtypes[rt]; @@ -163,9 +164,10 @@ static ChangeInfoResult RailTypeReserveInfo(uint first, uint last, int prop, Byt ChangeInfoResult ret = CIR_SUCCESS; extern RailTypeInfo _railtypes[RAILTYPE_END]; + auto &type_map = _cur_gps.grffile->railtype_map; - if (last > RAILTYPE_END) { - GrfMsg(1, "RailTypeReserveInfo: Rail type {} is invalid, max {}, ignoring", last, RAILTYPE_END); + if (last > std::size(type_map)) { + GrfMsg(1, "RailTypeReserveInfo: Rail type {} is invalid, max {}, ignoring", last, std::size(type_map)); return CIR_INVALID_ID; } @@ -182,7 +184,7 @@ static ChangeInfoResult RailTypeReserveInfo(uint first, uint last, int prop, Byt rt = AllocateRailType(rtl); } - _cur_gps.grffile->railtype_map[id] = rt; + type_map[id] = rt; break; } @@ -199,10 +201,10 @@ static ChangeInfoResult RailTypeReserveInfo(uint first, uint last, int prop, Byt break; case 0x1D: // Alternate rail type label list - if (_cur_gps.grffile->railtype_map[id] != INVALID_RAILTYPE) { + if (type_map[id] != INVALID_RAILTYPE) { int n = buf.ReadByte(); for (int j = 0; j != n; j++) { - _railtypes[_cur_gps.grffile->railtype_map[id]].alternate_labels.push_back(std::byteswap(buf.ReadDWord())); + _railtypes[type_map[id]].alternate_labels.push_back(std::byteswap(buf.ReadDWord())); } break; } diff --git a/src/newgrf/newgrf_act0_roadtypes.cpp b/src/newgrf/newgrf_act0_roadtypes.cpp index d655c99b7e..2eff6b05fd 100644 --- a/src/newgrf/newgrf_act0_roadtypes.cpp +++ b/src/newgrf/newgrf_act0_roadtypes.cpp @@ -30,10 +30,10 @@ static ChangeInfoResult RoadTypeChangeInfo(uint first, uint last, int prop, Byte ChangeInfoResult ret = CIR_SUCCESS; extern RoadTypeInfo _roadtypes[ROADTYPE_END]; - std::array &type_map = (rtt == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; + const auto &type_map = (rtt == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; - if (last > ROADTYPE_END) { - GrfMsg(1, "RoadTypeChangeInfo: Road type {} is invalid, max {}, ignoring", last, ROADTYPE_END); + if (last > std::size(type_map)) { + GrfMsg(1, "RoadTypeChangeInfo: Road type {} is invalid, max {}, ignoring", last, std::size(type_map)); return CIR_INVALID_ID; } @@ -151,10 +151,10 @@ static ChangeInfoResult RoadTypeReserveInfo(uint first, uint last, int prop, Byt ChangeInfoResult ret = CIR_SUCCESS; extern RoadTypeInfo _roadtypes[ROADTYPE_END]; - std::array &type_map = (rtt == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; + auto &type_map = (rtt == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; - if (last > ROADTYPE_END) { - GrfMsg(1, "RoadTypeReserveInfo: Road type {} is invalid, max {}, ignoring", last, ROADTYPE_END); + if (last > std::size(type_map)) { + GrfMsg(1, "RoadTypeReserveInfo: Road type {} is invalid, max {}, ignoring", last, std::size(type_map)); return CIR_INVALID_ID; } diff --git a/src/newgrf/newgrf_act3.cpp b/src/newgrf/newgrf_act3.cpp index 2f060c1fca..3ec90c87b7 100644 --- a/src/newgrf/newgrf_act3.cpp +++ b/src/newgrf/newgrf_act3.cpp @@ -268,7 +268,8 @@ struct RailTypeMapSpriteGroupHandler : MapSpriteGroupHandler { { if (cid >= RTSG_END) return; - RailType railtype = local_id < RAILTYPE_END ? _cur_gps.grffile->railtype_map[local_id] : INVALID_RAILTYPE; + const auto &type_map = _cur_gps.grffile->railtype_map; + RailType railtype = local_id < std::size(type_map) ? type_map[local_id] : INVALID_RAILTYPE; if (railtype == INVALID_RAILTYPE) return; extern RailTypeInfo _railtypes[RAILTYPE_END]; @@ -286,8 +287,8 @@ struct RoadTypeMapSpriteGroupHandler : MapSpriteGroupHandler { { if (cid >= ROTSG_END) return; - std::array &type_map = (TRoadTramType == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; - RoadType roadtype = local_id < ROADTYPE_END ? type_map[local_id] : INVALID_ROADTYPE; + const auto &type_map = (TRoadTramType == RTT_TRAM) ? _cur_gps.grffile->tramtype_map : _cur_gps.grffile->roadtype_map; + RoadType roadtype = local_id < std::size(type_map) ? type_map[local_id] : INVALID_ROADTYPE; if (roadtype == INVALID_ROADTYPE) return; extern RoadTypeInfo _roadtypes[ROADTYPE_END]; From 331799797601b888c79b01f7cf7fd54b2994773b Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 12 Sep 2025 04:43:48 +0000 Subject: [PATCH 032/280] Update: Translations from eints english (au): 1 change by krysclarke swedish: 1 change by robert-i chinese (traditional): 1 change by KogentaSan chinese (simplified): 2 changes by WenSimEHRP korean: 1 change by telk5093 greek: 1 change by gh658804 finnish: 1 change by hpiirai portuguese: 9 changes by jcteotonio portuguese (brazilian): 1 change by pasantoro polish: 1 change by Rito13 --- src/lang/brazilian_portuguese.txt | 1 + src/lang/english_AU.txt | 1 + src/lang/finnish.txt | 1 + src/lang/greek.txt | 1 + src/lang/korean.txt | 1 + src/lang/polish.txt | 1 + src/lang/portuguese.txt | 17 +++++++++-------- src/lang/simplified_chinese.txt | 2 ++ src/lang/swedish.txt | 1 + src/lang/traditional_chinese.txt | 1 + 10 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 575278bd37..ebb64ad5e9 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -5269,6 +5269,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Ponte é muito baixa para uma boia STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle ferroviário STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle rodoviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é muito baixa para eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 4b89c39bdc..67afff78e3 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge i STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index ec7a5c9b20..a662e0e4c7 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Silta on STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Silta on liian matala poijun ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Silta on liian matala rautatien reittipisteen ylle STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Silta on liian matala tien reittipisteen ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Silta on liian matala sulun ylle # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Tunnelia ei voi rakentaa... diff --git a/src/lang/greek.txt b/src/lang/greek.txt index cd47e7c7e8..ba24630a2a 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -5369,6 +5369,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Η γέ STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σημαδούρα STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σιδηροδρομικό σημείο αναφοράς STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για οδικό σημείο αναφοράς +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Η γέφυρα είναι πολύ χαμηλή για κλείδωμα # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί σήραγγα εδώ... diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 943a35c782..1327143acc 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -5269,6 +5269,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}다리 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}다리 밑에 부표를 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}다리 밑에 철도 경유지를 두기에는 다리 높이가 너무 낮습니다 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}다리 밑에 도로 경유지를 두기에는 다리 높이가 너무 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 너무 낮습니다 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}여기에 터널을 지을 수 없습니다... diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 809fa5bb69..95e98ec8b3 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -5654,6 +5654,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Most jes STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Most jest zbyt niski dla boi STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku kolejowego STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku drogowego +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Most jest zbyt niski dla śluzy # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nie można tutaj zbudować tunelu... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index d6304ead95..62b34bca98 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1084,7 +1084,7 @@ STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :Arrastar o cont STR_GAME_OPTIONS_GUI_SCALE_AUTO :Detetar automaticamente o tamanho STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :Marque esta opção para detetar automaticamente o tamanho do interface -STR_GAME_OPTIONS_GUI_SCALE_BEVELS :Escalar chanfros +STR_GAME_OPTIONS_GUI_SCALE_BEVELS :Escalar rebordos STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Marque esta opção para dimensionar os chanfros por tamanho de interface STR_GAME_OPTIONS_GUI_FONT_SPRITE :Usar o tipo de letra com gráficos tradicionais @@ -1708,10 +1708,10 @@ STR_CONFIG_SETTING_PREFER_TEAMCHAT :Escolher chat d STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Trocar o mapeamento entre o chat interno da empresa e o chat público para e respetivamente STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidade da roda do rato no mapa: {STRING} -STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controlo de sensibilidade da roda de rolagem do rato +STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controlo de sensibilidade da roda de deslocamento do rato STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :Função da roda do rato: {STRING} -STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Ativar "scroll" com rodas de rato bidimensionais +STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Ativar descolamento com rodas de rato bidimensionais ###length 3 STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Ampliar mapa STR_CONFIG_SETTING_SCROLLWHEEL_SCROLL :Percorrer mapa @@ -2054,9 +2054,9 @@ STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Desativado -STR_CONFIG_SETTING_ZOOM_MIN :Nível maximo de ampliação: {STRING} +STR_CONFIG_SETTING_ZOOM_MIN :Nível máximo de ampliação: {STRING} STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :O nível máximo de zoom para visualizadores. Níveis máximos de zoom superiores aumenterão os requisitos de memória -STR_CONFIG_SETTING_ZOOM_MAX :Nível maximo de redução da câmara: {STRING} +STR_CONFIG_SETTING_ZOOM_MAX :Nível máximo de redução da câmara: {STRING} STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :O nível mínimo de zoom para visualizadores. Níveis mínimos de zoom superiores poderão causar lag quando utilizados ###length 6 STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x @@ -2100,7 +2100,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" si STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para o correio: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correio será enviada de uma estação A para a estação B assim como de B para A. "Assimétrico" significa que uma quantidade arbitrária de correio poderá ser enviada em qualquer direção. "Manual" significa que nenhuma distribuição automática terá lugar para o correio STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para a classe de carga BLINDADA: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém valores no clima temperado, diamantes no tropical ou ouro no ártico. Os NewGRFs podem mudar isto. "Simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como da B para a A. "Assimétrico" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá para essa carga. Recomenda-se que seja definido para assimétrico ou manual quando a jogar no ártico ou no tropical, pois os bancos nesses climas só recebem mercadorias. Para o temperado pode ser também escolhido simétrico pois os bancos irão remeter valores ao banco de origem +STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém valores no clima temperado, diamantes no tropical ou ouro no ártico. Os NewGRFs podem mudar isto. "Simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como da B para a A. "Assimétrico" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá para essa carga. Recomenda-se que seja definido para assimétrico ou manual quando a jogar no ártico ou no clima tropical, pois os bancos nesses climas só recebem mercadorias. Para o clima temperado pode ser também escolhido simétrico pois os bancos irão remeter valores ao banco de origem STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribuição para outras classes de carga: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Assimétrico" significa que quantidades arbitrárias de carga podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá para essas cargas ###length 3 @@ -2554,7 +2554,7 @@ STR_NETWORK_ASK_SURVEY_LINK :Sobre sondagem STR_NETWORK_ASK_SURVEY_NO :Não STR_NETWORK_ASK_SURVEY_YES :Sim -STR_NETWORK_SPECTATORS :Espectadores +STR_NETWORK_SPECTATORS :Espetadores # Network company info join/password STR_COMPANY_VIEW_JOIN :{BLACK}Entrar @@ -3837,7 +3837,7 @@ STR_STATION_LIST_CARGO_FILTER_ALL_AND_NO_RATING :Todos os tipos STR_STATION_LIST_CARGO_FILTER_MULTIPLE :Múltiplos tipos de carga STR_STATION_LIST_CARGO_FILTER_NO_CARGO_TYPES :Sem tipos de carga STR_STATION_LIST_CARGO_FILTER_ONLY_NO_RATING :Apenas sem classificação de carga -STR_STATION_LIST_CARGO_FILTER_SELECT_ALL :Selecionar tudo e sem avaliação +STR_STATION_LIST_CARGO_FILTER_SELECT_ALL :Selecionar todos e sem avaliação STR_STATION_LIST_CARGO_FILTER_NO_RATING :Sem classificação de carga STR_STATION_LIST_CARGO_FILTER_EXPAND :Mostrar mais... @@ -5269,6 +5269,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para a boia STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo ferroviário STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo rodoviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é demasiado baixa para a eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index d775ac2d53..58a02c6686 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -5264,9 +5264,11 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}…… STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}桥梁终点将越出地图 STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}桥梁过低,无法建设车站 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}桥梁过低,无法建设车站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}桥梁过低,无法建设码头 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}桥梁过低,无法放置浮标 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}桥梁过低,无法建设路点 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}桥梁过低,无法建设路点 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}桥梁过低,无法建设船闸 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}不能在这里开凿隧道…… diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 2c6970bc7f..f275fe2d4b 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bron är STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bro för låg för boj STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bro för låg för järnvägsriktmärke STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bro för låg för vägriktmärke +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bro för låg för sluss # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan inte bygga tunnel här... diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 170d5abcd6..88a2049ae1 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}橋樑 STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}橋樑過低,無法放置浮標 STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}橋樑過低,無法興建水閘 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}無法在此挖掘隧道... From b1dc37fb05bf21c76ad2941a2fac30ac72dcb78d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 12 Sep 2025 08:28:42 +0100 Subject: [PATCH 033/280] Fix 9a294ab2ed: Bridge height check for waypoints didn't include axis in layout. (#14609) It's unlikely that X and Y axis waypoints have different heights, but not impossible. --- src/waypoint_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 25b3a5383a..18a0540595 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -242,7 +242,7 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi CommandCost ret = IsValidTileForWaypoint(tile, axis, &est); if (ret.Failed()) return ret; - ret = IsRailStationBridgeAboveOk(tile, spec, StationType::RailWaypoint, *it++); + ret = IsRailStationBridgeAboveOk(tile, spec, StationType::RailWaypoint, *it++ + axis); if (ret.Failed()) return ret; } From ee664f7e8c2ce3e9b398e00f680f5d35bf1bd8e7 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 12 Sep 2025 19:37:17 +0100 Subject: [PATCH 034/280] Codechange: Prefer EnumBitSet's All() method over bitwise comparisons. (#14611) This makes the intent of the operation clearer. --- src/rail.cpp | 2 +- src/road.cpp | 2 +- src/townname.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rail.cpp b/src/rail.cpp index e09f1b4e20..5e6682317d 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -104,7 +104,7 @@ RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date /* Have we introduced all required railtypes? */ RailTypes required = rti->introduction_required_railtypes; - if ((rts & required) != required) continue; + if (!rts.All(required)) continue; rts.Set(rti->introduces_railtypes); } diff --git a/src/road.cpp b/src/road.cpp index f80fdddf4c..27a6a9bb78 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -179,7 +179,7 @@ RoadTypes AddDateIntroducedRoadTypes(RoadTypes current, TimerGameCalendar::Date /* Have we introduced all required roadtypes? */ RoadTypes required = rti->introduction_required_roadtypes; - if ((rts & required) != required) continue; + if (!rts.All(required)) continue; rts.Set(rti->introduces_roadtypes); } diff --git a/src/townname.cpp b/src/townname.cpp index aa264a6dba..5067de1524 100644 --- a/src/townname.cpp +++ b/src/townname.cpp @@ -667,7 +667,7 @@ static void MakeCzechTownName(StringBuilder &builder, uint32_t seed) for (ending = ending_start; ending <= ending_stop; ending++) { const CzechNameSubst *e = &_name_czech_subst_ending[ending]; - if ((e->choose & choose) == choose && e->allow.Any(allow)) { + if (e->choose.All(choose) && e->allow.Any(allow)) { map[i++] = ending; } } @@ -681,7 +681,7 @@ static void MakeCzechTownName(StringBuilder &builder, uint32_t seed) assert(gender != CZG_FREE && gender != CZG_NFREE); } - if (do_prefix && (_name_czech_adj[prefix].choose & choose) != choose) { + if (do_prefix && !_name_czech_adj[prefix].choose.All(choose)) { /* Throw away non-matching prefix. */ do_prefix = false; } From 3356aa7c6941f56b197e4c2340b726350c451dfc Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 12 Sep 2025 19:41:18 +0100 Subject: [PATCH 035/280] Codechange: Remove two vector typedefs which are only used once. (#14612) --- src/rail.h | 5 +---- src/road.h | 5 +---- src/table/railtypes.h | 8 ++++---- src/table/roadtypes.h | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/rail.h b/src/rail.h index d945dab24b..4e9e62ee76 100644 --- a/src/rail.h +++ b/src/rail.h @@ -109,9 +109,6 @@ enum RailFenceOffset : uint8_t { RFO_SLOPE_NW_SW, //!< Slope NW, Track Y, Fence SW }; -/** List of rail type labels. */ -typedef std::vector RailTypeLabelList; - /** * This struct contains all the info that is needed to draw and construct tracks. */ @@ -229,7 +226,7 @@ public: /** * Rail type labels this type provides in addition to the main label. */ - RailTypeLabelList alternate_labels; + std::vector alternate_labels; /** * Colour on mini-map diff --git a/src/road.h b/src/road.h index 98482d6462..76355d216e 100644 --- a/src/road.h +++ b/src/road.h @@ -63,9 +63,6 @@ enum RoadTypeSpriteGroup : uint8_t { ROTSG_END, }; -/** List of road type labels. */ -typedef std::vector RoadTypeLabelList; - class RoadTypeInfo { public: /** @@ -140,7 +137,7 @@ public: /** * Road type labels this type provides in addition to the main label. */ - RoadTypeLabelList alternate_labels; + std::vector alternate_labels; /** * Colour on mini-map diff --git a/src/table/railtypes.h b/src/table/railtypes.h index 7ea62899a4..71b64418e1 100644 --- a/src/table/railtypes.h +++ b/src/table/railtypes.h @@ -95,7 +95,7 @@ static const RailTypeInfo _original_railtypes[] = { RAILTYPE_LABEL_RAIL, /* alternate labels */ - RailTypeLabelList(), + {}, /* map colour */ PC_GREY, @@ -197,7 +197,7 @@ static const RailTypeInfo _original_railtypes[] = { RAILTYPE_LABEL_ELECTRIC, /* alternate labels */ - RailTypeLabelList(), + {}, /* map colour */ PC_GREY, @@ -295,7 +295,7 @@ static const RailTypeInfo _original_railtypes[] = { RAILTYPE_LABEL_MONO, /* alternate labels */ - RailTypeLabelList(), + {}, /* map colour */ PC_GREY, @@ -393,7 +393,7 @@ static const RailTypeInfo _original_railtypes[] = { RAILTYPE_LABEL_MAGLEV, /* alternate labels */ - RailTypeLabelList(), + {}, /* map colour */ PC_GREY, diff --git a/src/table/roadtypes.h b/src/table/roadtypes.h index eba40d3ad0..eaf9c93c56 100644 --- a/src/table/roadtypes.h +++ b/src/table/roadtypes.h @@ -78,7 +78,7 @@ static const RoadTypeInfo _original_roadtypes[] = { ROADTYPE_LABEL_ROAD, /* alternate labels */ - RoadTypeLabelList(), + {}, /* map colour */ PC_BLACK, @@ -159,7 +159,7 @@ static const RoadTypeInfo _original_roadtypes[] = { ROADTYPE_LABEL_TRAM, /* alternate labels */ - RoadTypeLabelList(), + {}, /* map colour */ PC_BLACK, From 96b59af4d160887273270e871d9aa5d1c118047c Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 13 Sep 2025 04:36:41 +0000 Subject: [PATCH 036/280] Update: Translations from eints norwegian (bokmal): 2 changes by eriksorngard vietnamese: 14 changes by KhoiCanDev russian: 1 change by Ln-Wolf dutch: 1 change by Afoklala --- src/lang/dutch.txt | 1 + src/lang/norwegian_bokmal.txt | 2 ++ src/lang/russian.txt | 1 + src/lang/vietnamese.txt | 27 ++++++++++++++------------- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 6e6a14ad45..736562470b 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}De brug STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Brug te laag voor boei STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Brug te laag voor spoorroutepunt STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Brug te laag voor wegroutepunt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Brug te laag voor sluis # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan hier geen tunnel bouwen... diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 22322977db..1a10bfc7b6 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -5266,9 +5266,11 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... broe STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bro vil ende utenfor kartet STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Broen er for lav for en stasjon STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Broen er for lav for en holdeplass +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er for lav for en havn STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er for lav for en bøye STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er for lav for et veipunkt STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er for lav for et veipunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Broen er for lav for en sluse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan ikke bygge tunnel her... diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 2d0e505fc2..795c4cbdaf 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -5455,6 +5455,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Высо STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Высота моста недостаточна для установки буя STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Высота моста недостаточна для строительства шлюза # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Здесь невозможно построить туннель... diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 7df1dfc6b8..ec663d1330 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1461,10 +1461,10 @@ STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Cửa sổ chí STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Cửa sổ chính STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Mọi cửa sổ bổ sung -STR_CONFIG_SETTING_BRIBE :Cho phép hối lộ chính quyền địa phương: {STRING} +STR_CONFIG_SETTING_BRIBE :Cho phép đút lót chính quyền địa phương: {STRING} ###length 2 -STR_CONFIG_SETTING_BRIBE_HELPTEXT :Cho phép công ty thử hối lộ quan chức địa phương. Nếu việc hối lộ bị phát giác, công ty sẽ không được làm gì ở địa phương đó 6 tháng -STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Cho phép các công ty hối lộ quan chức địa phương. Nếu việc hối lộ bị phát giác bởi điều tra viên, thì công ty sẽ không được hoạt động ở địa phương đó trong 6 phút +STR_CONFIG_SETTING_BRIBE_HELPTEXT :Cho phép công ty thử đút lót quan chức địa phương. Nếu việc đút lót bị phát hiện, công ty sẽ không được làm gì ở địa phương đó trong sáu tháng +STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Cho phép các công ty đút lót quan chức địa phương. Nếu việc đút lót bị phát hiện bởi thanh tra viên, thì công ty sẽ không được hoạt động ở địa phương đó trong sáu phút STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Cho phép mua quyền vận tải độc quyền: {STRING} ###length 2 @@ -2163,7 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Hoàng Gia (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) -STR_CONFIG_SETTING_LOCALISATION :Tiêu Chuẩn Đo Lường +STR_CONFIG_SETTING_LOCALISATION :Tiêu chuẩn đo lường STR_CONFIG_SETTING_GRAPHICS :Đồ họa STR_CONFIG_SETTING_SOUND :Âm thanh STR_CONFIG_SETTING_INTERFACE :Giao diện @@ -2232,7 +2232,7 @@ STR_INTRO_MULTIPLAYER :{BLACK}Ván Ch STR_INTRO_GAME_OPTIONS :{BLACK}Cấu Hình Trò Chơi STR_INTRO_HIGHSCORE :{BLACK}Bảng Thành Tích -STR_INTRO_HELP :{BLACK}Trợ giúp & hướng dẫn +STR_INTRO_HELP :{BLACK}Trợ Giúp & Hướng Dẫn STR_INTRO_ONLINE_CONTENT :{BLACK}Nội Dung Trực Tuyến STR_INTRO_QUIT :{BLACK}Thoát @@ -3704,7 +3704,7 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (đã được vận chuyển) STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Thị trấn phát triển mỗi {ORANGE}{UNITS_DAYS_OR_SECONDS} STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Thị trấn phát triển mỗi {ORANGE}{UNITS_DAYS_OR_SECONDS} (đã được góp vốn) -STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Thị trấn {RED}không còn{BLACK} phát triển +STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Thị trấn đang {RED}không{BLACK} phát triển STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Độ ồn giới hạn trong đô thị: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Xem trung tâm đô thị. Ctrl+Click mở cửa sổ mới về vị trí đô thị STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Chính quyền địa phương @@ -3743,7 +3743,7 @@ STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Tài trợ cả STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Xây tượng đài công ty STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Tài trợ xây nhà cửa STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Mua độc quyền kinh doanh vận tải -STR_LOCAL_AUTHORITY_ACTION_BRIBE :Hối lộ quan chức địa phương +STR_LOCAL_AUTHORITY_ACTION_BRIBE :Đút lót quan chức địa phương ###next-name-looks-similar STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Thực hiện chiến dịch quảng cáo nhỏ để thu hút khách và hàng hoá vận chuyển.{}Tăng xếp hạng cho các trạm gần trung tâm trong thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} @@ -3753,8 +3753,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Tài trợ cải tạo lại mạng đường phố trong đô thị.{}Nó sẽ gây ra sự gián đoạn với giao thông đường bộ đáng kể trong vòng 6 phút.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Dựng tượng đài tôn vinh để quảng bá hình ảnh công ty.{}Tăng xếp hạng cho các trạm trong khu vực.{}{POP_COLOUR} Chi phí: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Tài trợ xây dựng các toà nhà để thúc đẩy phát triển đô thị.{}Tăng sự phát triển đô thị trong một thời gian ngắn.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Mua hợp đồng giấy phép vận tải độc quyền ở địa phương trong 12 tháng.{}Chính quyền địa phương sẽ không cho hành khách và hàng hoá sử dụng các ga, bến, cảng của đối thủ. Nhưng nếu đối thủ thực hiện hối lộ thành công thì sẽ huỷ bỏ hợp đồng này.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Mua hợp đồng giấy phép vận tải độc quyền ở địa phương trong 12 phút.{}Chính quyền địa phương sẽ không cho hành khách và hàng hoá sử dụng các ga, bến, cảng của đối thủ. Nhưng nếu đối thủ thực hiện hối lộ thành công thì sẽ huỷ bỏ hợp đồng này.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Mua hợp đồng giấy phép vận tải độc quyền ở địa phương trong 12 tháng.{}Chính quyền địa phương sẽ không cho hành khách và hàng hoá sử dụng các ga, bến, cảng của đối thủ. Nhưng nếu đối thủ thực hiện đút lót thành công thì sẽ huỷ bỏ hợp đồng này.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Mua hợp đồng giấy phép vận tải độc quyền ở địa phương trong 12 phút.{}Chính quyền địa phương sẽ không cho hành khách và hàng hoá sử dụng các ga, bến, cảng của đối thủ. Nhưng nếu đối thủ thực hiện đút lót thành công thì sẽ huỷ bỏ hợp đồng này.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Đút lót quan chức địa phương để nâng cao quyền lợi và hủy bỏ độc quyền kinh doanh vận tải của đối thủ, có nguy cơ bị phạt nặng nếu vụ việc bị bại lộ.{}{POP_COLOUR}Chi phí: {CURRENCY_LONG} # Goal window @@ -4480,10 +4480,10 @@ STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Không có STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Chờ đường thông STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}Quá xa để tới điểm kế tiếp -STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Nhắm tới {0:STATION} +STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - Hướng tới {0:STATION} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - Không lộ trình -STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Nhắm tới {0:WAYPOINT} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Nhắm tới {0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - Hướng tới {0:WAYPOINT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - Hướng tới {0:DEPOT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - Phục vụ tại {0:DEPOT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}{1:VELOCITY} - Gỡ gộp và bảo trì ở {0:DEPOT} @@ -5038,7 +5038,7 @@ STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Không c STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}Chính quyền {TOWN} từ chối bạn làm việc này STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}Chính quyền {TOWN} từ chối có thêm một sân bay nữa trong địa phận của họ STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}Chính quyền {TOWN} từ chối sân bay vì dân chúng phàn nàn là quá ồn ào -STR_ERROR_BRIBE_FAILED :{WHITE}Sự cố gắng trong việc hối lộ của bạn đã bị phát hiện bởi các nhà điều tra +STR_ERROR_BRIBE_FAILED :{WHITE}Hành vi đút lót của bạn đã bị thanh tra viên khu vực phát hiện # Levelling errors STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Không thể nâng đất ở đây... @@ -5268,6 +5268,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Cầu qu STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Cầu quá thấp cho phao STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường ray STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :Cầu thấp, tàu không qua được khóa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Không thể đào hầm ở đây... From 748700bd9ef75889705365b5f93d377b31f0609b Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 14 Sep 2025 04:38:01 +0000 Subject: [PATCH 037/280] Update: Translations from eints catalan: 2 changes by J0anJosep latvian: 53 changes by lexuslatvia portuguese: 36 changes by jcteotonio --- src/lang/catalan.txt | 2 ++ src/lang/latvian.txt | 63 ++++++++++++++++++++++++++++++------ src/lang/portuguese.txt | 72 ++++++++++++++++++++--------------------- 3 files changed, 91 insertions(+), 46 deletions(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 2dba9b55da..c715650802 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -5265,9 +5265,11 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... el p STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}El pont acabaria fora del mapa STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}El pont està massa baix per a l'estació. STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}El pont està massa baix per a la parada. +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}El pont és massa baix per al port. STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}El pont està massa baix per a la boia. STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}El pont està massa baix per al punt de pas. STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}El pont està massa baix per al punt de pas de carretera. +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}El pont és massa baix per a la resclosa. # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Aquí no es pot construir el túnel... diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index f2baaaa0f0..a342fe2b9b 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -269,6 +269,7 @@ STR_UNITS_YEARS :{NUM}{NBSP}gad{ STR_UNITS_PERIODS :{NUM}{NBSP}period{P s s di} STR_LIST_SEPARATOR :,{SPACE} +STR_TRUNCATION_ELLIPSIS :... # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filters: @@ -623,8 +624,14 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Uzņēmu STR_GRAPH_LAST_24_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Pēdējās 24 minūtes STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Pēdējās 72 minūtes +STR_GRAPH_LAST_288_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Pēdējās 288 minūtes +STR_GRAPH_LAST_24_MONTHS :{TINY_FONT}{BLACK}2 gadi (mēnešos) +STR_GRAPH_LAST_24_QUARTERS :{TINY_FONT}{BLACK}6 gadi (ceturkšnos) +STR_GRAPH_LAST_24_YEARS :{TINY_FONT}{BLACK}24 gadi (gadskārtēji) +STR_GRAPH_TOGGLE_RANGE :Pārslēgt diagrammu šim datu diapazonam +STR_GRAPH_SELECT_SCALE :Mainīt grafika horizontālo mērogu STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Kravas apmaksas cenas STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dienas ceļā @@ -632,14 +639,20 @@ STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLA STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Izmaksas par 10 vienību (vai 10,000 litru) kravas pārvadāšanu par 20 lauciņiem STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Viss STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Nav -STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Rādīt visas kravas samaksu salīdzināšanas diagrammā -STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Nerādīt nevienu kravu samaksu salīdzināšanas diagrammā +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Attēlot visas kravas grafikā +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Nerādīt kravas grafikā STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Paslēgt kravas veida diagrammu STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} +STR_GRAPH_INDUSTRY_CAPTION :{WHITE}{INDUSTRY} - Kravu vēsture STR_GRAPH_INDUSTRY_RANGE_PRODUCED :Saražots STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Pārvadāts +STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Piegādāts +STR_GRAPH_INDUSTRY_RANGE_WAITING :Gaida +STR_GRAPH_TOWN_CARGO_CAPTION :{WHITE}{TOWN} - Kravu vēsture +STR_GRAPH_TOWN_RANGE_PRODUCED :Piegāde +STR_GRAPH_TOWN_RANGE_TRANSPORTED :Pārvadāts STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Rādīt detalizētus uzņēmējdarbības vērtējumus @@ -1031,6 +1044,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Malaizijas Ring STR_GAME_OPTIONS_CURRENCY_LVL :Latvijas lati STR_GAME_OPTIONS_CURRENCY_PTE :Portugāles eskudo STR_GAME_OPTIONS_CURRENCY_UAH :Ukrainas Grivna +STR_GAME_OPTIONS_CURRENCY_VND :Vjetnamas Dongs STR_GAME_OPTIONS_AUTOSAVE_FRAME :Automātiskā saglabāšana STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :Izvēlēties spēles automātiskās saglabāšanas starplaikus @@ -1305,6 +1319,9 @@ STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Aizdevumu proce STR_CONFIG_SETTING_RUNNING_COSTS :Kārtējās izmaksas: {STRING} STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Iestaties uzturēšanas un ekspluatācijas izmaksu līmeni transportlīdzekļiem un infrastruktūrai ###length 3 +STR_CONFIG_SETTING_RUNNING_COSTS_LOW :Zemas +STR_CONFIG_SETTING_RUNNING_COSTS_MEDIUM :Vidējas +STR_CONFIG_SETTING_RUNNING_COSTS_HIGH :Augstas STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Būvēšanas ātrums: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :MI (mākslīgā intelekta) būvniecības darbību daudzuma ierobežošana @@ -1327,6 +1344,9 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Bez subsīdijā STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Būvēšanas izmaksas: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Iestatīt būvēšanas un pirkumu izmaksas ###length 3 +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_LOW :Zemas +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_MEDIUM :Vidējas +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HIGH :Augstas STR_CONFIG_SETTING_RECESSIONS :Lejupslīde: {STRING} STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ja ieslēgts, periodiski var rasties recesijas. Recesijas laikā visa ražošana ir ievērojami zemāka (tā atgriežas iepriekšējā līmenī, kad recesija ir beigusies) @@ -1672,6 +1692,8 @@ STR_CONFIG_SETTING_SCROLLMODE_LMB :Pārvietot kart STR_CONFIG_SETTING_SMOOTH_SCROLLING :Plūdena skatvietas ritināšana: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Noteikt, kā galvenais skats ritina uz norādīto pozīciju, kad klikšķina uz mazās kartes vai kad dod komandu ritināt uz noteiktu kartes objektu. Ja ieslēgs, skatvieta ritinās gludi. Ja izslēgts, skats pārlec uz izvēlēto punktu. +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT :Tradicionālā rīkjoslas izvēlnes atlases darbība: {STRING} +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT_HELPTEXT :Izvēlieties rīkjoslas izvēļņu atlases darbību. Ja izslēgts, rīkjoslas izvēlnes paliks atvērtas, līdz tiks veikta atlase. Ja ieslēgts, rīkjoslas izvēlnes tiks aktivizētas, atlaižot peles pogu. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Rādīt mērījumu rīkjoslu, izmantojot dažādus būvniecības rīkus: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Rāda lauciņu attālumus un augstuma starpības, ar vilkšanu veicot būvniecības darbības @@ -2083,9 +2105,9 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :APSARGĀJAMĀ k STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Izplatīšanas modelis citām kravu klasēm: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asimetrisks" nozīmē, ka jebkurā virzienā var nosūtīt patvaļīgu daudzumu kravas. "Manuāli" nozīmē, ka šīm kravām automātiska sadale nenotiks ###length 3 -STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuāli -STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetriska -STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetriska +STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manuāli +STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asimetriska +STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Simetriska STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Sadales precizitāte: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Jo lielāku vērtību iestatīsiet, jo vairāk CPU laika aizies saišu grafa aprēķināšanai. Ja tas aizņem pārāk daudz laika, jūs varētu pamanīt spēles iebremzēšanos. Ja iestatīsiet pārāk mazu, izplatīšana būs neprecīza un jūs varētu pamanīt, ka krava tiek nosūtīta uz negaidītām vietām. @@ -2337,16 +2359,19 @@ STR_FACE_SIMPLE_TOOLTIP :{BLACK}Vienkār STR_FACE_LOAD :{BLACK}Ielādēt STR_FACE_LOAD_TOOLTIP :{BLACK}Ielādēt iecienīto seju STR_FACE_LOAD_DONE :{WHITE}Jūsu iecienītā seja tika ielādēta no OpenTDD konfigurācijas faila -STR_FACE_FACECODE :{BLACK}Spēlētāja sejas nr. -STR_FACE_FACECODE_TOOLTIP :{BLACK}Skatīt un/vai pielikt uzņēmuma prezidenta sejas numuru -STR_FACE_FACECODE_CAPTION :{WHITE}Skatīt un/vai pielikt prezidenta sejas numuru -STR_FACE_FACECODE_SET :{WHITE}Jauns sejas numurs ir pielikts -STR_FACE_FACECODE_ERR :{WHITE}Nevar pielikt numuru spēlētāja sejai - tam ir jābūt skaitlim no 0 līdz 4,294,967,295! +STR_FACE_FACECODE :{BLACK}Spēlētāja sejas kods +STR_FACE_FACECODE_TOOLTIP :{BLACK}Skatīt un/vai pielikt uzņēmuma prezidenta sejas kodu +STR_FACE_FACECODE_CAPTION :{WHITE}Skatīt un/vai pielikt prezidenta sejas kodu +STR_FACE_FACECODE_SET :{WHITE}Jauns prezidenta seja ir pielikta +STR_FACE_FACECODE_ERR :{WHITE}Nevar pielikt kodu spēlētāja sejai - tam ir jābūt derīgai etiķetei un numuram STR_FACE_SAVE :{BLACK}Saglabāt STR_FACE_SAVE_TOOLTIP :{BLACK}Saglabāt iecienīto seju STR_FACE_SAVE_DONE :{WHITE}Šī seja tiks saglabāta OpenTDD konfigurācijas failā kā iecienītā seja +STR_FACE_SETTING_TOGGLE :{STRING} {ORANGE}{STRING} +STR_FACE_SETTING_NUMERIC :{STRING} {ORANGE}{NUM} / {NUM} STR_FACE_YES :Ir STR_FACE_NO :Nav +STR_FACE_STYLE :Stils: STR_FACE_HAIR :Mati: STR_FACE_EYEBROWS :Uzacis: STR_FACE_EYECOLOUR :Acu krāsa: @@ -2819,6 +2844,10 @@ STR_PICKER_MODE_USED_TOOLTIP :Pārslēgt tika STR_PICKER_MODE_SAVED :Saglabāts STR_PICKER_MODE_SAVED_TOOLTIP :Pārslēgt tikai saglabāto vienumu rādīšanu +STR_PICKER_PREVIEW_SHRINK :- +STR_PICKER_PREVIEW_SHRINK_TOOLTIP :Samaziniet priekšskatījuma attēlu augstumu. Ctrl+klikšķis, lai samazinātu līdz minimumam. +STR_PICKER_PREVIEW_EXPAND :+ +STR_PICKER_PREVIEW_EXPAND_TOOLTIP :Palieliniet priekšskatījuma attēlu augstumu. Ctrl+klikšķis, lai palielinātu līdz maksimālajam. STR_PICKER_STATION_CLASS_TOOLTIP :Izvēlieties rādāmo staciju klasi STR_PICKER_STATION_TYPE_TOOLTIP :Izvēlieties izveidojamās stacijas veidu. Ctrl+klikšķis, lai pievienotu vai noņemtu saglabātos vienumus @@ -3689,6 +3718,8 @@ STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Pašvaldība STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Rādīt informāciju par pašvaldību STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Pārdēvēt pilsētu +STR_TOWN_VIEW_CARGO_GRAPH :Kravu grafiks +STR_TOWN_VIEW_CARGO_GRAPH_TOOLTIP :Rādīt pilsētas kravu vēstures grafiku STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Paplašināt STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Palielināt pilsētas izmērus @@ -4024,6 +4055,8 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Iepriek STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Ražošanas pēdējā minūtē: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (pārvadāti {COMMA}%) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz ražotni. Ctrl+klikšķis atvērs skatu uz ražotni jaunā skatlaukā +STR_INDUSTRY_VIEW_CARGO_GRAPH :{BLACK}Kravu grafiks +STR_INDUSTRY_VIEW_CARGO_GRAPH_TOOLTIP :{BLACK}Rāda nozares kravu vēstures grafiku STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ražošanas līmenis: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Nozare ir paziņojusi par nenovēršamu slēgšanu! @@ -4999,6 +5032,7 @@ STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}Nepiecie STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Nogāze ir uz nepareizo pusi STR_ERROR_CAN_T_DO_THIS :{WHITE}Nav iespējams tā izdarīt... STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Vispirms ir jānojauc ēku +STR_ERROR_BUILDING_IS_PROTECTED :{WHITE}... ēka ir aizsargāta STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Šo laukumu nevar nolīdzināt... STR_ERROR_SITE_UNSUITABLE :{WHITE}... vieta nav piemērota STR_ERROR_ALREADY_BUILT :{WHITE}... jau ir uzbūvēts @@ -5239,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Sākumam STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... abiem tilta galiem jābūt uz zemes STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... tilts ir pārāk garš STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Tilts beigtos ārpus kartes +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Tilts ir pārāk zems stacijai +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Tilts ir pārāk zems, ceļa pieturai +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Tilts ir pārāk zems piestātnei +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Tilts ir pārāk zems bojai +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Tilts ir pārāk zems dzelzceļa pieturas punktam +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Tilts ir pārāk zems ceļa punktam +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Tilts ir pārāk zems slūžām # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Šeit nevar būvēt tuneli... @@ -5855,6 +5896,8 @@ STR_SAVEGAME_NAME_SPECTATOR :Novērotājs, { # Viewport strings STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN_CITY :{TOWN} {CITY_ICON} +STR_VIEWPORT_TOWN_CITY_POP :{TOWN} ({COMMA}) {CITY_ICON} STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} # Simple strings to get specific types of data diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 62b34bca98..90eec730eb 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2117,7 +2117,7 @@ STR_CONFIG_SETTING_DEMAND_SIZE :Quantidade de c STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Definir isto para menos de 100% torna a distribuição simétrica reagir mais como a assimétrica. Menos carga será forçada a ser devolvida se uma determinada quantidade for enviada para uma estação. Se for definido para 0% a distribuição simétrica irá reagir como a assimétrica STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturação de percursos curtos antes de usar percursos de grande capacidade: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente existem múltiplos trajectos entre duas estações. Cargodist irá saturar o trajecto mais curto primeiro, depois usar o segundo trajecto mais curto até o saturar, e assim por diante. A saturação é determinada pelo estimativa da capacidade do uso planeado. Ao saturar todos os caminhos, se ainda existir procura, irá sobrecarregar todos os trajectos, com preferência pelos de maior capacidade. No entanto, grande parte das vezes o algoritmo não irá estimar correctamente a capacidade. Esta configuração permite definir até que percentagem um trajecto mais curto deverá ser saturado na primeira passagem antes do algoritmo proceder ao próximo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade super-estimada +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente existem múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até o saturar, e assim por diante. A saturação é determinada pelo estimativa da capacidade do uso planeado. Ao saturar todos os caminhos, se ainda existir procura, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. No entanto, grande parte das vezes o algoritmo não irá estimar corretamente a capacidade. Esta configuração permite definir até que percentagem um trajeto mais curto deverá ser saturado na primeira passagem antes do algoritmo proceder ao próximo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade super-estimada STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terrestre): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidades de velocidade (náutica): {STRING} @@ -2577,7 +2577,7 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Introduz # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Não foram encontradas interfaces de rede STR_NETWORK_ERROR_NOCONNECTION :{WHITE}A ligação ao servidor atingiu o tempo limite ou foi recusada -STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Impossível ligar devido a incompatibilidade de NewGRF +STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Não é possível ligar devido a incompatibilidade de NewGRF STR_NETWORK_ERROR_DESYNC :{WHITE}A sincronização do jogo de rede falhou. STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}A conexão do jogo de rede perdeu-se. STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Não foi possível abrir o jogo. @@ -2586,7 +2586,7 @@ STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Ocorreu STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}O seu nome de jogador não foi definido. O nome pode ser definido no topo da janela de Multi-jogador STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}O seu nome do seu servidor não foi definido. O nome pode ser definido no topo da janela de Multi-jogador STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}A revisão deste cliente não condiz com a revisão do servidor -STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Palavra-chave incorrecta +STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Palavra-chave incorreta STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST :{WHITE}Você não está na lista de clientes permitidos STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Servidor cheio STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Foi banido deste servidor @@ -2612,9 +2612,9 @@ STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :erro de protoco STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :NewGRF incompatível STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :não autorizado STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :foi recebido um pacote inesperado ou inválido -STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :revisão incorrecta +STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :revisão incorreta STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :nome já está a ser utilizado -STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :palavra-chave incorrecta +STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :palavra-chave incorreta STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :não está na lista de permissões STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :nenhum dos métodos de autenticação solicitados está disponível STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :ID da empresa errado na aplicação de rede @@ -3626,9 +3626,9 @@ STR_NEWGRF_ERROR_INDPROD_CALLBACK :Revogação da STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Alerta! STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Vai alterar um jogo em andamento. O OpenTTD pode terminar abruptamente.Não envie relatórios de erros sobre estas questões.{}Tem a certeza que quer continuar? -STR_NEWGRF_DUPLICATE_GRFID :{WHITE}Impossível adicionar ficheiro: GRF ID duplicado +STR_NEWGRF_DUPLICATE_GRFID :{WHITE}Não é possível adicionar ficheiro: GRF ID duplicado STR_NEWGRF_COMPATIBLE_LOADED :{ORANGE}Ficheiro correspondente não encontrado (GRF compatível carregado) -STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Impossivel adicionar ficheiro: alcançado limite de ficheiros NewGRF +STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Não é possível adicionar ficheiro: foi alcançado o limite de NewGRFs STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}GRF(s) compatíveis carregados para ficheiros em falta STR_NEWGRF_DISABLED_WARNING :{WHITE}Ficheiro(s) GRF em falta foram desativados @@ -4441,7 +4441,7 @@ STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Comprar STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Comprar uma cópia da aeronave. Ctrl+Clique para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forçar comboio a prosseguir sem esperar pelo sinal -STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter direcção do comboio +STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter direção do comboio STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forçar veículo a dar a volta STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique para abrir um novo visualizador na localização do destino da ordem @@ -4610,7 +4610,7 @@ STR_ORDERS_CAPTION :{WHITE}{VEHICLE STR_ORDERS_TIMETABLE_VIEW :{BLACK}Horário STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Mudar para a vista de horário -STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de ordens - clique numa ordem para a selecionar. Ctrl+Clique para rolar até ao destino da ordem +STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de ordens - clique numa ordem para a selecionar. Ctrl+Clique para deslocar a câmara ao destino da ordem STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDERS_END_OF_ORDERS :- - Fim de Ordens - - @@ -4975,8 +4975,8 @@ STR_ERROR_GAME_LOAD_FAILED :{WHITE}Falha ao STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erro interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ficheiro corrompido - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Jogo gravado numa versão mais recente do jogo -STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Impossível ler ficheiro -STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Impossível escrever ficheiro +STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Ficheiro não é legível +STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Não é possível escrever ficheiro STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Falha ao verificar integridade de dados STR_GAME_SAVELOAD_ERROR_PATCHPACK :Salvar o jogo é feito com uma versão modificada STR_GAME_SAVELOAD_NOT_AVAILABLE : @@ -4986,12 +4986,12 @@ STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}O jogo f STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Geração do mapa cancelada...{}{}... não existem locais adequados para localidades STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... não existe nenhuma localidade neste cenário -STR_ERROR_PNGMAP :{WHITE}Impossível carregar paisagem do PNG... +STR_ERROR_PNGMAP :{WHITE}Não é possível carregar paisagem do PNG... STR_ERROR_PNGMAP_FILE_NOT_FOUND :{WHITE}... ficheiro não encontrado STR_ERROR_PNGMAP_IMAGE_TYPE :{WHITE}... não pode converter tipo de imagem. Necessário PNG de 8 ou 24 bits. STR_ERROR_PNGMAP_MISC :{WHITE}... alguma coisa correu mal (provavelmente um ficheiro corrompido) -STR_ERROR_BMPMAP :{WHITE}Impossível carregar paisagem de BMP... +STR_ERROR_BMPMAP :{WHITE}Não é possível carregar paisagem de BMP... STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... não pode converter tipo de imagem STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... a imagem é demasiado grande @@ -5019,7 +5019,7 @@ STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Fora dos STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP :{WHITE}Muito perto dos limites do mapa STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}Dinheiro insuficiente - é necessário {CURRENCY_LONG} STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}É necessário terreno plano -STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreno inclinado na direcção incorrecta +STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreno inclinado na direção incorreta STR_ERROR_CAN_T_DO_THIS :{WHITE}Não é possível fazer isto... STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifício deve ser demolido primeiro STR_ERROR_BUILDING_IS_PROTECTED :{WHITE}... o edifício está protegido @@ -5082,11 +5082,11 @@ STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}Não é # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... demasiadas indústrias STR_ERROR_CAN_T_GENERATE_INDUSTRIES :{WHITE}Não é possível gerar indústrias... -STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Não é possível construir {STRING} aqui... +STR_ERROR_CAN_T_BUILD_HERE :{WHITE}Não é possível construir {G 0 "" "o " "a " "os " "as "}{STRING} aqui... STR_ERROR_CAN_T_CONSTRUCT_THIS_INDUSTRY :{WHITE}Não é possível construir este tipo de indústria aqui... STR_ERROR_CAN_T_PROSPECT_INDUSTRY :{WHITE}Não é possível prospetar indústria... STR_ERROR_INDUSTRY_TOO_CLOSE :{WHITE}... muito perto de outra indústria -STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... é necessário construir uma localidade primeiro +STR_ERROR_MUST_FOUND_TOWN_FIRST :{WHITE}... é necessário fundar uma localidade primeiro STR_ERROR_ONLY_ONE_ALLOWED_PER_TOWN :{WHITE}... só é permitido uma por localidade STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200 :{WHITE}... só pode ser construído em localidades com pelo menos 1200 habitantes STR_ERROR_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}... só se pode construir em zonas florestais @@ -5125,17 +5125,17 @@ STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Muito pe STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado perto de outro aeroporto STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Não pode alterar o nome da estação... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... estrada pertence a uma localidade -STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... estrada orientada na direcção incorrecta +STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... estrada orientada na direção incorreta STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... estações de passagem não podem ter curvas STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... estações de passagem não podem ter cruzamentos # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Não é possível remover parte da estação... STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}É preciso remover a estação primeiro -STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Impossível remover estação... -STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Impossível remover estação... -STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Impossível remover paragem de elétricos de passageiros -STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Impossível remover terminal de elétricos de mercadorias... +STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Não é possível remover estação... +STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Não é possível remover terminal de carga... +STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Não é possível remover paragem de elétricos de passageiros +STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Não é possível remover terminal de elétricos de mercadorias... STR_ERROR_MUST_REMOVE_ROAD_STOP_FIRST :{WHITE}Deverá remover a paragem rodoviária primeiro STR_ERROR_THERE_IS_NO_STATION :{WHITE}... não há nenhuma estação aqui @@ -5178,7 +5178,7 @@ STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... tem 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 :{WHITE}Não é possível inverter a direção do veículo... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... compostos por unidades múltiplas STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Vias férreas incompatíveis @@ -5250,10 +5250,10 @@ STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Não é # Tree related errors STR_ERROR_TREE_ALREADY_HERE :{WHITE}... árvore já está plantada aqui STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE}... terreno não indicado para este tipo de árvore -STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Impossível plantar árvore aqui... +STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Não é possível plantar árvore aqui... # Bridge related errors -STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Não é possível construir ponte aqui... +STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Não é possível construir uma ponte aqui... STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Deverá demolir a ponte primeiro STR_ERROR_CAN_T_START_AND_END_ON :{WHITE}Não é possível iniciar e finalizar no mesmo ponto STR_ERROR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Extremos da ponte não estão ao mesmo nível @@ -5290,14 +5290,14 @@ STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... já STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... atingido o limite de construção de objeto # Group related errors -STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Impossível criar grupo... -STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Impossível remover este grupo... -STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Impossível renomear o grupo... +STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Não é possível criar grupo... +STR_ERROR_GROUP_CAN_T_DELETE :{WHITE}Não é possível remover este grupo... +STR_ERROR_GROUP_CAN_T_RENAME :{WHITE}Não é possível alterar o nome do grupo... STR_ERROR_GROUP_CAN_T_SET_PARENT :{WHITE}Não é possível definir grupo parente... STR_ERROR_GROUP_CAN_T_SET_PARENT_RECURSION :{WHITE}... não são permitidos ciclos na hierarquia de grupos STR_ERROR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Não é possível remover todos os veículos deste grupo... -STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Impossível adicionar o veículo a este grupo... -STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Impossível adicionar veículos com ordens partilhadas ao grupo... +STR_ERROR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Não é possível adicionar o veículo a este grupo... +STR_ERROR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Não é possível adicionar veículos partilhados ao grupo... # Generic vehicle errors @@ -5386,10 +5386,10 @@ STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET_EXPLANATION :{WHITE}Começar # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Não é possível fazer o comboio passar o sinal com perigo... -STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Não é possível inverter a direcção do comboio... +STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Não é possível inverter a direção do comboio... STR_ERROR_TRAIN_START_NO_POWER :O comboio não tem energia -STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Impossível fazer o veículo dar a volta... +STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Não é possível fazer o veículo dar a volta... STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Aeronave está em voo @@ -5399,9 +5399,9 @@ STR_ERROR_TOO_MANY_ORDERS :{WHITE}Demasiad STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}Não é possível inserir nova ordem... STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Não é possível eliminar esta ordem... STR_ERROR_CAN_T_MODIFY_THIS_ORDER :{WHITE}Não é possível modificar esta ordem... -STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Impossível mover esta ordem... -STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Impossível saltar esta ordem... -STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Impossível saltar ordem selecionada... +STR_ERROR_CAN_T_MOVE_THIS_ORDER :{WHITE}Não é possível mover esta ordem... +STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Não é possível saltar a ordem atual... +STR_ERROR_CAN_T_SKIP_TO_ORDER :{WHITE}Não é possível saltar a ordem selecionada... STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... veiculo não pode ir a todas as estações STR_ERROR_CAN_T_ADD_ORDER :{WHITE}... veiculo não pode ir a essa estação STR_ERROR_CAN_T_ADD_ORDER_SHARED :{WHITE}... um veículo a partilhar esta ordem não pode ir a essa estação @@ -5409,7 +5409,7 @@ STR_ERROR_CAN_T_COPY_ORDER_VEHICLE_LIST :{WHITE}... nem STR_ERROR_CAN_T_SHARE_ORDER_VEHICLE_LIST :{WHITE}... nem todos os veículos estão a partilhar ordens STR_ERROR_CAN_T_SHARE_ORDER_LIST :{WHITE}Não é possível partilhar a lista de ordens... -STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Impossível parar de partilhar a lista de ordens... +STR_ERROR_CAN_T_STOP_SHARING_ORDER_LIST :{WHITE}Não é possível parar de partilhar a lista de ordens... STR_ERROR_CAN_T_COPY_ORDER_LIST :{WHITE}Não é possível copiar a lista de ordens... STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... muito distante do destino anterior STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... o avião não tem alcance suficiente @@ -5430,7 +5430,7 @@ STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}Não exi STR_ERROR_NO_BUOY :{WHITE}Não existe uma boia # Timetable related errors -STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossível programar veículo... +STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Não é possível programar o horário do veículo... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos apenas podem esperar em estações. STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este veículo não pára nesta estação. STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horário incompleto From 0715903b240a33ff2cc153deca4b15030001bf9d Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Thu, 19 Jun 2025 21:09:37 +0200 Subject: [PATCH 038/280] Codechange: Use an enum for vehicle acceleration model. --- src/build_vehicle_gui.cpp | 2 +- src/engine_gui.cpp | 2 +- src/engine_type.h | 7 +++++++ src/ground_vehicle.cpp | 2 +- src/newgrf/newgrf_act0_railtypes.cpp | 2 +- src/rail.h | 2 +- src/roadveh.h | 6 +++--- src/table/railtypes.h | 8 ++++---- src/train.h | 2 +- src/train_cmd.cpp | 4 ++-- src/vehicle_gui.cpp | 2 +- 11 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 51c5160cc8..2732578f79 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -637,7 +637,7 @@ static int DrawRailEnginePurchaseInfo(int left, int right, int y, EngineID engin y += GetCharacterHeight(FS_NORMAL); /* Max tractive effort - not applicable if old acceleration or maglev */ - if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(rvi->railtype)->acceleration_type != 2) { + if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(rvi->railtype)->acceleration_type != VehicleAccelerationModel::Maglev) { DrawString(left, right, y, GetString(STR_PURCHASE_INFO_MAX_TE, e->GetDisplayMaxTractiveEffort())); y += GetCharacterHeight(FS_NORMAL); } diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 5b624ef303..68b44f6905 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -181,7 +181,7 @@ static std::string GetTrainEngineInfoString(const Engine &e) res << GetString(STR_ENGINE_PREVIEW_COST_WEIGHT, e.GetCost(), e.GetDisplayWeight()); res << '\n'; - if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(e.u.rail.railtype)->acceleration_type != 2) { + if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(e.u.rail.railtype)->acceleration_type != VehicleAccelerationModel::Maglev) { res << GetString(STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE, PackVelocity(e.GetDisplayMaxSpeed(), e.type), e.GetPower(), e.GetDisplayMaxTractiveEffort()); res << '\n'; } else { diff --git a/src/engine_type.h b/src/engine_type.h index 94f797430e..5d35a11bd4 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -43,6 +43,13 @@ enum EngineClass : uint8_t { EC_MAGLEV, ///< Maglev engine. }; +/** Acceleration model of a vehicle. */ +enum class VehicleAccelerationModel : uint8_t { + Normal, ///< Default acceleration model. + Monorail, ///< Monorail acceleration model. + Maglev, ///< Maglev acceleration model. +}; + /** Information about a rail vehicle. */ struct RailVehicleInfo { uint8_t image_index = 0; diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp index ca8fe65fcf..a5b638f09a 100644 --- a/src/ground_vehicle.cpp +++ b/src/ground_vehicle.cpp @@ -131,7 +131,7 @@ int GroundVehicle::GetAcceleration() const */ int64_t resistance = 0; - bool maglev = v->GetAccelerationType() == 2; + bool maglev = v->GetAccelerationType() == VehicleAccelerationModel::Maglev; const int area = v->GetAirDragArea(); if (!maglev) { diff --git a/src/newgrf/newgrf_act0_railtypes.cpp b/src/newgrf/newgrf_act0_railtypes.cpp index 0ab9fdbb9e..27394f8bf4 100644 --- a/src/newgrf/newgrf_act0_railtypes.cpp +++ b/src/newgrf/newgrf_act0_railtypes.cpp @@ -118,7 +118,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint first, uint last, int prop, Byte break; case 0x15: // Acceleration model - rti->acceleration_type = Clamp(buf.ReadByte(), 0, 2); + rti->acceleration_type = static_cast(Clamp(buf.ReadByte(), 0, 2)); break; case 0x16: // Map colour diff --git a/src/rail.h b/src/rail.h index 4e9e62ee76..68323b0388 100644 --- a/src/rail.h +++ b/src/rail.h @@ -211,7 +211,7 @@ public: /** * Acceleration type of this rail type */ - uint8_t acceleration_type; + VehicleAccelerationModel acceleration_type; /** * Maximum speed for vehicles travelling on this rail type diff --git a/src/roadveh.h b/src/roadveh.h index 56aae919c4..8657512d1e 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -250,11 +250,11 @@ protected: // These functions should not be called outside acceleration code. /** * Allows to know the acceleration type of a vehicle. - * @return Zero, road vehicles always use a normal acceleration method. + * @return \c VehicleAccelerationModel::Normal, road vehicles always use a normal acceleration method. */ - inline int GetAccelerationType() const + inline VehicleAccelerationModel GetAccelerationType() const { - return 0; + return VehicleAccelerationModel::Normal; } /** diff --git a/src/table/railtypes.h b/src/table/railtypes.h index 71b64418e1..0b0112322e 100644 --- a/src/table/railtypes.h +++ b/src/table/railtypes.h @@ -86,7 +86,7 @@ static const RailTypeInfo _original_railtypes[] = { 8, /* acceleration type */ - 0, + VehicleAccelerationModel::Normal, /* max speed */ 0, @@ -188,7 +188,7 @@ static const RailTypeInfo _original_railtypes[] = { 12, /* acceleration type */ - 0, + VehicleAccelerationModel::Normal, /* max speed */ 0, @@ -286,7 +286,7 @@ static const RailTypeInfo _original_railtypes[] = { 16, /* acceleration type */ - 1, + VehicleAccelerationModel::Monorail, /* max speed */ 0, @@ -384,7 +384,7 @@ static const RailTypeInfo _original_railtypes[] = { 24, /* acceleration type */ - 2, + VehicleAccelerationModel::Maglev, /* max speed */ 0, diff --git a/src/train.h b/src/train.h index b7ff1a6581..ee1b499c1c 100644 --- a/src/train.h +++ b/src/train.h @@ -302,7 +302,7 @@ protected: // These functions should not be called outside acceleration code. * Allows to know the acceleration type of a vehicle. * @return Acceleration type of the vehicle. */ - inline int GetAccelerationType() const + inline VehicleAccelerationModel GetAccelerationType() const { return GetRailTypeInfo(this->railtype)->acceleration_type; } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index a5532c34d9..d3dbcf13b6 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3074,7 +3074,7 @@ static inline void AffectSpeedByZChange(Train *v, int old_z) { if (old_z == v->z_pos || _settings_game.vehicle.train_acceleration_model != AM_ORIGINAL) return; - const AccelerationSlowdownParams *asp = &_accel_slowdown[GetRailTypeInfo(v->railtype)->acceleration_type]; + const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(GetRailTypeInfo(v->railtype)->acceleration_type)]; if (old_z < v->z_pos) { v->cur_speed -= (v->cur_speed * asp->z_up >> 8); @@ -3481,7 +3481,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) if (chosen_dir != v->direction) { if (prev == nullptr && _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) { - const AccelerationSlowdownParams *asp = &_accel_slowdown[GetRailTypeInfo(v->railtype)->acceleration_type]; + const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(GetRailTypeInfo(v->railtype)->acceleration_type)]; DirDiff diff = DirDifference(v->direction, chosen_dir); v->cur_speed -= (diff == DIRDIFF_45RIGHT || diff == DIRDIFF_45LEFT ? asp->small_turn : asp->large_turn) * v->cur_speed >> 8; } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5a0f6846f2..c644664afb 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2598,7 +2598,7 @@ struct VehicleDetailsWindow : Window { (v->type == VEH_ROAD && _settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL)) { const GroundVehicleCache *gcache = v->GetGroundVehicleCache(); if (v->type == VEH_TRAIN && (_settings_game.vehicle.train_acceleration_model == AM_ORIGINAL || - GetRailTypeInfo(Train::From(v)->railtype)->acceleration_type == 2)) { + GetRailTypeInfo(Train::From(v)->railtype)->acceleration_type == VehicleAccelerationModel::Maglev)) { DrawString(tr, GetString(STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, gcache->cached_weight, gcache->cached_power, max_speed)); } else { DrawString(tr, GetString(STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE, gcache->cached_weight, gcache->cached_power, max_speed, gcache->cached_max_te)); From 3ac1a2f1e408625d5f06028d1aea0e2d129d693c Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Fri, 13 Jun 2025 21:01:31 +0200 Subject: [PATCH 039/280] Codechange: Store the rail type of rail engines as a RailTypes bitmask. --- src/articulated_vehicles.cpp | 2 +- src/autoreplace_cmd.cpp | 2 +- src/autoreplace_gui.cpp | 2 +- src/build_vehicle_gui.cpp | 14 +++++-- src/elrail.cpp | 13 +++--- src/engine.cpp | 7 ++-- src/engine_gui.cpp | 10 ++++- src/engine_type.h | 4 +- src/newgrf.cpp | 27 ++++++++---- src/newgrf/newgrf_act0_trains.cpp | 15 +++---- src/newgrf/newgrf_internal_vehicle.h | 2 +- src/newgrf_engine.cpp | 6 +-- src/pathfinder/yapf/yapf_destrail.hpp | 2 +- src/pbs.cpp | 4 +- src/rail.cpp | 12 +++--- src/rail.h | 60 +++++++++++++++++++++++++++ src/rail_cmd.cpp | 4 +- src/saveload/afterload.cpp | 6 +-- src/saveload/oldloader_sl.cpp | 9 +++- src/saveload/saveload.h | 1 + src/saveload/vehicle_sl.cpp | 9 +++- src/script/api/script_engine.cpp | 6 +-- src/script/api/script_engine.hpp | 4 +- src/train.h | 24 +++++------ src/train_cmd.cpp | 22 +++++----- src/vehicle.cpp | 2 +- src/vehicle_gui.cpp | 2 +- 27 files changed, 184 insertions(+), 87 deletions(-) diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index ffb2fc052b..9ffc0a6e8f 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -363,7 +363,7 @@ void AddArticulatedParts(Vehicle *first) t->subtype = 0; t->track = front->track; - t->railtype = front->railtype; + t->railtypes = front->railtypes; t->spritenum = e_artic->u.rail.image_index; if (e_artic->CanCarryCargo()) { diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 3ff1515b01..0798c679b3 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -71,7 +71,7 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company) switch (type) { case VEH_TRAIN: { /* make sure the railtypes are compatible */ - if (!GetRailTypeInfo(e_from->u.rail.railtype)->compatible_railtypes.Any(GetRailTypeInfo(e_to->u.rail.railtype)->compatible_railtypes)) return false; + if (!GetAllCompatibleRailTypes(e_from->u.rail.railtypes).Any(GetAllCompatibleRailTypes(e_to->u.rail.railtypes))) return false; /* make sure we do not replace wagons with engines or vice versa */ if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false; diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 58fb5124d5..081a8a8ace 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -111,7 +111,7 @@ class ReplaceVehicleWindow : public Window { if (draw_left && this->sel_railtype != INVALID_RAILTYPE) { /* Ensure that the railtype is specific to the selected one */ - if (rvi->railtype != this->sel_railtype) return false; + if (!rvi->railtypes.Test(this->sel_railtype)) return false; } return true; } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 2732578f79..93655d9f9e 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -637,9 +637,15 @@ static int DrawRailEnginePurchaseInfo(int left, int right, int y, EngineID engin y += GetCharacterHeight(FS_NORMAL); /* Max tractive effort - not applicable if old acceleration or maglev */ - if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(rvi->railtype)->acceleration_type != VehicleAccelerationModel::Maglev) { - DrawString(left, right, y, GetString(STR_PURCHASE_INFO_MAX_TE, e->GetDisplayMaxTractiveEffort())); - y += GetCharacterHeight(FS_NORMAL); + if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL) { + bool is_maglev = true; + for (RailType rt : rvi->railtypes) { + is_maglev &= GetRailTypeInfo(rt)->acceleration_type == VehicleAccelerationModel::Maglev; + } + if (!is_maglev) { + DrawString(left, right, y, GetString(STR_PURCHASE_INFO_MAX_TE, e->GetDisplayMaxTractiveEffort())); + y += GetCharacterHeight(FS_NORMAL); + } } /* Running cost */ @@ -1378,7 +1384,7 @@ struct BuildVehicleWindow : Window { EngineID eid = e->index; const RailVehicleInfo *rvi = &e->u.rail; - if (this->filter.railtype != INVALID_RAILTYPE && !HasPowerOnRail(rvi->railtype, this->filter.railtype)) continue; + if (this->filter.railtype != INVALID_RAILTYPE && !HasPowerOnRail(rvi->railtypes, this->filter.railtype)) continue; if (!IsEngineBuildable(eid, VEH_TRAIN, _local_company)) continue; /* Filter now! So num_engines and num_wagons is valid */ diff --git a/src/elrail.cpp b/src/elrail.cpp index 0d69ded928..720da0f26b 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -580,15 +580,13 @@ void SettingsDisableElrail(int32_t new_value) void UpdateDisableElrailSettingState(bool disable, bool update_vehicles) { - /* pick appropriate railtype for elrail engines depending on setting */ - const RailType new_railtype = disable ? RAILTYPE_RAIL : RAILTYPE_ELECTRIC; - /* walk through all train engines */ for (Engine *e : Engine::IterateType(VEH_TRAIN)) { RailVehicleInfo *rv_info = &e->u.rail; /* update railtype of engines intended to use elrail */ - if (rv_info->intended_railtype == RAILTYPE_ELECTRIC) { - rv_info->railtype = new_railtype; + if (rv_info->intended_railtypes.Test(RAILTYPE_ELECTRIC)) { + rv_info->railtypes.Set(RAILTYPE_ELECTRIC, !disable); + rv_info->railtypes.Set(RAILTYPE_RAIL, disable); } } @@ -596,11 +594,12 @@ void UpdateDisableElrailSettingState(bool disable, bool update_vehicles) * normal rail too */ if (disable) { for (Train *t : Train::Iterate()) { - if (t->railtype == RAILTYPE_ELECTRIC) { + if (t->railtypes.Test(RAILTYPE_ELECTRIC)) { /* this railroad vehicle is now compatible only with elrail, * so add there also normal rail compatibility */ t->compatible_railtypes.Set(RAILTYPE_RAIL); - t->railtype = RAILTYPE_RAIL; + t->railtypes.Reset(RAILTYPE_ELECTRIC); + t->railtypes.Set(RAILTYPE_RAIL); t->flags.Set(VehicleRailFlag::AllowedOnNormalRail); } } diff --git a/src/engine.cpp b/src/engine.cpp index a89713162d..68b9e1b0d1 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1107,8 +1107,9 @@ static void NewVehicleAvailable(Engine *e) if (e->type == VEH_TRAIN) { /* maybe make another rail type available */ - assert(e->u.rail.railtype < RAILTYPE_END); - for (Company *c : Company::Iterate()) c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes, TimerGameCalendar::date); + assert(e->u.rail.railtypes != RailTypes{}); + RailTypes introduced = GetAllIntroducesRailTypes(e->u.rail.railtypes); + for (Company *c : Company::Iterate()) c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | introduced, TimerGameCalendar::date); } else if (e->type == VEH_ROAD) { /* maybe make another road type available */ assert(e->u.road.roadtype < ROADTYPE_END); @@ -1267,7 +1268,7 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company) if (type == VEH_TRAIN && company != OWNER_DEITY) { /* Check if the rail type is available to this company */ const Company *c = Company::Get(company); - if (!GetRailTypeInfo(e->u.rail.railtype)->compatible_railtypes.Any(c->avail_railtypes)) return false; + if (!GetAllCompatibleRailTypes(e->u.rail.railtypes).Any(c->avail_railtypes)) return false; } if (type == VEH_ROAD && company != OWNER_DEITY) { /* Check if the road type is available to this company */ diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 68b44f6905..c494da2ef7 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -47,7 +47,8 @@ StringID GetEngineCategoryName(EngineID engine) case VEH_AIRCRAFT: return STR_ENGINE_PREVIEW_AIRCRAFT; case VEH_SHIP: return STR_ENGINE_PREVIEW_SHIP; case VEH_TRAIN: - return GetRailTypeInfo(e->u.rail.railtype)->strings.new_loco; + assert(e->u.rail.railtypes.Any()); + return GetRailTypeInfo(e->u.rail.railtypes.GetNthSetBit(0).value())->strings.new_loco; } } @@ -181,7 +182,12 @@ static std::string GetTrainEngineInfoString(const Engine &e) res << GetString(STR_ENGINE_PREVIEW_COST_WEIGHT, e.GetCost(), e.GetDisplayWeight()); res << '\n'; - if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && GetRailTypeInfo(e.u.rail.railtype)->acceleration_type != VehicleAccelerationModel::Maglev) { + bool is_maglev = true; + for (RailType rt : e.u.rail.railtypes) { + is_maglev &= GetRailTypeInfo(rt)->acceleration_type == VehicleAccelerationModel::Maglev; + } + + if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL && !is_maglev) { res << GetString(STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE, PackVelocity(e.GetDisplayMaxSpeed(), e.type), e.GetPower(), e.GetDisplayMaxTractiveEffort()); res << '\n'; } else { diff --git a/src/engine_type.h b/src/engine_type.h index 5d35a11bd4..1fefbe1ba1 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -55,8 +55,8 @@ struct RailVehicleInfo { uint8_t image_index = 0; RailVehicleTypes railveh_type{}; uint8_t cost_factor = 0; ///< Purchase cost factor; For multiheaded engines the sum of both engine prices. - RailType railtype{}; ///< Railtype, mangled if elrail is disabled. - RailType intended_railtype{}; ///< Intended railtype, regardless of elrail being enabled or disabled. + RailTypes railtypes{}; ///< Railtypes, mangled if elrail is disabled. + RailTypes intended_railtypes{}; ///< Intended railtypes, regardless of elrail being enabled or disabled. uint8_t ai_passenger_only = 0; ///< Bit value to tell AI that this engine is for passenger use only uint16_t max_speed = 0; ///< Maximum speed (1 unit = 1/1.6 mph = 1 km-ish/h) uint16_t power = 0; ///< Power of engine (hp); For multiheaded engines the sum of both engine powers. diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 63ae6a7d59..547b1bbc43 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -271,7 +271,8 @@ Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t internal_id _gted.resize(Engine::GetPoolSize()); } if (type == VEH_TRAIN) { - _gted[e->index].railtypelabel = GetRailTypeInfo(e->u.rail.railtype)->label; + _gted[e->index].railtypelabels.clear(); + for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); } GrfMsg(5, "Created new engine at index {} for GRFID {:x}, type {}, index {}", e->index, std::byteswap(file->grfid), type, internal_id); @@ -425,7 +426,8 @@ void ResetNewGRFData() /* Fill rail type label temporary data for default trains */ for (const Engine *e : Engine::IterateType(VEH_TRAIN)) { - _gted[e->index].railtypelabel = GetRailTypeInfo(e->u.rail.railtype)->label; + _gted[e->index].railtypelabels.clear(); + for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); } /* Reset GRM reservations */ @@ -864,7 +866,11 @@ static void FinaliseEngineArray() if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue; switch (e->type) { - case VEH_TRAIN: AppendCopyableBadgeList(e->badges, GetRailTypeInfo(e->u.rail.railtype)->badges, GSF_TRAINS); break; + case VEH_TRAIN: + for (RailType rt : e->u.rail.railtypes) { + AppendCopyableBadgeList(e->badges, GetRailTypeInfo(rt)->badges, GSF_TRAINS); + } + break; case VEH_ROAD: AppendCopyableBadgeList(e->badges, GetRoadTypeInfo(e->u.road.roadtype)->badges, GSF_ROADVEHICLES); break; default: break; } @@ -1711,13 +1717,18 @@ static void AfterLoadGRFs() } for (Engine *e : Engine::IterateType(VEH_TRAIN)) { - RailType railtype = GetRailTypeByLabel(_gted[e->index].railtypelabel); - if (railtype == INVALID_RAILTYPE) { + RailTypes railtypes{}; + for (RailTypeLabel label : _gted[e->index].railtypelabels) { + auto rt = GetRailTypeByLabel(label); + if (rt != INVALID_RAILTYPE) railtypes.Set(rt); + } + + if (railtypes.Any()) { + e->u.rail.railtypes = railtypes; + e->u.rail.intended_railtypes = railtypes; + } else { /* Rail type is not available, so disable this engine */ e->info.climates = {}; - } else { - e->u.rail.railtype = railtype; - e->u.rail.intended_railtype = railtype; } } diff --git a/src/newgrf/newgrf_act0_trains.cpp b/src/newgrf/newgrf_act0_trains.cpp index 445dbf294b..cc550130d1 100644 --- a/src/newgrf/newgrf_act0_trains.cpp +++ b/src/newgrf/newgrf_act0_trains.cpp @@ -41,15 +41,16 @@ ChangeInfoResult RailVehicleChangeInfo(uint first, uint last, int prop, ByteRead case 0x05: { // Track type uint8_t tracktype = buf.ReadByte(); + _gted[e->index].railtypelabels.clear(); if (tracktype < _cur_gps.grffile->railtype_list.size()) { - _gted[e->index].railtypelabel = _cur_gps.grffile->railtype_list[tracktype]; + _gted[e->index].railtypelabels.push_back(_cur_gps.grffile->railtype_list[tracktype]); break; } switch (tracktype) { - case 0: _gted[e->index].railtypelabel = rvi->engclass >= 2 ? RAILTYPE_LABEL_ELECTRIC : RAILTYPE_LABEL_RAIL; break; - case 1: _gted[e->index].railtypelabel = RAILTYPE_LABEL_MONO; break; - case 2: _gted[e->index].railtypelabel = RAILTYPE_LABEL_MAGLEV; break; + case 0: _gted[e->index].railtypelabels.push_back(rvi->engclass >= 2 ? RAILTYPE_LABEL_ELECTRIC : RAILTYPE_LABEL_RAIL); break; + case 1: _gted[e->index].railtypelabels.push_back(RAILTYPE_LABEL_MONO); break; + case 2: _gted[e->index].railtypelabels.push_back(RAILTYPE_LABEL_MAGLEV); break; default: GrfMsg(1, "RailVehicleChangeInfo: Invalid track type {} specified, ignoring", tracktype); break; @@ -179,11 +180,11 @@ ChangeInfoResult RailVehicleChangeInfo(uint first, uint last, int prop, ByteRead break; } - if (_cur_gps.grffile->railtype_list.empty()) { + if (_cur_gps.grffile->railtype_list.empty() && !_gted[e->index].railtypelabels.empty()) { /* Use traction type to select between normal and electrified * rail only when no translation list is in place. */ - if (_gted[e->index].railtypelabel == RAILTYPE_LABEL_RAIL && engclass >= EC_ELECTRIC) _gted[e->index].railtypelabel = RAILTYPE_LABEL_ELECTRIC; - if (_gted[e->index].railtypelabel == RAILTYPE_LABEL_ELECTRIC && engclass < EC_ELECTRIC) _gted[e->index].railtypelabel = RAILTYPE_LABEL_RAIL; + if (_gted[e->index].railtypelabels[0] == RAILTYPE_LABEL_RAIL && engclass >= EC_ELECTRIC) _gted[e->index].railtypelabels[0] = RAILTYPE_LABEL_ELECTRIC; + if (_gted[e->index].railtypelabels[0] == RAILTYPE_LABEL_ELECTRIC && engclass < EC_ELECTRIC) _gted[e->index].railtypelabels[0] = RAILTYPE_LABEL_RAIL; } rvi->engclass = engclass; diff --git a/src/newgrf/newgrf_internal_vehicle.h b/src/newgrf/newgrf_internal_vehicle.h index 185382c530..05a35b286a 100644 --- a/src/newgrf/newgrf_internal_vehicle.h +++ b/src/newgrf/newgrf_internal_vehicle.h @@ -27,7 +27,7 @@ struct GRFTempEngineData { CargoClasses cargo_allowed; ///< Bitmask of cargo classes that are allowed as a refit. CargoClasses cargo_allowed_required; ///< Bitmask of cargo classes that are required to be all present to allow a cargo as a refit. CargoClasses cargo_disallowed; ///< Bitmask of cargo classes that are disallowed as a refit. - RailTypeLabel railtypelabel; + std::vector railtypelabels; uint8_t roadtramtype; const GRFFile *defaultcargo_grf; ///< GRF defining the cargo translation table to use if the default cargo is the 'first refittable'. Refittability refittability; ///< Did the newgrf set any refittability property? If not, default refittability will be applied. diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 8248a0bbf0..5d1f7ba7fe 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -565,7 +565,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec RailType rt = GetTileRailType(v->tile); const RailTypeInfo *rti = GetRailTypeInfo(rt); return (rti->flags.Test(RailTypeFlag::Catenary) ? 0x200 : 0) | - (HasPowerOnRail(Train::From(v)->railtype, rt) ? 0x100 : 0) | + (HasPowerOnRail(Train::From(v)->railtypes, rt) ? 0x100 : 0) | GetReverseRailTypeTranslation(rt, object->ro.grffile); } @@ -732,7 +732,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec const Train *u = is_powered_wagon ? t->First() : t; // for powered wagons the engine defines the type of engine (i.e. railtype) RailType railtype = GetRailType(v->tile); bool powered = t->IsEngine() || is_powered_wagon; - bool has_power = HasPowerOnRail(u->railtype, railtype); + bool has_power = HasPowerOnRail(u->railtypes, railtype); if (powered && has_power) SetBit(modflags, 5); if (powered && !has_power) SetBit(modflags, 6); @@ -915,7 +915,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec Train *t = Train::From(v); switch (variable - 0x80) { case 0x62: return t->track; - case 0x66: return t->railtype; + case 0x66: return t->railtypes.GetNthSetBit(0).value_or(RailType::INVALID_RAILTYPE); case 0x73: return 0x80 + VEHICLE_LENGTH - t->gcache.cached_veh_length; case 0x74: return t->gcache.cached_power; case 0x75: return GB(t->gcache.cached_power, 8, 24); diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 1c312c11e2..55a3f2bc62 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -22,7 +22,7 @@ public: void SetDestination(const Train *v, bool override_rail_type = false) { this->compatible_railtypes = v->compatible_railtypes; - if (override_rail_type) this->compatible_railtypes.Set(GetRailTypeInfo(v->railtype)->compatible_railtypes); + if (override_rail_type) this->compatible_railtypes.Set(GetAllCompatibleRailTypes(v->railtypes)); } bool IsCompatibleRailType(RailType rt) diff --git a/src/pbs.cpp b/src/pbs.cpp index 8537c17aa5..f47c990c6d 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -296,7 +296,7 @@ PBSTileInfo FollowTrainReservation(const Train *v, Vehicle **train_on_res) if (IsRailDepotTile(tile) && !GetDepotReservationTrackBits(tile)) return PBSTileInfo(tile, trackdir, false); FindTrainOnTrackInfo ftoti; - ftoti.res = FollowReservation(v->owner, GetRailTypeInfo(v->railtype)->compatible_railtypes, tile, trackdir); + ftoti.res = FollowReservation(v->owner, GetAllCompatibleRailTypes(v->railtypes), tile, trackdir); ftoti.res.okay = IsSafeWaitingPosition(v, ftoti.res.tile, ftoti.res.trackdir, true, _settings_game.pf.forbid_90_deg); if (train_on_res != nullptr) { CheckTrainsOnTrack(ftoti, ftoti.res.tile); @@ -388,7 +388,7 @@ bool IsSafeWaitingPosition(const Train *v, TileIndex tile, Trackdir trackdir, bo } /* Check next tile. For performance reasons, we check for 90 degree turns ourself. */ - CFollowTrackRail ft(v, GetRailTypeInfo(v->railtype)->compatible_railtypes); + CFollowTrackRail ft(v, GetAllCompatibleRailTypes(v->railtypes)); /* End of track? */ if (!ft.Follow(tile, trackdir)) { diff --git a/src/rail.cpp b/src/rail.cpp index 5e6682317d..852a4dce6f 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -132,11 +132,11 @@ RailTypes GetCompanyRailTypes(CompanyID company, bool introduces) const RailVehicleInfo *rvi = &e->u.rail; if (rvi->railveh_type != RAILVEH_WAGON) { - assert(rvi->railtype < RAILTYPE_END); + assert(rvi->railtypes.Any()); if (introduces) { - rts.Set(GetRailTypeInfo(rvi->railtype)->introduces_railtypes); + rts.Set(GetAllIntroducesRailTypes(rvi->railtypes)); } else { - rts.Set(rvi->railtype); + rts.Set(rvi->railtypes); } } } @@ -161,11 +161,11 @@ RailTypes GetRailTypes(bool introduces) const RailVehicleInfo *rvi = &e->u.rail; if (rvi->railveh_type != RAILVEH_WAGON) { - assert(rvi->railtype < RAILTYPE_END); + assert(rvi->railtypes.Any()); if (introduces) { - rts.Set(GetRailTypeInfo(rvi->railtype)->introduces_railtypes); + rts.Set(GetAllIntroducesRailTypes(rvi->railtypes)); } else { - rts.Set(rvi->railtype); + rts.Set(rvi->railtypes); } } } diff --git a/src/rail.h b/src/rail.h index 68323b0388..4a294e213d 100644 --- a/src/rail.h +++ b/src/rail.h @@ -314,6 +314,42 @@ inline RailType GetRailTypeInfoIndex(const RailTypeInfo *rti) return static_cast(index); } +/** + * Returns all compatible railtypes for a set of railtypes. + * @param railtypes Set of railtypes to get the compatible railtypes from. + * @return Union of all compatible railtypes. + */ +inline RailTypes GetAllCompatibleRailTypes(RailTypes railtypes) +{ + RailTypes compatible{}; + for (RailType rt : railtypes) compatible.Set(GetRailTypeInfo(rt)->compatible_railtypes); + return compatible; +} + +/** + * Returns all powered railtypes for a set of railtypes. + * @param railtypes Set of railtypes to get the powered railtypes from. + * @return Union of all powered railtypes. + */ +inline RailTypes GetAllPoweredRailTypes(RailTypes railtypes) +{ + RailTypes powered{}; + for (RailType rt : railtypes) powered.Set(GetRailTypeInfo(rt)->powered_railtypes); + return powered; +} + +/** + * Returns all introduced railtypes for a set of railtypes. + * @param railtypes Set of railtypes to get the introduced railtypes from. + * @return Union of all introduced railtypes. + */ +inline RailTypes GetAllIntroducesRailTypes(RailTypes railtypes) +{ + RailTypes introduces{}; + for (RailType rt : railtypes) introduces.Set(GetRailTypeInfo(rt)->introduces_railtypes); + return introduces; +} + /** * Checks if an engine of the given RailType can drive on a tile with a given * RailType. This would normally just be an equality check, but for electric @@ -327,6 +363,18 @@ inline bool IsCompatibleRail(RailType enginetype, RailType tiletype) return GetRailTypeInfo(enginetype)->compatible_railtypes.Test(tiletype); } +/** + * Checks if an engine of the given RailTypes can drive on a tile with a given + * RailType. + * @param enginetype The RailTypes of the engine we are considering. + * @param tiletype The RailType of the tile we are considering. + * @return Whether the engine can drive on this tile. + */ +inline bool IsCompatibleRail(RailTypes enginetype, RailType tiletype) +{ + return GetAllCompatibleRailTypes(enginetype).Test(tiletype); +} + /** * Checks if an engine of the given RailType got power on a tile with a given * RailType. This would normally just be an equality check, but for electric @@ -340,6 +388,18 @@ inline bool HasPowerOnRail(RailType enginetype, RailType tiletype) return GetRailTypeInfo(enginetype)->powered_railtypes.Test(tiletype); } +/** + * Checks if an engine of the given RailTypes got power on a tile with a given + * RailType. + * @param enginetype The RailTypes of the engine we are considering. + * @param tiletype The RailType of the tile we are considering. + * @return Whether the engine got power on this tile. + */ +inline bool HasPowerOnRail(RailTypes enginetype, RailType tiletype) +{ + return GetAllPoweredRailTypes(enginetype).Test(tiletype); +} + /** * Test if a RailType disallows build of level crossings. * @param rt The RailType to check. diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 08728bb403..fa70279955 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1605,7 +1605,7 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_ Track track; while ((track = RemoveFirstTrack(&reserved)) != INVALID_TRACK) { Train *v = GetTrainForReservation(tile, track); - if (v != nullptr && !HasPowerOnRail(v->railtype, totype)) { + if (v != nullptr && !HasPowerOnRail(v->railtypes, totype)) { /* No power on new rail type, reroute. */ FreeTrainTrackReservation(v); vehicles_affected.push_back(v); @@ -1691,7 +1691,7 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_ Track track = DiagDirToDiagTrack(GetTunnelBridgeDirection(tile)); if (HasTunnelBridgeReservation(tile)) { Train *v = GetTrainForReservation(tile, track); - if (v != nullptr && !HasPowerOnRail(v->railtype, totype)) { + if (v != nullptr && !HasPowerOnRail(v->railtypes, totype)) { /* No power on new rail type, reroute. */ FreeTrainTrackReservation(v); vehicles_affected.push_back(v); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index b00de76b61..908249e533 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1333,10 +1333,10 @@ bool AfterLoadGame() RailType min_rail = RAILTYPE_ELECTRIC; for (Train *v : Train::Iterate()) { - RailType rt = RailVehInfo(v->engine_type)->railtype; + RailTypes rts = RailVehInfo(v->engine_type)->railtypes; - v->railtype = rt; - if (rt == RAILTYPE_ELECTRIC) min_rail = RAILTYPE_RAIL; + v->railtypes = rts; + if (rts.Test(RAILTYPE_ELECTRIC)) min_rail = RAILTYPE_RAIL; } /* .. so we convert the entire map from normal to elrail (so maintain "fairness") */ diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 880947c914..6d1f557b3b 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -1060,12 +1060,13 @@ static bool LoadOldCompany(LoadgameState &ls, int num) static uint32_t _old_order_ptr; static uint16_t _old_next_ptr; static typename VehicleID::BaseType _current_vehicle_id; +static RailType _old_railtype; static const OldChunks vehicle_train_chunk[] = { OCL_SVAR( OC_UINT8, Train, track ), OCL_SVAR( OC_UINT8, Train, force_proceed ), OCL_SVAR( OC_UINT16, Train, crash_anim_pos ), - OCL_SVAR( OC_UINT8, Train, railtype ), + OCL_VAR ( OC_UINT8, 1, &_old_railtype), OCL_NULL( 5 ), ///< Junk @@ -1306,7 +1307,7 @@ bool LoadOldVehicle(LoadgameState &ls, int num) if (v->spritenum / 2 >= lengthof(spriteset_rail)) return false; v->spritenum = spriteset_rail[v->spritenum / 2]; // adjust railway sprite set offset /* Should be the original values for monorail / rail, can't use RailType constants */ - Train::From(v)->railtype = static_cast(type == 0x25 ? 1 : 0); + Train::From(v)->railtypes = static_cast(type == 0x25 ? 1 : 0); break; } @@ -1367,6 +1368,10 @@ bool LoadOldVehicle(LoadgameState &ls, int num) Debug(oldloader, 0, "Loading failed - vehicle-array is invalid"); return false; } + + if (v->type == VEH_TRAIN) { + Train::From(v)->railtypes = _old_railtype; + } } if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) { diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 85cf3cf7ca..e27825a5dc 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -411,6 +411,7 @@ enum SaveLoadVersion : uint16_t { SLV_DOCKS_UNDER_BRIDGES, ///< 360 PR#14594 Allow docks under bridges. SLV_LOCKS_UNDER_BRIDGES, ///< 361 PR#14595 Allow locks under bridges. + SLV_ENGINE_MULTI_RAILTYPE, ///< 362 PR#14357 Train engines can have multiple railtypes. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 908793dc5c..a20daa3438 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -793,13 +793,16 @@ public: } }; +static RailType _old_railtype; + class SlVehicleTrain : public DefaultSaveLoadHandler { public: static inline const SaveLoad description[] = { SLEG_STRUCT("common", SlVehicleCommon), SLE_VAR(Train, crash_anim_pos, SLE_UINT16), SLE_VAR(Train, force_proceed, SLE_UINT8), - SLE_VAR(Train, railtype, SLE_UINT8), + SLEG_CONDVAR("railtype", _old_railtype, SLE_UINT8, SL_MIN_VERSION, SLV_ENGINE_MULTI_RAILTYPE), + SLE_VAR(Train, railtypes, SLE_UINT64), SLE_VAR(Train, track, SLE_UINT8), SLE_CONDVAR(Train, flags, SLE_FILE_U8 | SLE_VAR_U16, SLV_2, SLV_100), @@ -819,6 +822,10 @@ public: { if (v->type != VEH_TRAIN) return; SlObject(v, this->GetLoadDescription()); + + if (IsSavegameVersionBefore(SLV_ENGINE_MULTI_RAILTYPE)) { + Train::From(v)->railtypes = _old_railtype; + } } void FixPointers(Vehicle *v) const override diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index e7cf0a025a..92e72522ed 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -203,7 +203,7 @@ if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return false; if (!ScriptRail::IsRailTypeAvailable(track_rail_type)) return false; - return ::IsCompatibleRail((::RailType)::RailVehInfo(engine_id)->railtype, (::RailType)track_rail_type); + return ::IsCompatibleRail(::RailVehInfo(engine_id)->railtypes, (::RailType)track_rail_type); } /* static */ bool ScriptEngine::HasPowerOnRail(EngineID engine_id, ScriptRail::RailType track_rail_type) @@ -212,7 +212,7 @@ if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return false; if (!ScriptRail::IsRailTypeAvailable(track_rail_type)) return false; - return ::HasPowerOnRail((::RailType)::RailVehInfo(engine_id)->railtype, (::RailType)track_rail_type); + return ::HasPowerOnRail(::RailVehInfo(engine_id)->railtypes, (::RailType)track_rail_type); } /* static */ bool ScriptEngine::CanRunOnRoad(EngineID engine_id, ScriptRoad::RoadType road_type) @@ -242,7 +242,7 @@ if (!IsValidEngine(engine_id)) return ScriptRail::RAILTYPE_INVALID; if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return ScriptRail::RAILTYPE_INVALID; - return (ScriptRail::RailType)(uint)::RailVehInfo(engine_id)->railtype; + return static_cast(::RailVehInfo(engine_id)->railtypes.GetNthSetBit(0).value_or(::RailType::INVALID_RAILTYPE)); } /* static */ bool ScriptEngine::IsArticulated(EngineID engine_id) diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp index b1dd9141ad..84bf229efa 100644 --- a/src/script/api/script_engine.hpp +++ b/src/script/api/script_engine.hpp @@ -248,11 +248,11 @@ public: static ScriptRoad::RoadType GetRoadType(EngineID engine_id); /** - * Get the RailType of the engine. + * Get the first RailType of the engine. * @param engine_id The engine to get the RailType of. * @pre IsValidEngine(engine_id). * @pre GetVehicleType(engine_id) == ScriptVehicle::VT_RAIL. - * @return The RailType the engine has. + * @return The first RailType the engine has. */ static ScriptRail::RailType GetRailType(EngineID engine_id); diff --git a/src/train.h b/src/train.h index ee1b499c1c..f4bd7889ad 100644 --- a/src/train.h +++ b/src/train.h @@ -99,7 +99,7 @@ struct Train final : public GroundVehicle { Train *other_multiheaded_part = nullptr; RailTypes compatible_railtypes{}; - RailType railtype = INVALID_RAILTYPE; + RailTypes railtypes{}; TrackBits track{}; TrainForceProceeding force_proceed{}; @@ -180,6 +180,15 @@ struct Train final : public GroundVehicle { return this->gcache.cached_veh_length / 2 + (this->Next() != nullptr ? this->Next()->gcache.cached_veh_length + 1 : 0) / 2; } + /** + * Allows to know the acceleration type of a vehicle. + * @return Acceleration type of the vehicle. + */ + inline VehicleAccelerationModel GetAccelerationType() const + { + return GetRailTypeInfo(GetRailType(this->tile))->acceleration_type; + } + protected: // These functions should not be called outside acceleration code. /** @@ -189,7 +198,7 @@ protected: // These functions should not be called outside acceleration code. inline uint16_t GetPower() const { /* Power is not added for articulated parts */ - if (!this->IsArticulatedPart() && HasPowerOnRail(this->railtype, GetRailType(this->tile))) { + if (!this->IsArticulatedPart() && HasPowerOnRail(this->railtypes, GetRailType(this->tile))) { uint16_t power = GetVehicleProperty(this, PROP_TRAIN_POWER, RailVehInfo(this->engine_type)->power); /* Halve power for multiheaded parts */ if (this->IsMultiheaded()) power /= 2; @@ -206,7 +215,7 @@ protected: // These functions should not be called outside acceleration code. inline uint16_t GetPoweredPartPower(const Train *head) const { /* For powered wagons the engine defines the type of engine (i.e. railtype) */ - if (this->flags.Test(VehicleRailFlag::PoweredWagon) && HasPowerOnRail(head->railtype, GetRailType(this->tile))) { + if (this->flags.Test(VehicleRailFlag::PoweredWagon) && HasPowerOnRail(head->railtypes, GetRailType(this->tile))) { return RailVehInfo(this->gcache.first_engine)->pow_wag_power; } @@ -298,15 +307,6 @@ protected: // These functions should not be called outside acceleration code. return 15 * (512 + this->GetCurrentSpeed()) / 512; } - /** - * Allows to know the acceleration type of a vehicle. - * @return Acceleration type of the vehicle. - */ - inline VehicleAccelerationModel GetAccelerationType() const - { - return GetRailTypeInfo(this->railtype)->acceleration_type; - } - /** * Returns the slope steepness used by this vehicle. * @return Slope steepness used by the vehicle. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index d3dbcf13b6..93a5483cfc 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -127,7 +127,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) /* update the 'first engine' */ u->gcache.first_engine = this == u ? EngineID::Invalid() : first_engine; - u->railtype = rvi_u->railtype; + u->railtypes = rvi_u->railtypes; if (u->IsEngine()) first_engine = u->engine_type; @@ -172,13 +172,13 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) /* Do not count powered wagons for the compatible railtypes, as wagons always have railtype normal */ if (rvi_u->power > 0) { - this->compatible_railtypes.Set(GetRailTypeInfo(u->railtype)->powered_railtypes); + this->compatible_railtypes.Set(GetAllPoweredRailTypes(u->railtypes)); } /* Some electric engines can be allowed to run on normal rail. It happens to all * existing electric engines when elrails are disabled and then re-enabled */ if (u->flags.Test(VehicleRailFlag::AllowedOnNormalRail)) { - u->railtype = RAILTYPE_RAIL; + u->railtypes.Set(RAILTYPE_RAIL); u->compatible_railtypes.Set(RAILTYPE_RAIL); } @@ -639,7 +639,7 @@ static CommandCost CmdBuildRailWagon(DoCommandFlags flags, TileIndex tile, const const RailVehicleInfo *rvi = &e->u.rail; /* Check that the wagon can drive on the track in question */ - if (!IsCompatibleRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR; + if (!IsCompatibleRail(rvi->railtypes, GetRailType(tile))) return CMD_ERROR; if (flags.Test(DoCommandFlag::Execute)) { Train *v = new Train(); @@ -674,7 +674,7 @@ static CommandCost CmdBuildRailWagon(DoCommandFlags flags, TileIndex tile, const v->cargo_cap = rvi->capacity; v->refit_cap = 0; - v->railtype = rvi->railtype; + v->railtypes = rvi->railtypes; v->date_of_last_service = TimerGameEconomy::date; v->date_of_last_service_newgrf = TimerGameCalendar::date; @@ -741,7 +741,7 @@ static void AddRearEngineToMultiheadedTrain(Train *v) u->cargo_subtype = v->cargo_subtype; u->cargo_cap = v->cargo_cap; u->refit_cap = v->refit_cap; - u->railtype = v->railtype; + u->railtypes = v->railtypes; 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; @@ -776,7 +776,7 @@ CommandCost CmdBuildRailVehicle(DoCommandFlags flags, TileIndex tile, const Engi /* Check if depot and new engine uses the same kind of tracks * * We need to see if the engine got power on the tile to avoid electric engines in non-electric depots */ - if (!HasPowerOnRail(rvi->railtype, GetRailType(tile))) return CMD_ERROR; + if (!HasPowerOnRail(rvi->railtypes, GetRailType(tile))) return CMD_ERROR; if (flags.Test(DoCommandFlag::Execute)) { DiagDirection dir = GetRailDepotDirection(tile); @@ -808,7 +808,7 @@ CommandCost CmdBuildRailVehicle(DoCommandFlags flags, TileIndex tile, const Engi v->reliability_spd_dec = e->reliability_spd_dec; v->max_age = e->GetLifeLengthInDays(); - v->railtype = rvi->railtype; + v->railtypes = rvi->railtypes; v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_trains); v->date_of_last_service = TimerGameEconomy::date; @@ -2418,7 +2418,7 @@ void FreeTrainTrackReservation(const Train *v) /* Don't free reservation if it's not ours. */ if (TracksOverlap(GetReservedTrackbits(tile) | TrackToTrackBits(TrackdirToTrack(td)))) return; - CFollowTrackRail ft(v, GetRailTypeInfo(v->railtype)->compatible_railtypes); + CFollowTrackRail ft(v, GetAllCompatibleRailTypes(v->railtypes)); while (ft.Follow(tile, td)) { tile = ft.new_tile; TrackdirBits bits = ft.new_td_bits & TrackBitsToTrackdirBits(GetReservedTrackbits(tile)); @@ -3074,7 +3074,7 @@ static inline void AffectSpeedByZChange(Train *v, int old_z) { if (old_z == v->z_pos || _settings_game.vehicle.train_acceleration_model != AM_ORIGINAL) return; - const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(GetRailTypeInfo(v->railtype)->acceleration_type)]; + const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(v->GetAccelerationType())]; if (old_z < v->z_pos) { v->cur_speed -= (v->cur_speed * asp->z_up >> 8); @@ -3481,7 +3481,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) if (chosen_dir != v->direction) { if (prev == nullptr && _settings_game.vehicle.train_acceleration_model == AM_ORIGINAL) { - const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(GetRailTypeInfo(v->railtype)->acceleration_type)]; + const AccelerationSlowdownParams *asp = &_accel_slowdown[static_cast(v->GetAccelerationType())]; DirDiff diff = DirDifference(v->direction, chosen_dir); v->cur_speed -= (diff == DIRDIFF_45RIGHT || diff == DIRDIFF_45LEFT ? asp->small_turn : asp->large_turn) * v->cur_speed >> 8; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index bc039c3321..e6573b3726 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2837,7 +2837,7 @@ void Vehicle::ShowVisualEffect() const IsDepotTile(v->tile) || IsTunnelTile(v->tile) || (v->type == VEH_TRAIN && - !HasPowerOnRail(Train::From(v)->railtype, GetTileRailType(v->tile)))) { + !HasPowerOnRail(Train::From(v)->railtypes, GetTileRailType(v->tile)))) { continue; } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index c644664afb..fbd7a69b54 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2598,7 +2598,7 @@ struct VehicleDetailsWindow : Window { (v->type == VEH_ROAD && _settings_game.vehicle.roadveh_acceleration_model != AM_ORIGINAL)) { const GroundVehicleCache *gcache = v->GetGroundVehicleCache(); if (v->type == VEH_TRAIN && (_settings_game.vehicle.train_acceleration_model == AM_ORIGINAL || - GetRailTypeInfo(Train::From(v)->railtype)->acceleration_type == VehicleAccelerationModel::Maglev)) { + Train::From(v)->GetAccelerationType() == VehicleAccelerationModel::Maglev)) { DrawString(tr, GetString(STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED, gcache->cached_weight, gcache->cached_power, max_speed)); } else { DrawString(tr, GetString(STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE, gcache->cached_weight, gcache->cached_power, max_speed, gcache->cached_max_te)); From 1779da51c2e785a5fe18f719366eb37e9c1ca621 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Fri, 13 Jun 2025 21:19:34 +0200 Subject: [PATCH 040/280] Add: [NewGRF] Train property to set multiple track types for an engine. --- src/newgrf/newgrf_act0_trains.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/newgrf/newgrf_act0_trains.cpp b/src/newgrf/newgrf_act0_trains.cpp index cc550130d1..8f8a4c4121 100644 --- a/src/newgrf/newgrf_act0_trains.cpp +++ b/src/newgrf/newgrf_act0_trains.cpp @@ -328,6 +328,22 @@ ChangeInfoResult RailVehicleChangeInfo(uint first, uint last, int prop, ByteRead e->badges = ReadBadgeList(buf, GSF_TRAINS); break; + case 0x34: { // List of track types + uint8_t count = buf.ReadByte(); + + _gted[e->index].railtypelabels.clear(); + while (count--) { + uint8_t tracktype = buf.ReadByte(); + + if (tracktype < _cur_gps.grffile->railtype_list.size()) { + _gted[e->index].railtypelabels.push_back(_cur_gps.grffile->railtype_list[tracktype]); + } else { + GrfMsg(1, "RailVehicleChangeInfo: Invalid track type {} specified, ignoring", tracktype); + } + } + break; + } + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; From 313c6c45aa307835f4eb141e11c3bf68038bc3aa Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Fri, 13 Jun 2025 21:20:29 +0200 Subject: [PATCH 041/280] Add: [Script] Function to get all rail types of an rail engine. --- src/script/api/ai_changelog.hpp | 2 ++ src/script/api/game_changelog.hpp | 2 ++ src/script/api/script_engine.cpp | 8 ++++++++ src/script/api/script_engine.hpp | 10 ++++++++++ src/script/api/script_rail.hpp | 8 ++++++++ src/script/squirrel.cpp | 2 +- src/script/squirrel.hpp | 12 +++++++++--- 7 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 4732f0a2b8..9d976962a1 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -29,6 +29,7 @@ * \li AICargo::CC_NON_POTABLE * \li AIVehicleList_Waypoint * \li AIError::ERR_BRIDGE_TOO_LOW + * \li AIRail::GetAllRailTypes * * Other changes: * \li AIBridge::GetBridgeID renamed to AIBridge::GetBridgeType @@ -36,6 +37,7 @@ * \li AIList instances can now be saved * \li AIVehicleList_Station accepts an optional AIVehicle::VehicleType parameter * \li AIList instances can now be cloned + * \li AIRail::GetRailType will only return the first RailType of an engine, use AIRail::GetAllRailTypes instead * * \b 14.0 * diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 5509ee5dca..4a3a3111ab 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -30,6 +30,7 @@ * \li GSVehicleList_Waypoint * \li GSBaseStation::GetOwner * \li GSError:ERR_BRIDGE_TOO_LOW + * \li GSRail::GetAllRailTypes * * Other changes: * \li GSBridge::GetBridgeID renamed to GSBridge::GetBridgeType @@ -37,6 +38,7 @@ * \li GSList instances can now be saved * \li GSVehicleList_Station accepts an optional GSVehicle::VehicleType parameter * \li GSList instances can now be cloned + * \li GSRail::GetRailType will only return the first RailType of an engine, use GSRail::GetAllRailTypes instead * * \b 14.0 * diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index 92e72522ed..5b6ced3e13 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -245,6 +245,14 @@ return static_cast(::RailVehInfo(engine_id)->railtypes.GetNthSetBit(0).value_or(::RailType::INVALID_RAILTYPE)); } +/* static */ ScriptRail::RailTypes ScriptEngine::GetAllRailTypes(EngineID engine_id) +{ + if (!IsValidEngine(engine_id)) return ScriptRail::INVALID_RAILTYPES; + if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return ScriptRail::INVALID_RAILTYPES; + + return static_cast(::RailVehInfo(engine_id)->railtypes.base()); +} + /* static */ bool ScriptEngine::IsArticulated(EngineID engine_id) { if (!IsValidEngine(engine_id)) return false; diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp index 84bf229efa..01eaa03509 100644 --- a/src/script/api/script_engine.hpp +++ b/src/script/api/script_engine.hpp @@ -249,6 +249,7 @@ public: /** * Get the first RailType of the engine. + * @note This will only return the first RailType of a multi-system engine. Use GetAllRailTypes to get all rail types of the engine. * @param engine_id The engine to get the RailType of. * @pre IsValidEngine(engine_id). * @pre GetVehicleType(engine_id) == ScriptVehicle::VT_RAIL. @@ -256,6 +257,15 @@ public: */ static ScriptRail::RailType GetRailType(EngineID engine_id); + /** + * Get all RailType's of the engine. + * @param engine_id The engine to get all RailTypes of. + * @pre IsValidEngine(engine_id). + * @pre GetVehicleType(engine_id) == ScriptVehicle::VT_RAIL. + * @return All rail types of the engine. + */ + static ScriptRail::RailTypes GetAllRailTypes(EngineID engine_id); + /** * Check if the engine is articulated. * @param engine_id The engine to check. diff --git a/src/script/api/script_rail.hpp b/src/script/api/script_rail.hpp index 414aa15b7d..050539f5be 100644 --- a/src/script/api/script_rail.hpp +++ b/src/script/api/script_rail.hpp @@ -49,6 +49,14 @@ public: RAILTYPE_INVALID = ::INVALID_RAILTYPE, ///< Invalid RailType. }; + /** + * A bitmap with all possible rail types. + */ + enum RailTypes : int64_t { + /* Note: these values represent part of the in-game RailTypes enum */ + INVALID_RAILTYPES = INT64_MAX, ///< Invalid RailTypes. + }; + /** * A bitmap with all possible rail tracks on a tile. */ diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index 3484454c15..41e030fc1d 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -270,7 +270,7 @@ void Squirrel::AddMethod(std::string_view method_name, SQFUNCTION proc, std::str sq_newslot(this->vm, -3, SQFalse); } -void Squirrel::AddConst(std::string_view var_name, int value) +void Squirrel::AddConst(std::string_view var_name, SQInteger value) { ScriptAllocatorScope alloc_scope(this); diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp index 415f75ca10..847c8f38ba 100644 --- a/src/script/squirrel.hpp +++ b/src/script/squirrel.hpp @@ -104,15 +104,21 @@ public: * Adds a const to the stack. Depending on the current state this means * either a const to a class or to the global space. */ - void AddConst(std::string_view var_name, int value); + void AddConst(std::string_view var_name, SQInteger value); /** * Adds a const to the stack. Depending on the current state this means * either a const to a class or to the global space. */ - void AddConst(std::string_view var_name, uint value) { this->AddConst(var_name, (int)value); } + void AddConst(std::string_view var_name, uint value) { this->AddConst(var_name, (SQInteger)value); } - void AddConst(std::string_view var_name, const ConvertibleThroughBase auto &value) { this->AddConst(var_name, static_cast(value.base())); } + /** + * Adds a const to the stack. Depending on the current state this means + * either a const to a class or to the global space. + */ + void AddConst(std::string_view var_name, int value) { this->AddConst(var_name, (SQInteger)value); } + + void AddConst(std::string_view var_name, const ConvertibleThroughBase auto &value) { this->AddConst(var_name, static_cast(value.base())); } /** * Adds a const to the stack. Depending on the current state this means From 52e97c981cb3770c920db58e5c745d694c0dc329 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Mon, 8 Sep 2025 00:25:17 +0200 Subject: [PATCH 042/280] Add: Show all railtypes in the build vehicle and engine preview dialogs. --- src/build_vehicle_gui.cpp | 13 +++++++++++++ src/engine_gui.cpp | 14 ++++++++++++++ src/lang/english.txt | 2 ++ 3 files changed, 29 insertions(+) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 93655d9f9e..a40ad4ef35 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -632,6 +632,19 @@ static int DrawRailEnginePurchaseInfo(int left, int right, int y, EngineID engin } y += GetCharacterHeight(FS_NORMAL); + /* Supported rail types */ + std::string railtypes{}; + std::string_view list_separator = GetListSeparator(); + + for (const auto &rt : _sorted_railtypes) { + if (!rvi->railtypes.Test(rt)) continue; + + if (!railtypes.empty()) railtypes += list_separator; + AppendStringInPlace(railtypes, GetRailTypeInfo(rt)->strings.name); + } + DrawString(left, right, y, GetString(STR_PURCHASE_INFO_RAILTYPES, railtypes)); + y += GetCharacterHeight(FS_NORMAL); + /* Max speed - Engine power */ DrawString(left, right, y, GetString(STR_PURCHASE_INFO_SPEED_POWER, PackVelocity(e->GetDisplayMaxSpeed(), e->type), e->GetPower())); y += GetCharacterHeight(FS_NORMAL); diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index c494da2ef7..210cf3bdf1 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -182,6 +182,20 @@ static std::string GetTrainEngineInfoString(const Engine &e) res << GetString(STR_ENGINE_PREVIEW_COST_WEIGHT, e.GetCost(), e.GetDisplayWeight()); res << '\n'; + if (e.u.rail.railtypes.Count() > 1) { + std::string railtypes{}; + std::string_view list_separator = GetListSeparator(); + + for (const auto &rt : _sorted_railtypes) { + if (!e.u.rail.railtypes.Test(rt)) continue; + + if (!railtypes.empty()) railtypes += list_separator; + AppendStringInPlace(railtypes, GetRailTypeInfo(rt)->strings.name); + } + res << GetString(STR_ENGINE_PREVIEW_RAILTYPES, railtypes); + res << '\n'; + } + bool is_maglev = true; for (RailType rt : e.u.rail.railtypes) { is_maglev &= GetRailTypeInfo(rt)->acceleration_type == VehicleAccelerationModel::Maglev; diff --git a/src/lang/english.txt b/src/lang/english.txt index dcd008c392..5c346825c8 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4183,6 +4183,7 @@ STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Rail types: {GOLD}{RAW_STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :All cargo types @@ -4366,6 +4367,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Running Cost: { STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Running Cost: {CURRENCY_LONG}/period STR_ENGINE_PREVIEW_CAPACITY :Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacity: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Rail types: {RAW_STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING1} From c111abad3752f3618c5cfe2f3a874198d4fcbe01 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 15 Sep 2025 04:38:59 +0000 Subject: [PATCH 043/280] Update: Translations from eints portuguese: 1 change by jcteotonio --- src/lang/portuguese.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 90eec730eb..9ecc72539d 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -5132,7 +5132,7 @@ STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... esta # Station destruction related errors STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Não é possível remover parte da estação... STR_ERROR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}É preciso remover a estação primeiro -STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Não é possível remover estação... +STR_ERROR_CAN_T_REMOVE_BUS_STATION :{WHITE}Não é possível remover paragem de autocarros... STR_ERROR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Não é possível remover terminal de carga... STR_ERROR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Não é possível remover paragem de elétricos de passageiros STR_ERROR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Não é possível remover terminal de elétricos de mercadorias... From 7240ed58178bc86c49a99a3780344c612f81a8d3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 15 Sep 2025 08:21:09 +0100 Subject: [PATCH 044/280] Cleanup 3ac1a2f1e4: Don't load/save a train's railtypes property. (#14618) A train's railtypes property is always reset by Train::ConsistChanged on load, so storing is not necessary. --- src/saveload/compat/vehicle_sl_compat.h | 2 +- src/saveload/oldloader_sl.cpp | 9 +-------- src/saveload/vehicle_sl.cpp | 8 -------- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/src/saveload/compat/vehicle_sl_compat.h b/src/saveload/compat/vehicle_sl_compat.h index 4587dd2824..d9293eef39 100644 --- a/src/saveload/compat/vehicle_sl_compat.h +++ b/src/saveload/compat/vehicle_sl_compat.h @@ -100,7 +100,7 @@ const SaveLoadCompat _vehicle_train_sl_compat[] = { SLC_VAR("common"), SLC_VAR("crash_anim_pos"), SLC_VAR("force_proceed"), - SLC_VAR("railtype"), + SLC_NULL(1, SL_MIN_VERSION, SLV_ENGINE_MULTI_RAILTYPE), SLC_VAR("track"), SLC_VAR("flags"), SLC_NULL(2, SLV_2, SLV_60), diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 6d1f557b3b..8bd04801d5 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -1060,13 +1060,12 @@ static bool LoadOldCompany(LoadgameState &ls, int num) static uint32_t _old_order_ptr; static uint16_t _old_next_ptr; static typename VehicleID::BaseType _current_vehicle_id; -static RailType _old_railtype; static const OldChunks vehicle_train_chunk[] = { OCL_SVAR( OC_UINT8, Train, track ), OCL_SVAR( OC_UINT8, Train, force_proceed ), OCL_SVAR( OC_UINT16, Train, crash_anim_pos ), - OCL_VAR ( OC_UINT8, 1, &_old_railtype), + OCL_NULL( 1 ), // railtype OCL_NULL( 5 ), ///< Junk @@ -1306,8 +1305,6 @@ bool LoadOldVehicle(LoadgameState &ls, int num) }; if (v->spritenum / 2 >= lengthof(spriteset_rail)) return false; v->spritenum = spriteset_rail[v->spritenum / 2]; // adjust railway sprite set offset - /* Should be the original values for monorail / rail, can't use RailType constants */ - Train::From(v)->railtypes = static_cast(type == 0x25 ? 1 : 0); break; } @@ -1368,10 +1365,6 @@ bool LoadOldVehicle(LoadgameState &ls, int num) Debug(oldloader, 0, "Loading failed - vehicle-array is invalid"); return false; } - - if (v->type == VEH_TRAIN) { - Train::From(v)->railtypes = _old_railtype; - } } if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) { diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index a20daa3438..51ef51069d 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -793,16 +793,12 @@ public: } }; -static RailType _old_railtype; - class SlVehicleTrain : public DefaultSaveLoadHandler { public: static inline const SaveLoad description[] = { SLEG_STRUCT("common", SlVehicleCommon), SLE_VAR(Train, crash_anim_pos, SLE_UINT16), SLE_VAR(Train, force_proceed, SLE_UINT8), - SLEG_CONDVAR("railtype", _old_railtype, SLE_UINT8, SL_MIN_VERSION, SLV_ENGINE_MULTI_RAILTYPE), - SLE_VAR(Train, railtypes, SLE_UINT64), SLE_VAR(Train, track, SLE_UINT8), SLE_CONDVAR(Train, flags, SLE_FILE_U8 | SLE_VAR_U16, SLV_2, SLV_100), @@ -822,10 +818,6 @@ public: { if (v->type != VEH_TRAIN) return; SlObject(v, this->GetLoadDescription()); - - if (IsSavegameVersionBefore(SLV_ENGINE_MULTI_RAILTYPE)) { - Train::From(v)->railtypes = _old_railtype; - } } void FixPointers(Vehicle *v) const override From 7d252ff7fc251f8f28099afae38846e1bbcf5116 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Mon, 15 Sep 2025 13:14:56 +0200 Subject: [PATCH 045/280] Change: Ask for confirmation before deleting a savegame / scenario / heightmap. (#14621) --- src/fios_gui.cpp | 36 +++++++++++++++++++++--------------- src/lang/english.txt | 2 ++ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index dd4f92aa95..a63679cc8f 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -349,6 +349,21 @@ private: if (confirmed) _switch_mode = SM_SAVE_HEIGHTMAP; } + static void DeleteFileConfirmationCallback(Window *window, bool confirmed) + { + auto *save_load_window = static_cast(window); + + if (confirmed) { + if (!FiosDelete(save_load_window->filename_editbox.text.GetText())) { + ShowErrorMessage(GetEncodedString(STR_ERROR_UNABLE_TO_DELETE_FILE), {}, WL_ERROR); + } else { + save_load_window->InvalidateData(SLIWD_RESCAN_FILES); + /* Reset file name to current date on successful delete */ + if (save_load_window->abstract_filetype == FT_SAVEGAME) save_load_window->GenerateFileName(); + } + } + } + public: /** Generate a default save filename. */ @@ -806,31 +821,22 @@ public: if (this->fop != SLO_SAVE) return; if (this->IsWidgetLowered(WID_SL_DELETE_SELECTION)) { // Delete button clicked - if (!FiosDelete(this->filename_editbox.text.GetText())) { - ShowErrorMessage(GetEncodedString(STR_ERROR_UNABLE_TO_DELETE_FILE), {}, WL_ERROR); - } else { - this->InvalidateData(SLIWD_RESCAN_FILES); - /* Reset file name to current date on successful delete */ - if (this->abstract_filetype == FT_SAVEGAME) GenerateFileName(); - } + ShowQuery(GetEncodedString(STR_SAVELOAD_DELETE_TITLE), GetEncodedString(STR_SAVELOAD_DELETE_WARNING), + this, SaveLoadWindow::DeleteFileConfirmationCallback); } else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) { _file_to_saveload.name = FiosMakeSavegameName(this->filename_editbox.text.GetText()); if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) { - ShowQuery( - GetEncodedString(STR_SAVELOAD_OVERWRITE_TITLE), - GetEncodedString(STR_SAVELOAD_OVERWRITE_WARNING), - this, SaveLoadWindow::SaveGameConfirmationCallback); + ShowQuery(GetEncodedString(STR_SAVELOAD_OVERWRITE_TITLE), GetEncodedString(STR_SAVELOAD_OVERWRITE_WARNING), + this, SaveLoadWindow::SaveGameConfirmationCallback); } else { _switch_mode = SM_SAVE_GAME; } } else { _file_to_saveload.name = FiosMakeHeightmapName(this->filename_editbox.text.GetText()); if (FioCheckFileExists(_file_to_saveload.name, Subdirectory::SAVE_DIR)) { - ShowQuery( - GetEncodedString(STR_SAVELOAD_OVERWRITE_TITLE), - GetEncodedString(STR_SAVELOAD_OVERWRITE_WARNING), - this, SaveLoadWindow::SaveHeightmapConfirmationCallback); + ShowQuery(GetEncodedString(STR_SAVELOAD_OVERWRITE_TITLE), GetEncodedString(STR_SAVELOAD_OVERWRITE_WARNING), + this, SaveLoadWindow::SaveHeightmapConfirmationCallback); } else { _switch_mode = SM_SAVE_HEIGHTMAP; } diff --git a/src/lang/english.txt b/src/lang/english.txt index 5c346825c8..f33f4848fc 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Delete File +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Are you sure you want to delete the file? STR_SAVELOAD_DIRECTORY :{RAW_STRING} (Directory) STR_SAVELOAD_PARENT_DIRECTORY :{RAW_STRING} (Parent directory) From 5f20a97b36c429a328bd5d0b08ab35ce7e50780e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 15 Sep 2025 13:59:04 +0100 Subject: [PATCH 046/280] Fix 313c6c45aa: [Script] Return rail types as list instead of bitmask. (#14617) This is more idiomatic for scripts, and avoids exposing internal representation. --- regression/regression/main.nut | 7 + regression/regression/result.txt | 274 ++++++++++++++++++++++++++++++- src/script/api/script_engine.cpp | 13 +- src/script/api/script_engine.hpp | 5 +- src/script/api/script_rail.hpp | 8 - 5 files changed, 292 insertions(+), 15 deletions(-) diff --git a/regression/regression/main.nut b/regression/regression/main.nut index 951c9d4598..b9df4ebb4a 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -487,6 +487,13 @@ function Regression::Engine() print(" GetRailType(): " + AIEngine.GetRailType(i)); print(" GetRoadType(): " + AIEngine.GetRoadType(i)); print(" GetPlaneType(): " + AIEngine.GetPlaneType(i)); + local railtypes = AIEngine.GetAllRailTypes(i); + print(" GetAllRailTypes(): " + (railtypes == null ? "null" : "instance")); + if (railtypes != null) { + foreach(t in railtypes) { + print(" " + t); + } + } } print(" Valid Engines: " + j); } diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 18afcb5f2f..ba6304953a 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -1407,6 +1407,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 0 IsValidEngine(): true GetName(): Kirby Paul Tank (Steam) @@ -1425,6 +1426,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 1 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1443,6 +1446,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 2 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1461,6 +1465,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 3 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1479,6 +1484,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 4 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1497,6 +1503,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 5 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1515,6 +1522,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 6 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1533,6 +1541,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 7 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1551,6 +1560,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 8 IsValidEngine(): true GetName(): Chaney 'Jubilee' (Steam) @@ -1569,6 +1579,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 9 IsValidEngine(): true GetName(): Ginzu 'A4' (Steam) @@ -1587,6 +1599,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 10 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1605,6 +1619,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 11 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1623,6 +1638,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 12 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1641,6 +1657,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 13 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1659,6 +1676,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 14 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1677,6 +1695,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 15 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1695,6 +1714,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 16 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1713,6 +1733,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 17 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1731,6 +1752,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 18 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1749,6 +1771,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 19 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1767,6 +1790,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 20 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1785,6 +1809,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 21 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1803,6 +1828,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 22 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1821,6 +1847,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 23 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1839,6 +1866,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 24 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1857,6 +1885,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 25 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1875,6 +1904,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 26 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -1893,6 +1923,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 27 IsValidEngine(): true GetName(): Passenger Carriage @@ -1911,6 +1942,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 28 IsValidEngine(): true GetName(): Mail Van @@ -1929,6 +1962,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 29 IsValidEngine(): true GetName(): Coal Truck @@ -1947,6 +1982,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 30 IsValidEngine(): true GetName(): Oil Tanker @@ -1965,6 +2002,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 31 IsValidEngine(): true GetName(): Livestock Van @@ -1983,6 +2022,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 32 IsValidEngine(): true GetName(): Goods Van @@ -2001,6 +2042,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 33 IsValidEngine(): true GetName(): Grain Hopper @@ -2019,6 +2062,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 34 IsValidEngine(): true GetName(): Wood Truck @@ -2037,6 +2082,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 35 IsValidEngine(): true GetName(): Iron Ore Hopper @@ -2055,6 +2102,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 36 IsValidEngine(): true GetName(): Steel Truck @@ -2073,6 +2122,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 37 IsValidEngine(): true GetName(): Armoured Van @@ -2091,6 +2142,8 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 0 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): instance + 0 Engine 38 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2109,6 +2162,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 39 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2127,6 +2181,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 40 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2145,6 +2200,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 41 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2163,6 +2219,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 42 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2181,6 +2238,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 43 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2199,6 +2257,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 44 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2217,6 +2276,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 45 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2235,6 +2295,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 46 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2253,6 +2314,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 47 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2271,6 +2333,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 48 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2289,6 +2352,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 49 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2307,6 +2371,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 50 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2325,6 +2390,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 51 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2343,6 +2409,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 52 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2361,6 +2428,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 53 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2379,6 +2447,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 54 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2397,6 +2466,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 55 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2415,6 +2485,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 56 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2433,6 +2504,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 57 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2451,6 +2523,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 58 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2469,6 +2542,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 59 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2487,6 +2561,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 60 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2505,6 +2580,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 61 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2523,6 +2599,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 62 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2541,6 +2618,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 63 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2559,6 +2637,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 64 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2577,6 +2656,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 65 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2595,6 +2675,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 66 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2613,6 +2694,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 67 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2631,6 +2713,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 68 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2649,6 +2732,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 69 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2667,6 +2751,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 70 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2685,6 +2770,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 71 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2703,6 +2789,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 72 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2721,6 +2808,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 73 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2739,6 +2827,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 74 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2757,6 +2846,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 75 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2775,6 +2865,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 76 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2793,6 +2884,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 77 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2811,6 +2903,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 78 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2829,6 +2922,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 79 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2847,6 +2941,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 80 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2865,6 +2960,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 81 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2883,6 +2979,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 82 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2901,6 +2998,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 83 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2919,6 +3017,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 84 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2937,6 +3036,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 85 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2955,6 +3055,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 86 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2973,6 +3074,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 87 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -2991,6 +3093,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 88 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3009,6 +3112,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 89 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3027,6 +3131,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 90 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3045,6 +3150,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 91 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3063,6 +3169,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 92 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3081,6 +3188,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 93 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3099,6 +3207,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 94 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3117,6 +3226,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 95 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3135,6 +3245,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 96 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3153,6 +3264,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 97 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3171,6 +3283,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 98 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3189,6 +3302,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 99 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3207,6 +3321,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 100 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3225,6 +3340,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 101 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3243,6 +3359,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 102 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3261,6 +3378,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 103 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3279,6 +3397,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 104 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3297,6 +3416,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 105 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3315,6 +3435,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 106 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3333,6 +3454,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 107 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3351,6 +3473,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 108 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3369,6 +3492,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 109 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3387,6 +3511,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 110 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3405,6 +3530,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 111 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3423,6 +3549,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 112 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3441,6 +3568,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 113 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3459,6 +3587,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 114 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3477,6 +3606,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 115 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3495,6 +3625,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 116 IsValidEngine(): true GetName(): MPS Regal Bus @@ -3513,6 +3644,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 117 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3531,6 +3663,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 118 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3549,6 +3682,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 119 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3567,6 +3701,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 120 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3585,6 +3720,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 121 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3603,6 +3739,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 122 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3621,6 +3758,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 123 IsValidEngine(): true GetName(): Balogh Coal Truck @@ -3639,6 +3777,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 124 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3657,6 +3796,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 125 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3675,6 +3815,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 126 IsValidEngine(): true GetName(): MPS Mail Truck @@ -3693,6 +3834,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 127 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3711,6 +3853,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 128 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3729,6 +3872,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 129 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3747,6 +3891,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 130 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3765,6 +3910,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 131 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3783,6 +3929,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 132 IsValidEngine(): true GetName(): Witcombe Oil Tanker @@ -3801,6 +3948,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 133 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3819,6 +3967,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 134 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3837,6 +3986,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 135 IsValidEngine(): true GetName(): Talbott Livestock Van @@ -3855,6 +4005,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 136 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3873,6 +4024,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 137 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3891,6 +4043,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 138 IsValidEngine(): true GetName(): Balogh Goods Truck @@ -3909,6 +4062,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 139 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3927,6 +4081,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 140 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3945,6 +4100,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 141 IsValidEngine(): true GetName(): Hereford Grain Truck @@ -3963,6 +4119,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 142 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3981,6 +4138,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 143 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -3999,6 +4157,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 144 IsValidEngine(): true GetName(): Witcombe Wood Truck @@ -4017,6 +4176,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 145 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4035,6 +4195,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 146 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4053,6 +4214,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 147 IsValidEngine(): true GetName(): MPS Iron Ore Truck @@ -4071,6 +4233,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 148 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4089,6 +4252,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 149 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4107,6 +4271,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 150 IsValidEngine(): true GetName(): Balogh Steel Truck @@ -4125,6 +4290,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 151 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4143,6 +4309,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 152 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4161,6 +4328,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 153 IsValidEngine(): true GetName(): Balogh Armoured Truck @@ -4179,6 +4347,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): 0 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 154 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4197,6 +4366,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 155 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4215,6 +4385,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 156 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4233,6 +4404,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 157 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4251,6 +4423,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 158 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4269,6 +4442,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 159 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4287,6 +4461,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 160 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4305,6 +4480,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 161 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4323,6 +4499,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 162 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4341,6 +4518,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 163 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4359,6 +4537,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 164 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4377,6 +4556,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 165 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4395,6 +4575,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 166 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4413,6 +4594,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 167 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4431,6 +4613,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 168 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4449,6 +4632,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 169 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4467,6 +4651,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 170 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4485,6 +4670,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 171 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4503,6 +4689,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 172 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4521,6 +4708,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 173 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4539,6 +4727,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 174 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4557,6 +4746,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 175 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4575,6 +4765,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 176 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4593,6 +4784,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 177 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4611,6 +4803,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 178 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4629,6 +4822,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 179 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4647,6 +4841,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 180 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4665,6 +4860,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 181 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4683,6 +4879,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 182 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4701,6 +4898,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 183 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4719,6 +4917,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 184 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4737,6 +4936,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 185 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4755,6 +4955,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 186 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4773,6 +4974,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 187 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4791,6 +4993,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 188 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4809,6 +5012,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 189 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4827,6 +5031,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 190 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4845,6 +5050,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 191 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4863,6 +5069,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 192 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4881,6 +5088,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 193 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4899,6 +5107,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 194 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4917,6 +5126,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 195 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4935,6 +5145,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 196 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4953,6 +5164,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 197 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4971,6 +5183,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 198 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -4989,6 +5202,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 199 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5007,6 +5221,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 200 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5025,6 +5240,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 201 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5043,6 +5259,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 202 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5061,6 +5278,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 203 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5079,6 +5297,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 204 IsValidEngine(): true GetName(): MPS Oil Tanker @@ -5097,6 +5316,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 205 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5115,6 +5335,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 206 IsValidEngine(): true GetName(): MPS Passenger Ferry @@ -5133,6 +5354,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 207 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5151,6 +5373,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 208 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5169,6 +5392,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 209 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5187,6 +5411,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 210 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5205,6 +5430,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 211 IsValidEngine(): true GetName(): Yate Cargo Ship @@ -5223,6 +5449,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 212 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5241,6 +5468,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 213 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5259,6 +5487,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 214 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5277,6 +5506,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 215 IsValidEngine(): true GetName(): Sampson U52 @@ -5295,6 +5525,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): 1 + GetAllRailTypes(): null Engine 216 IsValidEngine(): true GetName(): Coleman Count @@ -5313,6 +5544,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): 1 + GetAllRailTypes(): null Engine 217 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5331,6 +5563,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 218 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5349,6 +5582,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 219 IsValidEngine(): true GetName(): Bakewell Cotswald LB-3 @@ -5367,6 +5601,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): 1 + GetAllRailTypes(): null Engine 220 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5385,6 +5620,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 221 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5403,6 +5639,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 222 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5421,6 +5658,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 223 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5439,6 +5677,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 224 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5457,6 +5696,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 225 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5475,6 +5715,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 226 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5493,6 +5734,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 227 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5511,6 +5753,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 228 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5529,6 +5772,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 229 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5547,6 +5791,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 230 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5565,6 +5810,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 231 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5583,6 +5829,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 232 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5601,6 +5848,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 233 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5619,6 +5867,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 234 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5637,6 +5886,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 235 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5655,6 +5905,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 236 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5673,6 +5924,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 237 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5691,6 +5943,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 238 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5709,6 +5962,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 239 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5727,6 +5981,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 240 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5745,6 +6000,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 241 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5763,6 +6019,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 242 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5781,6 +6038,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 243 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5799,6 +6057,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 244 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5817,6 +6076,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 245 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5835,6 +6095,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 246 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5853,6 +6114,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 247 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5871,6 +6133,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 248 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5889,6 +6152,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 249 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5907,6 +6171,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 250 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5925,6 +6190,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 251 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5943,6 +6209,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 252 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5961,6 +6228,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 253 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5979,6 +6247,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 254 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -5997,6 +6266,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 255 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -6015,6 +6285,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Engine 256 IsValidEngine(): false GetName(): (null : 0x00000000) @@ -6033,6 +6304,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetRailType(): 255 GetRoadType(): -1 GetPlaneType(): -1 + GetAllRailTypes(): null Valid Engines: 31 --EngineList-- @@ -9835,7 +10107,7 @@ ERROR: IsEnd() is invalid as Begin() is never called constructor failed with: excessive CPU usage in list filter function Your script made an error: excessive CPU usage in valuator function -*FUNCTION [Start()] regression/main.nut line [2161] +*FUNCTION [Start()] regression/main.nut line [2168] [Infinite] CLOSURE [list] INSTANCE diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index 5b6ced3e13..f3dfe4b656 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -245,12 +245,17 @@ return static_cast(::RailVehInfo(engine_id)->railtypes.GetNthSetBit(0).value_or(::RailType::INVALID_RAILTYPE)); } -/* static */ ScriptRail::RailTypes ScriptEngine::GetAllRailTypes(EngineID engine_id) +/* static */ ScriptList *ScriptEngine::GetAllRailTypes(EngineID engine_id) { - if (!IsValidEngine(engine_id)) return ScriptRail::INVALID_RAILTYPES; - if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return ScriptRail::INVALID_RAILTYPES; + if (!IsValidEngine(engine_id)) return nullptr; + if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return nullptr; - return static_cast(::RailVehInfo(engine_id)->railtypes.base()); + ScriptList *list = new ScriptList(); + for (::RailType railtype : ::RailVehInfo(engine_id)->railtypes) { + list->AddItem(railtype); + } + + return list; } /* static */ bool ScriptEngine::IsArticulated(EngineID engine_id) diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp index 01eaa03509..0404ff3e04 100644 --- a/src/script/api/script_engine.hpp +++ b/src/script/api/script_engine.hpp @@ -10,6 +10,7 @@ #ifndef SCRIPT_ENGINE_HPP #define SCRIPT_ENGINE_HPP +#include "script_list.hpp" #include "script_vehicle.hpp" #include "script_rail.hpp" #include "script_airport.hpp" @@ -258,13 +259,13 @@ public: static ScriptRail::RailType GetRailType(EngineID engine_id); /** - * Get all RailType's of the engine. + * Get a list of all RailTypes of the engine. * @param engine_id The engine to get all RailTypes of. * @pre IsValidEngine(engine_id). * @pre GetVehicleType(engine_id) == ScriptVehicle::VT_RAIL. * @return All rail types of the engine. */ - static ScriptRail::RailTypes GetAllRailTypes(EngineID engine_id); + static ScriptList *GetAllRailTypes(EngineID engine_id); /** * Check if the engine is articulated. diff --git a/src/script/api/script_rail.hpp b/src/script/api/script_rail.hpp index 050539f5be..414aa15b7d 100644 --- a/src/script/api/script_rail.hpp +++ b/src/script/api/script_rail.hpp @@ -49,14 +49,6 @@ public: RAILTYPE_INVALID = ::INVALID_RAILTYPE, ///< Invalid RailType. }; - /** - * A bitmap with all possible rail types. - */ - enum RailTypes : int64_t { - /* Note: these values represent part of the in-game RailTypes enum */ - INVALID_RAILTYPES = INT64_MAX, ///< Invalid RailTypes. - }; - /** * A bitmap with all possible rail tracks on a tile. */ From f2f66092062949148150e8747cf9567915f46c57 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 15 Sep 2025 18:52:07 +0100 Subject: [PATCH 047/280] Fix #14572: Incorrect playlist entry was removed if there are duplicates. (#14583) --- src/music_gui.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index b368fb3742..cbd30c6c40 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -365,24 +365,27 @@ void MusicSystem::PlaylistRemove(size_t song_index) { if (!this->IsCustomPlaylist()) return; - Playlist &pl = this->standard_playlists[this->selected_playlist]; - if (song_index >= pl.size()) return; + if (song_index >= this->active_playlist.size()) return; - /* Remove from "simple" playlists */ - PlaylistEntry song = pl[song_index]; - pl.erase(pl.begin() + song_index); + PlaylistEntry song = this->active_playlist[song_index]; + this->active_playlist.erase(std::next(std::begin(this->active_playlist), song_index)); - /* Find in actual active playlist (may be shuffled) and remove, - * if it's the current song restart playback */ - for (size_t i = 0; i < this->active_playlist.size(); i++) { - Playlist::iterator s2 = this->active_playlist.begin() + i; - if (s2->filename == song.filename && s2->cat_index == song.cat_index) { - this->active_playlist.erase(s2); - if ((int)i == this->playlist_position && this->IsPlaying()) this->Play(); - break; - } + Playlist &playlist = this->standard_playlists[this->selected_playlist]; + auto it = std::end(playlist); + if (this->IsShuffle()) { + /* Playlist is shuffled, so remove the first instance. */ + it = std::ranges::find_if(playlist, [&song](const auto &s) { return s.filename == song.filename && s.cat_index == song.cat_index; }); + } else if (song_index < playlist.size()) { + /* Not shuffled, we can remove the entry directly. */ + it = std::next(std::begin(playlist), song_index); } + if (it == std::end(playlist)) return; + it = playlist.erase(it); + + /* If it's the current song restart playback. */ + if (this->IsPlaying() && std::distance(std::begin(playlist), it) == this->playlist_position) this->Play(); + this->SaveCustomPlaylist(this->selected_playlist); InvalidateWindowData(WC_MUSIC_TRACK_SELECTION, 0); From 26fef5b62b0ed492fa40323861f4ad2b5ce31116 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:17:18 +0200 Subject: [PATCH 048/280] Fix 4eaeccd: FioRemove should return false if the file does not exist. (#14619) --- src/fileio.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/fileio.cpp b/src/fileio.cpp index bae969a362..981d37c8cd 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -328,9 +328,12 @@ bool FioRemove(const std::string &filename) { std::filesystem::path path = OTTD2FS(filename); std::error_code error_code; - std::filesystem::remove(path, error_code); - if (error_code) { - Debug(misc, 0, "Removing {} failed: {}", filename, error_code.message()); + if (!std::filesystem::remove(path, error_code)) { + if (error_code) { + Debug(misc, 0, "Removing {} failed: {}", filename, error_code.message()); + } else { + Debug(misc, 0, "Removing {} failed: file does not exist", filename); + } return false; } return true; From faacae2c3f59b77bb53f754236f6e2ff57ec653e Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:59:12 +0200 Subject: [PATCH 049/280] Change: Removed disable_node_optimization YAPF setting (#14578) --- src/pathfinder/yapf/yapf_node_rail.hpp | 15 +++------ src/pathfinder/yapf/yapf_node_road.hpp | 15 +++------ src/pathfinder/yapf/yapf_node_ship.hpp | 11 ++----- src/pathfinder/yapf/yapf_rail.cpp | 34 ++++++++++----------- src/pathfinder/yapf/yapf_road.cpp | 21 +++++-------- src/pathfinder/yapf/yapf_ship.cpp | 14 ++++----- src/saveload/compat/settings_sl_compat.h | 2 +- src/settings_type.h | 1 - src/table/settings/pathfinding_settings.ini | 6 ---- 9 files changed, 42 insertions(+), 77 deletions(-) diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index fafa75dbca..53483d30e3 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -110,9 +110,8 @@ struct CYapfRailSegment { }; /** Yapf Node for rail YAPF */ -template -struct CYapfRailNodeT : CYapfNodeT> { - typedef CYapfNodeT> base; +struct CYapfRailNode : CYapfNodeT { + typedef CYapfNodeT base; typedef CYapfRailSegment CachedData; CYapfRailSegment *segment; @@ -128,7 +127,7 @@ struct CYapfRailNodeT : CYapfNodeT> { SignalType last_red_signal_type; SignalType last_signal_type; - inline void Set(CYapfRailNodeT *parent, TileIndex tile, Trackdir td, bool is_choice) + inline void Set(CYapfRailNode *parent, TileIndex tile, Trackdir td, bool is_choice) { this->base::Set(parent, tile, td, is_choice); this->segment = nullptr; @@ -206,12 +205,6 @@ struct CYapfRailNodeT : CYapfNodeT> { } }; -/* now define two major node types (that differ by key type) */ -typedef CYapfRailNodeT CYapfRailNodeExitDir; -typedef CYapfRailNodeT CYapfRailNodeTrackDir; - -/* Default NodeList types */ -typedef NodeList CRailNodeListExitDir; -typedef NodeList CRailNodeListTrackDir; +typedef NodeList CRailNodeList; #endif /* YAPF_NODE_RAIL_HPP */ diff --git a/src/pathfinder/yapf/yapf_node_road.hpp b/src/pathfinder/yapf/yapf_node_road.hpp index 0a9dc59648..b70e118870 100644 --- a/src/pathfinder/yapf/yapf_node_road.hpp +++ b/src/pathfinder/yapf/yapf_node_road.hpp @@ -16,14 +16,13 @@ #include "yapf_node.hpp" /** Yapf Node for road YAPF */ -template -struct CYapfRoadNodeT : CYapfNodeT> { - typedef CYapfNodeT> base; +struct CYapfRoadNode : CYapfNodeT { + typedef CYapfNodeT base; TileIndex segment_last_tile; Trackdir segment_last_td; - void Set(CYapfRoadNodeT *parent, TileIndex tile, Trackdir td, bool is_choice) + void Set(CYapfRoadNode *parent, TileIndex tile, Trackdir td, bool is_choice) { this->base::Set(parent, tile, td, is_choice); this->segment_last_tile = tile; @@ -31,12 +30,6 @@ struct CYapfRoadNodeT : CYapfNodeT> { } }; -/* now define two major node types (that differ by key type) */ -typedef CYapfRoadNodeT CYapfRoadNodeExitDir; -typedef CYapfRoadNodeT CYapfRoadNodeTrackDir; - -/* Default NodeList types */ -typedef NodeList CRoadNodeListExitDir; -typedef NodeList CRoadNodeListTrackDir; +typedef NodeList CRoadNodeList; #endif /* YAPF_NODE_ROAD_HPP */ diff --git a/src/pathfinder/yapf/yapf_node_ship.hpp b/src/pathfinder/yapf/yapf_node_ship.hpp index 8b79a6a47e..481d77b9fe 100644 --- a/src/pathfinder/yapf/yapf_node_ship.hpp +++ b/src/pathfinder/yapf/yapf_node_ship.hpp @@ -16,16 +16,9 @@ #include "yapf_node.hpp" /** Yapf Node for ships */ -template -struct CYapfShipNodeT : CYapfNodeT> { +struct CYapfShipNode : CYapfNodeT { }; -/* now define two major node types (that differ by key type) */ -typedef CYapfShipNodeT CYapfShipNodeExitDir; -typedef CYapfShipNodeT CYapfShipNodeTrackDir; - -/* Default NodeList types */ -typedef NodeList CShipNodeListExitDir; -typedef NodeList CShipNodeListTrackDir; +typedef NodeList CShipNodeList; #endif /* YAPF_NODE_SHIP_HPP */ diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index b462b4eee8..208b65b737 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -528,13 +528,13 @@ public: } }; -template class TdestinationT, template class TfollowT> +template class TdestinationT, template class TfollowT> struct CYapfRail_TypesT { - typedef CYapfRail_TypesT Types; + typedef CYapfRail_TypesT Types; typedef Tpf_ Tpf; typedef Ttrack_follower TrackFollower; - typedef Tnode_list NodeList; + typedef CRailNodeList NodeList; typedef Train VehicleType; typedef CYapfBaseT PfBase; typedef TfollowT PfFollow; @@ -544,21 +544,21 @@ struct CYapfRail_TypesT { typedef CYapfCostRailT PfCost; }; -struct CYapfRail1 : CYapfT> {}; -struct CYapfRail2 : CYapfT> {}; +struct CYapfRail : CYapfT> {}; +struct CYapfRailNo90 : CYapfT> {}; -struct CYapfAnyDepotRail1 : CYapfT> {}; -struct CYapfAnyDepotRail2 : CYapfT> {}; +struct CYapfAnyDepotRail : CYapfT> {}; +struct CYapfAnyDepotRailNo90 : CYapfT> {}; -struct CYapfAnySafeTileRail1 : CYapfT> {}; -struct CYapfAnySafeTileRail2 : CYapfT> {}; +struct CYapfAnySafeTileRail : CYapfT> {}; +struct CYapfAnySafeTileRailNo90 : CYapfT> {}; Track YapfTrainChooseTrack(const Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, bool reserve_track, PBSTileInfo *target, TileIndex *dest) { Trackdir td_ret = _settings_game.pf.forbid_90_deg - ? CYapfRail2::stChooseRailTrack(v, tile, enterdir, tracks, path_found, reserve_track, target, dest) - : CYapfRail1::stChooseRailTrack(v, tile, enterdir, tracks, path_found, reserve_track, target, dest); + ? CYapfRailNo90::stChooseRailTrack(v, tile, enterdir, tracks, path_found, reserve_track, target, dest) + : CYapfRail::stChooseRailTrack(v, tile, enterdir, tracks, path_found, reserve_track, target, dest); return (td_ret != INVALID_TRACKDIR) ? TrackdirToTrack(td_ret) : FindFirstTrack(tracks); } @@ -610,8 +610,8 @@ bool YapfTrainCheckReverse(const Train *v) if (reverse_penalty == 0) reverse_penalty = 1; bool reverse = _settings_game.pf.forbid_90_deg - ? CYapfRail2::stCheckReverseTrain(v, tile, td, tile_rev, td_rev, reverse_penalty) - : CYapfRail1::stCheckReverseTrain(v, tile, td, tile_rev, td_rev, reverse_penalty); + ? CYapfRailNo90::stCheckReverseTrain(v, tile, td, tile_rev, td_rev, reverse_penalty) + : CYapfRail::stCheckReverseTrain(v, tile, td, tile_rev, td_rev, reverse_penalty); return reverse; } @@ -625,15 +625,15 @@ FindDepotData YapfTrainFindNearestDepot(const Train *v, int max_penalty) Trackdir td_rev = ReverseTrackdir(last_veh->GetVehicleTrackdir()); return _settings_game.pf.forbid_90_deg - ? CYapfAnyDepotRail2::stFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY) - : CYapfAnyDepotRail1::stFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY); + ? CYapfAnyDepotRailNo90::stFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY) + : CYapfAnyDepotRail::stFindNearestDepotTwoWay(v, origin.tile, origin.trackdir, last_tile, td_rev, max_penalty, YAPF_INFINITE_PENALTY); } bool YapfTrainFindNearestSafeTile(const Train *v, TileIndex tile, Trackdir td, bool override_railtype) { return _settings_game.pf.forbid_90_deg - ? CYapfAnySafeTileRail2::stFindNearestSafeTile(v, tile, td, override_railtype) - : CYapfAnySafeTileRail1::stFindNearestSafeTile(v, tile, td, override_railtype); + ? CYapfAnySafeTileRailNo90::stFindNearestSafeTile(v, tile, td, override_railtype) + : CYapfAnySafeTileRail::stFindNearestSafeTile(v, tile, td, override_railtype); } /** if any track changes, this counter is incremented - that will invalidate segment cost cache */ diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index f886a90774..2611ceb379 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -485,13 +485,13 @@ public: } }; -template class Tdestination> +template class Tdestination> struct CYapfRoad_TypesT { - typedef CYapfRoad_TypesT Types; + typedef CYapfRoad_TypesT Types; typedef Tpf_ Tpf; typedef CFollowTrackRoad TrackFollower; - typedef Tnode_list NodeList; + typedef CRoadNodeList NodeList; typedef RoadVehicle VehicleType; typedef CYapfBaseT PfBase; typedef CYapfFollowRoadT PfFollow; @@ -501,18 +501,13 @@ struct CYapfRoad_TypesT { typedef CYapfCostRoadT PfCost; }; -struct CYapfRoad1 : CYapfT> {}; -struct CYapfRoad2 : CYapfT> {}; - -struct CYapfRoadAnyDepot1 : CYapfT> {}; -struct CYapfRoadAnyDepot2 : CYapfT> {}; +struct CYapfRoad : CYapfT> {}; +struct CYapfRoadAnyDepot : CYapfT> {}; Trackdir YapfRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool &path_found, RoadVehPathCache &path_cache) { - Trackdir td_ret = _settings_game.pf.yapf.disable_node_optimization - ? CYapfRoad1::stChooseRoadTrack(v, tile, enterdir, path_found, path_cache) // Trackdir - : CYapfRoad2::stChooseRoadTrack(v, tile, enterdir, path_found, path_cache); // ExitDir, allow 90-deg + Trackdir td_ret = CYapfRoad::stChooseRoadTrack(v, tile, enterdir, path_found, path_cache); return (td_ret != INVALID_TRACKDIR) ? td_ret : (Trackdir)FindFirstBit(trackdirs); } @@ -526,7 +521,5 @@ FindDepotData YapfRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_dist return FindDepotData(); } - return _settings_game.pf.yapf.disable_node_optimization - ? CYapfRoadAnyDepot1::stFindNearestDepot(v, tile, trackdir, max_distance) // Trackdir - : CYapfRoadAnyDepot2::stFindNearestDepot(v, tile, trackdir, max_distance); // ExitDir + return CYapfRoadAnyDepot::stFindNearestDepot(v, tile, trackdir, max_distance); } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index a5f1ef67a2..335a589ef6 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -398,13 +398,13 @@ public: * Config struct of YAPF for ships. * Defines all 6 base YAPF modules as classes providing services for CYapfBaseT. */ -template +template struct CYapfShip_TypesT { - typedef CYapfShip_TypesT Types; ///< Shortcut for this struct type. - typedef Tpf_ Tpf; ///< Pathfinder type. - typedef Ttrack_follower TrackFollower; ///< Track follower helper class. - typedef Tnode_list NodeList; - typedef Ship VehicleType; + typedef CYapfShip_TypesT Types; ///< Shortcut for this struct type. + typedef Tpf_ Tpf; ///< Pathfinder type. + typedef CFollowTrackWater TrackFollower; ///< Track follower helper class. + typedef CShipNodeList NodeList; + typedef Ship VehicleType; /** Pathfinder components (modules). */ typedef CYapfBaseT PfBase; ///< Base pathfinder class. @@ -415,7 +415,7 @@ struct CYapfShip_TypesT { typedef CYapfCostShipT PfCost; ///< Cost provider. }; -struct CYapfShip : CYapfT> { +struct CYapfShip : CYapfT> { explicit CYapfShip(int max_nodes) { this->max_search_nodes = max_nodes; } }; diff --git a/src/saveload/compat/settings_sl_compat.h b/src/saveload/compat/settings_sl_compat.h index 422e5a2785..9fe49f8b12 100644 --- a/src/saveload/compat/settings_sl_compat.h +++ b/src/saveload/compat/settings_sl_compat.h @@ -185,7 +185,7 @@ const SaveLoadCompat _settings_sl_compat[] = { SLC_NULL(4, SLV_47, SLV_TABLE_CHUNKS), SLC_NULL(8, SLV_130, SLV_TABLE_CHUNKS), SLC_NULL(4, SLV_131, SLV_TABLE_CHUNKS), - SLC_VAR("pf.yapf.disable_node_optimization"), + SLC_NULL(1, SLV_28, SLV_TABLE_CHUNKS), SLC_VAR("pf.yapf.max_search_nodes"), SLC_VAR("pf.yapf.rail_firstred_twoway_eol"), SLC_VAR("pf.yapf.rail_firstred_penalty"), diff --git a/src/settings_type.h b/src/settings_type.h index 3c596d32c1..86350e4054 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -431,7 +431,6 @@ struct ScriptSettings { /** Settings related to the yet another pathfinder. */ struct YAPFSettings { - bool disable_node_optimization; ///< whether to use exit-dir instead of trackdir in node key uint32_t max_search_nodes; ///< stop path-finding when this number of nodes visited uint32_t maximum_go_to_depot_penalty; ///< What is the maximum penalty that may be endured for going to a depot uint32_t road_slope_penalty; ///< penalty for up-hill slope diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index daf7b804bb..1bf6efac3a 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -98,12 +98,6 @@ min = 1 max = 255 cat = SC_EXPERT -[SDT_BOOL] -var = pf.yapf.disable_node_optimization -from = SLV_28 -def = false -cat = SC_EXPERT - [SDT_VAR] var = pf.yapf.max_search_nodes type = SLE_UINT From 5dea17058976b6680c73b44d77c03e748696a16e Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 15 Sep 2025 19:05:35 -0400 Subject: [PATCH 050/280] Fix #14588: Show error when unable to clone partly-cleared crashed train (#14591) --- src/vehicle_cmd.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 93f665d4bd..c27fb92ded 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -849,7 +849,8 @@ std::tuple CmdCloneVehicle(DoCommandFlags flags, TileInd CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return { ret, VehicleID::Invalid() }; - if (v->type == VEH_TRAIN && (!v->IsFrontEngine() || Train::From(v)->crash_anim_pos >= 4400)) return { CMD_ERROR, VehicleID::Invalid() }; + /* Crashed trains can only be cloned before cleanup begins. */ + if (v->type == VEH_TRAIN && (!v->IsFrontEngine() || Train::From(v)->crash_anim_pos >= 4400)) return { CommandCost(STR_ERROR_VEHICLE_IS_DESTROYED), VehicleID::Invalid() }; /* check that we can allocate enough vehicles */ if (!flags.Test(DoCommandFlag::Execute)) { From f487cde0564cddbf6850ad1d621013007696a164 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 16 Sep 2025 04:37:32 +0000 Subject: [PATCH 051/280] Update: Translations from eints swedish: 2 changes by robert-i greek: 2 changes by gh658804 russian: 3 changes by Ln-Wolf finnish: 2 changes by hpiirai danish: 3 changes by New-Authentication portuguese: 44 changes by jcteotonio portuguese (brazilian): 2 changes by pasantoro polish: 2 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 2 + src/lang/danish.txt | 3 ++ src/lang/finnish.txt | 2 + src/lang/greek.txt | 2 + src/lang/polish.txt | 2 + src/lang/portuguese.txt | 86 ++++++++++++++++--------------- src/lang/russian.txt | 4 +- src/lang/swedish.txt | 2 + 8 files changed, 60 insertions(+), 43 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index ebb64ad5e9..23626a5dde 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -4184,6 +4184,7 @@ STR_PURCHASE_INFO_ALL_BUT :Todas, exceto { STR_PURCHASE_INFO_MAX_TE :{BLACK}Força de Tração máx.: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomia: {GOLD}{COMMA} quadrados STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipos de trilhos: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga @@ -4367,6 +4368,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Custo Operacion STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Custo Operacional: {CURRENCY_LONG}/período STR_ENGINE_PREVIEW_CAPACITY :Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Tipos de trilhos: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituir {STRING} - {STRING} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 96bc87d1f6..9ed1a39006 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -4183,6 +4183,7 @@ STR_PURCHASE_INFO_ALL_BUT :Alle undtagen { STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. trækkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rækkevidde: {GOLD}{COMMA} felter STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fly type: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Skinnetyper: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Alle fragttyper @@ -4366,6 +4367,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Driftsomkostnin STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Driftsomkostninger: {CURRENCY_LONG}/periode STR_ENGINE_PREVIEW_CAPACITY :Kapacitet: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapacitet: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Skinnetyper: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING} @@ -5268,6 +5270,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er for lav til en bøje STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bro er for lav til at låse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan ikke bygge en tunnel her... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index a662e0e4c7..4e564b5fdd 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -4183,6 +4183,7 @@ STR_PURCHASE_INFO_ALL_BUT :Kaikki paitsi { STR_PURCHASE_INFO_MAX_TE :{BLACK}Maksimivetovoima: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Toimintasäde: {GOLD}{COMMA} ruutua STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Ilma-alustyyppi: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Raidetyypit: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Kaikki rahtityypit @@ -4366,6 +4367,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Käyttökustann STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Käyttökustannukset: {CURRENCY_LONG}/jakso STR_ENGINE_PREVIEW_CAPACITY :Kapasiteetti: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapasiteetti: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Raidetyypit: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Korvaa {STRING} – {STRING} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index ba24630a2a..7c166c39da 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -4277,6 +4277,7 @@ STR_PURCHASE_INFO_ALL_BUT :Όλα εκτό STR_PURCHASE_INFO_MAX_TE :{BLACK}Μέγ. Δύναμη Έλξης: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Εύρος: {GOLD}{COMMA} τετραγωνίδια STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Τύπος αεροσκάφους: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Είδη σιδηροτροχιών: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Όλα τα είδη φορτίου @@ -4467,6 +4468,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Τρέχον κ STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Τρέχον κόστος: {CURRENCY_LONG}/περίοδο STR_ENGINE_PREVIEW_CAPACITY :Χωρητικότητα: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Χωρητικότητα: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Είδη σιδηροτροχιών: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Αντικατάσταση {STRING} - {STRING} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 95e98ec8b3..8bd6af65a8 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -4563,6 +4563,7 @@ STR_PURCHASE_INFO_ALL_BUT :wszystko opróc STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. siła pociągowa: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Zasięg: {GOLD}{COMMA} pól STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Typ samolotu: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Rodzaje torów: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Wszystkie typy ładunków @@ -4752,6 +4753,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Koszt utrzymani STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Koszt utrzymania: {CURRENCY_LONG}/okres STR_ENGINE_PREVIEW_CAPACITY :Ładowność: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Ładowność: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Rodzaje torów: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 9ecc72539d..6000a0385e 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -284,7 +284,7 @@ STR_BUTTON_CATCHMENT :{BLACK}Cobertur STR_TOOLTIP_CATCHMENT :{BLACK}Alternar exibição da área de cobertura STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fechar janela -STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título da janela - arraste isto para mover a janela +STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}O título da janela - arraste-o para mover a janela STR_TOOLTIP_SHADE :{BLACK}Encolher janela - apenas mostra a barra de título STR_TOOLTIP_DEBUG :{BLACK}Mostrar informação de depuração de NewGRF STR_TOOLTIP_DEFSIZE :{BLACK}Redimensionar a janela para o tamanho padrão. Ctrl+Clique para guardar o tamanho atual como padrão. Duplo Ctrl+Clique para redefinir o padrão armazenado @@ -2244,10 +2244,10 @@ STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Iniciar STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Criar um cenário de jogo personalizado STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Começar um jogo multi-jogador -STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Selecionar terreno do estilo "temperado" -STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Selecionar terreno do estilo "subárctico" -STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Selecionar terreno do estilo "subtropical" -STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecionar terreno do estilo "terra dos brinquedos" +STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Selecionar terreno do estilo “temperado” +STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Selecionar terreno do estilo “subártico” +STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Selecionar terreno do estilo “subtropical” +STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecionar terreno do estilo “terra dos brinquedos” STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Abrir tabela de classificações @@ -2319,11 +2319,11 @@ STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Não estão con ###length 23 STR_LIVERY_DEFAULT :Pintura Padrão -STR_LIVERY_STEAM :Locomotivas a Vapor -STR_LIVERY_DIESEL :Locomotivas Diesel -STR_LIVERY_ELECTRIC :Locomotivas Eléctricas -STR_LIVERY_MONORAIL :Locomotivas em Monocarril -STR_LIVERY_MAGLEV :Locomotivas Maglev (Levitação Magnética) +STR_LIVERY_STEAM :Locomotiva a Vapor +STR_LIVERY_DIESEL :Locomotiva a Diesel +STR_LIVERY_ELECTRIC :Locomotiva Elétrica +STR_LIVERY_MONORAIL :Locomotiva em Monocarril +STR_LIVERY_MAGLEV :Locomotiva Maglev (Levitação Magnética) STR_LIVERY_DMU :Unidade Múltipla a Diesel STR_LIVERY_EMU :Unidade Múltipla Elétrica STR_LIVERY_PASSENGER_WAGON_STEAM :Carruagem de Passageiros (Vapor) @@ -2800,21 +2800,21 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construção de STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construção de Monocarris STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construção de Linhas Maglev -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha férrea. Ctrl+Clique para remover a linha férrea. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir caminhos-de-ferro usando o modo automático. Ctrl+Clique para remover a via férrea. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha de carril. Ctrl+Clique para remover a linha de carril. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir linha de carril usando o modo automático para a direção. Ctrl+Clique para remover a linha de carril. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controlo na ferrovia. Ctrl+Clique para selecionar outro ponto de controlo para se unir. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais na ferrovia. Ctrl+Clique para construir estilo de sinal alternativo{}Clique+Arrastar para preencher a secção de via selecionada com sinais no espaçamento escolhido. Ctrl+Clique+Arrastar para preencher com sinais até à próxima junção, estação ou sinal. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais na linha ferroviária. Ctrl+Clique para construir estilo de sinal alternativo{}Clique+Arrastar para preencher a secção de via selecionada com sinais no espaçamento escolhido. Ctrl+Clique+Arrastar para preencher com sinais até à próxima junção, estação ou sinal. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controlo e estações. Ctrl+Clique também remove os carris de pontos de passagem e de estações STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de via férrea. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_NAME_RAILROAD :Caminhos-de-ferro -STR_RAIL_NAME_ELRAIL :Caminhos-de-ferro elétrificados -STR_RAIL_NAME_MONORAIL :Monocarril -STR_RAIL_NAME_MAGLEV :Maglev +STR_RAIL_NAME_RAILROAD :{G=mp}Caminhos-de-ferro (Convencional) +STR_RAIL_NAME_ELRAIL :{G=mp}Caminhos-de-ferro eletrificados +STR_RAIL_NAME_MONORAIL :{G=m}Monocarril +STR_RAIL_NAME_MAGLEV :Maglev (Levitação Magnética) # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Ferroviário @@ -3176,28 +3176,28 @@ STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS :Rochas cobertas STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND :Terreno irregular coberto de neve STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS :Relva coberta de neve -STR_LAI_RAIL_DESCRIPTION_TRACK :Linha de caminhos-de-ferro -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Linha de caminhos-de-ferro com pre-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Linha de caminhos-de-ferro com sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de saida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de bloqueio e de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de saida -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Linha de caminhos-de-ferro com pré-sinais e sinais de sentido único -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Linha de caminhos-de-ferro com sinais de saida e combinados -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Linha de caminhos-de-ferro com sinais de saida e de rota -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Linha de caminhos-de-ferro com sinais de saida e de sentido único -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_TRACK :Linha de comboio +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Linha de comboio com sinais de bloqueio +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Linha de comboio com pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Linha de comboio com sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Linha de comboio com sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Linha de comboio com sinais de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Linha de comboio com sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Linha de comboio com sinais de bloqueio e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Linha de comboio com sinais de bloqueio e de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Linha de comboio com sinais de bloqueio e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Linha de comboio com sinais de bloqueio e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Linha de comboio com sinais de bloqueio e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Linha de comboio com pré-sinais e sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Linha de comboio com pré-sinais e sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Linha de comboio com pré-sinais e sinais de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Linha de comboio com pré-sinais e sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Linha de comboio com sinais de saída e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Linha de comboio com sinais de saída e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Linha de comboio com sinais de saída e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Linha de comboio com sinais combinados e de rota +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Linha de comboio com sinais combinados e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Linha de comboio com sinais de rota e de sentido único STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito ferroviário para comboios STR_LAI_ROAD_DESCRIPTION_ROAD :Estrada @@ -3974,7 +3974,7 @@ STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Nenhum STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Valor da empresa: {WHITE}{CURRENCY_LONG} STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Infraestrutura: -STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL :{WHITE}{COMMA} secç{P ão ões} de caminho-de-ferro +STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL :{WHITE}{COMMA} secç{P ão ões} de linha ferroviária STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD :{WHITE}{COMMA} secç{P ão ões} de estrada STR_COMPANY_VIEW_INFRASTRUCTURE_WATER :{WHITE}{COMMA} mosaico{P "" s} com água STR_COMPANY_VIEW_INFRASTRUCTURE_STATION :{WHITE}{COMMA} mosaico{P "" s} com estaç{P ão ões} @@ -4012,7 +4012,7 @@ STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}Na aquis # Company infrastructure window STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Infraestrutura de {COMPANY} -STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Secções de caminho-de-ferro: +STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Secções de linha ferroviária: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}Sinais STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Secções de estrada: STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Secções de elétricos: @@ -4184,6 +4184,7 @@ STR_PURCHASE_INFO_ALL_BUT :Todas menos {CA STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforço de Tração Máx: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} mosaicos STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipos de carril: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga @@ -4367,6 +4368,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Custo de Circul STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Custo de Circulação: {CURRENCY_LONG}/período STR_ENGINE_PREVIEW_CAPACITY :Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Tipos de carril: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituir {STRING} - {STRING} @@ -5212,7 +5214,7 @@ STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Estrada STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Passagens de nível não são permitidas para este tipo de linha STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Passagens de nível não são permitidas para este tipo de estrada STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Não é possível construir sinais aqui... -STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir linha férrea aqui... +STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir a linha de carril aqui... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Não é possível remover linha férrea daqui... STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Não é possível remover sinais daqui... STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Não é possível converter sinais aqui... diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 795c4cbdaf..32d8c6090d 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -4358,6 +4358,7 @@ STR_PURCHASE_INFO_ALL_BUT :Всё, кро STR_PURCHASE_INFO_MAX_TE :{BLACK}Макс. тяговое усилие: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Дальность: {GOLD}{COMMA} клет{P ка ки ок} STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Тип возд. судна: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Типы рельсов: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Все типы грузов @@ -4549,6 +4550,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Стоимос STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Стоимость обслуживания: {CURRENCY_LONG}/цикл STR_ENGINE_PREVIEW_CAPACITY :Ёмкость: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Ёмкость: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Типы рельсов: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Замена {STRING.gen} - {STRING} @@ -5366,7 +5368,7 @@ STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}Сост STR_ERROR_TRAIN_TOO_LONG :{WHITE}Поезд слишком длинный STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Не удалось развернуть поезд... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... состоит из нескольких элементов -STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Несовместимый тип рельс +STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Несовместимые типы рельсов STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}Невозможно переместить транспортное средство... STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}Тыловой локомотив всегда следует за его передней частью diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index f275fe2d4b..fc44bc39b9 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -4183,6 +4183,7 @@ STR_PURCHASE_INFO_ALL_BUT :Allt utom {CARG STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximal Dragkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Räckvidd: {GOLD}{COMMA} rutor STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flygplanstyp: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Järnvägstyper: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Alla godstyper @@ -4366,6 +4367,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Driftkostnad: { STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Driftkostnad: {CURRENCY_LONG}/period STR_ENGINE_PREVIEW_CAPACITY :Kapacitet: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapacitet: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Järnvägstyper: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Byt ut {STRING} - {STRING} From 445d2b3e22dd45f659b9bd0173fd5861439951db Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 17 Sep 2025 04:37:43 +0000 Subject: [PATCH 052/280] Update: Translations from eints swedish: 2 changes by robert-i norwegian (bokmal): 4 changes by eriksorngard chinese (traditional): 5 changes by KogentaSan english (us): 5 changes by 2TallTyler greek: 2 changes by gh658804 russian: 2 changes by Ln-Wolf finnish: 2 changes by hpiirai danish: 2 changes by bscargo portuguese: 6 changes by jcteotonio portuguese (brazilian): 9 changes by pasantoro polish: 12 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 16 +++++++++------- src/lang/danish.txt | 2 ++ src/lang/english_US.txt | 5 +++++ src/lang/finnish.txt | 2 ++ src/lang/greek.txt | 2 ++ src/lang/norwegian_bokmal.txt | 4 ++++ src/lang/polish.txt | 22 ++++++++++++---------- src/lang/portuguese.txt | 10 ++++++---- src/lang/russian.txt | 2 ++ src/lang/swedish.txt | 2 ++ src/lang/traditional_chinese.txt | 6 +++++- 11 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 23626a5dde..bb169f5799 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -410,7 +410,7 @@ STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construi STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeroporto STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abrir menu de paisagismo, menu de árvores ou colocar uma placa STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Abrir janela de som/música -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Abrir última mensagem/notícia, histórico de mensagens ou apagar todas as mensagens +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Abrir última mensagem/notícia, histórico de mensagens ou excluir todas as mensagens STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Abrir informações do terreno, menu de captura de tela, créditos do OpenTTD ou ferramentas de desenvolvedor STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Trocar barra de ferramentas @@ -531,7 +531,7 @@ STR_TOOLBAR_SOUND_MUSIC :Som/música # Message menu STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Última mensagem/notícia STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Histórico de mensagens -STR_NEWS_MENU_DELETE_ALL_MESSAGES :Apagar todas as mensagens +STR_NEWS_MENU_DELETE_ALL_MESSAGES :Excluir todas as mensagens # About menu STR_ABOUT_MENU_LAND_BLOCK_INFO :Informações do terreno @@ -3334,7 +3334,7 @@ STR_SAVELOAD_HOME_BUTTON_TOOLTIP :{BLACK}Clique a STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} livres STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades, diretórios e arquivos de jogos salvos STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Nome selecionado para salvar o jogo -STR_SAVELOAD_DELETE_BUTTON :{BLACK}Apagar +STR_SAVELOAD_DELETE_BUTTON :{BLACK}Excluir STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Excluir o jogo salvo selecionado STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salvar STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual usando o nome escolhido @@ -3349,6 +3349,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtro: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Substituir Arquivo STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Você quer mesmo substituir o arquivo existente? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Excluir Arquivo +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Você quer mesmo excluir o arquivo? STR_SAVELOAD_DIRECTORY :{STRING} (Diretório) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório raiz) @@ -4816,15 +4818,15 @@ STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifica STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Alterar o período de tempo que a ordem selecionada deve durar. Ctrl+Clique para definir o tempo para todas as ordens STR_TIMETABLE_CHANGE_TIME_QUERY :Modificar tempo -STR_TIMETABLE_CLEAR_TIME :{BLACK}Apagar Tempo -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Apagar o período de tempo da ordem selecionada. Ctrl+Clique para apagar o tempo de todas as ordens +STR_TIMETABLE_CLEAR_TIME :{BLACK}Remover Tempo +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Remover o período de tempo da ordem selecionada. Ctrl+Clique para remover o tempo de todas as ordens STR_TIMETABLE_CHANGE_SPEED :{BLACK}Modificar limite de velocidade STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Alterar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique para definir a velocidade para todas as ordens STR_TIMETABLE_CHANGE_SPEED_QUERY :Modificar limite de velocidade STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Apagar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique para apagar a velocidade de todas as ordens +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Remover a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique para remover a velocidade de todas as ordens STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar Contador de Atrasos STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar o contador de atrasos para o veículo ficar pontual. Ctrl+Clique para reiniciar todo o grupo e, com isso, fazer o veículo mais atrasado ficar pontual e todos os outros ficarem adiantados @@ -4972,7 +4974,7 @@ STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Gravaç STR_ERROR_AUTOSAVE_FAILED :{WHITE}Salvamento automático falhou STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Não é possível ler a unidade STR_ERROR_GAME_SAVE_FAILED :{WHITE}Falha ao salvar jogo... -STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Não é possível apagar o arquivo +STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Não é possível excluir o arquivo STR_ERROR_GAME_LOAD_FAILED :{WHITE}Falha ao abrir jogo... STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Erro interno: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Jogo salvo está corrompido - {STRING} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 9ed1a39006..d498678ef3 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter udtryk: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overskriv fil STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Er du sikker på du vil overskrive den eksisterende fil? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Slet fil +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Er du sikker på, at du vil slette filen? STR_SAVELOAD_DIRECTORY :{STRING} (Mappe) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Overmappe) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 96f899e5e7..c04f5ce88f 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Delete File +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Are you sure you want to delete the file? STR_SAVELOAD_DIRECTORY :{STRING} (Directory) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Parent directory) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Rail types: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :All cargo types @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Running Cost: { STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Running Cost: {CURRENCY_LONG}/period STR_ENGINE_PREVIEW_CAPACITY :Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacity: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Rail types: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING} @@ -5268,6 +5272,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge i STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 4e564b5fdd..2271da1991 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Suodatin: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Tiedosto on jo olemassa STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Haluatko varmasti korvata olemassaolevan tiedoston? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Poista tiedosto +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Haluatko varmasti poistaa tiedoston? STR_SAVELOAD_DIRECTORY :{STRING} (hakemisto) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (ylähakemisto) diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 7c166c39da..4ad2d4028b 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3441,6 +3441,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Φίλτρο: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Αντικατάσταση Αρχείου STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Είστε σίγουροι οτι θέλετε να αντικαταστήσετε το υπάρχων αρχείο; +STR_SAVELOAD_DELETE_TITLE :{WHITE}Διαγραφή αρχείου +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Είστε σίγουροι ότι θέλετε να διαγράψετε το αρχείο; STR_SAVELOAD_DIRECTORY :{STRING} (Κατάλογος) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Γονικός κατάλογος) diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 1a10bfc7b6..da763e6bdb 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3350,6 +3350,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtrer: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overskriv fil STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Er du sikker på at du vil overskrive eksisterende fil? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Slett fil +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Er du sikker på at du vil slette filen? STR_SAVELOAD_DIRECTORY :{STRING} (Liste) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Foreldrekatalog) @@ -4185,6 +4187,7 @@ STR_PURCHASE_INFO_ALL_BUT :Alt utenom {CAR STR_PURCHASE_INFO_MAX_TE :{BLACK}Største trekkraft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rekkevidde: {GOLD}{COMMA} ruter STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Flytype: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Jernbanetyper: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Alle varetyper @@ -4368,6 +4371,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Running Cost: { STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Driftskostnader: {CURRENCY_LONG}/periode STR_ENGINE_PREVIEW_CAPACITY :Kapasitet: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapasitet: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Jernbanetyper: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Erstatte {STRING} - {STRING} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 8bd6af65a8..e620986c82 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3174,10 +3174,10 @@ STR_JOIN_WAYPOINT_CREATE_SPLIT_WAYPOINT :{YELLOW}Zbuduj STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Nieaktywne, ponieważ nie są dostępne pojazdy korzystające z takiej infrastruktury # Rail construction toolbar -STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Budowa linii kolejowej -STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Budowa linii zelektryfikowanej -STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Budowa linii jednoszynowej -STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Budowa linii Maglev +STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Budowa Linii Kolejowej +STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Budowa Linii Zelektryfikowanej +STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Budowa Linii Jednoszynowej +STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Budowa Linii Maglev STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Zbuduj tory kolejowe. Użyj Ctrl, aby usunąć tory. Użyj Shift, aby tylko wyświetlić szacunkowy koszt STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Zbuduj tory kolejowe za pomocą trybu Autotory. Użyj Ctrl, aby usunąć tory. Użyj Shift, aby tylko wyświetlić szacunkowy koszt @@ -3304,8 +3304,8 @@ STR_BRIDGE_TUBULAR_SILICON :Cylindryczny, k # Road construction toolbar -STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Budowa dróg -STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Budowa linii tramwajowej +STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Budowa Dróg +STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Budowa Linii Tramwajowej STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Zbuduj drogę. Użyj Ctrl, aby usunąć fragment drogi. Użyj Shift, aby tylko wyświetlić szacunkowy koszt STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Zbuduj tory tramwajowe. Użyj Ctrl, aby usunąć fragment torów. Użyj Shift, aby tylko wyświetlić szacunkowy koszt STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Zbuduj drogę za pomocą trybu Autodroga. Użyj Ctrl, aby usunąć fragment drogi. Użyj Shift, aby tylko wyświetlić szacunkowy koszt @@ -3704,10 +3704,10 @@ STR_FRAMETIME_CAPTION_AI :SI {NUM} {STRIN # Save/load game/scenario STR_SAVELOAD_SAVE_CAPTION :{WHITE}Zapisz Grę STR_SAVELOAD_LOAD_CAPTION :{WHITE}Wczytaj Grę -STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Zapisz scenariusz +STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Zapisz Scenariusz STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Wczytaj Scenariusz STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Wczytaj Mapę Wysokości -STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Zapisz mapę wysokości +STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Zapisz Mapę Wysokości STR_SAVELOAD_LOAD_TOWN_DATA :{WHITE}Wczytaj Dane o Miastach STR_SAVELOAD_HOME_BUTTON_TOOLTIP :{BLACK}Kliknij tutaj, aby przejść do domyślnego katalogu zapisów STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} wolnego miejsca @@ -3721,13 +3721,15 @@ STR_SAVELOAD_LOAD_BUTTON :{BLACK}Wczytaj STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Wczytaj wybraną grę STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Wczytaj wybraną mapę wysokości STR_SAVELOAD_LOAD_TOWN_DATA_TOOLTIP :{BLACK}Wczytaj zaznaczone dane o miastach -STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Szczegóły gry +STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Szczegóły Gry STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Brak dostępnych informacji STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtr: -STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Zastąp plik +STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Zastąp Plik STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Czy na pewno chcesz zastąpić istniejący stan gry? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Usuń Plik +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Czy na pewno chcesz usunąć ten plik? STR_SAVELOAD_DIRECTORY :{STRING} (folder) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (folder nadrzędny) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 6000a0385e..61272732f9 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2800,8 +2800,8 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Construção de STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Construção de Monocarris STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construção de Linhas Maglev -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha de carril. Ctrl+Clique para remover a linha de carril. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir linha de carril usando o modo automático para a direção. Ctrl+Clique para remover a linha de carril. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha ferroviária. Ctrl+Clique para remover a linha. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir linha ferroviária usando o modo automático para a direção. Ctrl+Clique para remover a linha. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controlo na ferrovia. Ctrl+Clique para selecionar outro ponto de controlo para se unir. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado @@ -2811,7 +2811,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construi STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controlo e estações. Ctrl+Clique também remove os carris de pontos de passagem e de estações STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de via férrea. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_NAME_RAILROAD :{G=mp}Caminhos-de-ferro (Convencional) +STR_RAIL_NAME_RAILROAD :{G=mp}Caminhos-de-ferro STR_RAIL_NAME_ELRAIL :{G=mp}Caminhos-de-ferro eletrificados STR_RAIL_NAME_MONORAIL :{G=m}Monocarril STR_RAIL_NAME_MAGLEV :Maglev (Levitação Magnética) @@ -3349,6 +3349,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtro: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Substituir Ficheiro STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Tem a certeza que deseja substituir o ficheiro existente? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Apagar Ficheiro +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Tem a certeza que quer apagar este ficheiro? STR_SAVELOAD_DIRECTORY :{STRING} (Diretório) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório pai) @@ -5214,7 +5216,7 @@ STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Estrada STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Passagens de nível não são permitidas para este tipo de linha STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Passagens de nível não são permitidas para este tipo de estrada STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Não é possível construir sinais aqui... -STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir a linha de carril aqui... +STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Não é possível construir a linha ferroviária aqui... STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Não é possível remover linha férrea daqui... STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Não é possível remover sinais daqui... STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Não é possível converter sinais aqui... diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 32d8c6090d..277fbec78e 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3523,6 +3523,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Фильтр: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Перезапись файла STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Перезаписать файл? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Удаление файла +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Вы уверены, что хотите удалить файл? STR_SAVELOAD_DIRECTORY :{STRING} (Каталог) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Родительский каталог) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index fc44bc39b9..298b9d86b2 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Sökfilter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Skriv över fil STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Är du säker på att du vill skriva över den existerande filen? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Ta bort fil +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Vill du verkligen ta bort filen? STR_SAVELOAD_DIRECTORY :{STRING} (Katalog) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Föräldrakatalog) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 88a2049ae1..8acba78a68 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF STR_SAVELOAD_FILTER_TITLE :{BLACK}篩選: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}覆蓋檔案 STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}你確定要覆蓋現有存檔嗎? +STR_SAVELOAD_DELETE_TITLE :{WHITE}刪除檔案 +STR_SAVELOAD_DELETE_WARNING :{YELLOW}您確定要刪除檔案嗎? STR_SAVELOAD_DIRECTORY :{STRING} (路徑) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (上層資料夾) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :所有貨物( STR_PURCHASE_INFO_MAX_TE :{BLACK}最大牽引力:{GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}範圍:{GOLD}{COMMA} 方格 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飛機類型:{GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}軌道類型:{GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :所有貨物種類 @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :營運成本: STR_ENGINE_PREVIEW_RUNCOST_PERIOD :營運成本:{CURRENCY_LONG}/週期 STR_ENGINE_PREVIEW_CAPACITY :容量:{CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :容量:{CARGO_LONG}、{CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :軌道類型:{STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}替換 {STRING} - {STRING} @@ -5179,7 +5183,7 @@ STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}列車 STR_ERROR_TRAIN_TOO_LONG :{WHITE}列車過長 STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}無法調轉車輛方向... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... 由多節車廂組成 -STR_ERROR_INCOMPATIBLE_RAIL_TYPES :軌道種類不相容 +STR_ERROR_INCOMPATIBLE_RAIL_TYPES :軌道類型不相容 STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}無法移動車輛... STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}後端車頭一定要跟著前端車頭 From 129825077b61b59790d5cae1a879a92885d6923e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Sep 2025 12:29:16 +0100 Subject: [PATCH 053/280] Change: Apply interface scale to window snap distance. (#14625) --- src/window.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/window.cpp b/src/window.cpp index ebda278665..50422b89de 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2160,8 +2160,8 @@ static EventState HandleWindowDragging() int ny = y; if (_settings_client.gui.window_snap_radius != 0) { - int hsnap = _settings_client.gui.window_snap_radius; - int vsnap = _settings_client.gui.window_snap_radius; + int hsnap = ScaleGUITrad(_settings_client.gui.window_snap_radius); + int vsnap = ScaleGUITrad(_settings_client.gui.window_snap_radius); int delta; for (const Window *v : Window::Iterate()) { From 262c364a286d1e4a4912ae3521ef45327a1706c0 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Wed, 17 Sep 2025 21:43:22 +0200 Subject: [PATCH 054/280] Fix #14620: Use full file path when deleting files. (#14623) --- src/fios.cpp | 10 ---------- src/fios.h | 1 - src/fios_gui.cpp | 17 +++++++++++++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/fios.cpp b/src/fios.cpp index 94a60a8a3f..fc02d43da7 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -230,16 +230,6 @@ std::string FiosMakeHeightmapName(std::string_view name) return FiosMakeFilename(_fios_path, name, fmt::format(".{}", GetCurrentScreenshotExtension())); } -/** - * Delete a file. - * @param name Filename to delete. - * @return Whether the file deletion was successful. - */ -bool FiosDelete(std::string_view name) -{ - return FioRemove(FiosMakeSavegameName(name)); -} - typedef std::tuple FiosGetTypeAndNameProc(SaveLoadOperation fop, std::string_view filename, std::string_view ext); /** diff --git a/src/fios.h b/src/fios.h index 0436880f26..0da3311f7b 100644 --- a/src/fios.h +++ b/src/fios.h @@ -112,7 +112,6 @@ bool FiosBrowseTo(const FiosItem *item); std::string FiosGetCurrentPath(); std::optional FiosGetDiskFreeSpace(const std::string &path); -bool FiosDelete(std::string_view name); std::string FiosMakeHeightmapName(std::string_view name); std::string FiosMakeSavegameName(std::string_view name); diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index a63679cc8f..10e05908eb 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -327,13 +327,13 @@ private: QueryString filename_editbox; ///< Filename editbox. AbstractFileType abstract_filetype{}; /// Type of file to select. SaveLoadOperation fop{}; ///< File operation to perform. - FileList fios_items{}; ///< Save game list. + FileList fios_items{}; ///< Item list. FiosItem o_dir{}; ///< Original dir (home dir for this browser) - const FiosItem *selected = nullptr; ///< Selected game in #fios_items, or \c nullptr. + const FiosItem *selected = nullptr; ///< Selected item in #fios_items, or \c nullptr. const FiosItem *highlighted = nullptr; ///< Item in fios_items highlighted by mouse pointer, or \c nullptr. Scrollbar *vscroll = nullptr; - StringFilter string_filter{}; ///< Filter for available games. + StringFilter string_filter{}; ///< Filter for available items. QueryString filter_editbox; ///< Filter editbox; std::vector display_list{}; ///< Filtered display list @@ -353,8 +353,10 @@ private: { auto *save_load_window = static_cast(window); + assert(save_load_window->selected != nullptr); + if (confirmed) { - if (!FiosDelete(save_load_window->filename_editbox.text.GetText())) { + if (!FioRemove(save_load_window->selected->name)) { ShowErrorMessage(GetEncodedString(STR_ERROR_UNABLE_TO_DELETE_FILE), {}, WL_ERROR); } else { save_load_window->InvalidateData(SLIWD_RESCAN_FILES); @@ -909,6 +911,8 @@ public: /* Selection changes */ if (!gui_scope) break; + if (this->fop == SLO_SAVE) this->SetWidgetDisabledState(WID_SL_DELETE_SELECTION, this->selected == nullptr); + if (this->fop != SLO_LOAD) break; switch (this->abstract_filetype) { @@ -947,6 +951,11 @@ public: this->string_filter.SetFilterTerm(this->filter_editbox.text.GetText()); this->InvalidateData(SLIWD_FILTER_CHANGES); } + + if (wid == WID_SL_SAVE_OSK_TITLE) { + this->selected = nullptr; + this->InvalidateData(SLIWD_SELECTION_CHANGES); + } } }; From d54bf4993659d72d0ab88380f07b79a363527d25 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 17 Sep 2025 22:42:42 +0100 Subject: [PATCH 055/280] Fix: Variant cycle detection in FinaliseEngineArray (#14629) --- src/newgrf.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 547b1bbc43..b6444a8e06 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -904,12 +904,18 @@ static void FinaliseEngineArray() } /* Check engine variants don't point back on themselves (either directly or via a loop) then set appropriate flags - * on variant engine. This is performed separately as all variant engines need to have been resolved. */ + * on variant engine. This is performed separately as all variant engines need to have been resolved. + * Use Floyd's cycle-detection algorithm to handle the case where a cycle is present but does + * not include the starting engine ID. */ for (Engine *e : Engine::Iterate()) { EngineID parent = e->info.variant_id; + EngineID parent_slow = parent; + bool update_slow = false; while (parent != EngineID::Invalid()) { parent = Engine::Get(parent)->info.variant_id; - if (parent != e->index) continue; + if (update_slow) parent_slow = Engine::Get(parent_slow)->info.variant_id; + update_slow = !update_slow; + if (parent != e->index && parent != parent_slow) continue; /* Engine looped back on itself, so clear the variant. */ e->info.variant_id = EngineID::Invalid(); From 2d13bcb7b99366292f2d08a36692e049e4bfacba Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 18 Sep 2025 04:37:46 +0000 Subject: [PATCH 056/280] Update: Translations from eints french: 5 changes by ottdfevr portuguese: 31 changes by jcteotonio --- src/lang/french.txt | 5 ++++ src/lang/portuguese.txt | 62 ++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/lang/french.txt b/src/lang/french.txt index d7475456a6..d1b844e658 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -3349,6 +3349,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF{ STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtre{NBSP}: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Écraser le fichier STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Êtes-vous sûr de vouloir écraser le fichier existant{NBSP}? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Supprimer le fichier +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Êtes-vous sûr de vouloir supprimer ce fichier ? STR_SAVELOAD_DIRECTORY :{STRING} (Répertoire) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Répertoire parent) @@ -4184,6 +4186,7 @@ STR_PURCHASE_INFO_ALL_BUT :Tous sauf {CARG STR_PURCHASE_INFO_MAX_TE :{BLACK}Effort de traction max.{NBSP}: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rayon d'action{NBSP}: {GOLD}{COMMA}{NBSP}cases STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Type d'aéronef{NBSP}: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Types de rail : {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Tous les types de cargaison @@ -4367,6 +4370,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Coûts d'entret STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Coûts d'entretien{NBSP}: {CURRENCY_LONG}/période STR_ENGINE_PREVIEW_CAPACITY :Capacité{NBSP}: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Types de rail : {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Remplacer {STRING} - {STRING} @@ -5268,6 +5272,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Le pont STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Le pont est trop bas pour les bouées STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle de route +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Ce pont est trop bas pour le verrouillage # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Impossible de construire un tunnel ici... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 61272732f9..006cdcbc5f 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -667,7 +667,7 @@ STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Engenheiro STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Gestor de Tráfego STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordenador de Transportes STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR :Supervisor de Rotas -STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Director +STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR :Diretor STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE :Chefe Executivo STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN :Diretor Executivo STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT :Presidente @@ -684,9 +684,9 @@ STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP :{BLACK}Ver deta ###length 10 STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Veículos: STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Estações: -STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Mín. lucros: -STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Mín. rendim.: -STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Máx. rendim.: +STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Lucro mín.: +STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Rendim. mín.: +STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Rendim. máx.: STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Entregue: STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Carga: STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Dinheiro: @@ -754,18 +754,18 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique n # Highscore window STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}As melhores empresas -STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. -STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Negociante -STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empresário -STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrial +STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}º +STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Empresário +STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empreendedor +STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrialista STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitalista STR_HIGHSCORE_PERFORMANCE_TITLE_MAGNATE :Magnata -STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Grande magnata -STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnata do século +STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Grande Magnata +STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnata do Século STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} -STR_HIGHSCORE_STATS :{BIG_FONT}"{STRING}" ({COMMA}) -STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}{COMPANY} alcança o estatuto de '{STRING}'! -STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}{PRESIDENT_NAME} de {COMPANY} conquista o estatuto de '{STRING}'! +STR_HIGHSCORE_STATS :{BIG_FONT}“{STRING}” ({COMMA}) +STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}{COMPANY} alcança o estatuto de “{STRING}”! +STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}{PRESIDENT_NAME} de {COMPANY} conquista o estatuto de “{STRING}”! # Smallmap window STR_SMALLMAP_CAPTION :{WHITE}Mapa - {STRING} @@ -897,8 +897,8 @@ STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Est{G 0 á á á ão ão} a ser feit{G 0 o o a os as} {G 0 "um " "um " "uma " "" ""}nov{G 0 o o a os as} {STRING} perto de {TOWN}! STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}{G 0 "" "O " "A " "Os " "As "}{STRING} anuncia{G 0 "" "" "" m m} fecho iminente! -STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Problemas de abastecimento levam{G 0 "" " o" " a" " os" " as"} {STRING} a anunciar{G 0 "" "" "" em em} fecho iminente! -STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}Escassez de árvores nas proximidades leva{G 0 "" " o" " a" " os" " as"} {STRING} a anunciar{G 0 "" "" "" em em} fecho iminente! +STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Problemas de abastecimento leva{G 0 "" "" "" m m} {G 0 "" "o " "a " "o " "as "}{STRING} a anunciar{G 0 "" "" "" em em} fecho iminente! +STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}Escassez de árvores nas proximidades leva{G 0 "" "" "" m m} {G 0 "" "o " "a " "os " "as "}{STRING} a anunciar{G 0 "" "" "" em em} fecho iminente! STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}União Monetária Europeia!{}{}O Euro é introduzido como moeda única para todas as transacções no seu país! STR_NEWS_BEGIN_OF_RECESSION :{BIG_FONT}{BLACK}Recessão Mundial!{}{}Especialistas financeiros temem crise económica! @@ -1783,7 +1783,7 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Mostrar horári STR_CONFIG_SETTING_QUICKGOTO :Criação rápida de ordens de veículos: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pré-selecionar o 'cursor Ir Para' ao abrir a janela de ordens -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou abrir jogo): {STRING} +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de linha ferroviária (ao criar/abrir jogo): {STRING} STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de carril selecionado após o início ou carregamento de um jogo. 'primeiro disponível' seleciona o tipo mais antigo de carril, 'último disponível' seleciona o tipo mais recente de carril e 'mais utilizado' seleciona o tipo mais utilizado atualmente ###length 3 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível @@ -2515,8 +2515,8 @@ STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}Juntar-s STR_NETWORK_CLIENT_LIST_COMPANY_AUTHORIZE_TOOLTIP :{BLACK}Autorizar este cliente a ingressar na sua empresa STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Enviar uma mensagem a este jogador STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Enviar uma mensagem a todos os jogadores desta empresa -STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Enviar uma mensagem a todos os espectadores -STR_NETWORK_CLIENT_LIST_SPECTATORS :Espectadores +STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Enviar uma mensagem a todos os espetadores +STR_NETWORK_CLIENT_LIST_SPECTATORS :Espetadores STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nova empresa) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Criar uma nova empresa e aderir à mesma STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Este é você @@ -2529,7 +2529,7 @@ STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP :{BLACK}O númer STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}Local STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}Jogadores remotos não conseguem conetar STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}Público -STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Atrás de NAT +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}Atrás de um NAT STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}Via retransmissão STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar @@ -2649,7 +2649,7 @@ STR_NETWORK_MESSAGE_CLIENT_LEAVING :a sair STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} entrou no jogo (Client #{NUM}) STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} juntou-se a {STRING} -STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} entrou como espectador +STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} entrou como espetador STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} iniciou uma nova empresa (#{NUM}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} deixou o jogo ({STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} mudou o nome para {STRING} @@ -2803,16 +2803,16 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Construção de STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha ferroviária. Ctrl+Clique para remover a linha. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construir linha ferroviária usando o modo automático para a direção. Ctrl+Clique para remover a linha. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito ferroviário (para compra e manutenção de comboios). Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controlo na ferrovia. Ctrl+Clique para selecionar outro ponto de controlo para se unir. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controlo na linha ferroviária. Ctrl+Clique para selecionar outro ponto de controlo para fazer a união. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais na linha ferroviária. Ctrl+Clique para construir estilo de sinal alternativo{}Clique+Arrastar para preencher a secção de via selecionada com sinais no espaçamento escolhido. Ctrl+Clique+Arrastar para preencher com sinais até à próxima junção, estação ou sinal. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressione também Shift para apenas mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controlo e estações. Ctrl+Clique também remove os carris de pontos de passagem e de estações -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de via férrea. Pressione também Shift para apenas mostrar o custo estimado +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de carril. Pressione também Shift para apenas mostrar o custo estimado -STR_RAIL_NAME_RAILROAD :{G=mp}Caminhos-de-ferro -STR_RAIL_NAME_ELRAIL :{G=mp}Caminhos-de-ferro eletrificados +STR_RAIL_NAME_RAILROAD :{G=m}Caminho-de-ferro +STR_RAIL_NAME_ELRAIL :{G=m}Caminho-de-ferro eletrificado STR_RAIL_NAME_MONORAIL :{G=m}Monocarril STR_RAIL_NAME_MAGLEV :Maglev (Levitação Magnética) @@ -3118,8 +3118,8 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Tem a c # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadeia da Indústria - {STRING} STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadeia de Carga - {STRING} -STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Indústrias produtoras -STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias receptoras +STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Produtores +STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Recetores STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clique na indústria para ver os seus fornecedores e clientes STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clique na mercadoria para ver os seus fornecedores e clientes @@ -3885,7 +3885,7 @@ STR_STATION_VIEW_GROUP_D_S_V :Destino-Origem- STR_STATION_VIEW_GROUP_D_V_S :Destino-Via-Origem ###length 8 -STR_CARGO_RATING_APPALLING :Horrível +STR_CARGO_RATING_APPALLING :Péssimo STR_CARGO_RATING_VERY_POOR :Muito Fraco STR_CARGO_RATING_POOR :Fraco STR_CARGO_RATING_MEDIOCRE :Medíocre @@ -4186,7 +4186,7 @@ STR_PURCHASE_INFO_ALL_BUT :Todas menos {CA STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforço de Tração Máx: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Alcance: {GOLD}{COMMA} mosaicos STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} -STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipos de carril: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipo de carril: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga @@ -4370,7 +4370,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Custo de Circul STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Custo de Circulação: {CURRENCY_LONG}/período STR_ENGINE_PREVIEW_CAPACITY :Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG} -STR_ENGINE_PREVIEW_RAILTYPES :Tipos de carril: {STRING} +STR_ENGINE_PREVIEW_RAILTYPES :Tipo de carril: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituir {STRING} - {STRING} @@ -4435,7 +4435,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Centrar ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito. Ctrl+Clique para fazer apenas manutenção STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para a garagem. Ctrl+Clique para fazer apenas manutenção -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique para fazer apenas manutenção +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar navio para o estaleiro. Ctrl+Clique para fazer apenas manutenção STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar. Ctrl+Clique para fazer apenas manutenção ###length VEHICLE_TYPES @@ -5886,7 +5886,7 @@ STR_COMPANY_SOMEONE :alguém STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} -STR_SAVEGAME_NAME_SPECTATOR :Espectador, {1:STRING} +STR_SAVEGAME_NAME_SPECTATOR :Espetador, {1:STRING} # Viewport strings STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA}) From 17fbe0b9112a839ea9667f7534625fcd43e5890b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 18 Sep 2025 18:52:14 +0100 Subject: [PATCH 057/280] Change: Determine automatic interface scale by window size. (#14627) Replace OS-dependent interface scaling with scaling dependent on the window size. This works on all platforms and should provide a more comfortable experience for new players. Manual interface scale setting works as before. --- src/gfx.cpp | 11 +++++++++- src/settings_gui.cpp | 16 +++++++++++++-- src/video/cocoa/cocoa_v.h | 1 - src/video/cocoa/cocoa_v.mm | 6 ------ src/video/video_driver.hpp | 16 --------------- src/video/win32_v.cpp | 41 -------------------------------------- src/video/win32_v.h | 1 - 7 files changed, 24 insertions(+), 68 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 8dfc5683fa..87b6c7c50e 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1325,6 +1325,10 @@ void ScreenSizeChanged() /* screen size changed and the old bitmap is invalid now, so we don't want to undraw it */ _cursor.visible = false; + + if (VideoDriver::GetInstance() != nullptr) { + if (AdjustGUIZoom(true)) ReInitAllWindows(true); + } } void UndrawMouseCursor() @@ -1785,7 +1789,12 @@ void UpdateGUIZoom() { /* Determine real GUI zoom to use. */ if (_gui_scale_cfg == -1) { - _gui_scale = VideoDriver::GetInstance()->GetSuggestedUIScale(); + /* Minimum design size of the game is 640x480. */ + float xs = _screen.width / 640.f; + float ys = _screen.height / 480.f; + int scale = std::min(xs, ys) * 100; + /* Round down scaling to 25% increments and clamp to limits. */ + _gui_scale = Clamp((scale / 25) * 25, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); } else { _gui_scale = Clamp(_gui_scale_cfg, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 800c4ef71b..034a5da24b 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -417,10 +417,11 @@ struct GameOptionsWindow : Window { GameSettings *opt = nullptr; bool reload = false; + bool gui_scale_changed = false; int gui_scale = 0; static inline WidgetID active_tab = WID_GO_TAB_GENERAL; - GameOptionsWindow(WindowDesc &desc) : Window(desc), filter_editbox(50), gui_scale(_gui_scale) + GameOptionsWindow(WindowDesc &desc) : Window(desc), filter_editbox(50) { this->opt = &GetGameSettings(); @@ -453,6 +454,7 @@ struct GameOptionsWindow : Window { void OnInit() override { _setting_circle_size = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); + this->gui_scale = _gui_scale; } void Close([[maybe_unused]] int data = 0) override @@ -1057,7 +1059,16 @@ struct GameOptionsWindow : Window { #endif /* HAS_TRUETYPE_FONT */ case WID_GO_GUI_SCALE: + /* Any click on the slider deactivates automatic interface scaling, setting it to the current value before being adjusted. */ + if (_gui_scale_cfg == -1) { + _gui_scale_cfg = this->gui_scale; + this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, false); + this->SetWidgetDirty(WID_GO_GUI_SCALE_AUTO); + this->SetWidgetDirty(WID_GO_GUI_SCALE_AUTO_TEXT); + } + if (ClickSliderWidget(this->GetWidget(widget)->GetCurrentRect(), pt, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE, _ctrl_pressed ? 0 : SCALE_NMARKS, this->gui_scale)) { + this->gui_scale_changed = true; this->SetWidgetDirty(widget); } @@ -1383,8 +1394,9 @@ struct GameOptionsWindow : Window { void OnMouseLoop() override { - if (_left_button_down || this->gui_scale == _gui_scale) return; + if (_left_button_down || !this->gui_scale_changed) return; + this->gui_scale_changed = false; _gui_scale_cfg = this->gui_scale; if (AdjustGUIZoom(false)) { diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 727a9b140b..738a796805 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -64,7 +64,6 @@ protected: bool buffer_locked; ///< Video buffer was locked by the main thread. Dimension GetScreenSize() const override; - float GetDPIScale() override; void InputLoop() override; bool LockVideoBuffer() override; void UnlockVideoBuffer() override; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 6960b0f925..31f390fe09 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -283,12 +283,6 @@ Dimension VideoDriver_Cocoa::GetScreenSize() const return { static_cast(NSWidth(frame)), static_cast(NSHeight(frame)) }; } -/** Get DPI scale of our window. */ -float VideoDriver_Cocoa::GetDPIScale() -{ - return this->cocoaview != nil ? [ this->cocoaview getContentsScale ] : 1.0f; -} - /** Lock video buffer for drawing if it isn't already mapped. */ bool VideoDriver_Cocoa::LockVideoBuffer() { diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index c6229da341..d302ca1a03 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -166,16 +166,6 @@ public: return {}; } - /** - * Get a suggested default GUI scale taking screen DPI into account. - */ - virtual int GetSuggestedUIScale() - { - float dpi_scale = this->GetDPIScale(); - - return Clamp(dpi_scale * 100, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE); - } - virtual std::string_view GetInfoString() const { return this->GetName(); @@ -233,12 +223,6 @@ protected: */ virtual Dimension GetScreenSize() const { return { DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT }; } - /** - * Get DPI scaling factor of the screen OTTD is displayed on. - * @return 1.0 for default platform DPI, > 1.0 for higher DPI values, and < 1.0 for smaller DPI values. - */ - virtual float GetDPIScale() { return 1.0f; } - /** * Apply resolution auto-detection and clamp to sensible defaults. */ diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 33dc0a8b21..728b2be9f9 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -1079,47 +1079,6 @@ Dimension VideoDriver_Win32Base::GetScreenSize() const return { static_cast(GetSystemMetrics(SM_CXSCREEN)), static_cast(GetSystemMetrics(SM_CYSCREEN)) }; } -float VideoDriver_Win32Base::GetDPIScale() -{ - typedef UINT (WINAPI *PFNGETDPIFORWINDOW)(HWND hwnd); - typedef UINT (WINAPI *PFNGETDPIFORSYSTEM)(VOID); - typedef HRESULT (WINAPI *PFNGETDPIFORMONITOR)(HMONITOR hMonitor, int dpiType, UINT *dpiX, UINT *dpiY); - - static PFNGETDPIFORWINDOW _GetDpiForWindow = nullptr; - static PFNGETDPIFORSYSTEM _GetDpiForSystem = nullptr; - static PFNGETDPIFORMONITOR _GetDpiForMonitor = nullptr; - - static bool init_done = false; - if (!init_done) { - init_done = true; - static LibraryLoader _user32("user32.dll"); - static LibraryLoader _shcore("shcore.dll"); - _GetDpiForWindow = _user32.GetFunction("GetDpiForWindow"); - _GetDpiForSystem = _user32.GetFunction("GetDpiForSystem"); - _GetDpiForMonitor = _shcore.GetFunction("GetDpiForMonitor"); - } - - UINT cur_dpi = 0; - - if (cur_dpi == 0 && _GetDpiForWindow != nullptr && this->main_wnd != nullptr) { - /* Per window DPI is supported since Windows 10 Ver 1607. */ - cur_dpi = _GetDpiForWindow(this->main_wnd); - } - if (cur_dpi == 0 && _GetDpiForMonitor != nullptr && this->main_wnd != nullptr) { - /* Per monitor is supported since Windows 8.1. */ - UINT dpiX, dpiY; - if (SUCCEEDED(_GetDpiForMonitor(MonitorFromWindow(this->main_wnd, MONITOR_DEFAULTTOPRIMARY), 0 /* MDT_EFFECTIVE_DPI */, &dpiX, &dpiY))) { - cur_dpi = dpiX; // X and Y are always identical. - } - } - if (cur_dpi == 0 && _GetDpiForSystem != nullptr) { - /* Fall back to system DPI. */ - cur_dpi = _GetDpiForSystem(); - } - - return cur_dpi > 0 ? cur_dpi / 96.0f : 1.0f; // Default Windows DPI value is 96. -} - bool VideoDriver_Win32Base::LockVideoBuffer() { if (this->buffer_locked) return false; diff --git a/src/video/win32_v.h b/src/video/win32_v.h index 9b2cb8535e..f0426a29c0 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -49,7 +49,6 @@ protected: bool buffer_locked; ///< Video buffer was locked by the main thread. Dimension GetScreenSize() const override; - float GetDPIScale() override; void InputLoop() override; bool LockVideoBuffer() override; void UnlockVideoBuffer() override; From 264cbd8ab5d5dfaff6d7b0f3758275b6219fae36 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 19 Sep 2025 04:38:27 +0000 Subject: [PATCH 058/280] Update: Translations from eints english (au): 4 changes by krysclarke portuguese: 13 changes by jcteotonio --- src/lang/english_AU.txt | 4 ++++ src/lang/portuguese.txt | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 67afff78e3..804b09d79c 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Overwrite File STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Are you sure you want to overwrite the existing file? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Delete File +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Are you sure you want to delete the file? STR_SAVELOAD_DIRECTORY :{STRING} (Directory) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Parent directory) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :All but {CARGO_ STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Tractive Effort: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Range: {GOLD}{COMMA} tiles STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Aircraft type: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Rail types: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :All cargo types @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Running Cost: { STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Running Cost: {CURRENCY_LONG}/period STR_ENGINE_PREVIEW_CAPACITY :Capacity: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacity: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Rail types: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Replace {STRING} - {STRING} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 006cdcbc5f..3e9672d321 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -763,7 +763,7 @@ STR_HIGHSCORE_PERFORMANCE_TITLE_MAGNATE :Magnata STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Grande Magnata STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnata do Século STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} -STR_HIGHSCORE_STATS :{BIG_FONT}“{STRING}” ({COMMA}) +STR_HIGHSCORE_STATS :{BIG_FONT}"{STRING}" ({COMMA}) STR_HIGHSCORE_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{BLACK}{COMPANY} alcança o estatuto de “{STRING}”! STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHITE}{PRESIDENT_NAME} de {COMPANY} conquista o estatuto de “{STRING}”! @@ -1583,7 +1583,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar a popul STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas dos gráficos estatísticos: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Largura da linha nos gráficos. Uma linha mais estreita é de leitura mais precisa, enquanto uma linha mais espessa é mais fácil de ver e as cores distinguem-se melhor. -STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Exibir o nome do "NewGRF" na janela de compra de veículos: {STRING} +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostrar o nome do NewGRF na janela de compra de veículos: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Adiciona uma linha à janela de compra de veículos, mostrando a qual "NewGRF" pertence o veículo selecionado STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Mostrar as cargas que os veículos podem transportar nas janelas de listagem: {STRING} STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Quando ativo, a carga transportável do veículo aparecerá acima nas listas de veículos @@ -4433,10 +4433,10 @@ STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrar STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Centrar a visualização na localização da aeronave. Clique duplo para seguir a aeronave na visualização principal. Ctrl+Clique para abrir um novo visualizador na localização da aeronave ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito. Ctrl+Clique para fazer apenas manutenção -STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para a garagem. Ctrl+Clique para fazer apenas manutenção -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar navio para o estaleiro. Ctrl+Clique para fazer apenas manutenção -STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar. Ctrl+Clique para fazer apenas manutenção +STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar comboio para o depósito. Ctrl+Clique para fazer apenas a manutenção +STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar o veículo para a garagem. Ctrl+Clique para fazer apenas a manutenção +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar navio para o estaleiro. Ctrl+Clique para fazer apenas a manutenção +STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar a aeronave para o hangar. Ctrl+Clique para fazer apenas a manutenção ###length VEHICLE_TYPES STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Comprar uma cópia do comboio, incluindo todos os veículos rebocados. Ctrl+Clique para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado @@ -4445,7 +4445,7 @@ STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Comprar STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Comprar uma cópia da aeronave. Ctrl+Clique para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forçar comboio a prosseguir sem esperar pelo sinal -STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter direção do comboio +STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter sentido do comboio STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forçar veículo a dar a volta STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique para abrir um novo visualizador na localização do destino da ordem @@ -5182,7 +5182,7 @@ STR_ERROR_AIRCRAFT_MUST_BE_STOPPED_INSIDE_HANGAR :{WHITE}... tem 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}Não é possível inverter a direção do veículo... +STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}Não é possível inverter o sentido do veículo... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}... compostos por unidades múltiplas STR_ERROR_INCOMPATIBLE_RAIL_TYPES :Vias férreas incompatíveis @@ -5336,10 +5336,10 @@ 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 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... +STR_ERROR_CAN_T_SEND_TRAIN_TO_DEPOT :{WHITE}Não é possível enviar o comboio para o depósito ferroviário... +STR_ERROR_CAN_T_SEND_ROAD_VEHICLE_TO_DEPOT :{WHITE}Não é possível enviar o veículo para a garagem... +STR_ERROR_CAN_T_SEND_SHIP_TO_DEPOT :{WHITE}Não é possível enviar o navio para o estaleiro naval... +STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR :{WHITE}Não é possível enviar a aeronave para o hangar... ###length VEHICLE_TYPES STR_ERROR_CAN_T_BUY_TRAIN :{WHITE}Não é possível comprar veículo ferroviário... @@ -5390,7 +5390,7 @@ STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET_EXPLANATION :{WHITE}Começar # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Não é possível fazer o comboio passar o sinal com perigo... -STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Não é possível inverter a direção do comboio... +STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Não é possível inverter o sentido do comboio... STR_ERROR_TRAIN_START_NO_POWER :O comboio não tem energia STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Não é possível fazer o veículo dar a volta... From 68e37b7b50daa88c6b4244306f66ffe6ebd808b1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 19 Sep 2025 22:02:08 +0100 Subject: [PATCH 059/280] Change: [Script] Decouple RAILTYPE_INVALID from internal presentation. (#14630) RAILTYPE_INVALID is now -1, which matches ROADTYPE_INVALID. --- regression/regression/result.txt | 488 +++++++++++++++---------------- src/script/api/script_engine.cpp | 5 +- src/script/api/script_rail.hpp | 5 +- 3 files changed, 250 insertions(+), 248 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index ba6304953a..6a88a5297d 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -1404,7 +1404,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1443,7 +1443,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1462,7 +1462,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1481,7 +1481,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1500,7 +1500,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1519,7 +1519,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1538,7 +1538,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1557,7 +1557,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1616,7 +1616,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1635,7 +1635,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1654,7 +1654,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1673,7 +1673,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1692,7 +1692,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1711,7 +1711,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1730,7 +1730,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1749,7 +1749,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1768,7 +1768,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1787,7 +1787,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1806,7 +1806,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1825,7 +1825,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1844,7 +1844,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1863,7 +1863,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1882,7 +1882,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1901,7 +1901,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -1920,7 +1920,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2159,7 +2159,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2178,7 +2178,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2197,7 +2197,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2216,7 +2216,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2235,7 +2235,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2254,7 +2254,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2273,7 +2273,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2292,7 +2292,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2311,7 +2311,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2330,7 +2330,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2349,7 +2349,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2368,7 +2368,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2387,7 +2387,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2406,7 +2406,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2425,7 +2425,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2444,7 +2444,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2463,7 +2463,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2482,7 +2482,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2501,7 +2501,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2520,7 +2520,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2539,7 +2539,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2558,7 +2558,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2577,7 +2577,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2596,7 +2596,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2615,7 +2615,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2634,7 +2634,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2653,7 +2653,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2672,7 +2672,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2691,7 +2691,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2710,7 +2710,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2729,7 +2729,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2748,7 +2748,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2767,7 +2767,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2786,7 +2786,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2805,7 +2805,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2824,7 +2824,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2843,7 +2843,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2862,7 +2862,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2881,7 +2881,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2900,7 +2900,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2919,7 +2919,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2938,7 +2938,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2957,7 +2957,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2976,7 +2976,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -2995,7 +2995,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3014,7 +3014,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3033,7 +3033,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3052,7 +3052,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3071,7 +3071,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3090,7 +3090,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3109,7 +3109,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3128,7 +3128,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3147,7 +3147,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3166,7 +3166,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3185,7 +3185,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3204,7 +3204,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3223,7 +3223,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3242,7 +3242,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3261,7 +3261,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3280,7 +3280,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3299,7 +3299,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3318,7 +3318,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3337,7 +3337,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3356,7 +3356,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3375,7 +3375,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3394,7 +3394,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3413,7 +3413,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3432,7 +3432,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3451,7 +3451,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3470,7 +3470,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3489,7 +3489,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3508,7 +3508,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3527,7 +3527,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3546,7 +3546,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3565,7 +3565,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3584,7 +3584,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3603,7 +3603,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3622,7 +3622,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3641,7 +3641,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 10 GetMaxTractiveEffort(): 29 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3660,7 +3660,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3679,7 +3679,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3698,7 +3698,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3717,7 +3717,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3736,7 +3736,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3755,7 +3755,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3774,7 +3774,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3793,7 +3793,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3812,7 +3812,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3831,7 +3831,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3850,7 +3850,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3869,7 +3869,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3888,7 +3888,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3907,7 +3907,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3926,7 +3926,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3945,7 +3945,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3964,7 +3964,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -3983,7 +3983,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4002,7 +4002,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4021,7 +4021,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4040,7 +4040,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4059,7 +4059,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4078,7 +4078,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4097,7 +4097,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4116,7 +4116,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4135,7 +4135,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4154,7 +4154,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4173,7 +4173,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4192,7 +4192,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4211,7 +4211,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4230,7 +4230,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4249,7 +4249,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4268,7 +4268,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4287,7 +4287,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4306,7 +4306,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4325,7 +4325,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4344,7 +4344,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): 9 GetMaxTractiveEffort(): 26 GetVehicleType(): 1 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): 0 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4363,7 +4363,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4382,7 +4382,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4401,7 +4401,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4420,7 +4420,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4439,7 +4439,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4458,7 +4458,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4477,7 +4477,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4496,7 +4496,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4515,7 +4515,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4534,7 +4534,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4553,7 +4553,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4572,7 +4572,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4591,7 +4591,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4610,7 +4610,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4629,7 +4629,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4648,7 +4648,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4667,7 +4667,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4686,7 +4686,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4705,7 +4705,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4724,7 +4724,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4743,7 +4743,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4762,7 +4762,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4781,7 +4781,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4800,7 +4800,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4819,7 +4819,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4838,7 +4838,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4857,7 +4857,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4876,7 +4876,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4895,7 +4895,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4914,7 +4914,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4933,7 +4933,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4952,7 +4952,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4971,7 +4971,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -4990,7 +4990,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5009,7 +5009,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5028,7 +5028,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5047,7 +5047,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5066,7 +5066,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5085,7 +5085,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5104,7 +5104,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5123,7 +5123,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5142,7 +5142,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5161,7 +5161,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5180,7 +5180,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5199,7 +5199,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5218,7 +5218,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5237,7 +5237,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5256,7 +5256,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5275,7 +5275,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5294,7 +5294,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5313,7 +5313,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 2 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5332,7 +5332,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5351,7 +5351,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 2 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5370,7 +5370,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5389,7 +5389,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5408,7 +5408,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5427,7 +5427,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5446,7 +5446,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 2 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5465,7 +5465,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5484,7 +5484,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5503,7 +5503,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5522,7 +5522,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 3 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): 1 GetAllRailTypes(): null @@ -5541,7 +5541,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 3 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): 1 GetAllRailTypes(): null @@ -5560,7 +5560,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5579,7 +5579,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5598,7 +5598,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 3 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): 1 GetAllRailTypes(): null @@ -5617,7 +5617,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5636,7 +5636,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5655,7 +5655,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5674,7 +5674,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5693,7 +5693,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5712,7 +5712,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5731,7 +5731,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5750,7 +5750,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5769,7 +5769,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5788,7 +5788,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5807,7 +5807,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5826,7 +5826,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5845,7 +5845,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5864,7 +5864,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5883,7 +5883,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5902,7 +5902,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5921,7 +5921,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5940,7 +5940,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5959,7 +5959,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5978,7 +5978,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -5997,7 +5997,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6016,7 +6016,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6035,7 +6035,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6054,7 +6054,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6073,7 +6073,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6092,7 +6092,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6111,7 +6111,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6130,7 +6130,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6149,7 +6149,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6168,7 +6168,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6187,7 +6187,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6206,7 +6206,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6225,7 +6225,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6244,7 +6244,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6263,7 +6263,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6282,7 +6282,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null @@ -6301,7 +6301,7 @@ ERROR: IsEnd() is invalid as Begin() is never called GetWeight(): -1 GetMaxTractiveEffort(): -1 GetVehicleType(): 255 - GetRailType(): 255 + GetRailType(): -1 GetRoadType(): -1 GetPlaneType(): -1 GetAllRailTypes(): null diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index f3dfe4b656..873a1154b7 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -242,7 +242,10 @@ if (!IsValidEngine(engine_id)) return ScriptRail::RAILTYPE_INVALID; if (GetVehicleType(engine_id) != ScriptVehicle::VT_RAIL) return ScriptRail::RAILTYPE_INVALID; - return static_cast(::RailVehInfo(engine_id)->railtypes.GetNthSetBit(0).value_or(::RailType::INVALID_RAILTYPE)); + auto railtype = ::RailVehInfo(engine_id)->railtypes.GetNthSetBit(0); + if (!railtype.has_value()) return ScriptRail::RAILTYPE_INVALID; + + return static_cast(railtype.value()); } /* static */ ScriptList *ScriptEngine::GetAllRailTypes(EngineID engine_id) diff --git a/src/script/api/script_rail.hpp b/src/script/api/script_rail.hpp index 414aa15b7d..6c535b84d5 100644 --- a/src/script/api/script_rail.hpp +++ b/src/script/api/script_rail.hpp @@ -44,9 +44,8 @@ public: /** * Types of rail known to the game. */ - enum RailType : uint8_t { - /* Note: these values represent part of the in-game static values */ - RAILTYPE_INVALID = ::INVALID_RAILTYPE, ///< Invalid RailType. + enum RailType { + RAILTYPE_INVALID = -1, ///< Invalid RailType. }; /** From 2aaffbe23ca559c9fc1b5824a5807e1dcf8373e1 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 20 Sep 2025 04:37:32 +0000 Subject: [PATCH 060/280] Update: Translations from eints korean: 8 changes by telk5093 dutch: 4 changes by Afoklala portuguese: 10 changes by jcteotonio --- src/lang/dutch.txt | 4 ++++ src/lang/korean.txt | 12 ++++++++---- src/lang/portuguese.txt | 20 ++++++++++---------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 736562470b..ecd71919e2 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Bestand overschrijven STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Weet je zeker dat je het bestaande bestand wilt overschrijven? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Bestand verwijderen +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Weet je zeker dat je dit bestand wilt verwijderen? STR_SAVELOAD_DIRECTORY :{STRING} (Map) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Bovenliggende map) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :Alles behalve { STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. trekkracht: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Bereik: {GOLD}{COMMA} tegels STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Vliegtuigtype: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Spoortypen: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Alle soorten vracht @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Lopende kosten: STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Lopende kosten: {CURRENCY_LONG}/periode STR_ENGINE_PREVIEW_CAPACITY :Capaciteit: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capaciteit: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Spoortypen: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Vervang {STRING} - {STRING} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 1327143acc..9ad3186e14 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2539,7 +2539,7 @@ STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :삭제 STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}관리자 기능 STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}'{STRING}' 플레이어를 정말로 추방하시겠습니까? STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}'{STRING}' 플레이어를 정말로 차단하시겠습니까? -STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}'{COMPANY}' 회사를 정말로 삭제하시겠습니까? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}정말 '{COMPANY}' 회사를 삭제하시겠습니까? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}중계를 이용할까요? STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}'{0:STRING}' 서버와 연결하는 데 실패했습니다.{} '{1:STRING}'{G 1 "을" "를"} 통해 연결을 중계하시겠습니까? @@ -3348,7 +3348,9 @@ STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} STR_SAVELOAD_FILTER_TITLE :{BLACK}검색: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}파일 덮어쓰기 -STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}정말로 이미 존재하는 파일에 덮어씌우시겠습니까? +STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}정말 이미 존재하는 파일에 덮어씌우시겠습니까? +STR_SAVELOAD_DELETE_TITLE :{WHITE}파일 삭제 +STR_SAVELOAD_DELETE_WARNING :{YELLOW}정말 이 파일을 삭제하시겠습니까? STR_SAVELOAD_DIRECTORY :{STRING} (폴더) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (상위 폴더) @@ -4126,7 +4128,7 @@ STR_GROUP_LIVERY_TOOLTIP :{BLACK}선택 STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}클릭하면 전체 자동 교체로부터 이 그룹을 보호합니다. CTRL+클릭하면 하위 그룹도 보호합니다 STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}그룹 삭제 -STR_GROUP_DELETE_QUERY_TEXT :{WHITE}이 그룹과 하위 그룹을 정말 삭제하시겠습니까? +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}정말 이 그룹과 하위 그룹을 삭제하시겠습니까? STR_GROUP_ADD_SHARED_VEHICLE :경로를 공유 중인 차량 추가 STR_GROUP_REMOVE_ALL_VEHICLES :모든 차량 제거 @@ -4184,6 +4186,7 @@ STR_PURCHASE_INFO_ALL_BUT :{CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}최고 견인력: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}항속거리: {GOLD}{COMMA}칸 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}항공기 종류: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}철도 종류: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :모든 화물 @@ -4367,6 +4370,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :유지비: {CUR STR_ENGINE_PREVIEW_RUNCOST_PERIOD :유지비: {CURRENCY_LONG}/기간 STR_ENGINE_PREVIEW_CAPACITY :수송량: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :수송량: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :철도 종류: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} 교체 - {STRING} @@ -5180,7 +5184,7 @@ STR_ERROR_TRAINS_CAN_ONLY_BE_ALTERED_INSIDE_A_DEPOT :{WHITE}차량 STR_ERROR_TRAIN_TOO_LONG :{WHITE}열차가 너무 깁니다! STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE :{WHITE}차량을 뒤집을 수 없습니다... STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS :{WHITE}여러 대가 연결된 차량은 뒤집을 수 없습니다... -STR_ERROR_INCOMPATIBLE_RAIL_TYPES :알맞지 않은 철도 타입입니다 +STR_ERROR_INCOMPATIBLE_RAIL_TYPES :알맞지 않은 철도 종류입니다 STR_ERROR_CAN_T_MOVE_VEHICLE :{WHITE}차량을 옮길 수 없습니다... STR_ERROR_REAR_ENGINE_FOLLOW_FRONT :{WHITE}뒷쪽 기관차는 앞쪽 기관차와 항상 붙어있어야 합니다 diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 3e9672d321..6c1aa845e9 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -54,7 +54,7 @@ STR_CARGO_PLURAL_COLA :{G=m}Xarope de STR_CARGO_PLURAL_CANDYFLOSS :{G=m}Algodão Doce STR_CARGO_PLURAL_BUBBLES :{G=fp}Bolhas STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelo -STR_CARGO_PLURAL_BATTERIES :{G=fp}Baterias +STR_CARGO_PLURAL_BATTERIES :{G=fp}Pilhas STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico STR_CARGO_PLURAL_FIZZY_DRINKS :{G=mp}Refrigerantes @@ -88,7 +88,7 @@ STR_CARGO_SINGULAR_COLA :{G=m}Xarope de STR_CARGO_SINGULAR_CANDYFLOSS :{G=m}Algodão Doce STR_CARGO_SINGULAR_BUBBLE :{G=f}Bolha STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo -STR_CARGO_SINGULAR_BATTERY :{G=f}Bateria +STR_CARGO_SINGULAR_BATTERY :{G=f}Pilha STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refrigerante @@ -4435,7 +4435,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Centrar ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar comboio para o depósito. Ctrl+Clique para fazer apenas a manutenção STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar o veículo para a garagem. Ctrl+Clique para fazer apenas a manutenção -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar navio para o estaleiro. Ctrl+Clique para fazer apenas a manutenção +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar o navio para o estaleiro. Ctrl+Clique para fazer apenas a manutenção STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Enviar a aeronave para o hangar. Ctrl+Clique para fazer apenas a manutenção ###length VEHICLE_TYPES @@ -5529,7 +5529,7 @@ STR_INDUSTRY_NAME_FARM_2 :{G=f}Quinta STR_INDUSTRY_NAME_LUMBER_MILL :{G=f}Serração STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=f}Floresta de Algodão Doce STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Doces -STR_INDUSTRY_NAME_BATTERY_FARM :{G=m}Campo de Baterias +STR_INDUSTRY_NAME_BATTERY_FARM :{G=m}Campo de Pilhas STR_INDUSTRY_NAME_COLA_WELLS :{G=mp}Poços de Xarope de Cola STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Loja de Brinquedos STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica de Brinquedos @@ -5636,7 +5636,7 @@ STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :Vagão de Bolha STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :Cisterna de Xarope de Cola STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Vagão de Doces STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Vagão de Brinquedos -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagão de Baterias +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Vagão de Pilhas STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PLASTIC_TRUCK :Vagão de Plástico STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elétrico) @@ -5666,7 +5666,7 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :Vagão de Bolha STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :Cisterna de Xarope de Cola STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Vagão de Doces STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Vagão de Brinquedos -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Vagão de Baterias +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Vagão de Pilhas STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PLASTIC_TRUCK :Vagão de Plástico STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV1_LEVIATHAN_ELECTRIC :Lev1 'Leviathan' (Elétrico) @@ -5698,7 +5698,7 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :Vagão de Bolha STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :Cisterna de Xarope de Cola STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Vagão de Doces STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :Vagão de Brinquedos -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :Vagão de Baterias +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :Vagão de Pilhas STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :Vagão de Refrigerantes STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PLASTIC_TRUCK :Vagão de Plástico @@ -5779,9 +5779,9 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOY_VAN :Camião de Brin STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Camião de Doces MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Camião de Doces Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Camião de Doces Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BATTERY_TRUCK :Camião de Baterias MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BATTERY_TRUCK :Camião de Baterias Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BATTERY_TRUCK :Camião de Baterias Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BATTERY_TRUCK :Camião de Pilhas MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BATTERY_TRUCK :Camião de Pilhas Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BATTERY_TRUCK :Camião de Pilhas Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_FIZZY_DRINK :Camião de Refrigerantes MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_FIZZY_DRINK :Camião de Refrigerantes Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_FIZZY_DRINK_TRUCK :Camião de Refrigerantes Wizzowow From bff850128c2b9ad737a212d1091fa092bcb1e79d Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Sat, 20 Sep 2025 21:42:06 +0200 Subject: [PATCH 061/280] Codechange: Use YAPF for river builder pathfinder. (#14606) --- src/landscape.cpp | 100 +----------- src/pathfinder/CMakeLists.txt | 2 - src/pathfinder/aystar.cpp | 168 -------------------- src/pathfinder/aystar.h | 98 ------------ src/pathfinder/yapf/CMakeLists.txt | 2 + src/pathfinder/yapf/yapf_river_builder.cpp | 152 ++++++++++++++++++ src/pathfinder/yapf/yapf_river_builder.h | 17 ++ src/settings_table.cpp | 1 - src/table/settings/pathfinding_settings.ini | 2 +- src/water.h | 2 + 10 files changed, 179 insertions(+), 365 deletions(-) delete mode 100644 src/pathfinder/aystar.cpp delete mode 100644 src/pathfinder/aystar.h create mode 100644 src/pathfinder/yapf/yapf_river_builder.cpp create mode 100644 src/pathfinder/yapf/yapf_river_builder.h diff --git a/src/landscape.cpp b/src/landscape.cpp index 39d5a563bb..61aa649874 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -32,13 +32,13 @@ #include "object_base.h" #include "company_func.h" #include "company_gui.h" -#include "pathfinder/aystar.h" #include "saveload/saveload.h" #include "framerate_type.h" #include "landscape_cmd.h" #include "terraform_cmd.h" #include "station_func.h" #include "pathfinder/water_regions.h" +#include "pathfinder/yapf/yapf_river_builder.h" #include "table/strings.h" #include "table/sprites.h" @@ -1037,7 +1037,7 @@ static void MakeLake(TileIndex tile, uint height_lake) * @param tile The tile to try expanding the river into. * @param origin_tile The tile to try surrounding the river around. */ -static void RiverMakeWider(TileIndex tile, TileIndex origin_tile) +void RiverMakeWider(TileIndex tile, TileIndex origin_tile) { /* Don't expand into void tiles. */ if (!IsValidTile(tile)) return; @@ -1180,7 +1180,7 @@ static void RiverMakeWider(TileIndex tile, TileIndex origin_tile) * @param end The destination of the flow. * @return True iff the water can be flowing down. */ -static bool FlowsDown(TileIndex begin, TileIndex end) +bool RiverFlowsDown(TileIndex begin, TileIndex end) { assert(DistanceManhattan(begin, end) == 1); @@ -1201,96 +1201,6 @@ static bool FlowsDown(TileIndex begin, TileIndex end) return slope_end == SLOPE_FLAT || slope_begin == SLOPE_FLAT; } -/** Search path and build river */ -class RiverBuilder : public AyStar { -protected: - AyStarStatus EndNodeCheck(const PathNode ¤t) const override - { - return current.GetTile() == this->end ? AyStarStatus::FoundEndNode : AyStarStatus::Done; - } - - int32_t CalculateG(const AyStarNode &, const PathNode &) const override - { - return 1 + RandomRange(_settings_game.game_creation.river_route_random); - } - - int32_t CalculateH(const AyStarNode ¤t, const PathNode &) const override - { - return DistanceManhattan(this->end, current.tile); - } - - void GetNeighbours(const PathNode ¤t, std::vector &neighbours) const override - { - TileIndex tile = current.GetTile(); - - neighbours.clear(); - for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { - TileIndex t = tile + TileOffsByDiagDir(d); - if (IsValidTile(t) && FlowsDown(tile, t)) { - auto &neighbour = neighbours.emplace_back(); - neighbour.tile = t; - neighbour.td = INVALID_TRACKDIR; - } - } - } - - void FoundEndNode(const PathNode ¤t) override - { - /* First, build the river without worrying about its width. */ - for (PathNode *path = current.parent; path != nullptr; path = path->parent) { - TileIndex tile = path->GetTile(); - if (!IsWaterTile(tile)) { - MakeRiverAndModifyDesertZoneAround(tile); - } - } - - /* If the river is a main river, go back along the path to widen it. - * Don't make wide rivers if we're using the original landscape generator. - */ - if (_settings_game.game_creation.land_generator != LG_ORIGINAL && this->main_river) { - const uint long_river_length = _settings_game.game_creation.min_river_length * 4; - - for (PathNode *path = current.parent; path != nullptr; path = path->parent) { - TileIndex origin_tile = path->GetTile(); - - /* Check if we should widen river depending on how far we are away from the source. */ - uint current_river_length = DistanceManhattan(this->spring, origin_tile); - uint diameter = std::min(3u, (current_river_length / (long_river_length / 3u)) + 1u); - if (diameter <= 1) continue; - - for (auto tile : SpiralTileSequence(origin_tile, diameter)) { - RiverMakeWider(tile, origin_tile); - } - } - } - } - - RiverBuilder(TileIndex end, TileIndex spring, bool main_river) : end(end), spring(spring), main_river(main_river) {} - -private: - TileIndex end; ///< Destination for the river. - TileIndex spring; ///< The current spring during river generation. - bool main_river; ///< Whether the current river is a big river that others flow into. - -public: - /** - * Actually build the river between the begin and end tiles using AyStar. - * @param begin The begin of the river. - * @param end The end of the river. - * @param spring The springing point of the river. - * @param main_river Whether the current river is a big river that others flow into. - */ - static void Exec(TileIndex begin, TileIndex end, TileIndex spring, bool main_river) - { - RiverBuilder builder(end, spring, main_river); - AyStarNode start; - start.tile = begin; - start.td = INVALID_TRACKDIR; - builder.AddStartNode(&start, 0); - builder.Main(); - } -}; - /** * Try to flow the river down from a given begin. * @param spring The springing point of the river. @@ -1328,7 +1238,7 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { TileIndex t = end + TileOffsByDiagDir(d); - if (IsValidTile(t) && !marks.contains(t) && FlowsDown(end, t)) { + if (IsValidTile(t) && !marks.contains(t) && RiverFlowsDown(end, t)) { marks.insert(t); count++; queue.push_back(t); @@ -1373,7 +1283,7 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint } marks.clear(); - if (found) RiverBuilder::Exec(begin, end, spring, main_river); + if (found) YapfBuildRiver(begin, end, spring, main_river); return { found, main_river }; } diff --git a/src/pathfinder/CMakeLists.txt b/src/pathfinder/CMakeLists.txt index dd6d63bb4d..aa6b032965 100644 --- a/src/pathfinder/CMakeLists.txt +++ b/src/pathfinder/CMakeLists.txt @@ -1,8 +1,6 @@ add_subdirectory(yapf) add_files( - aystar.h - aystar.cpp follow_track.hpp pathfinder_func.h pathfinder_type.h diff --git a/src/pathfinder/aystar.cpp b/src/pathfinder/aystar.cpp deleted file mode 100644 index b885c76c43..0000000000 --- a/src/pathfinder/aystar.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * 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 aystar.cpp Implementation of A*. - * - * This file has the core function for %AyStar. - * %AyStar is a fast path finding routine and is used for things like AI path finding and Train path finding. - * For more information about %AyStar (A* Algorithm), you can look at - * http://en.wikipedia.org/wiki/A-star_search_algorithm. - */ - -#include "../../stdafx.h" -#include "aystar.h" - -#include "../../safeguards.h" - -/** - * Adds a node to the open list. - * It makes a copy of node, and puts the pointer of parent in the struct. - */ -void AyStar::OpenListAdd(PathNode *parent, const AyStarNode *node, int f, int g) -{ - /* Add a new Node to the OpenList */ - PathNode &new_node = this->nodes.CreateNewNode(); - new_node.Set(parent, node->tile, node->td, true); - new_node.estimate = f; - new_node.cost = g; - this->nodes.InsertOpenNode(new_node); -} - -/** - * Checks one tile and calculate its f-value - */ -void AyStar::CheckTile(AyStarNode *current, PathNode *parent) -{ - /* Check the new node against the ClosedList */ - if (this->nodes.FindClosedNode(*current) != nullptr) return; - - /* Calculate the G-value for this node */ - int new_g = this->CalculateG(*current, *parent); - /* If the value was INVALID_NODE, we don't do anything with this node */ - if (new_g == AYSTAR_INVALID_NODE) return; - - /* There should not be given any other error-code.. */ - assert(new_g >= 0); - /* Add the parent g-value to the new g-value */ - new_g += parent->cost; - - /* Calculate the h-value */ - int new_h = this->CalculateH(*current, *parent); - /* There should not be given any error-code.. */ - assert(new_h >= 0); - - /* The f-value if g + h */ - int new_f = new_g + new_h; - - /* Get the pointer to the parent in the ClosedList (the current one is to a copy of the one in the OpenList) */ - PathNode *closedlist_parent = this->nodes.FindClosedNode(parent->key); - - /* Check if this item is already in the OpenList */ - PathNode *check = this->nodes.FindOpenNode(*current); - if (check != nullptr) { - /* Yes, check if this g value is lower.. */ - if (new_g > check->cost) return; - this->nodes.PopOpenNode(check->key); - /* It is lower, so change it to this item */ - check->estimate = new_f; - check->cost = new_g; - check->parent = closedlist_parent; - /* Re-add it in the openlist_queue. */ - this->nodes.InsertOpenNode(*check); - } else { - /* A new node, add it to the OpenList */ - this->OpenListAdd(closedlist_parent, current, new_f, new_g); - } -} - -/** - * This function is the core of %AyStar. It handles one item and checks - * its neighbour items. If they are valid, they are added to be checked too. - * @return Possible values: - * - #AyStarStatus::EmptyOpenList - * - #AyStarStatus::LimitReached - * - #AyStarStatus::FoundEndNode - * - #AyStarStatus::StillBusy - */ -AyStarStatus AyStar::Loop() -{ - /* Get the best node from OpenList */ - PathNode *current = this->nodes.PopBestOpenNode(); - /* If empty, drop an error */ - if (current == nullptr) return AyStarStatus::EmptyOpenList; - - /* Check for end node and if found, return that code */ - if (this->EndNodeCheck(*current) == AyStarStatus::FoundEndNode && current->parent != nullptr) { - this->FoundEndNode(*current); - return AyStarStatus::FoundEndNode; - } - - /* Add the node to the ClosedList */ - this->nodes.InsertClosedNode(*current); - - /* Load the neighbours */ - this->GetNeighbours(*current, this->neighbours); - - /* Go through all neighbours */ - for (auto &neighbour : this->neighbours) { - /* Check and add them to the OpenList if needed */ - this->CheckTile(&neighbour, current); - } - - if (this->nodes.ClosedCount() >= AYSTAR_DEF_MAX_SEARCH_NODES) { - /* We've expanded enough nodes */ - return AyStarStatus::LimitReached; - } else { - /* Return that we are still busy */ - return AyStarStatus::StillBusy; - } -} - -/** - * This is the function you call to run AyStar. - * @return Possible values: - * - #AyStarStatus::FoundEndNode - * - #AyStarStatus::NoPath - * - #AyStarStatus::StillBusy - */ -AyStarStatus AyStar::Main() -{ - AyStarStatus r; - do { - r = this->Loop(); - } while (r == AyStarStatus::StillBusy); -#ifdef AYSTAR_DEBUG - switch (r) { - case AyStarStatus::FoundEndNode: Debug(misc, 0, "[AyStar] Found path!"); break; - case AyStarStatus::EmptyOpenList: Debug(misc, 0, "[AyStar] OpenList run dry, no path found"); break; - case AyStarStatus::LimitReached: Debug(misc, 0, "[AyStar] Exceeded search_nodes, no path found"); break; - default: break; - } -#endif - - switch (r) { - case AyStarStatus::FoundEndNode: return AyStarStatus::FoundEndNode; - case AyStarStatus::EmptyOpenList: - case AyStarStatus::LimitReached: return AyStarStatus::NoPath; - default: return AyStarStatus::StillBusy; - } -} - -/** - * Adds a node from where to start an algorithm. Multiple nodes can be added - * if wanted. - * @param start_node Node to start with. - * @param g the cost for starting with this node. - */ -void AyStar::AddStartNode(AyStarNode *start_node, int g) -{ -#ifdef AYSTAR_DEBUG - Debug(misc, 0, "[AyStar] Starting A* Algorithm from node ({}, {}, {})\n", - TileX(start_node->tile), TileY(start_node->tile), start_node->direction); -#endif - this->OpenListAdd(nullptr, start_node, 0, g); -} diff --git a/src/pathfinder/aystar.h b/src/pathfinder/aystar.h deleted file mode 100644 index e74d1f3476..0000000000 --- a/src/pathfinder/aystar.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 aystar.h - * This file has the header for %AyStar. - * %AyStar is a fast path finding routine and is used for things like AI path finding and Train path finding. - * For more information about AyStar (A* Algorithm), you can look at - * http://en.wikipedia.org/wiki/A-star_search_algorithm. - */ - -#ifndef AYSTAR_H -#define AYSTAR_H - -#include "yapf/nodelist.hpp" -#include "yapf/yapf_node.hpp" - -static const int AYSTAR_DEF_MAX_SEARCH_NODES = 10000; ///< Reference limit for #AyStar::max_search_nodes - -/** Return status of #AyStar methods. */ -enum class AyStarStatus : uint8_t { - FoundEndNode, ///< An end node was found. - EmptyOpenList, ///< All items are tested, and no path has been found. - StillBusy, ///< Some checking was done, but no path found yet, and there are still items left to try. - NoPath, ///< No path to the goal was found. - LimitReached, ///< The AYSTAR_DEF_MAX_SEARCH_NODES limit has been reached, aborting search. - Done, ///< Not an end-tile, or wrong direction. -}; - -static const int AYSTAR_INVALID_NODE = -1; ///< Item is not valid (for example, not walkable). - -using AyStarNode = CYapfNodeKeyTrackDir; - -struct PathNode : CYapfNodeT { -}; - -/** - * %AyStar search algorithm struct. - */ -class AyStar { -protected: - /** - * Calculate the G-value for the %AyStar algorithm. - * @return G value of the node: - * - #AYSTAR_INVALID_NODE : indicates an item is not valid (e.g.: unwalkable) - * - Any value >= 0 : the g-value for this tile - */ - virtual int32_t CalculateG(const AyStarNode ¤t, const PathNode &parent) const = 0; - - /** - * Calculate the H-value for the %AyStar algorithm. - * Mostly, this must return the distance (Manhattan way) between the current point and the end point. - * @return The h-value for this tile (any value >= 0) - */ - virtual int32_t CalculateH(const AyStarNode ¤t, const PathNode &parent) const = 0; - - /** - * This function requests the tiles around the current tile. - * #neighbours is never reset, so if you are not using directions, just leave it alone. - */ - virtual void GetNeighbours(const PathNode ¤t, std::vector &neighours) const = 0; - - /** - * Check whether the end-tile is found. - * @param current Node to exam. - * @return Status of the node: - * - #AyStarStatus::FoundEndNode : indicates this is the end tile - * - #AyStarStatus::Done : indicates this is not the end tile (or direction was wrong) - */ - virtual AyStarStatus EndNodeCheck(const PathNode ¤t) const = 0; - - /** - * If the End Node is found, this function is called. - * It can do, for example, calculate the route and put that in an array. - */ - virtual void FoundEndNode(const PathNode ¤t) = 0; - - void AddStartNode(AyStarNode *start_node, int g); - - AyStarStatus Main(); - -public: - virtual ~AyStar() = default; - -private: - NodeList nodes; - mutable std::vector neighbours; - - AyStarStatus Loop(); - void OpenListAdd(PathNode *parent, const AyStarNode *node, int f, int g); - void CheckTile(AyStarNode *current, PathNode *parent); -}; - -#endif /* AYSTAR_H */ diff --git a/src/pathfinder/yapf/CMakeLists.txt b/src/pathfinder/yapf/CMakeLists.txt index 6717233352..2ab0ec5b51 100644 --- a/src/pathfinder/yapf/CMakeLists.txt +++ b/src/pathfinder/yapf/CMakeLists.txt @@ -14,6 +14,8 @@ add_files( yapf_node_road.hpp yapf_node_ship.hpp yapf_rail.cpp + yapf_river_builder.h + yapf_river_builder.cpp yapf_road.cpp yapf_ship.cpp yapf_ship_regions.h diff --git a/src/pathfinder/yapf/yapf_river_builder.cpp b/src/pathfinder/yapf/yapf_river_builder.cpp new file mode 100644 index 0000000000..697ddd2e8f --- /dev/null +++ b/src/pathfinder/yapf/yapf_river_builder.cpp @@ -0,0 +1,152 @@ +/* + * 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 yapf_river_builder.cpp Pathfinder for river building. */ + +#include "../../stdafx.h" + +#include "../../water.h" +#include "../../genworld.h" +#include "yapf.hpp" + +#include "../../safeguards.h" + +/* River builder pathfinder node. */ +struct YapfRiverBuilderNode : CYapfNodeT {}; + +/* River builder pathfinder node list. */ +using RiverBuilderNodeList = NodeList; + +/* We don't need a follower but YAPF requires one. */ +struct DummyFollower {}; + +/* We don't need a vehicle but YAPF requires one. */ +struct DummyVehicle : Vehicle {}; + +class YapfRiverBuilder; + +/* Types struct required for YAPF components. */ +struct RiverBuilderTypes { + using Tpf = YapfRiverBuilder; + using TrackFollower = DummyFollower; + using NodeList = RiverBuilderNodeList; + using VehicleType = DummyVehicle; +}; + +/* River builder pathfinder implementation. */ +class YapfRiverBuilder + : public CYapfBaseT + , public CYapfSegmentCostCacheNoneT +{ +public: + using Node = RiverBuilderTypes::NodeList::Item; + using Key = Node::Key; + +protected: + TileIndex start_tile; ///< Start tile of the river + TileIndex end_tile; ///< End tile of the river + + inline YapfRiverBuilder &Yapf() + { + return *static_cast(this); + } + +public: + YapfRiverBuilder(TileIndex start_tile, TileIndex end_tile) + { + this->start_tile = start_tile; + this->end_tile = end_tile; + } + + void PfSetStartupNodes() + { + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, this->start_tile, INVALID_TRACKDIR, false); + Yapf().AddStartupNode(node); + } + + inline bool PfDetectDestination(Node &n) const + { + return n.GetTile() == this->end_tile; + } + + inline bool PfCalcCost(Node &n, const DummyFollower *) + { + n.cost = n.parent->cost + 1 + RandomRange(_settings_game.game_creation.river_route_random); + return true; + } + + inline bool PfCalcEstimate(Node &n) + { + n.estimate = n.cost + DistanceManhattan(this->end_tile, n.GetTile()); + assert(n.estimate >= n.parent->estimate); + return true; + } + + inline void PfFollowNode(Node &old_node) + { + for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; ++d) { + const TileIndex t = old_node.GetTile() + TileOffsByDiagDir(d); + if (IsValidTile(t) && RiverFlowsDown(old_node.GetTile(), t)) { + Node &node = Yapf().CreateNewNode(); + node.Set(&old_node, t, INVALID_TRACKDIR, true); + Yapf().AddNewNode(node, DummyFollower{}); + } + } + } + + inline char TransportTypeChar() const + { + return '~'; + } + + static void BuildRiver(TileIndex start_tile, TileIndex end_tile, TileIndex spring_tile, bool main_river) + { + YapfRiverBuilder pf(start_tile, end_tile); + if (pf.FindPath(nullptr) == false) return; // No path found + + /* First, build the river without worrying about its width. */ + for (Node *node = pf.GetBestNode(); node != nullptr; node = node->parent) { + TileIndex tile = node->GetTile(); + if (!IsWaterTile(tile)) { + MakeRiverAndModifyDesertZoneAround(tile); + } + } + + /* If the river is a main river, go back along the path to widen it. + * Don't make wide rivers if we're using the original landscape generator. + */ + if (_settings_game.game_creation.land_generator != LG_ORIGINAL && main_river) { + const uint long_river_length = _settings_game.game_creation.min_river_length * 4; + + for (Node *node = pf.GetBestNode(); node != nullptr; node = node->parent) { + const TileIndex center_tile = node->GetTile(); + + /* Check if we should widen river depending on how far we are away from the source. */ + uint current_river_length = DistanceManhattan(spring_tile, center_tile); + uint diameter = std::min(3u, (current_river_length / (long_river_length / 3u)) + 1u); + if (diameter <= 1) continue; + + for (auto tile : SpiralTileSequence(center_tile, diameter)) { + RiverMakeWider(tile, center_tile); + } + } + } + } +}; + +/** + * Builds a river from the start tile to the end tile. + * @param start_tile Start tile of the river. + * @param end_tile End tile of the river. + * @param spring_tile spring_tile Tile in which the spring of the river is located. + * @param main_river Whether it is a main river. Main rivers can get wider than one tile. + */ +void YapfBuildRiver(TileIndex start_tile, TileIndex end_tile, TileIndex spring_tile, bool main_river) +{ + YapfRiverBuilder::BuildRiver(start_tile, end_tile, spring_tile, main_river); +} diff --git a/src/pathfinder/yapf/yapf_river_builder.h b/src/pathfinder/yapf/yapf_river_builder.h new file mode 100644 index 0000000000..6417770cc0 --- /dev/null +++ b/src/pathfinder/yapf/yapf_river_builder.h @@ -0,0 +1,17 @@ +/* + * 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 yapf_river_builder.h Pathfinder for river building. */ + +#ifndef YAPF_RIVER_BUILDER_H +#define YAPF_RIVER_BUILDER_H + +#include "../../tile_type.h" + +void YapfBuildRiver(TileIndex start_tile, TileIndex end_tile, TileIndex spring_tile, bool main_river); + +#endif /* YAPF_RIVER_BUILDER_H */ diff --git a/src/settings_table.cpp b/src/settings_table.cpp index 8eeccf90ea..b75bd3afb6 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -17,7 +17,6 @@ #include "network/network_func.h" #include "network/core/config.h" #include "pathfinder/pathfinder_type.h" -#include "pathfinder/aystar.h" #include "linkgraph/linkgraphschedule.h" #include "genworld.h" #include "train.h" diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index 1bf6efac3a..63c17d1a8d 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -102,7 +102,7 @@ cat = SC_EXPERT var = pf.yapf.max_search_nodes type = SLE_UINT from = SLV_28 -def = AYSTAR_DEF_MAX_SEARCH_NODES +def = 10000 min = 500 max = 1000000 cat = SC_EXPERT diff --git a/src/water.h b/src/water.h index 3bad4fba5a..f6c48bcf97 100644 --- a/src/water.h +++ b/src/water.h @@ -39,6 +39,8 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o); void CheckForDockingTile(TileIndex t); void MakeRiverAndModifyDesertZoneAround(TileIndex tile); +void RiverMakeWider(TileIndex tile, TileIndex origin_tile); +bool RiverFlowsDown(TileIndex begin, TileIndex end); static const uint RIVER_OFFSET_DESERT_DISTANCE = 5; ///< Circular tile search diameter to create non-desert around a river tile. bool IsWateredTile(TileIndex tile, Direction from); From 1ac5baab31cfe79a1ce8f4086852f263894f2e16 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Sat, 20 Sep 2025 22:52:59 +0200 Subject: [PATCH 062/280] Change: Add lock penalty to ship pathfinder. (#14603) --- src/pathfinder/yapf/yapf_ship.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 335a589ef6..fcb2e3759c 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -388,6 +388,13 @@ public: uint8_t speed_frac = (GetEffectiveWaterClass(n.GetTile()) == WATER_CLASS_SEA) ? svi->ocean_speed_frac : svi->canal_speed_frac; if (speed_frac > 0) c += YAPF_TILE_LENGTH * (1 + tf->tiles_skipped) * speed_frac / (256 - speed_frac); + /* Lock penalty. */ + if (IsTileType(n.GetTile(), MP_WATER) && IsLock(n.GetTile()) && GetLockPart(n.GetTile()) == LOCK_PART_MIDDLE) { + const uint canal_speed = svi->ApplyWaterClassSpeedFrac(svi->max_speed, false); + /* Cost is proportional to the vehicle's speed as the vehicle stops in the lock. */ + c += (TILE_HEIGHT * YAPF_TILE_LENGTH * canal_speed) / 128; + } + /* Apply it. */ n.cost = n.parent->cost + c; return true; From 2ab3b5516f5641d726e936a31a999d61b34a4c00 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 21 Jul 2025 06:46:16 -0400 Subject: [PATCH 063/280] Codechange: Early continue for cargos not moved by this station --- src/station_cmd.cpp | 242 ++++++++++++++++++++++---------------------- 1 file changed, 122 insertions(+), 120 deletions(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 333460b53b..0d89063424 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3955,144 +3955,146 @@ static void UpdateStationRating(Station *st) for (const CargoSpec *cs : CargoSpec::Iterate()) { GoodsEntry *ge = &st->goods[cs->Index()]; - /* Slowly increase the rating back to its original level in the case we - * didn't deliver cargo yet to this station. This happens when a bribe - * failed while you didn't moved that cargo yet to a station. */ - if (!ge->HasRating() && ge->rating < INITIAL_STATION_RATING) { - ge->rating++; + + /* The station might not currently be moving this cargo. */ + if (!ge->HasRating()) { + /* Slowly increase the rating back to its original level in the case we + * didn't deliver cargo yet to this station. This happens when a bribe + * failed while you didn't moved that cargo yet to a station. */ + if (ge->rating < INITIAL_STATION_RATING) ge->rating++; + + /* Nothing else to do with this cargo. */ + continue; } - /* Only change the rating if we are moving this cargo */ - if (ge->HasRating()) { - byte_inc_sat(&ge->time_since_pickup); - if (ge->time_since_pickup == 255 && _settings_game.order.selectgoods) { - ge->status.Reset(GoodsEntry::State::Rating); - ge->last_speed = 0; - TruncateCargo(cs, ge); - waiting_changed = true; - continue; - } + byte_inc_sat(&ge->time_since_pickup); + if (ge->time_since_pickup == 255 && _settings_game.order.selectgoods) { + ge->status.Reset(GoodsEntry::State::Rating); + ge->last_speed = 0; + TruncateCargo(cs, ge); + waiting_changed = true; + continue; + } - bool skip = false; - int rating = 0; - uint waiting = ge->HasData() ? ge->GetData().cargo.AvailableCount() : 0; + bool skip = false; + int rating = 0; + uint waiting = ge->HasData() ? ge->GetData().cargo.AvailableCount() : 0; - /* num_dests is at least 1 if there is any cargo as - * StationID::Invalid() is also a destination. - */ - uint num_dests = ge->HasData() ? static_cast(ge->GetData().cargo.Packets()->MapSize()) : 0; + /* num_dests is at least 1 if there is any cargo as + * StationID::Invalid() is also a destination. + */ + uint num_dests = ge->HasData() ? static_cast(ge->GetData().cargo.Packets()->MapSize()) : 0; - /* Average amount of cargo per next hop, but prefer solitary stations - * with only one or two next hops. They are allowed to have more - * cargo waiting per next hop. - * With manual cargo distribution waiting_avg = waiting / 2 as then - * StationID::Invalid() is the only destination. - */ - uint waiting_avg = waiting / (num_dests + 1); + /* Average amount of cargo per next hop, but prefer solitary stations + * with only one or two next hops. They are allowed to have more + * cargo waiting per next hop. + * With manual cargo distribution waiting_avg = waiting / 2 as then + * StationID::Invalid() is the only destination. + */ + uint waiting_avg = waiting / (num_dests + 1); - if (_cheats.station_rating.value) { - ge->rating = rating = MAX_STATION_RATING; + if (_cheats.station_rating.value) { + ge->rating = rating = MAX_STATION_RATING; + skip = true; + } else if (cs->callback_mask.Test(CargoCallbackMask::StationRatingCalc)) { + /* Perform custom station rating. If it succeeds the speed, days in transit and + * waiting cargo ratings must not be executed. */ + + /* NewGRFs expect last speed to be 0xFF when no vehicle has arrived yet. */ + uint last_speed = ge->HasVehicleEverTriedLoading() ? ge->last_speed : 0xFF; + + uint32_t var18 = ClampTo(ge->time_since_pickup) + | (ClampTo(ge->max_waiting_cargo) << 8) + | (ClampTo(last_speed) << 24); + /* Convert to the 'old' vehicle types */ + uint32_t var10 = (st->last_vehicle_type == VEH_INVALID) ? 0x0 : (st->last_vehicle_type + 0x10); + uint16_t callback = GetCargoCallback(CBID_CARGO_STATION_RATING_CALC, var10, var18, cs); + if (callback != CALLBACK_FAILED) { skip = true; - } else if (cs->callback_mask.Test(CargoCallbackMask::StationRatingCalc)) { - /* Perform custom station rating. If it succeeds the speed, days in transit and - * waiting cargo ratings must not be executed. */ + rating = GB(callback, 0, 14); - /* NewGRFs expect last speed to be 0xFF when no vehicle has arrived yet. */ - uint last_speed = ge->HasVehicleEverTriedLoading() ? ge->last_speed : 0xFF; + /* Simulate a 15 bit signed value */ + if (HasBit(callback, 14)) rating -= 0x4000; + } + } - uint32_t var18 = ClampTo(ge->time_since_pickup) - | (ClampTo(ge->max_waiting_cargo) << 8) - | (ClampTo(last_speed) << 24); - /* Convert to the 'old' vehicle types */ - uint32_t var10 = (st->last_vehicle_type == VEH_INVALID) ? 0x0 : (st->last_vehicle_type + 0x10); - uint16_t callback = GetCargoCallback(CBID_CARGO_STATION_RATING_CALC, var10, var18, cs); - if (callback != CALLBACK_FAILED) { - skip = true; - rating = GB(callback, 0, 14); + if (!skip) { + int b = ge->last_speed - 85; + if (b >= 0) rating += b >> 2; - /* Simulate a 15 bit signed value */ - if (HasBit(callback, 14)) rating -= 0x4000; + uint8_t waittime = ge->time_since_pickup; + if (st->last_vehicle_type == VEH_SHIP) waittime >>= 2; + if (waittime <= 21) rating += 25; + if (waittime <= 12) rating += 25; + if (waittime <= 6) rating += 45; + if (waittime <= 3) rating += 35; + + rating -= 90; + if (ge->max_waiting_cargo <= 1500) rating += 55; + if (ge->max_waiting_cargo <= 1000) rating += 35; + if (ge->max_waiting_cargo <= 600) rating += 10; + if (ge->max_waiting_cargo <= 300) rating += 20; + if (ge->max_waiting_cargo <= 100) rating += 10; + } + + if (Company::IsValidID(st->owner) && st->town->statues.Test(st->owner)) rating += 26; + + uint8_t age = ge->last_age; + if (age < 3) rating += 10; + if (age < 2) rating += 10; + if (age < 1) rating += 13; + + { + int or_ = ge->rating; // old rating + + /* only modify rating in steps of -2, -1, 0, 1 or 2 */ + ge->rating = rating = ClampTo(or_ + Clamp(rating - or_, -2, 2)); + + /* if rating is <= 64 and more than 100 items waiting on average per destination, + * remove some random amount of goods from the station */ + if (rating <= 64 && waiting_avg >= 100) { + int dec = Random() & 0x1F; + if (waiting_avg < 200) dec &= 7; + waiting -= (dec + 1) * num_dests; + waiting_changed = true; + } + + /* if rating is <= 127 and there are any items waiting, maybe remove some goods. */ + if (rating <= 127 && waiting != 0) { + uint32_t r = Random(); + if (rating <= (int)GB(r, 0, 7)) { + /* Need to have int, otherwise it will just overflow etc. */ + waiting = std::max((int)waiting - (int)((GB(r, 8, 2) - 1) * num_dests), 0); + waiting_changed = true; } } - if (!skip) { - int b = ge->last_speed - 85; - if (b >= 0) rating += b >> 2; + /* At some point we really must cap the cargo. Previously this + * was a strict 4095, but now we'll have a less strict, but + * increasingly aggressive truncation of the amount of cargo. */ + static const uint WAITING_CARGO_THRESHOLD = 1 << 12; + static const uint WAITING_CARGO_CUT_FACTOR = 1 << 6; + static const uint MAX_WAITING_CARGO = 1 << 15; - uint8_t waittime = ge->time_since_pickup; - if (st->last_vehicle_type == VEH_SHIP) waittime >>= 2; - if (waittime <= 21) rating += 25; - if (waittime <= 12) rating += 25; - if (waittime <= 6) rating += 45; - if (waittime <= 3) rating += 35; + if (waiting > WAITING_CARGO_THRESHOLD) { + uint difference = waiting - WAITING_CARGO_THRESHOLD; + waiting -= (difference / WAITING_CARGO_CUT_FACTOR); - rating -= 90; - if (ge->max_waiting_cargo <= 1500) rating += 55; - if (ge->max_waiting_cargo <= 1000) rating += 35; - if (ge->max_waiting_cargo <= 600) rating += 10; - if (ge->max_waiting_cargo <= 300) rating += 20; - if (ge->max_waiting_cargo <= 100) rating += 10; + waiting = std::min(waiting, MAX_WAITING_CARGO); + waiting_changed = true; } - if (Company::IsValidID(st->owner) && st->town->statues.Test(st->owner)) rating += 26; + /* We can't truncate cargo that's already reserved for loading. + * Thus StoredCount() here. */ + if (waiting_changed && waiting < (ge->HasData() ? ge->GetData().cargo.AvailableCount() : 0)) { + /* Feed back the exact own waiting cargo at this station for the + * next rating calculation. */ + ge->max_waiting_cargo = 0; - uint8_t age = ge->last_age; - if (age < 3) rating += 10; - if (age < 2) rating += 10; - if (age < 1) rating += 13; - - { - int or_ = ge->rating; // old rating - - /* only modify rating in steps of -2, -1, 0, 1 or 2 */ - ge->rating = rating = ClampTo(or_ + Clamp(rating - or_, -2, 2)); - - /* if rating is <= 64 and more than 100 items waiting on average per destination, - * remove some random amount of goods from the station */ - if (rating <= 64 && waiting_avg >= 100) { - int dec = Random() & 0x1F; - if (waiting_avg < 200) dec &= 7; - waiting -= (dec + 1) * num_dests; - waiting_changed = true; - } - - /* if rating is <= 127 and there are any items waiting, maybe remove some goods. */ - if (rating <= 127 && waiting != 0) { - uint32_t r = Random(); - if (rating <= (int)GB(r, 0, 7)) { - /* Need to have int, otherwise it will just overflow etc. */ - waiting = std::max((int)waiting - (int)((GB(r, 8, 2) - 1) * num_dests), 0); - waiting_changed = true; - } - } - - /* At some point we really must cap the cargo. Previously this - * was a strict 4095, but now we'll have a less strict, but - * increasingly aggressive truncation of the amount of cargo. */ - static const uint WAITING_CARGO_THRESHOLD = 1 << 12; - static const uint WAITING_CARGO_CUT_FACTOR = 1 << 6; - static const uint MAX_WAITING_CARGO = 1 << 15; - - if (waiting > WAITING_CARGO_THRESHOLD) { - uint difference = waiting - WAITING_CARGO_THRESHOLD; - waiting -= (difference / WAITING_CARGO_CUT_FACTOR); - - waiting = std::min(waiting, MAX_WAITING_CARGO); - waiting_changed = true; - } - - /* We can't truncate cargo that's already reserved for loading. - * Thus StoredCount() here. */ - if (waiting_changed && waiting < (ge->HasData() ? ge->GetData().cargo.AvailableCount() : 0)) { - /* Feed back the exact own waiting cargo at this station for the - * next rating calculation. */ - ge->max_waiting_cargo = 0; - - TruncateCargo(cs, ge, ge->GetData().cargo.AvailableCount() - waiting); - } else { - /* If the average number per next hop is low, be more forgiving. */ - ge->max_waiting_cargo = waiting_avg; - } + TruncateCargo(cs, ge, ge->GetData().cargo.AvailableCount() - waiting); + } else { + /* If the average number per next hop is low, be more forgiving. */ + ge->max_waiting_cargo = waiting_avg; } } } From 20067d2db5e5adadd237915558fa26b99ae42a6f Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 21 Jul 2025 06:49:35 -0400 Subject: [PATCH 064/280] Doc: Update station rating comments and doxygen. --- src/station_cmd.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0d89063424..2b5aadb8fe 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3946,6 +3946,10 @@ static void TruncateCargo(const CargoSpec *cs, GoodsEntry *ge, uint amount = UIN } } +/** + * Periodic update of a station's rating. + * @param st The station to update. + */ static void UpdateStationRating(Station *st) { bool waiting_changed = false; @@ -3968,6 +3972,8 @@ static void UpdateStationRating(Station *st) } byte_inc_sat(&ge->time_since_pickup); + + /* If this cargo hasn't been picked up in a long time, get rid of it. */ if (ge->time_since_pickup == 255 && _settings_game.order.selectgoods) { ge->status.Reset(GoodsEntry::State::Rating); ge->last_speed = 0; @@ -4351,6 +4357,14 @@ static const IntervalTimer _economy_stations_monthly({TimerGam } }); +/** + * Forcibly modify station ratings near a given tile. + * Used when a crash hurts a company's station ratings nearby, or when local authority actions affect nearby ratings. + * @param tile The center of the ratings change area. + * @param owner The station owner whose stations are affected. + * @param amount The amount to change the rating. + * @param radius The radius to search for stations, from the origin tile. + */ void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint radius) { ForAllStationsRadius(tile, radius, [&](Station *st) { From d07ff71c67001de45624c9fa3b82cb4f85225358 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 02:25:31 +0100 Subject: [PATCH 065/280] Fix ed67aedabf: Wrong button type for town menu in scenario editor toolbar. (#14641) The button was changed from an action to a menu, which should be WWT_IMGBTN instead of WWT_PUSHIMGBTN. --- src/toolbar_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 8f71d93f1c..c447b182b6 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2555,7 +2555,7 @@ static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = { NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_ZOOM_OUT), SetSpriteTip(SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT), NWidget(NWID_SPACER), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_LAND_GENERATE), SetSpriteTip(SPR_IMG_LANDSCAPING, STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION_TOOLTIP), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TOWN_GENERATE), SetSpriteTip(SPR_IMG_TOWN, STR_SCENEDIT_TOOLBAR_TOWN_GENERATION_TOOLTIP), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_TE_INDUSTRY), SetSpriteTip(SPR_IMG_INDUSTRY, STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_ROADS), SetSpriteTip(SPR_IMG_BUILDROAD, STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_TRAMS), SetSpriteTip(SPR_IMG_BUILDTRAMS, STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION_TOOLTIP), From 030bbc6399f9f9f4b11a4f97e92fc515025736a5 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 21 Sep 2025 04:37:37 +0000 Subject: [PATCH 066/280] Update: Translations from eints vietnamese: 4 changes by KhoiCanDev --- src/lang/vietnamese.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index ec663d1330..cac92cff53 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Lọc: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Ghi đè file STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Bạn có chắc chắn ghi đè lên file đang tồn tại? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Xóa File +STR_SAVELOAD_DELETE_WARNING :{WHITE}Bạn có chắc chắn muốn xóa file này? STR_SAVELOAD_DIRECTORY :{STRING} (Thư mục) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Thư mục cha) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :Tất cả tr STR_PURCHASE_INFO_MAX_TE :{BLACK}Lực kéo tối đa: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Tầm xa: {GOLD}{COMMA} ô STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Kiểu máy bay: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Kiểu đường ray: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Tất cả hàng hóa @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Chi phí hoạt STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Chi phí hoạt động: {CURRENCY_LONG}/kỳ STR_ENGINE_PREVIEW_CAPACITY :Tải trọng: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Tải trọng: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Kiểu đường ray: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Thay thế {STRING} - {STRING} From 70d418285060efb28c964f299bb898baf59b3ac9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 09:32:25 +0100 Subject: [PATCH 067/280] Fix #14631, Fix 1cb0cbcb6c: Waypoint customs spec not allocated properly on initial construction. (#14633) Split AllocateSpecToStation/RoadStop into Allocate and Assign functions, allowing command tests to occur separately. --- src/newgrf_roadstop.cpp | 39 +++++++++++++++++++++++------------- src/newgrf_roadstop.h | 3 ++- src/newgrf_station.cpp | 38 ++++++++++++++++++++++------------- src/newgrf_station.h | 3 ++- src/saveload/waypoint_sl.cpp | 3 ++- src/station_cmd.cpp | 6 ++++-- src/waypoint_cmd.cpp | 9 ++++++--- 7 files changed, 65 insertions(+), 36 deletions(-) diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index da022d14f3..f093c0b2b4 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -561,20 +561,22 @@ const RoadStopSpec *GetRoadStopSpec(TileIndex t) /** * Allocate a RoadStopSpec to a Station. This is called once per build operation. - * @param statspec RoadStopSpec to allocate. + * @param spec RoadStopSpec to allocate. * @param st Station to allocate it to. - * @param exec Whether to actually allocate the spec. * @return Index within the Station's road stop spec list, or std::nullopt if the allocation failed. */ -std::optional AllocateSpecToRoadStop(const RoadStopSpec *statspec, BaseStation *st, bool exec) +std::optional AllocateSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st) { uint i; - if (statspec == nullptr || st == nullptr) return 0; + if (spec == nullptr) return 0; + + /* If station doesn't exist yet then the first slot is available. */ + if (st == nullptr) return 1; /* Try to find the same spec and return that one */ for (i = 1; i < st->roadstop_speclist.size() && i < NUM_ROADSTOPSPECS_PER_STATION; i++) { - if (st->roadstop_speclist[i].spec == statspec) return i; + if (st->roadstop_speclist[i].spec == spec) return i; } /* Try to find an unused spec slot */ @@ -587,18 +589,27 @@ std::optional AllocateSpecToRoadStop(const RoadStopSpec *statspec, Base return std::nullopt; } - if (exec) { - if (i >= st->roadstop_speclist.size()) st->roadstop_speclist.resize(i + 1); - st->roadstop_speclist[i].spec = statspec; - st->roadstop_speclist[i].grfid = statspec->grf_prop.grfid; - st->roadstop_speclist[i].localidx = statspec->grf_prop.local_id; - - RoadStopUpdateCachedTriggers(st); - } - return i; } +/** + * Assign a previously allocated RoadStopSpec specindex to a Station. + * @param spec RoadStopSpec to assign.. + * @param st Station to allocate it to. + * @param specindex Spec index of allocation. + */ +void AssignSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st, uint8_t specindex) +{ + if (specindex == 0) return; + if (specindex >= st->roadstop_speclist.size()) st->roadstop_speclist.resize(specindex + 1); + + st->roadstop_speclist[specindex].spec = spec; + st->roadstop_speclist[specindex].grfid = spec->grf_prop.grfid; + st->roadstop_speclist[specindex].localidx = spec->grf_prop.local_id; + + RoadStopUpdateCachedTriggers(st); +} + /** * Deallocate a RoadStopSpec from a Station. Called when removing a single roadstop tile. * @param st Station to work with. diff --git a/src/newgrf_roadstop.h b/src/newgrf_roadstop.h index 3f826aac43..73fa2e9db6 100644 --- a/src/newgrf_roadstop.h +++ b/src/newgrf_roadstop.h @@ -177,7 +177,8 @@ bool GetIfClassHasNewStopsByType(const RoadStopClass *roadstopclass, RoadStopTyp bool GetIfStopIsForType(const RoadStopSpec *roadstopspec, RoadStopType rs, RoadType roadtype); const RoadStopSpec *GetRoadStopSpec(TileIndex t); -std::optional AllocateSpecToRoadStop(const RoadStopSpec *statspec, BaseStation *st, bool exec); +std::optional AllocateSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st); +void AssignSpecToRoadStop(const RoadStopSpec *spec, BaseStation *st, uint8_t specindex); void DeallocateSpecFromRoadStop(BaseStation *st, uint8_t specindex); void RoadStopUpdateCachedTriggers(BaseStation *st); diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index d307e6dd9d..358f6505d5 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -692,16 +692,18 @@ CommandCost PerformStationTileSlopeCheck(TileIndex north_tile, TileIndex cur_til /** * Allocate a StationSpec to a Station. This is called once per build operation. - * @param statspec StationSpec to allocate. + * @param spec StationSpec to allocate. * @param st Station to allocate it to. - * @param exec Whether to actually allocate the spec. * @return Index within the Station's station spec list, or std::nullopt if the allocation failed. */ -std::optional AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exec) +std::optional AllocateSpecToStation(const StationSpec *spec, BaseStation *st) { uint i; - if (statspec == nullptr || st == nullptr) return 0; + if (spec == nullptr) return 0; + + /* If station doesn't exist yet then the first slot is available. */ + if (st == nullptr) return 1; for (i = 1; i < st->speclist.size() && i < NUM_STATIONSSPECS_PER_STATION; i++) { if (st->speclist[i].spec == nullptr && st->speclist[i].grfid == 0) break; @@ -714,24 +716,32 @@ std::optional AllocateSpecToStation(const StationSpec *statspec, BaseSt * but it's fairly unlikely that one reaches the limit anyways. */ for (i = 1; i < st->speclist.size() && i < NUM_STATIONSSPECS_PER_STATION; i++) { - if (st->speclist[i].spec == statspec) return i; + if (st->speclist[i].spec == spec) return i; } return std::nullopt; } - if (exec) { - if (i >= st->speclist.size()) st->speclist.resize(i + 1); - st->speclist[i].spec = statspec; - st->speclist[i].grfid = statspec->grf_prop.grfid; - st->speclist[i].localidx = statspec->grf_prop.local_id; - - StationUpdateCachedTriggers(st); - } - return i; } +/** + * Assign a previously allocated StationSpec specindex to a Station. + * @param spec StationSpec to assign.. + * @param st Station to allocate it to. + * @param specindex Spec index of allocation. + */ +void AssignSpecToStation(const StationSpec *spec, BaseStation *st, uint8_t specindex) +{ + if (specindex == 0) return; + if (specindex >= st->speclist.size()) st->speclist.resize(specindex + 1); + + st->speclist[specindex].spec = spec; + st->speclist[specindex].grfid = spec->grf_prop.grfid; + st->speclist[specindex].localidx = spec->grf_prop.local_id; + + StationUpdateCachedTriggers(st); +} /** * Deallocate a StationSpec from a Station. Called when removing a single station tile. diff --git a/src/newgrf_station.h b/src/newgrf_station.h index 2537209fd8..990f0bc4a9 100644 --- a/src/newgrf_station.h +++ b/src/newgrf_station.h @@ -215,7 +215,8 @@ SpriteID GetCustomStationFoundationRelocation(const StationSpec *statspec, BaseS uint16_t GetStationCallback(CallbackID callback, uint32_t param1, uint32_t param2, const StationSpec *statspec, BaseStation *st, TileIndex tile, std::span regs100 = {}); CommandCost PerformStationTileSlopeCheck(TileIndex north_tile, TileIndex cur_tile, const StationSpec *statspec, Axis axis, uint8_t plat_len, uint8_t numtracks); -std::optional AllocateSpecToStation(const StationSpec *statspec, BaseStation *st, bool exec); +std::optional AllocateSpecToStation(const StationSpec *spec, BaseStation *st); +void AssignSpecToStation(const StationSpec *spec, BaseStation *st, uint8_t specindex); void DeallocateSpecFromStation(BaseStation *st, uint8_t specindex); bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station); diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 58d014a15d..57edac0323 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -136,7 +136,8 @@ void MoveWaypointsToBaseStations() SetRailStationReservation(tile, reserved); if (wp.spec != nullptr) { - auto specindex = AllocateSpecToStation(wp.spec, new_wp, true); + auto specindex = AllocateSpecToStation(wp.spec, new_wp); + if (specindex.has_value()) AssignSpecToStation(wp.spec, new_wp, *specindex); SetCustomStationSpecIndex(tile, specindex.value_or(0)); } new_wp->rect.BeforeAddTile(tile, StationRect::ADD_FORCE); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 2b5aadb8fe..ce85d755e2 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1491,7 +1491,7 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy } /* Check if we can allocate a custom stationspec to this station */ - auto specindex = AllocateSpecToStation(statspec, st, flags.Test(DoCommandFlag::Execute)); + auto specindex = AllocateSpecToStation(statspec, st); if (!specindex.has_value()) return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS); if (statspec != nullptr) { @@ -1514,6 +1514,7 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy st->rect.BeforeAddRect(tile_org, w_org, h_org, StationRect::ADD_TRY); + if (specindex.has_value()) AssignSpecToStation(statspec, st, *specindex); if (statspec != nullptr) { /* Include this station spec's animation trigger bitmask * in the station's cached copy. */ @@ -2113,7 +2114,7 @@ CommandCost CmdBuildRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width if (ret.Failed()) return ret; /* Check if we can allocate a custom stationspec to this station */ - auto specindex = AllocateSpecToRoadStop(roadstopspec, st, flags.Test(DoCommandFlag::Execute)); + auto specindex = AllocateSpecToRoadStop(roadstopspec, st); if (!specindex.has_value()) return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS); if (roadstopspec != nullptr) { @@ -2127,6 +2128,7 @@ CommandCost CmdBuildRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width } if (flags.Test(DoCommandFlag::Execute)) { + if (specindex.has_value()) AssignSpecToRoadStop(roadstopspec, st, *specindex); /* Check every tile in the area. */ for (TileIndex cur_tile : roadstop_area) { /* Get existing road types and owners before any tile clearing */ diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 18a0540595..1a0dba435d 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -271,7 +271,8 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi if (!Waypoint::CanAllocateItem()) return CommandCost(STR_ERROR_TOO_MANY_STATIONS_LOADING); } - auto specindex = AllocateSpecToStation(spec, wp, flags.Test(DoCommandFlag::Execute)); + /* Check if we can allocate a custom spec to this waypoint. */ + auto specindex = AllocateSpecToStation(spec, wp); if (!specindex.has_value()) return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS); if (flags.Test(DoCommandFlag::Execute)) { @@ -284,6 +285,7 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi wp->owner = GetTileOwner(start_tile); wp->rect.BeforeAddRect(start_tile, width, height, StationRect::ADD_TRY); + if (specindex.has_value()) AssignSpecToStation(spec, wp, *specindex); wp->delete_ctr = 0; wp->facilities.Set(StationFacility::Train); @@ -391,8 +393,8 @@ CommandCost CmdBuildRoadWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi if (!Waypoint::CanAllocateItem()) return CommandCost(STR_ERROR_TOO_MANY_STATIONS_LOADING); } - /* Check if we can allocate a custom roadstopspec to this station */ - auto specindex = AllocateSpecToRoadStop(roadstopspec, wp, flags.Test(DoCommandFlag::Execute)); + /* Check if we can allocate a custom spec to this waypoint. */ + auto specindex = AllocateSpecToRoadStop(roadstopspec, wp); if (!specindex.has_value()) return CommandCost(STR_ERROR_TOO_MANY_STATION_SPECS); if (flags.Test(DoCommandFlag::Execute)) { @@ -406,6 +408,7 @@ CommandCost CmdBuildRoadWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi wp->owner = _current_company; wp->rect.BeforeAddRect(start_tile, width, height, StationRect::ADD_TRY); + if (specindex.has_value()) AssignSpecToRoadStop(roadstopspec, wp, *specindex); if (roadstopspec != nullptr) { /* Include this road stop spec's animation trigger bitmask From ce166bbbc314e463a607a131f32c997faded2203 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 01:29:54 +0100 Subject: [PATCH 068/280] Codechange: Demagicify main toolbar button type. Use WWT_PUSHIMGBTN for non-menu buttons so they automatically raise, replacing the custom OnTimeout function. --- src/toolbar_gui.cpp | 79 ++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index c447b182b6..dec57a4400 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2109,15 +2109,6 @@ struct MainToolbarWindow : Window { } }}; - void OnTimeout() override - { - /* We do not want to automatically raise the pause, fast forward and - * switchbar buttons; they have to stay down when pressed etc. */ - for (WidgetID i = WID_TN_SETTINGS; i < WID_TN_SWITCH_BAR; i++) { - this->RaiseWidgetWhenLowered(i); - } - } - /** * Some data on this window has become invalid. * @param data Information about the changed data. @@ -2176,43 +2167,43 @@ struct MainToolbarWindow : Window { static std::unique_ptr MakeMainToolbar() { /** Sprites to use for the different toolbar buttons */ - static const SpriteID toolbar_button_sprites[] = { - SPR_IMG_PAUSE, // WID_TN_PAUSE - SPR_IMG_FASTFORWARD, // WID_TN_FAST_FORWARD - SPR_IMG_SETTINGS, // WID_TN_SETTINGS - SPR_IMG_SAVE, // WID_TN_SAVE - SPR_IMG_SMALLMAP, // WID_TN_SMALL_MAP - SPR_IMG_TOWN, // WID_TN_TOWNS - SPR_IMG_SUBSIDIES, // WID_TN_SUBSIDIES - SPR_IMG_COMPANY_LIST, // WID_TN_STATIONS - SPR_IMG_COMPANY_FINANCE, // WID_TN_FINANCES - SPR_IMG_COMPANY_GENERAL, // WID_TN_COMPANIES - SPR_IMG_STORY_BOOK, // WID_TN_STORY - SPR_IMG_GOAL, // WID_TN_GOAL - SPR_IMG_GRAPHS, // WID_TN_GRAPHS - SPR_IMG_COMPANY_LEAGUE, // WID_TN_LEAGUE - SPR_IMG_INDUSTRY, // WID_TN_INDUSTRIES - SPR_IMG_TRAINLIST, // WID_TN_TRAINS - SPR_IMG_TRUCKLIST, // WID_TN_ROADVEHS - SPR_IMG_SHIPLIST, // WID_TN_SHIPS - SPR_IMG_AIRPLANESLIST, // WID_TN_AIRCRAFT - SPR_IMG_ZOOMIN, // WID_TN_ZOOMIN - SPR_IMG_ZOOMOUT, // WID_TN_ZOOMOUT - SPR_IMG_BUILDRAIL, // WID_TN_RAILS - SPR_IMG_BUILDROAD, // WID_TN_ROADS - SPR_IMG_BUILDTRAMS, // WID_TN_TRAMS - SPR_IMG_BUILDWATER, // WID_TN_WATER - SPR_IMG_BUILDAIR, // WID_TN_AIR - SPR_IMG_LANDSCAPING, // WID_TN_LANDSCAPE - SPR_IMG_MUSIC, // WID_TN_MUSIC_SOUND - SPR_IMG_MESSAGES, // WID_TN_MESSAGES - SPR_IMG_QUERY, // WID_TN_HELP - SPR_IMG_SWITCH_TOOLBAR, // WID_TN_SWITCH_BAR + static const std::tuple toolbar_button_sprites[] = { + {WID_TN_PAUSE, WWT_IMGBTN, SPR_IMG_PAUSE}, + {WID_TN_FAST_FORWARD, WWT_IMGBTN, SPR_IMG_FASTFORWARD}, + {WID_TN_SETTINGS, WWT_IMGBTN, SPR_IMG_SETTINGS}, + {WID_TN_SAVE, WWT_IMGBTN_2, SPR_IMG_SAVE}, + {WID_TN_SMALL_MAP, WWT_IMGBTN, SPR_IMG_SMALLMAP}, + {WID_TN_TOWNS, WWT_IMGBTN, SPR_IMG_TOWN}, + {WID_TN_SUBSIDIES, WWT_IMGBTN, SPR_IMG_SUBSIDIES}, + {WID_TN_STATIONS, WWT_IMGBTN, SPR_IMG_COMPANY_LIST}, + {WID_TN_FINANCES, WWT_IMGBTN, SPR_IMG_COMPANY_FINANCE}, + {WID_TN_COMPANIES, WWT_IMGBTN, SPR_IMG_COMPANY_GENERAL}, + {WID_TN_STORY, WWT_IMGBTN, SPR_IMG_STORY_BOOK}, + {WID_TN_GOAL, WWT_IMGBTN, SPR_IMG_GOAL}, + {WID_TN_GRAPHS, WWT_IMGBTN, SPR_IMG_GRAPHS}, + {WID_TN_LEAGUE, WWT_IMGBTN, SPR_IMG_COMPANY_LEAGUE}, + {WID_TN_INDUSTRIES, WWT_IMGBTN, SPR_IMG_INDUSTRY}, + {WID_TN_TRAINS, WWT_IMGBTN, SPR_IMG_TRAINLIST}, + {WID_TN_ROADVEHS, WWT_IMGBTN, SPR_IMG_TRUCKLIST}, + {WID_TN_SHIPS, WWT_IMGBTN, SPR_IMG_SHIPLIST}, + {WID_TN_AIRCRAFT, WWT_IMGBTN, SPR_IMG_AIRPLANESLIST}, + {WID_TN_ZOOM_IN, WWT_PUSHIMGBTN, SPR_IMG_ZOOMIN}, + {WID_TN_ZOOM_OUT, WWT_PUSHIMGBTN, SPR_IMG_ZOOMOUT}, + {WID_TN_RAILS, WWT_IMGBTN, SPR_IMG_BUILDRAIL}, + {WID_TN_ROADS, WWT_IMGBTN, SPR_IMG_BUILDROAD}, + {WID_TN_TRAMS, WWT_IMGBTN, SPR_IMG_BUILDTRAMS}, + {WID_TN_WATER, WWT_IMGBTN, SPR_IMG_BUILDWATER}, + {WID_TN_AIR, WWT_IMGBTN, SPR_IMG_BUILDAIR}, + {WID_TN_LANDSCAPE, WWT_IMGBTN, SPR_IMG_LANDSCAPING}, + {WID_TN_MUSIC_SOUND, WWT_IMGBTN, SPR_IMG_MUSIC}, + {WID_TN_MESSAGES, WWT_IMGBTN, SPR_IMG_MESSAGES}, + {WID_TN_HELP, WWT_IMGBTN, SPR_IMG_QUERY}, + {WID_TN_SWITCH_BAR, WWT_IMGBTN, SPR_IMG_SWITCH_TOOLBAR}, }; auto hor = std::make_unique(); - for (WidgetID i = 0; i < WID_TN_END; i++) { - switch (i) { + for (const auto &[widget, tp, sprite] : toolbar_button_sprites) { + switch (widget) { case WID_TN_SMALL_MAP: case WID_TN_FINANCES: case WID_TN_VEHICLE_START: @@ -2222,7 +2213,7 @@ static std::unique_ptr MakeMainToolbar() hor->Add(std::make_unique(0, 0)); break; } - auto leaf = std::make_unique(i == WID_TN_SAVE ? WWT_IMGBTN_2 : WWT_IMGBTN, COLOUR_GREY, i, WidgetData{.sprite = toolbar_button_sprites[i]}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + i); + auto leaf = std::make_unique(tp, COLOUR_GREY, widget, WidgetData{.sprite = sprite}, STR_TOOLBAR_TOOLTIP_PAUSE_GAME + widget); leaf->SetMinimalSize(20, 20); hor->Add(std::move(leaf)); } From 69697a62d340c316ea0ee8c8aabbdcba8695e4c2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 01:00:20 +0100 Subject: [PATCH 069/280] Fix 8c58fb1efdc: Doubled beep sounds when clicking toolbar buttons. * ShowDropDownList() now issues a beep, so individual toolbar buttons no longer need to do it. * HandleButtonClick() may be called twice for some buttons, as it is called by automatically for PUSH buttons. This caused some beeps to sound louder than others. --- src/toolbar_gui.cpp | 14 -------------- src/window.cpp | 3 +++ 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index dec57a4400..eba265fc7b 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -117,7 +117,6 @@ public: static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def) { ShowDropDownList(w, std::move(list), def, widget, 0, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); } /** @@ -291,7 +290,6 @@ static CallBackFunction ToolbarOptionsClick(Window *w) list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS)); ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -684,8 +682,6 @@ static CallBackFunction ToolbarGraphsClick(Window *w) if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list); ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); - return CBF_NONE; } @@ -697,8 +693,6 @@ static CallBackFunction ToolbarLeagueClick(Window *w) int selected = list[0]->result; ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); - return CBF_NONE; } @@ -876,7 +870,6 @@ static CallBackFunction ToolbarZoomOutClick(Window *w) static CallBackFunction ToolbarBuildRailClick(Window *w) { ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -898,7 +891,6 @@ static CallBackFunction MenuClickBuildRail(int index) static CallBackFunction ToolbarBuildRoadClick(Window *w) { ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -920,7 +912,6 @@ static CallBackFunction MenuClickBuildRoad(int index) static CallBackFunction ToolbarBuildTramClick(Window *w) { ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -944,7 +935,6 @@ static CallBackFunction ToolbarBuildWaterClick(Window *w) DropDownList list; list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0)); ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -966,7 +956,6 @@ static CallBackFunction ToolbarBuildAirClick(Window *w) DropDownList list; list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0)); ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -990,7 +979,6 @@ static CallBackFunction ToolbarForestClick(Window *w) list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1)); list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2)); ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -1260,7 +1248,6 @@ static CallBackFunction ToolbarScenGenIndustry(Window *w) static CallBackFunction ToolbarScenBuildRoadClick(Window *w) { ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } @@ -1280,7 +1267,6 @@ static CallBackFunction ToolbarScenBuildRoad(int index) static CallBackFunction ToolbarScenBuildTramClick(Window *w) { ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, _settings_client.gui.toolbar_dropdown_autoselect); - SndClickBeep(); return CBF_NONE; } diff --git a/src/window.cpp b/src/window.cpp index 50422b89de..e40641f24e 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -594,6 +594,9 @@ EventState Window::OnHotkey(int hotkey) */ void Window::HandleButtonClick(WidgetID widget) { + /* Button click for this widget may already have been handled. */ + if (this->IsWidgetLowered(widget) && this->timeout_timer == TIMEOUT_DURATION) return; + this->LowerWidget(widget); this->SetTimeout(); this->SetWidgetDirty(widget); From 13ab9c1adc8189bf4a74801efe57311b2a591caa Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 13:41:23 +0100 Subject: [PATCH 070/280] Fix 6e90b828c6: Off-by-one in Rect::CentreTo. (#14643) * Rect right/bottom are inclusive so -1 must be taken from width/height. * Misnamed variable, `new_right` is actually `new_top`. --- src/core/geometry_type.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index b3400c2cc3..f5bb66f554 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -261,8 +261,8 @@ struct Rect { [[nodiscard]] inline Rect CentreTo(int width, int height) const { int new_left = CentreBounds(this->left, this->right, width); - int new_right = CentreBounds(this->top, this->bottom, height); - return {new_left, new_right, new_left + width, new_right + height}; + int new_top = CentreBounds(this->top, this->bottom, height); + return {new_left, new_top, new_left + width - 1, new_top + height - 1}; } }; From 29012c3fce476334b883a6a4bac55d154df1099a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 13:41:47 +0100 Subject: [PATCH 071/280] Codechange: Move settings entry size global variables. (#14644) _setting_circle_size and (the incorrectly named) SETTING_HEIGHT variables are now static members of BaseSettingEntry. Neither of these are constants, so they no longer use constant naming style. --- src/settingentry_gui.cpp | 18 +++++++++--------- src/settingentry_gui.h | 6 +++--- src/settings_gui.cpp | 14 ++++++-------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/settingentry_gui.cpp b/src/settingentry_gui.cpp index 1d86a49369..087cff205d 100644 --- a/src/settingentry_gui.cpp +++ b/src/settingentry_gui.cpp @@ -94,22 +94,22 @@ uint BaseSettingEntry::Draw(GameSettings *settings_ptr, int left, int right, int if (cur_row >= max_row) return cur_row; bool rtl = _current_text_dir == TD_RTL; - int offset = (rtl ? -(int)_setting_circle_size.width : (int)_setting_circle_size.width) / 2; + int offset = (rtl ? -static_cast(BaseSettingEntry::circle_size.width) : static_cast(BaseSettingEntry::circle_size.width)) / 2; int level_width = rtl ? -WidgetDimensions::scaled.hsep_indent : WidgetDimensions::scaled.hsep_indent; int x = rtl ? right : left; if (cur_row >= first_row) { PixelColour colour = GetColourGradient(COLOUR_ORANGE, SHADE_NORMAL); - y += (cur_row - first_row) * SETTING_HEIGHT; // Compute correct y start position + y += (cur_row - first_row) * BaseSettingEntry::line_height; // Compute correct y start position /* Draw vertical for parent nesting levels */ for (uint lvl = 0; lvl < this->level; lvl++) { - if (!HasBit(parent_last, lvl)) GfxDrawLine(x + offset, y, x + offset, y + SETTING_HEIGHT - 1, colour); + if (!HasBit(parent_last, lvl)) GfxDrawLine(x + offset, y, x + offset, y + BaseSettingEntry::line_height - 1, colour); x += level_width; } /* draw own |- prefix */ - int halfway_y = y + SETTING_HEIGHT / 2; - int bottom_y = flags.Test(SettingEntryFlag::LastField) ? halfway_y : y + SETTING_HEIGHT - 1; + int halfway_y = y + BaseSettingEntry::line_height / 2; + int bottom_y = flags.Test(SettingEntryFlag::LastField) ? halfway_y : y + BaseSettingEntry::line_height - 1; GfxDrawLine(x + offset, y, x + offset, bottom_y, colour); /* Small horizontal line from the last vertical line */ GfxDrawLine(x + offset, halfway_y, x + level_width - (rtl ? -WidgetDimensions::scaled.hsep_normal : WidgetDimensions::scaled.hsep_normal), halfway_y, colour); @@ -274,7 +274,7 @@ void SettingEntry::DrawSetting(GameSettings *settings_ptr, int left, int right, uint buttons_left = rtl ? right + 1 - SETTING_BUTTON_WIDTH : left; uint text_left = left + (rtl ? 0 : SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide); uint text_right = right - (rtl ? SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide : 0); - uint button_y = y + (SETTING_HEIGHT - SETTING_BUTTON_HEIGHT) / 2; + uint button_y = y + (BaseSettingEntry::line_height - SETTING_BUTTON_HEIGHT) / 2; /* We do not allow changes of some items when we are a client in a networkgame */ bool editable = sd->IsEditable(); @@ -293,7 +293,7 @@ void SettingEntry::DrawSetting(GameSettings *settings_ptr, int left, int right, editable && value != (sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : min_val), editable && static_cast(value) != max_val); } auto [param1, param2] = sd->GetValueParams(value); - DrawString(text_left, text_right, y + (SETTING_HEIGHT - GetCharacterHeight(FS_NORMAL)) / 2, GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2), highlight ? TC_WHITE : TC_LIGHT_BLUE); + DrawString(text_left, text_right, y + (BaseSettingEntry::line_height - GetCharacterHeight(FS_NORMAL)) / 2, GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2), highlight ? TC_WHITE : TC_LIGHT_BLUE); } /* == SettingsContainer methods == */ @@ -611,8 +611,8 @@ uint SettingsPage::Draw(GameSettings *settings_ptr, int left, int right, int y, void SettingsPage::DrawSetting(GameSettings *, int left, int right, int y, bool) const { bool rtl = _current_text_dir == TD_RTL; - DrawSprite((this->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED), PAL_NONE, rtl ? right - _setting_circle_size.width : left, y + (SETTING_HEIGHT - _setting_circle_size.height) / 2); - DrawString(rtl ? left : left + _setting_circle_size.width + WidgetDimensions::scaled.hsep_normal, rtl ? right - _setting_circle_size.width - WidgetDimensions::scaled.hsep_normal : right, y + (SETTING_HEIGHT - GetCharacterHeight(FS_NORMAL)) / 2, this->title, TC_ORANGE); + DrawSprite((this->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED), PAL_NONE, rtl ? right - BaseSettingEntry::circle_size.width : left, y + (BaseSettingEntry::line_height - BaseSettingEntry::circle_size.height) / 2); + DrawString(rtl ? left : left + BaseSettingEntry::circle_size.width + WidgetDimensions::scaled.hsep_normal, rtl ? right - BaseSettingEntry::circle_size.width - WidgetDimensions::scaled.hsep_normal : right, y + (BaseSettingEntry::line_height - GetCharacterHeight(FS_NORMAL)) / 2, this->title, TC_ORANGE); } /** Construct settings tree */ diff --git a/src/settingentry_gui.h b/src/settingentry_gui.h index 66c017b99f..e23d54e8bf 100644 --- a/src/settingentry_gui.h +++ b/src/settingentry_gui.h @@ -14,9 +14,6 @@ #include "settings_internal.h" #include "stringfilter_type.h" -extern Dimension _setting_circle_size; -extern int SETTING_HEIGHT; - /** * Flags for #SettingEntry * @note The #SEF_BUTTONS_MASK matches expectations of the formal parameter 'state' of #DrawArrowButtons @@ -86,6 +83,9 @@ struct BaseSettingEntry { virtual uint Draw(GameSettings *settings_ptr, int left, int right, int y, uint first_row, uint max_row, BaseSettingEntry *selected, uint cur_row = 0, uint parent_last = 0) const; + static inline Dimension circle_size; ///< Dimension of the circle +/- icon. + static inline int line_height; ///< Height of a single setting. + protected: virtual void DrawSetting(GameSettings *settings_ptr, int left, int right, int y, bool highlight) const = 0; }; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 034a5da24b..af466bf40b 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -84,8 +84,6 @@ static const uint32_t _autosave_dropdown_to_minutes[] = { 120, }; -Dimension _setting_circle_size; ///< Dimension of the circle +/- icon. This is here as not all users are within the class of the settings window. - /** * Get index of the current screen resolution. * @return Index of the current screen resolution if it is a known resolution, _resolutions.size() otherwise. @@ -363,8 +361,6 @@ std::unique_ptr MakeNWidgetSocialPlugins() return std::make_unique(); } -int SETTING_HEIGHT = 11; ///< Height of a single setting in the tree view in pixels - static const StringID _game_settings_restrict_dropdown[] = { STR_CONFIG_SETTING_RESTRICT_BASIC, // RM_BASIC STR_CONFIG_SETTING_RESTRICT_ADVANCED, // RM_ADVANCED @@ -453,7 +449,9 @@ struct GameOptionsWindow : Window { void OnInit() override { - _setting_circle_size = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); + BaseSettingEntry::circle_size = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); + BaseSettingEntry::line_height = std::max({static_cast(BaseSettingEntry::circle_size.height), SETTING_BUTTON_HEIGHT, GetCharacterHeight(FS_NORMAL)}) + WidgetDimensions::scaled.vsep_normal; + this->gui_scale = _gui_scale; } @@ -709,7 +707,7 @@ struct GameOptionsWindow : Window { case WID_GO_OPTIONSPANEL: { Rect tr = r.Shrink(WidgetDimensions::scaled.frametext, WidgetDimensions::scaled.framerect); - tr.top += this->warn_lines * SETTING_HEIGHT; + tr.top += this->warn_lines * BaseSettingEntry::line_height; uint last_row = this->vscroll->GetPosition() + this->vscroll->GetCapacity() - this->warn_lines; int next_row = GetSettingsTree().Draw(settings_ptr, tr.left, tr.right, tr.top, this->vscroll->GetPosition(), last_row, this->last_clicked); @@ -858,7 +856,7 @@ struct GameOptionsWindow : Window { } case WID_GO_OPTIONSPANEL: - fill.height = resize.height = SETTING_HEIGHT = std::max({(int)_setting_circle_size.height, SETTING_BUTTON_HEIGHT, GetCharacterHeight(FS_NORMAL)}) + WidgetDimensions::scaled.vsep_normal; + fill.height = resize.height = BaseSettingEntry::line_height; resize.width = 1; size.height = 8 * resize.height + WidgetDimensions::scaled.framerect.Vertical(); @@ -1271,7 +1269,7 @@ struct GameOptionsWindow : Window { Rect wi_rect; wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x); wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1; - wi_rect.top = pt.y - rel_y + (SETTING_HEIGHT - SETTING_BUTTON_HEIGHT) / 2; + wi_rect.top = pt.y - rel_y + (BaseSettingEntry::line_height - SETTING_BUTTON_HEIGHT) / 2; wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1; /* For dropdowns we also have to check the y position thoroughly, the mouse may not above the just opening dropdown */ From a7b06fc9f5111078dd326390cb5111f09ade7b53 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 14:57:53 +0100 Subject: [PATCH 072/280] Codechange: Don't use Point for non-2D coordinate. (#14645) `HandleScrollbarHittest` returns min and max coordinates, not x and y. Also avoid referring to the min and max coordinates as top and bottom, as these functions are used for both vertical and horizontal scrollbars. --- src/widget.cpp | 75 ++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index 138ce18264..0c5977d174 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -139,57 +139,48 @@ static inline Point GetAlignedPosition(const Rect &r, const Dimension &d, String /** * Compute the vertical position of the draggable part of scrollbar - * @param sb Scrollbar list data - * @param top Top position of the scrollbar (top position of the up-button) - * @param bottom Bottom position of the scrollbar (bottom position of the down-button) + * @param sb Scrollbar list data + * @param mi Minimum coordinate of the scroll bar. + * @param ma Maximum coordinate of the scroll bar. * @param horizontal Whether the scrollbar is horizontal or not - * @return A Point, with x containing the top coordinate of the draggable part, and - * y containing the bottom coordinate of the draggable part + * @return A pair, with first containing the minimum coordinate of the draggable part, and + * second containing the maximum coordinate of the draggable part */ -static Point HandleScrollbarHittest(const Scrollbar *sb, int top, int bottom, bool horizontal) +static std::pair HandleScrollbarHittest(const Scrollbar *sb, int mi, int ma, bool horizontal) { /* Base for reversion */ - int rev_base = top + bottom; - int button_size; - if (horizontal) { - button_size = NWidgetScrollbar::GetHorizontalDimension().width; - } else { - button_size = NWidgetScrollbar::GetVerticalDimension().height; - } - top += button_size; // top points to just below the up-button - bottom -= button_size; // bottom points to just before the down-button + int rev_base = mi + ma; + int button_size = horizontal ? NWidgetScrollbar::GetHorizontalDimension().width : NWidgetScrollbar::GetVerticalDimension().height; + + mi += button_size; // now points to just after the up/left-button + ma -= button_size; // now points to just before the down/right-button int count = sb->GetCount(); int cap = sb->GetCapacity(); if (count > cap) { - int height = bottom + 1 - top; + int height = ma + 1 - mi; int slider_height = std::max(button_size, cap * height / count); height -= slider_height; - top += height * sb->GetPosition() / (count - cap); - bottom = top + slider_height - 1; + mi += height * sb->GetPosition() / (count - cap); + ma = mi + slider_height - 1; } - Point pt; - if (horizontal && _current_text_dir == TD_RTL) { - pt.x = rev_base - bottom; - pt.y = rev_base - top; - } else { - pt.x = top; - pt.y = bottom; - } - return pt; + /* Reverse coordinates for RTL. */ + if (horizontal && _current_text_dir == TD_RTL) return {rev_base - ma, rev_base - mi}; + + return {mi, ma}; } /** * Compute new position of the scrollbar after a click and updates the window flags. - * @param w Window on which a scroll was performed. - * @param sb Scrollbar - * @param mi Minimum coordinate of the scroll bar. - * @param ma Maximum coordinate of the scroll bar. - * @param x The X coordinate of the mouse click. - * @param y The Y coordinate of the mouse click. + * @param w Window on which a scroll was performed. + * @param sb Scrollbar + * @param x The X coordinate of the mouse click. + * @param y The Y coordinate of the mouse click. + * @param mi Minimum coordinate of the scroll bar. + * @param ma Maximum coordinate of the scroll bar. */ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, int y, int mi, int ma) { @@ -224,15 +215,15 @@ static void ScrollbarClickPositioning(Window *w, NWidgetScrollbar *sb, int x, in } w->mouse_capture_widget = sb->GetIndex(); } else { - Point pt = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR); + auto [start, end] = HandleScrollbarHittest(sb, mi, ma, sb->type == NWID_HSCROLLBAR); - if (pos < pt.x) { + if (pos < start) { changed = sb->UpdatePosition(rtl ? 1 : -1, Scrollbar::SS_BIG); - } else if (pos > pt.y) { + } else if (pos > end) { changed = sb->UpdatePosition(rtl ? -1 : 1, Scrollbar::SS_BIG); } else { - _scrollbar_start_pos = pt.x - mi - button_size; - _scrollbar_size = ma - mi - button_size * 2 - (pt.y - pt.x); + _scrollbar_start_pos = start - mi - button_size; + _scrollbar_size = ma - mi - button_size * 2 - (end - start); w->mouse_capture_widget = sb->GetIndex(); _cursorpos_drag_start = _cursor.pos; } @@ -534,8 +525,8 @@ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_ GfxFillRect(right - bl, r.top + height, right - 1, r.bottom - height, c1); GfxFillRect(right, r.top + height, right + br - 1, r.bottom - height, c2); - Point pt = HandleScrollbarHittest(scrollbar, r.top, r.bottom, false); - DrawFrameRect(r.left, pt.x, r.right, pt.y, colour, bar_dragged ? FrameFlag::Lowered : FrameFlags{}); + auto [top, bottom] = HandleScrollbarHittest(scrollbar, r.top, r.bottom, false); + DrawFrameRect(r.left, top, r.right, bottom, colour, bar_dragged ? FrameFlag::Lowered : FrameFlags{}); } /** @@ -574,8 +565,8 @@ static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool l GfxFillRect(r.left + width, bottom, r.right - width, bottom + bb - 1, c2); /* draw actual scrollbar */ - Point pt = HandleScrollbarHittest(scrollbar, r.left, r.right, true); - DrawFrameRect(pt.x, r.top, pt.y, r.bottom, colour, bar_dragged ? FrameFlag::Lowered : FrameFlags{}); + auto [left, right] = HandleScrollbarHittest(scrollbar, r.left, r.right, true); + DrawFrameRect(left, r.top, right, r.bottom, colour, bar_dragged ? FrameFlag::Lowered : FrameFlags{}); } /** From 71eba489bc891d0cb277f09ddc9542ebd865cb14 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 20:26:06 +0100 Subject: [PATCH 073/280] Codechange: Deduplicate DrawButtonDropdown. (#14646) Use Rect methods to position components. --- src/widget.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index 0c5977d174..f917901802 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -745,21 +745,17 @@ void DrawCaption(const Rect &r, Colours colour, Owner owner, TextColour text_col */ static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicked_button, bool clicked_dropdown, std::string_view str, StringAlignment align) { - int dd_width = NWidgetLeaf::dropdown_dimension.width; + bool rtl = _current_text_dir == TD_RTL; - if (_current_text_dir == TD_LTR) { - DrawFrameRect(r.left, r.top, r.right - dd_width, r.bottom, colour, clicked_button ? FrameFlag::Lowered : FrameFlags{}); - DrawImageButtons(r.WithWidth(dd_width, true), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); - if (!str.empty()) { - DrawString(r.left + WidgetDimensions::scaled.dropdowntext.left, r.right - dd_width - WidgetDimensions::scaled.dropdowntext.right, CentreBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), str, TC_BLACK, align); - } - } else { - DrawFrameRect(r.left + dd_width, r.top, r.right, r.bottom, colour, clicked_button ? FrameFlag::Lowered : FrameFlags{}); - DrawImageButtons(r.WithWidth(dd_width, false), WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); - if (!str.empty()) { - DrawString(r.left + dd_width + WidgetDimensions::scaled.dropdowntext.left, r.right - WidgetDimensions::scaled.dropdowntext.right, CentreBounds(r.top, r.bottom, GetCharacterHeight(FS_NORMAL)), str, TC_BLACK, align); - } + Rect text = r.Indent(NWidgetLeaf::dropdown_dimension.width, !rtl); + DrawFrameRect(text, colour, clicked_button ? FrameFlag::Lowered : FrameFlags{}); + if (!str.empty()) { + text = text.CentreTo(text.Width(), GetCharacterHeight(FS_NORMAL)).Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); + DrawString(text, str, TC_BLACK, align); } + + Rect button = r.WithWidth(NWidgetLeaf::dropdown_dimension.width, !rtl); + DrawImageButtons(button, WWT_DROPDOWN, colour, clicked_dropdown, SPR_ARROW_DOWN, SA_CENTER); } /** From 1278f62e2e4a65929fb340b7cfae7141efe37b2d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 20:30:59 +0100 Subject: [PATCH 074/280] Codechange: Call shorter variant of DrawFrameRect and GfxFillRect. (#14647) Pass rect instead of breaking it up when possible. --- src/bootstrap_gui.cpp | 4 ++-- src/widget.cpp | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 80620f303b..ae04d45b7b 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -60,8 +60,8 @@ public: void DrawWidget(const Rect &r, WidgetID) const override { - GfxFillRect(r.left, r.top, r.right, r.bottom, PixelColour{4}, FILLRECT_OPAQUE); - GfxFillRect(r.left, r.top, r.right, r.bottom, PixelColour{0}, FILLRECT_CHECKER); + GfxFillRect(r, PixelColour{4}, FILLRECT_OPAQUE); + GfxFillRect(r, PixelColour{0}, FILLRECT_CHECKER); } }; diff --git a/src/widget.cpp b/src/widget.cpp index f917901802..317727e57d 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -344,7 +344,7 @@ void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, StringA static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colour, bool clicked, SpriteID img, StringAlignment align) { assert(img != 0); - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, colour, clicked ? FrameFlag::Lowered : FrameFlags{}); if ((type & WWT_MASK) == WWT_IMGBTN_2 && clicked) img++; // Show different image when clicked for #WWT_IMGBTN_2. DrawSpriteIgnorePadding(img, PAL_NONE, r, align); @@ -363,7 +363,7 @@ static inline void DrawImageButtons(const Rect &r, WidgetType type, Colours colo */ static inline void DrawImageTextButtons(const Rect &r, Colours colour, bool clicked, SpriteID img, TextColour text_colour, const std::string &text, StringAlignment align, FontSize fs) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, colour, clicked ? FrameFlag::Lowered : FrameFlags{}); bool rtl = _current_text_dir == TD_RTL; int image_width = img != 0 ? GetScaledSpriteSize(img).width : 0; @@ -426,7 +426,7 @@ static inline void DrawText(const Rect &r, TextColour colour, std::string_view s */ static inline void DrawInset(const Rect &r, Colours colour, TextColour text_colour, std::string_view str, StringAlignment align, FontSize fs) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, {FrameFlag::Lowered, FrameFlag::Darkened}); + DrawFrameRect(r, colour, {FrameFlag::Lowered, FrameFlag::Darkened}); if (!str.empty()) DrawString(r.Shrink(WidgetDimensions::scaled.inset), str, text_colour, align, false, fs); } @@ -442,7 +442,7 @@ static inline void DrawInset(const Rect &r, Colours colour, TextColour text_colo */ static inline void DrawMatrix(const Rect &r, Colours colour, bool clicked, uint32_t num_columns, uint32_t num_rows, uint resize_x, uint resize_y) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, colour, clicked ? FrameFlag::Lowered : FrameFlags{}); int column_width; // Width of a single column in the matrix. if (num_columns == 0) { @@ -680,7 +680,7 @@ static inline void DrawDebugBox(const Rect &r, Colours colour, bool clicked) static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bool clicked, bool bevel) { if (bevel) { - DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, colour, clicked ? FrameFlag::Lowered : FrameFlags{}); } else if (clicked) { GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(colour, SHADE_LIGHTER)); } @@ -694,7 +694,7 @@ static inline void DrawResizeBox(const Rect &r, Colours colour, bool at_left, bo */ static inline void DrawCloseBox(const Rect &r, Colours colour) { - if (colour != COLOUR_WHITE) DrawFrameRect(r.left, r.top, r.right, r.bottom, colour, {}); + if (colour != COLOUR_WHITE) DrawFrameRect(r, colour, {}); Point offset; Dimension d = GetSpriteSize(SPR_CLOSEBOX, &offset); d.width -= offset.x; @@ -2307,7 +2307,7 @@ void NWidgetBackground::Draw(const Window *w) switch (this->type) { case WWT_PANEL: - DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, this->IsLowered() ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, this->colour, this->IsLowered() ? FrameFlag::Lowered : FrameFlags{}); break; case WWT_FRAME: @@ -2986,7 +2986,7 @@ void NWidgetLeaf::Draw(const Window *w) break; case WWT_PUSHBTN: - DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, this->colour, clicked ? FrameFlag::Lowered : FrameFlags{}); break; case WWT_BOOLBTN: { @@ -3006,7 +3006,7 @@ void NWidgetLeaf::Draw(const Window *w) case WWT_TEXTBTN: case WWT_PUSHTXTBTN: case WWT_TEXTBTN_2: - DrawFrameRect(r.left, r.top, r.right, r.bottom, this->colour, (clicked) ? FrameFlag::Lowered : FrameFlags{}); + DrawFrameRect(r, this->colour, clicked ? FrameFlag::Lowered : FrameFlags{}); DrawLabel(r, this->text_colour, GetStringForWidget(w, this, (type & WWT_MASK) == WWT_TEXTBTN_2 && clicked), this->align, this->text_size); break; From 1229a498b716d35095d02376e97457c851367a8b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 22:47:04 +0100 Subject: [PATCH 075/280] Codechange: Add constant for INVALID_WIDGET. (#14649) Replaces direct use of -1, making it easier to find. --- src/airport_gui.cpp | 2 +- src/depot_gui.cpp | 8 ++++---- src/dock_gui.cpp | 4 ++-- src/rail_gui.cpp | 2 +- src/road_gui.cpp | 2 +- src/terraform_gui.cpp | 4 ++-- src/widget.cpp | 8 ++++---- src/widget_type.h | 20 ++++++++++---------- src/widgets/airport_widget.h | 2 -- src/widgets/dock_widget.h | 2 -- src/widgets/game_widget.h | 2 +- src/widgets/rail_widget.h | 2 -- src/widgets/road_widget.h | 2 -- src/widgets/script_widget.h | 2 +- src/widgets/settings_widget.h | 2 +- src/widgets/terraform_widget.h | 4 ---- src/window.cpp | 6 +++--- src/window_gui.h | 2 +- src/window_type.h | 3 +++ 19 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 48b34bbd00..51ba9ffd66 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -84,7 +84,7 @@ static void PlaceAirport(TileIndex tile) /** Airport build toolbar window handler. */ struct BuildAirToolbarWindow : Window { - int last_user_action = INVALID_WID_AT; // Last started user action. + WidgetID last_user_action = INVALID_WIDGET; // Last started user action. BuildAirToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc) { diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index d4ad2baa9c..8306ec8b30 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -260,7 +260,7 @@ struct DepotWindow : Window { VehicleType type = VEH_INVALID; bool generate_list = true; bool check_unitnumber_digits = true; - WidgetID hovered_widget = -1; ///< Index of the widget being hovered during drag/drop. -1 if no drag is in progress. + WidgetID hovered_widget = INVALID_WIDGET; ///< Index of the widget being hovered during drag/drop. \c INVALID_WIDGET if no drag is in progress. VehicleList vehicle_list{}; VehicleList wagon_list{}; uint unitnumber_digits = 2; @@ -1001,10 +1001,10 @@ struct DepotWindow : Window { this->vehicle_over = VehicleID::Invalid(); this->SetWidgetDirty(WID_D_MATRIX); - if (this->hovered_widget != -1) { + if (this->hovered_widget != INVALID_WIDGET) { this->SetWidgetLoweredState(this->hovered_widget, false); this->SetWidgetDirty(this->hovered_widget); - this->hovered_widget = -1; + this->hovered_widget = INVALID_WIDGET; } } @@ -1116,7 +1116,7 @@ struct DepotWindow : Window { this->SetDirty(); break; } - this->hovered_widget = -1; + this->hovered_widget = INVALID_WIDGET; _cursor.vehchain = false; } diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index 4e44efc3d9..e79a501c68 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -98,7 +98,7 @@ static TileIndex GetOtherAqueductEnd(TileIndex tile_from, TileIndex *tile_to = n /** Toolbar window for constructing water infrastructure. */ struct BuildDocksToolbarWindow : Window { - DockToolbarWidgets last_clicked_widget = WID_DT_INVALID; ///< Contains the last widget that has been clicked on this toolbar. + WidgetID last_clicked_widget = INVALID_WIDGET; ///< Contains the last widget that has been clicked on this toolbar. BuildDocksToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc) { @@ -189,7 +189,7 @@ struct BuildDocksToolbarWindow : Window { default: return; } - this->last_clicked_widget = (DockToolbarWidgets)widget; + this->last_clicked_widget = widget; } void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index feaccc2a7d..7b9a503577 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -438,7 +438,7 @@ static void HandleAutoSignalPlacement() /** Rail toolbar management class. */ struct BuildRailToolbarWindow : Window { RailType railtype = INVALID_RAILTYPE; ///< Rail type to build. - int last_user_action = INVALID_WID_RAT; ///< Last started user action. + WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action. BuildRailToolbarWindow(WindowDesc &desc, RailType railtype) : Window(desc), railtype(railtype) { diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 46c59c82c9..e3d29dbd38 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -344,7 +344,7 @@ static bool RoadToolbar_CtrlChanged(Window *w) /** Road toolbar window handler. */ struct BuildRoadToolbarWindow : Window { RoadType roadtype = INVALID_ROADTYPE; ///< Road type to build. - int last_started_action = INVALID_WID_ROT; ///< Last started user action. + WidgetID last_started_action = INVALID_WIDGET; ///< Last started user action. BuildRoadToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc), roadtype(_cur_roadtype) { diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index ab81c7004f..7c0f388a60 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -155,7 +155,7 @@ void PlaceProc_DemolishArea(TileIndex tile) /** Terra form toolbar managing class. */ struct TerraformToolbarWindow : Window { - int last_user_action = INVALID_WID_TT; ///< Last started user action. + WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action. TerraformToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc) { @@ -529,7 +529,7 @@ static void ResetLandscapeConfirmationCallback(Window *, bool confirmed) /** Landscape generation window handler in the scenario editor. */ struct ScenarioEditorLandscapeGenerationWindow : Window { - int last_user_action = INVALID_WID_ETT; ///< Last started user action. + WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action. ScenarioEditorLandscapeGenerationWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc) { diff --git a/src/widget.cpp b/src/widget.cpp index 317727e57d..1248d0fb16 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -269,12 +269,12 @@ void ScrollbarClickHandler(Window *w, NWidgetCore *nw, int x, int y) * @param *w Window to look inside * @param x The Window client X coordinate * @param y The Window client y coordinate - * @return A widget index, or -1 if no widget was found. + * @return A widget index, or \c INVALID_WIDGET if no widget was found. */ WidgetID GetWidgetFromPos(const Window *w, int x, int y) { NWidgetCore *nw = w->nested_root->GetWidgetFromPos(x, y); - return (nw != nullptr) ? nw->GetIndex() : -1; + return (nw != nullptr) ? nw->GetIndex() : INVALID_WIDGET; } /** @@ -1885,7 +1885,7 @@ void NWidgetVertical::AssignSizePosition(SizingType sizing, int x, int y, uint g * @param width Horizontal size of the spacer widget. * @param height Vertical size of the spacer widget. */ -NWidgetSpacer::NWidgetSpacer(int width, int height) : NWidgetResizeBase(NWID_SPACER, -1, 0, 0) +NWidgetSpacer::NWidgetSpacer(int width, int height) : NWidgetResizeBase(NWID_SPACER, INVALID_WIDGET, 0, 0) { this->SetMinimalSize(width, height); this->SetResize(0, 0); @@ -3408,7 +3408,7 @@ std::unique_ptr MakeWindowNWidgetTree(std::span if (hor_cont != nullptr && hor_cont->GetWidgetOfType(WWT_CAPTION) != nullptr && hor_cont->GetWidgetOfType(WWT_SHADEBOX) != nullptr) { /* If the first widget has a title bar and a shade box, silently add a shade selection widget in the tree. */ - auto shade_stack = std::make_unique(-1); + auto shade_stack = std::make_unique(INVALID_WIDGET); *shade_select = shade_stack.get(); /* Load the remaining parts into the shade stack. */ shade_stack->Add(MakeNWidgets({nwid_begin, nwid_end}, std::make_unique())); diff --git a/src/widget_type.h b/src/widget_type.h index 063c6b4d6d..072d56365e 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -136,7 +136,7 @@ using WidgetLookup = std::map; */ class NWidgetBase { public: - NWidgetBase(WidgetType tp, WidgetID index = -1) : type(tp), index(index) {} + NWidgetBase(WidgetType tp, WidgetID index = INVALID_WIDGET) : type(tp), index(index) {} virtual ~NWidgetBase() = default; void ApplyAspectRatio(); @@ -249,7 +249,7 @@ public: NWidgetBase *parent = nullptr; ///< Parent widget of this widget, automatically filled in when added to container. protected: - const WidgetID index = -1; ///< Index of the nested widget (\c -1 means 'not used'). + const WidgetID index = INVALID_WIDGET; ///< Index of the nested widget (\c INVALID_WIDGET means 'not used'). inline void StoreSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height); }; @@ -402,7 +402,7 @@ public: protected: WidgetData widget_data{}; ///< Data of the widget. @see Widget::data StringID tool_tip{}; ///< Tooltip of the widget. @see Widget::tool_tips - WidgetID scrollbar_index = -1; ///< Index of an attached scrollbar. + WidgetID scrollbar_index = INVALID_WIDGET; ///< Index of an attached scrollbar. TextColour highlight_colour{}; ///< Colour of highlight. TextColour text_colour{}; ///< Colour of text within widget. FontSize text_size = FS_NORMAL; ///< Size of text within widget. @@ -471,7 +471,7 @@ inline bool NWidgetCore::IsDisabled() const */ class NWidgetContainer : public NWidgetBase { public: - NWidgetContainer(WidgetType tp, WidgetID index = -1) : NWidgetBase(tp, index) {} + NWidgetContainer(WidgetType tp, WidgetID index = INVALID_WIDGET) : NWidgetBase(tp, index) {} void AdjustPaddingForZoom() override; void Add(std::unique_ptr &&wid); @@ -537,7 +537,7 @@ using NWidContainerFlags = EnumBitSet; /** Container with pre/inter/post child space. */ class NWidgetPIPContainer : public NWidgetContainer { public: - NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags = {}, WidgetID index = -1) : NWidgetContainer(tp, index), flags(flags) {} + NWidgetPIPContainer(WidgetType tp, NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetContainer(tp, index), flags(flags) {} void AdjustPaddingForZoom() override; void SetPIP(uint8_t pip_pre, uint8_t pip_inter, uint8_t pip_post); @@ -565,7 +565,7 @@ protected: */ class NWidgetHorizontal : public NWidgetPIPContainer { public: - NWidgetHorizontal(NWidContainerFlags flags = {}, WidgetID index = -1, WidgetType type = NWID_HORIZONTAL) : NWidgetPIPContainer(type, flags, index) {} + NWidgetHorizontal(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET, WidgetType type = NWID_HORIZONTAL) : NWidgetPIPContainer(type, flags, index) {} void SetupSmallestSize(Window *w) override; void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override; @@ -577,7 +577,7 @@ public: */ class NWidgetHorizontalLTR : public NWidgetHorizontal { public: - NWidgetHorizontalLTR(NWidContainerFlags flags = {}, WidgetID index = -1) : NWidgetHorizontal(flags, index, NWID_HORIZONTAL_LTR) {} + NWidgetHorizontalLTR(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetHorizontal(flags, index, NWID_HORIZONTAL_LTR) {} void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override; }; @@ -588,7 +588,7 @@ public: */ class NWidgetVertical : public NWidgetPIPContainer { public: - NWidgetVertical(NWidContainerFlags flags = {}, WidgetID index = -1) : NWidgetPIPContainer(NWID_VERTICAL, flags, index) {} + NWidgetVertical(NWidContainerFlags flags = {}, WidgetID index = INVALID_WIDGET) : NWidgetPIPContainer(NWID_VERTICAL, flags, index) {} void SetupSmallestSize(Window *w) override; void AssignSizePosition(SizingType sizing, int x, int y, uint given_width, uint given_height, bool rtl) override; @@ -1412,7 +1412,7 @@ constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags = AspectFlag::Res * Child widgets must have a index bigger than the parent index. * @ingroup NestedWidgetParts */ -constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = -1) +constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = INVALID_WIDGET) { return NWidgetPart{tp, NWidgetPartWidget{col, idx}}; } @@ -1423,7 +1423,7 @@ constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx = -1) * @param cont_flags Flags for the containers (#NWID_HORIZONTAL and #NWID_VERTICAL). * @ingroup NestedWidgetParts */ -constexpr NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = {}, WidgetID idx = -1) +constexpr NWidgetPart NWidget(WidgetType tp, NWidContainerFlags cont_flags = {}, WidgetID idx = INVALID_WIDGET) { return NWidgetPart{tp, NWidgetPartContainer{cont_flags, idx}}; } diff --git a/src/widgets/airport_widget.h b/src/widgets/airport_widget.h index 4e16f4596e..af2261b149 100644 --- a/src/widgets/airport_widget.h +++ b/src/widgets/airport_widget.h @@ -14,8 +14,6 @@ enum AirportToolbarWidgets : WidgetID { WID_AT_AIRPORT, ///< Build airport button. WID_AT_DEMOLISH, ///< Demolish button. - - INVALID_WID_AT = -1, }; /** Widgets of the #BuildAirportWindow class. */ diff --git a/src/widgets/dock_widget.h b/src/widgets/dock_widget.h index 0a1f480eb6..85cabe94d6 100644 --- a/src/widgets/dock_widget.h +++ b/src/widgets/dock_widget.h @@ -27,8 +27,6 @@ enum DockToolbarWidgets : WidgetID { WID_DT_BUOY, ///< Build buoy button. WID_DT_RIVER, ///< Build river button (in scenario editor). WID_DT_BUILD_AQUEDUCT, ///< Build aqueduct button. - - WID_DT_INVALID, ///< Used to initialize a variable. }; #endif /* WIDGETS_DOCK_WIDGET_H */ diff --git a/src/widgets/game_widget.h b/src/widgets/game_widget.h index 5b105d9934..4ad5973fa6 100644 --- a/src/widgets/game_widget.h +++ b/src/widgets/game_widget.h @@ -24,7 +24,7 @@ enum GSConfigWidgets : WidgetID { WID_GSC_CONTENT_DOWNLOAD = WID_GSC_TEXTFILE + TFT_CONTENT_END, ///< Download content button. WID_GSC_RESET, ///< Reset button. - WID_GSC_SETTING_DROPDOWN = -1, ///< Dynamically created dropdown for changing setting value. + WID_GSC_SETTING_DROPDOWN = INVALID_WIDGET, ///< Dynamically created dropdown for changing setting value. }; #endif /* WIDGETS_GS_WIDGET_H */ diff --git a/src/widgets/rail_widget.h b/src/widgets/rail_widget.h index f290d80162..02da916e72 100644 --- a/src/widgets/rail_widget.h +++ b/src/widgets/rail_widget.h @@ -28,8 +28,6 @@ enum RailToolbarWidgets : WidgetID { WID_RAT_BUILD_TUNNEL, ///< Build a tunnel. WID_RAT_REMOVE, ///< Bulldozer to remove rail. WID_RAT_CONVERT_RAIL, ///< Convert other rail to this type. - - INVALID_WID_RAT = -1, }; /** Widgets of the #BuildRailStationWindow class. */ diff --git a/src/widgets/road_widget.h b/src/widgets/road_widget.h index 679545728a..23de63ed53 100644 --- a/src/widgets/road_widget.h +++ b/src/widgets/road_widget.h @@ -27,8 +27,6 @@ enum RoadToolbarWidgets : WidgetID { WID_ROT_BUILD_TUNNEL, ///< Build tunnel. WID_ROT_REMOVE, ///< Remove road. WID_ROT_CONVERT_ROAD, ///< Convert road. - - INVALID_WID_ROT = -1, }; /** Widgets of the #BuildRoadDepotWindow class. */ diff --git a/src/widgets/script_widget.h b/src/widgets/script_widget.h index 7b9905dcc9..71fecc5bad 100644 --- a/src/widgets/script_widget.h +++ b/src/widgets/script_widget.h @@ -28,7 +28,7 @@ enum ScriptSettingsWidgets : WidgetID { WID_SCRS_SCROLLBAR, ///< Scrollbar to scroll through all settings. WID_SCRS_RESET, ///< Reset button. - WID_SCRS_SETTING_DROPDOWN = -1, ///< Dynamically created dropdown for changing setting value. + WID_SCRS_SETTING_DROPDOWN = INVALID_WIDGET, ///< Dynamically created dropdown for changing setting value. }; /** Widgets of the #ScriptDebugWindow class. */ diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 858f17f104..d7a3c069d8 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -85,7 +85,7 @@ enum GameOptionsWidgets : WidgetID { WID_GO_RESTRICT_DROPDOWN, ///< The drop down box to restrict the list of settings WID_GO_TYPE_DROPDOWN, ///< The drop down box to choose client/game/company/all settings - WID_GO_SETTING_DROPDOWN = -1, ///< Dynamically created dropdown for changing setting value. + WID_GO_SETTING_DROPDOWN = INVALID_WIDGET, ///< Dynamically created dropdown for changing setting value. }; /** Widgets of the #CustomCurrencyWindow class. */ diff --git a/src/widgets/terraform_widget.h b/src/widgets/terraform_widget.h index 6b5796f9b5..d4ce57eabd 100644 --- a/src/widgets/terraform_widget.h +++ b/src/widgets/terraform_widget.h @@ -22,8 +22,6 @@ enum TerraformToolbarWidgets : WidgetID { WID_TT_PLANT_TREES, ///< Plant trees button (note: opens separate window, no place-push-button). WID_TT_PLACE_SIGN, ///< Place sign button. WID_TT_PLACE_OBJECT, ///< Place object button. - - INVALID_WID_TT = -1, }; /** Widgets of the #ScenarioEditorLandscapeGenerationWindow class. */ @@ -44,8 +42,6 @@ enum EditorTerraformToolbarWidgets : WidgetID { WID_ETT_DECREASE_SIZE, ///< Downwards arrow button to decrease terraforming size. WID_ETT_NEW_SCENARIO, ///< Button for generating a new scenario. WID_ETT_RESET_LANDSCAPE, ///< Button for removing all company-owned property. - - INVALID_WID_ETT = -1, }; #endif /* WIDGETS_TERRAFORM_WIDGET_H */ diff --git a/src/window.cpp b/src/window.cpp index e40641f24e..419612e0bf 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1809,7 +1809,7 @@ void Window::InitNested(WindowNumber window_number) * Empty constructor, initialization has been moved to #InitNested() called from the constructor of the derived class. * @param desc The description of the window. */ -Window::Window(WindowDesc &desc) : window_desc(desc), scale(_gui_scale), mouse_capture_widget(-1) +Window::Window(WindowDesc &desc) : window_desc(desc), scale(_gui_scale), mouse_capture_widget(INVALID_WIDGET) { this->z_position = _z_windows.insert(_z_windows.end(), this); } @@ -1891,7 +1891,7 @@ static void DecreaseWindowCounters() NWidgetScrollbar *sb = static_cast(nwid); if (sb->disp_flags.Any({NWidgetDisplayFlag::ScrollbarUp, NWidgetDisplayFlag::ScrollbarDown})) { sb->disp_flags.Reset({NWidgetDisplayFlag::ScrollbarUp, NWidgetDisplayFlag::ScrollbarDown}); - w->mouse_capture_widget = -1; + w->mouse_capture_widget = INVALID_WIDGET; sb->SetDirty(w); } } @@ -2390,7 +2390,7 @@ static EventState HandleActiveWidget() /* Abort if no button is clicked any more. */ if (!_left_button_down) { w->SetWidgetDirty(w->mouse_capture_widget); - w->mouse_capture_widget = -1; + w->mouse_capture_widget = INVALID_WIDGET; return ES_HANDLED; } diff --git a/src/window_gui.h b/src/window_gui.h index edfbf94da8..c6f1909ef2 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -323,7 +323,7 @@ public: NWidgetStacked *shade_select = nullptr; ///< Selection widget (#NWID_SELECTION) to use for shading the window. If \c nullptr, window cannot shade. Dimension unshaded_size{}; ///< Last known unshaded size (only valid while shaded). - WidgetID mouse_capture_widget = -1; ///< ID of current mouse capture widget (e.g. dragged scrollbar). -1 if no widget has mouse capture. + WidgetID mouse_capture_widget = INVALID_WIDGET; ///< ID of current mouse capture widget (e.g. dragged scrollbar). \c INVALID_WIDGET if no widget has mouse capture. Window *parent = nullptr; ///< Parent window. WindowList::iterator z_position{}; diff --git a/src/window_type.h b/src/window_type.h index 585ad7a83f..880738be1d 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -19,6 +19,9 @@ */ using WidgetID = int; +/** An invalid widget index. */ +static constexpr WidgetID INVALID_WIDGET = -1; + /** %Window numbers. */ enum WindowNumberEnum : uint8_t { WN_GAME_OPTIONS_AI = 0, ///< AI settings. From 853dc245a03cc289a3b899d585ac47d75a9ee67f Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 22 Sep 2025 04:38:24 +0000 Subject: [PATCH 076/280] Update: Translations from eints chinese (simplified): 4 changes by WenSimEHRP catalan: 5 changes by J0anJosep --- src/lang/catalan.txt | 6 +++++- src/lang/simplified_chinese.txt | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index c715650802..11352fd53f 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3349,6 +3349,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtre: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Sobreescriu fitxer STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Esteu segur que voleu sobreescriure el fitxer? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Esborra el fitxer +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Esteu segur que voleu esborrar aquest fitxer? STR_SAVELOAD_DIRECTORY :{STRING} (carpeta) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (carpeta superior) @@ -4126,7 +4128,7 @@ STR_GROUP_LIVERY_TOOLTIP :{BLACK}Canvia l STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clica per protegir aquest grup de l'autosubstitució global. Ctrl + clic també protegeix els subgrups. STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Esborrar grup -STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Estàs segur que vols esborrar aquest grup i tots els seus subgrups? +STR_GROUP_DELETE_QUERY_TEXT :{WHITE}Esteu segur que voleu esborrar aquest grup i tots els seus subgrups? STR_GROUP_ADD_SHARED_VEHICLE :Afegeix vehicles compartits STR_GROUP_REMOVE_ALL_VEHICLES :Treu tots els vehicles @@ -4184,6 +4186,7 @@ STR_PURCHASE_INFO_ALL_BUT :Qualsevol excep STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforç de tracció màxim: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Abast: {GOLD}{COMMA} cel·les STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipus d'aeronau: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipus de rail: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Tots els tipus de càrrega @@ -4367,6 +4370,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Cost d'utilitza STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Cost d'utilització: {CURRENCY_LONG}/període STR_ENGINE_PREVIEW_CAPACITY :Capacitat: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacitat: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Tipus de rail: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substitueix {STRING} - {STRING} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 58a02c6686..136c41ea47 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -3348,6 +3348,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF STR_SAVELOAD_FILTER_TITLE :{BLACK}搜索: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}覆盖文件 STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}确定覆盖已有文件吗? +STR_SAVELOAD_DELETE_TITLE :{WHITE}删除文件 +STR_SAVELOAD_DELETE_WARNING :{YELLOW}确定删除文件吗? STR_SAVELOAD_DIRECTORY :{STRING}(目录) STR_SAVELOAD_PARENT_DIRECTORY :{STRING}(上级目录) @@ -4183,6 +4185,7 @@ STR_PURCHASE_INFO_ALL_BUT :所有货物( STR_PURCHASE_INFO_MAX_TE :{BLACK}最大牵引力:{GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}航行距离:{GOLD}{COMMA} 格 STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飞机类型:{GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}轨道类型:{GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :所有货物类型 @@ -4366,6 +4369,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :运行费用: STR_ENGINE_PREVIEW_RUNCOST_PERIOD :运行费用:{CURRENCY_LONG}/周期 STR_ENGINE_PREVIEW_CAPACITY :容量:{CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :容量:{CARGO_LONG}、{CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :轨道类型:{STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}更新 {STRING} - {STRING} From 43e65d04e4060343cd081f3384158883ff39b8c5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 22 Sep 2025 07:18:08 +0100 Subject: [PATCH 077/280] Codefix: Incorrect naming and location of widget names for build docks window. (#14650) --- src/dock_gui.cpp | 33 ++++++++++++--------------------- src/widgets/dock_widget.h | 9 +++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index e79a501c68..e247c01396 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -412,21 +412,12 @@ Window *ShowBuildDocksScenToolbar() return AllocateWindowDescFront(_build_docks_scen_toolbar_desc, TRANSPORT_WATER); } -/** Widget numbers of the build-dock GUI. */ -enum BuildDockStationWidgets { - BDSW_BACKGROUND, ///< Background panel. - BDSW_LT_OFF, ///< 'Off' button of coverage high light. - BDSW_LT_ON, ///< 'On' button of coverage high light. - BDSW_INFO, ///< 'Coverage highlight' label. - BDSW_ACCEPTANCE, ///< Acceptance info. -}; - struct BuildDocksStationWindow : public PickerWindowBase { public: BuildDocksStationWindow(WindowDesc &desc, Window *parent) : PickerWindowBase(desc, parent) { this->InitNested(TRANSPORT_WATER); - this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF); + this->LowerWidget(_settings_client.gui.station_show_coverage + WID_BDSW_LT_OFF); } void Close([[maybe_unused]] int data = 0) override @@ -448,7 +439,7 @@ public: } /* strings such as 'Size' and 'Coverage Area' */ - Rect r = this->GetWidget(BDSW_ACCEPTANCE)->GetCurrentRect(); + Rect r = this->GetWidget(WID_BDSW_ACCEPTANCE)->GetCurrentRect(); const int bottom = r.bottom; r.bottom = INT_MAX; // Allow overflow as we want to know the required height. r.top = DrawStationCoverageAreaText(r, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal; @@ -464,11 +455,11 @@ public: void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { switch (widget) { - case BDSW_LT_OFF: - case BDSW_LT_ON: - this->RaiseWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF); - _settings_client.gui.station_show_coverage = (widget != BDSW_LT_OFF); - this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF); + case WID_BDSW_LT_OFF: + case WID_BDSW_LT_ON: + this->RaiseWidget(_settings_client.gui.station_show_coverage + WID_BDSW_LT_OFF); + _settings_client.gui.station_show_coverage = (widget != WID_BDSW_LT_OFF); + this->LowerWidget(_settings_client.gui.station_show_coverage + WID_BDSW_LT_OFF); SndClickBeep(); this->SetDirty(); SetViewportCatchmentStation(nullptr, true); @@ -492,16 +483,16 @@ static constexpr NWidgetPart _nested_build_dock_station_widgets[] = { NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), - NWidget(WWT_PANEL, COLOUR_DARK_GREEN, BDSW_BACKGROUND), + NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_BDSW_BACKGROUND), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), SetPadding(WidgetDimensions::unscaled.picker), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0), - NWidget(WWT_LABEL, INVALID_COLOUR, BDSW_INFO), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0), + NWidget(WWT_LABEL, INVALID_COLOUR, WID_BDSW_INFO), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0), NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), SetPIP(14, 0, 14), - NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), - NWidget(WWT_TEXTBTN, COLOUR_GREY, BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDSW_LT_OFF), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BDSW_LT_ON), SetMinimalSize(60, 12), SetFill(1, 0), SetStringTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP), EndContainer(), EndContainer(), - NWidget(WWT_EMPTY, INVALID_COLOUR, BDSW_ACCEPTANCE), SetResize(0, 1), SetMinimalTextLines(2, WidgetDimensions::unscaled.vsep_normal), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BDSW_ACCEPTANCE), SetResize(0, 1), SetMinimalTextLines(2, WidgetDimensions::unscaled.vsep_normal), EndContainer(), EndContainer(), }; diff --git a/src/widgets/dock_widget.h b/src/widgets/dock_widget.h index 85cabe94d6..2877b1ac02 100644 --- a/src/widgets/dock_widget.h +++ b/src/widgets/dock_widget.h @@ -17,6 +17,15 @@ enum BuildDockDepotWidgets : WidgetID { WID_BDD_Y, ///< Y-direction button. }; +/** Widgets of the #BuildDocksStationWindow window. */ +enum BuildDocksStationWidgets : WidgetID { + WID_BDSW_BACKGROUND, ///< Background panel. + WID_BDSW_LT_OFF, ///< 'Off' button of coverage high light. + WID_BDSW_LT_ON, ///< 'On' button of coverage high light. + WID_BDSW_INFO, ///< 'Coverage highlight' label. + WID_BDSW_ACCEPTANCE, ///< Acceptance info. +}; + /** Widgets of the #BuildDocksToolbarWindow class. */ enum DockToolbarWidgets : WidgetID { WID_DT_CANAL, ///< Build canal button. From 2b164111a9d376614db3dff39608c7a74814505e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 22 Sep 2025 20:04:55 +0100 Subject: [PATCH 078/280] Codechange: Use EnumBitSet for TownFlags. (#14651) --- src/newgrf_town.cpp | 2 +- src/saveload/afterload.cpp | 2 +- src/town.h | 26 +++++++++++--------------- src/town_cmd.cpp | 34 +++++++++++++++++----------------- src/town_gui.cpp | 2 +- 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index eb581d9328..370769cde6 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -63,7 +63,7 @@ static uint16_t TownHistoryHelper(const Town *t, CargoLabel label, uint period, 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 / Ticks::TOWN_GROWTH_TICKS; - case 0x92: return this->t->flags; // In original game, 0x92 and 0x93 are really one word. Since flags is a byte, this is to adjust + case 0x92: return this->t->flags.base(); // In original game, 0x92 and 0x93 are one word. case 0x93: return 0; case 0x94: return ClampTo(this->t->cache.squared_town_zone_radius[to_underlying(HouseZone::TownEdge)]); case 0x95: return GB(ClampTo(this->t->cache.squared_town_zone_radius[to_underlying(HouseZone::TownEdge)]), 8, 8); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 908249e533..4a901a3b39 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -3120,7 +3120,7 @@ bool AfterLoadGame() /* Convert towns growth_rate and grow_counter to ticks */ for (Town *t : Town::Iterate()) { /* 0x8000 = TOWN_GROWTH_RATE_CUSTOM previously */ - if (t->growth_rate & 0x8000) SetBit(t->flags, TOWN_CUSTOM_GROWTH); + if (t->growth_rate & 0x8000) t->flags.Set(TownFlag::CustomGrowth); if (t->growth_rate != TOWN_GROWTH_RATE_NONE) { t->growth_rate = TownTicksToGameTicks(t->growth_rate & ~0x8000); } diff --git a/src/town.h b/src/town.h index a8786767c9..38ba6c1798 100644 --- a/src/town.h +++ b/src/town.h @@ -37,6 +37,16 @@ static const uint16_t MAX_TOWN_GROWTH_TICKS = 930; ///< Max amount of original t typedef Pool TownPool; extern TownPool _town_pool; +/** Flags controlling various town behaviours. */ +enum class TownFlag : uint8_t { + IsGrowing = 0, ///< Conditions for town growth are met. Grow according to Town::growth_rate. + HasChurch = 1, ///< There can be only one church by town. + HasStadium = 2, ///< There can be only one stadium by town. + CustomGrowth = 3, ///< Growth rate is controlled by GS. +}; + +using TownFlags = EnumBitSet; + /** Data structure with cached data of towns. */ struct TownCache { uint32_t num_houses = 0; ///< Amount of houses @@ -62,7 +72,7 @@ struct Town : TownPool::PoolItem<&_town_pool> { std::string name{}; ///< Custom town name. If empty, the town was not renamed and uses the generated name. mutable std::string cached_name{}; ///< NOSAVE: Cache of the resolved name of the town, if not using a custom town name - uint8_t flags = 0; ///< See #TownFlags. + TownFlags flags{}; ///< See #TownFlags. uint16_t noise_reached = 0; ///< level of noise that all the airports are generating @@ -224,20 +234,6 @@ enum TownDirectoryInvalidateWindowData { TDIWD_FORCE_RESORT, }; -/** - * This enum is used in conjunction with town->flags. - * IT simply states what bit is used for. - * It is pretty unrealistic (IMHO) to only have one church/stadium - * per town, NO MATTER the population of it. - * And there are 5 more bits available on flags... - */ -enum TownFlags { - TOWN_IS_GROWING = 0, ///< Conditions for town growth are met. Grow according to Town::growth_rate. - TOWN_HAS_CHURCH = 1, ///< There can be only one church by town. - TOWN_HAS_STADIUM = 2, ///< There can be only one stadium by town. - TOWN_CUSTOM_GROWTH = 3, ///< Growth rate is controlled by GS. -}; - CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckType type); diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index bcb03da78e..abf59d90bc 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -666,7 +666,7 @@ static void TileLoop_Town(TileIndex tile) Backup cur_company(_current_company, OWNER_TOWN); if (hs->building_flags.Any(BUILDING_HAS_1_TILE) && - HasBit(t->flags, TOWN_IS_GROWING) && + t->flags.Test(TownFlag::IsGrowing) && CanDeleteHouse(tile) && GetHouseAge(tile) >= hs->minimum_life && --t->time_until_rebuild == 0) { @@ -917,7 +917,7 @@ static bool GrowTown(Town *t, TownExpandModes modes); */ static void TownTickHandler(Town *t) { - if (HasBit(t->flags, TOWN_IS_GROWING)) { + if (t->flags.Test(TownFlag::IsGrowing)) { TownExpandModes modes{TownExpandMode::Buildings}; if (_settings_game.economy.allow_town_roads) modes.Set(TownExpandMode::Roads); int i = (int)t->grow_counter - 1; @@ -2046,7 +2046,7 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32_t townnameparts, TownSi t->cache.num_houses = 0; t->time_until_rebuild = 10; UpdateTownRadius(t); - t->flags = 0; + t->flags.Reset(); t->cache.population = 0; InitializeBuildingCounts(t); /* Spread growth across ticks so even if there are many @@ -2867,15 +2867,15 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile, TownExpandModes modes) if (TimerGameCalendar::year < hs->min_year || TimerGameCalendar::year > hs->max_year) continue; /* Special houses that there can be only one of. */ - uint oneof = 0; + TownFlags oneof{}; if (hs->building_flags.Test(BuildingFlag::IsChurch)) { - SetBit(oneof, TOWN_HAS_CHURCH); + oneof.Set(TownFlag::HasChurch); } else if (hs->building_flags.Test(BuildingFlag::IsStadium)) { - SetBit(oneof, TOWN_HAS_STADIUM); + oneof.Set(TownFlag::HasStadium); } - if (t->flags & oneof) continue; + if (t->flags.Any(oneof)) continue; /* Make sure there is no slope? */ bool noslope = hs->building_flags.Test(BuildingFlag::NotSloped); @@ -2899,7 +2899,7 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile, TownExpandModes modes) } /* Special houses that there can be only one of. */ - t->flags |= oneof; + t->flags.Set(oneof); BuildTownHouse(t, tile, hs, house, random_bits, false, hs->extra_flags.Test(HouseExtraFlag::BuildingIsProtected)); @@ -3034,9 +3034,9 @@ void ClearTownHouse(Town *t, TileIndex tile) /* Clear flags for houses that only may exist once/town. */ if (hs->building_flags.Test(BuildingFlag::IsChurch)) { - ClrBit(t->flags, TOWN_HAS_CHURCH); + t->flags.Reset(TownFlag::HasChurch); } else if (hs->building_flags.Test(BuildingFlag::IsStadium)) { - ClrBit(t->flags, TOWN_HAS_STADIUM); + t->flags.Reset(TownFlag::HasStadium); } /* Do the actual clearing of tiles */ @@ -3168,7 +3168,7 @@ CommandCost CmdTownGrowthRate(DoCommandFlags flags, TownID town_id, uint16_t gro if (flags.Test(DoCommandFlag::Execute)) { if (growth_rate == 0) { /* Just clear the flag, UpdateTownGrowth will determine a proper growth rate */ - ClrBit(t->flags, TOWN_CUSTOM_GROWTH); + t->flags.Reset(TownFlag::CustomGrowth); } else { uint old_rate = t->growth_rate; if (t->grow_counter >= old_rate) { @@ -3179,7 +3179,7 @@ CommandCost CmdTownGrowthRate(DoCommandFlags flags, TownID town_id, uint16_t gro t->grow_counter = t->grow_counter * growth_rate / old_rate; } t->growth_rate = growth_rate; - SetBit(t->flags, TOWN_CUSTOM_GROWTH); + t->flags.Set(TownFlag::CustomGrowth); } UpdateTownGrowth(t); InvalidateWindowData(WC_TOWN_VIEW, town_id); @@ -3829,7 +3829,7 @@ static uint GetNormalGrowthRate(Town *t) */ static void UpdateTownGrowthRate(Town *t) { - if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) return; + if (t->flags.Test(TownFlag::CustomGrowth)) return; uint old_rate = t->growth_rate; t->growth_rate = GetNormalGrowthRate(t); UpdateTownGrowCounter(t, old_rate); @@ -3844,7 +3844,7 @@ static void UpdateTownGrowth(Town *t) { UpdateTownGrowthRate(t); - ClrBit(t->flags, TOWN_IS_GROWING); + t->flags.Reset(TownFlag::IsGrowing); SetWindowDirty(WC_TOWN_VIEW, t->index); if (_settings_game.economy.town_growth_rate == 0 && t->fund_buildings_months == 0) return; @@ -3866,15 +3866,15 @@ static void UpdateTownGrowth(Town *t) } } - if (HasBit(t->flags, TOWN_CUSTOM_GROWTH)) { - if (t->growth_rate != TOWN_GROWTH_RATE_NONE) SetBit(t->flags, TOWN_IS_GROWING); + if (t->flags.Test(TownFlag::CustomGrowth)) { + if (t->growth_rate != TOWN_GROWTH_RATE_NONE) t->flags.Set(TownFlag::IsGrowing); SetWindowDirty(WC_TOWN_VIEW, t->index); return; } if (t->fund_buildings_months == 0 && CountActiveStations(t) == 0 && !Chance16(1, 12)) return; - SetBit(t->flags, TOWN_IS_GROWING); + t->flags.Set(TownFlag::IsGrowing); SetWindowDirty(WC_TOWN_VIEW, t->index); } diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 8456176344..2659adc38a 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -453,7 +453,7 @@ public: tr.top += GetCharacterHeight(FS_NORMAL); } - if (HasBit(this->town->flags, TOWN_IS_GROWING)) { + if (this->town->flags.Test(TownFlag::IsGrowing)) { DrawString(tr, GetString(this->town->fund_buildings_months == 0 ? STR_TOWN_VIEW_TOWN_GROWS_EVERY : STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED, RoundDivSU(this->town->growth_rate + 1, Ticks::DAY_TICKS))); tr.top += GetCharacterHeight(FS_NORMAL); } else { From 484ed1008af9f1a8907ed8e34957eee298c113f7 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 23 Sep 2025 22:00:34 +0100 Subject: [PATCH 079/280] Codechange: Make TownRatingCheckType an enum class. (#14652) --- src/road_cmd.cpp | 4 ++-- src/town.h | 8 ++++---- src/town_cmd.cpp | 6 +++--- src/tunnelbridge_cmd.cpp | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index f1aff80870..eea76ef76a 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -282,7 +282,7 @@ CommandCost CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, R /* check if you're allowed to remove the street owned by a town * removal allowance depends on difficulty setting */ - CommandCost ret = CheckforTownRating(flags, t, ROAD_REMOVE); + CommandCost ret = CheckforTownRating(flags, t, TownRatingCheckType::RoadRemove); if (ret.Failed()) return ret; /* Get a bitmask of which neighbouring roads has a tile */ @@ -2492,7 +2492,7 @@ CommandCost CmdConvertRoad(DoCommandFlags flags, TileIndex tile, TileIndex area_ * acceptance of destructive actions. */ if (owner == OWNER_TOWN) { Town *t = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority); - CommandCost ret = CheckforTownRating({}, t, tt == MP_TUNNELBRIDGE ? TUNNELBRIDGE_REMOVE : ROAD_REMOVE); + CommandCost ret = CheckforTownRating({}, t, tt == MP_TUNNELBRIDGE ? TownRatingCheckType::TunnelBridgeRemove : TownRatingCheckType::RoadRemove); if (ret.Failed()) { error = std::move(ret); continue; diff --git a/src/town.h b/src/town.h index 38ba6c1798..5151e3c87c 100644 --- a/src/town.h +++ b/src/town.h @@ -221,10 +221,10 @@ enum TownCouncilAttitudes { * Action types that a company must ask permission for to a town authority. * @see CheckforTownRating */ -enum TownRatingCheckType { - ROAD_REMOVE = 0, ///< Removal of a road owned by the town. - TUNNELBRIDGE_REMOVE = 1, ///< Removal of a tunnel or bridge owned by the town. - TOWN_RATING_CHECK_TYPE_COUNT, ///< Number of town checking action types. +enum class TownRatingCheckType : uint8_t { + RoadRemove, ///< Removal of a road owned by the town. + TunnelBridgeRemove, ///< Removal of a tunnel or bridge owned by the town. + End, }; /** Special values for town list window for the data parameter of #InvalidateWindowData. */ diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index abf59d90bc..dea412c698 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -4050,8 +4050,8 @@ CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckTyp } /* minimum rating needed to be allowed to remove stuff */ - static const int needed_rating[][TOWN_RATING_CHECK_TYPE_COUNT] = { - /* ROAD_REMOVE, TUNNELBRIDGE_REMOVE */ + static const int needed_rating[][to_underlying(TownRatingCheckType::End)] = { + /* RoadRemove, TunnelBridgeRemove */ { RATING_ROAD_NEEDED_LENIENT, RATING_TUNNEL_BRIDGE_NEEDED_LENIENT}, // Lenient { RATING_ROAD_NEEDED_NEUTRAL, RATING_TUNNEL_BRIDGE_NEEDED_NEUTRAL}, // Neutral { RATING_ROAD_NEEDED_HOSTILE, RATING_TUNNEL_BRIDGE_NEEDED_HOSTILE}, // Hostile @@ -4062,7 +4062,7 @@ CommandCost CheckforTownRating(DoCommandFlags flags, Town *t, TownRatingCheckTyp * owned by a town no removal if rating is lower than ... depends now on * difficulty setting. Minimum town rating selected by difficulty level */ - int needed = needed_rating[_settings_game.difficulty.town_council_tolerance][type]; + int needed = needed_rating[_settings_game.difficulty.town_council_tolerance][to_underlying(type)]; if (GetRating(t) < needed) { return CommandCostWithParam(STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS, t->index); diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 2d03900ea1..6180c1ffb5 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -866,7 +866,7 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlags flags) /* Check if you are allowed to remove the tunnel owned by a town * Removal depends on difficulty settings */ - ret = CheckforTownRating(flags, t, TUNNELBRIDGE_REMOVE); + ret = CheckforTownRating(flags, t, TownRatingCheckType::TunnelBridgeRemove); if (ret.Failed()) return ret; } @@ -947,7 +947,7 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlags flags) /* Check if you are allowed to remove the bridge owned by a town * Removal depends on difficulty settings */ - ret = CheckforTownRating(flags, t, TUNNELBRIDGE_REMOVE); + ret = CheckforTownRating(flags, t, TownRatingCheckType::TunnelBridgeRemove); if (ret.Failed()) return ret; } From 6ad7c1c40adf3e0c6a6efb55dabc7030958e4b2f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 23 Sep 2025 23:15:21 +0100 Subject: [PATCH 080/280] Fix d85f4b3ebf: Incorrect row height in network server list. (#14653) --- src/network/network_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 0aefc12bd9..61975b476a 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -476,12 +476,12 @@ public: { switch (widget) { case WID_NG_MATRIX: - fill.height = resize.height = std::max(GetSpriteSize(SPR_BLOT).height, (uint)GetCharacterHeight(FS_NORMAL)) + padding.height; + fill.height = resize.height = std::max(this->blot.height, GetCharacterHeight(FS_NORMAL)) + padding.height; size.height = 12 * resize.height; break; case WID_NG_LASTJOINED: - size.height = std::max(GetSpriteSize(SPR_BLOT).height, (uint)GetCharacterHeight(FS_NORMAL)) + WidgetDimensions::scaled.matrix.Vertical(); + size.height = std::max(this->blot.height, GetCharacterHeight(FS_NORMAL)) + WidgetDimensions::scaled.matrix.Vertical(); break; case WID_NG_LASTJOINED_SPACER: From bec4e71d53fe6bd638aeecfd97f0732dc6287270 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 24 Sep 2025 04:37:55 +0000 Subject: [PATCH 081/280] Update: Translations from eints hungarian: 5 changes by vargaviktor --- src/lang/hungarian.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 69da512597..5d137f1e27 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3412,6 +3412,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Szűrő: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Fájl felülírása STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Biztos vagy benne, hogy felülírod a létező fájlt? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Fájl törlése +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Biztosan törölni akarod ezt a fájlt? STR_SAVELOAD_DIRECTORY :{STRING} (Könyvtár) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Szülőkönyvtár) @@ -4247,6 +4249,7 @@ STR_PURCHASE_INFO_ALL_BUT :Mindenre, kivé STR_PURCHASE_INFO_MAX_TE :{BLACK}Maximális vonóerő: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Hatótávolság: {GOLD}{COMMA} mező STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Típus: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Sín típusok: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Minden rakománytípus @@ -4430,6 +4433,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Üzemeletetés: STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Üzemeltetés: {CURRENCY_LONG}/időszak STR_ENGINE_PREVIEW_CAPACITY :Kapacitás: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapacitás: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Sín típusok: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} lecserélése - {STRING} @@ -5332,6 +5336,7 @@ STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A híd t STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A híd túl alacsony a bójához STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A híd túl alacsony a vasúti ellenőrzőponthoz STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}BA híd túl alacsony az útponthoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A híd túl alacsony a zároláshoz # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nem áshatsz ide alagutat... From ecb761fc6934c6dc5c521ef8b5461dde40b62674 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Wed, 24 Sep 2025 21:34:01 +0200 Subject: [PATCH 082/280] Codechange: Simplified structure of yapf_ship_regions. (#14640) --- src/pathfinder/yapf/yapf_ship_regions.cpp | 217 ++++++++-------------- 1 file changed, 80 insertions(+), 137 deletions(-) diff --git a/src/pathfinder/yapf/yapf_ship_regions.cpp b/src/pathfinder/yapf/yapf_ship_regions.cpp index 202936a7bd..089fde6073 100644 --- a/src/pathfinder/yapf/yapf_ship_regions.cpp +++ b/src/pathfinder/yapf/yapf_ship_regions.cpp @@ -16,12 +16,15 @@ #include "../../safeguards.h" -constexpr int DIRECT_NEIGHBOUR_COST = 100; -constexpr int NODES_PER_REGION = 4; -constexpr int MAX_NUMBER_OF_NODES = 65536; +static constexpr int DIRECT_NEIGHBOUR_COST = 100; +static constexpr int NODES_PER_REGION = 4; +static constexpr int MAX_NUMBER_OF_NODES = 65536; + +static constexpr int NODE_LIST_HASH_BITS_OPEN = 12; +static constexpr int NODE_LIST_HASH_BITS_CLOSED = 12; /** Yapf Node Key that represents a single patch of interconnected water within a water region. */ -struct CYapfRegionPatchNodeKey { +struct WaterRegionPatchKey { WaterRegionPatchDesc water_region_patch; inline void Set(const WaterRegionPatchDesc &water_region_patch) @@ -30,19 +33,18 @@ struct CYapfRegionPatchNodeKey { } inline int CalcHash() const { return CalculateWaterRegionPatchHash(this->water_region_patch); } - inline bool operator==(const CYapfRegionPatchNodeKey &other) const { return this->CalcHash() == other.CalcHash(); } + inline bool operator==(const WaterRegionPatchKey &other) const { return this->CalcHash() == other.CalcHash(); } }; -inline uint ManhattanDistance(const CYapfRegionPatchNodeKey &a, const CYapfRegionPatchNodeKey &b) +inline uint ManhattanDistance(const WaterRegionPatchKey &a, const WaterRegionPatchKey &b) { return (std::abs(a.water_region_patch.x - b.water_region_patch.x) + std::abs(a.water_region_patch.y - b.water_region_patch.y)) * DIRECT_NEIGHBOUR_COST; } /** Yapf Node for water regions. */ -template -struct CYapfRegionNodeT : CYapfNodeT> { - typedef Tkey_ Key; - typedef CYapfRegionNodeT Node; +struct WaterRegionNode : CYapfNodeT { + using Key = WaterRegionPatchKey; + using Node = WaterRegionNode; inline void Set(Node *parent, const WaterRegionPatchDesc &water_region_patch) { @@ -71,21 +73,43 @@ struct CYapfRegionNodeT : CYapfNodeT> { } }; -/** YAPF origin for water regions. */ -template -class CYapfOriginRegionT { -public: - typedef typename Types::Tpf Tpf; ///< The pathfinder class (derived from THIS class). - typedef typename Types::NodeList::Item Node; ///< This will be our node type. - typedef typename Node::Key Key; ///< Key to hash tables. +using WaterRegionNodeList = NodeList; -protected: - inline Tpf &Yapf() { return *static_cast(this); } +/* We don't need a follower but YAPF requires one. */ +struct DummyFollower : public CFollowTrackWater {}; +class YapfShipRegions; + +/* Types struct required for YAPF internals. */ +struct WaterRegionTypes { + using Tpf = YapfShipRegions; + using TrackFollower = DummyFollower; + using NodeList = WaterRegionNodeList; + using VehicleType = Ship; +}; + +/** Water region based YAPF implementation for ships. */ +class YapfShipRegions + : public CYapfBaseT + , public CYapfSegmentCostCacheNoneT +{ private: - std::vector origin_keys; + using Node = typename WaterRegionTypes::NodeList::Item; + + std::vector origin_keys; + WaterRegionPatchKey dest; + + inline YapfShipRegions &Yapf() + { + return *static_cast(this); + } public: + explicit YapfShipRegions(int max_nodes) + { + this->max_search_nodes = max_nodes; + } + void AddOrigin(const WaterRegionPatchDesc &water_region_patch) { if (water_region_patch.label == INVALID_WATER_REGION_PATCH) return; @@ -94,45 +118,52 @@ public: bool HasOrigin(const WaterRegionPatchDesc &water_region_patch) { - return std::ranges::find(this->origin_keys, CYapfRegionPatchNodeKey{ water_region_patch }) != this->origin_keys.end(); + return std::ranges::find(this->origin_keys, WaterRegionPatchKey{ water_region_patch }) != this->origin_keys.end(); } - void PfSetStartupNodes() - { - for (const CYapfRegionPatchNodeKey &origin_key : this->origin_keys) { - Node &node = Yapf().CreateNewNode(); - node.Set(nullptr, origin_key); - Yapf().AddStartupNode(node); - } - } -}; - -/** YAPF destination provider for water regions. */ -template -class CYapfDestinationRegionT { -public: - typedef typename Types::Tpf Tpf; ///< The pathfinder class (derived from THIS class). - typedef typename Types::NodeList::Item Node; ///< This will be our node type. - typedef typename Node::Key Key; ///< Key to hash tables. - -protected: - Key dest; - -public: void SetDestination(const WaterRegionPatchDesc &water_region_patch) { this->dest.Set(water_region_patch); } -protected: - Tpf &Yapf() { return *static_cast(this); } + void PfSetStartupNodes() + { + for (const WaterRegionPatchKey &origin_key : this->origin_keys) { + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, origin_key); + Yapf().AddStartupNode(node); + } + } + + inline void PfFollowNode(Node &old_node) + { + VisitWaterRegionPatchCallback visit_func = [&](const WaterRegionPatchDesc &water_region_patch) { + Node &node = Yapf().CreateNewNode(); + node.Set(&old_node, water_region_patch); + Yapf().AddNewNode(node, TrackFollower{}); + }; + VisitWaterRegionPatchNeighbours(old_node.key.water_region_patch, visit_func); + } -public: inline bool PfDetectDestination(Node &n) const { return n.key == this->dest; } + inline bool PfCalcCost(Node &n, const TrackFollower *) + { + n.cost = n.parent->cost + ManhattanDistance(n.key, n.parent->key); + + /* Incentivise zigzagging by adding a slight penalty when the search continues in the same direction. */ + Node *grandparent = n.parent->parent; + if (grandparent != nullptr) { + const DiagDirDiff dir_diff = DiagDirDifference(n.parent->GetDiagDirFromParent(), n.GetDiagDirFromParent()); + if (dir_diff != DIAGDIRDIFF_90LEFT && dir_diff != DIAGDIRDIFF_90RIGHT) n.cost += 1; + } + + return true; + } + inline bool PfCalcEstimate(Node &n) { if (this->PfDetectDestination(n)) { @@ -144,31 +175,6 @@ public: return true; } -}; - -/** YAPF node following for water region pathfinding. */ -template -class CYapfFollowRegionT { -public: - typedef typename Types::Tpf Tpf; ///< The pathfinder class (derived from THIS class). - typedef typename Types::TrackFollower TrackFollower; - typedef typename Types::NodeList::Item Node; ///< This will be our node type. - typedef typename Node::Key Key; ///< Key to hash tables. - -protected: - inline Tpf &Yapf() { return *static_cast(this); } - -public: - inline void PfFollowNode(Node &old_node) - { - VisitWaterRegionPatchCallback visit_func = [&](const WaterRegionPatchDesc &water_region_patch) - { - Node &node = Yapf().CreateNewNode(); - node.Set(&old_node, water_region_patch); - Yapf().AddNewNode(node, TrackFollower{}); - }; - VisitWaterRegionPatchNeighbours(old_node.key.water_region_patch, visit_func); - } inline char TransportTypeChar() const { return '^'; } @@ -178,7 +184,8 @@ public: /* We reserve 4 nodes (patches) per water region. The vast majority of water regions have 1 or 2 regions so this should be a pretty * safe limit. We cap the limit at 65536 which is at a region size of 16x16 is equivalent to one node per region for a 4096x4096 map. */ - Tpf pf(std::min(static_cast(Map::Size() * NODES_PER_REGION) / WATER_REGION_NUMBER_OF_TILES, MAX_NUMBER_OF_NODES)); + const int node_limit = std::min(static_cast(Map::Size() * NODES_PER_REGION) / WATER_REGION_NUMBER_OF_TILES, MAX_NUMBER_OF_NODES); + YapfShipRegions pf(node_limit); pf.SetDestination(start_water_region_patch); if (v->current_order.IsType(OT_GOTO_STATION)) { @@ -215,70 +222,6 @@ public: } }; -/** Cost Provider of YAPF for water regions. */ -template -class CYapfCostRegionT { -public: - typedef typename Types::Tpf Tpf; ///< The pathfinder class (derived from THIS class). - typedef typename Types::TrackFollower TrackFollower; - typedef typename Types::NodeList::Item Node; ///< This will be our node type. - typedef typename Node::Key Key; ///< Key to hash tables. - -protected: - /** To access inherited path finder. */ - Tpf &Yapf() { return *static_cast(this); } - -public: - /** - * Called by YAPF to calculate the cost from the origin to the given node. - * Calculates only the cost of given node, adds it to the parent node cost - * and stores the result into Node::cost member. - */ - inline bool PfCalcCost(Node &n, const TrackFollower *) - { - n.cost = n.parent->cost + ManhattanDistance(n.key, n.parent->key); - - /* Incentivise zigzagging by adding a slight penalty when the search continues in the same direction. */ - Node *grandparent = n.parent->parent; - if (grandparent != nullptr) { - const DiagDirDiff dir_diff = DiagDirDifference(n.parent->GetDiagDirFromParent(), n.GetDiagDirFromParent()); - if (dir_diff != DIAGDIRDIFF_90LEFT && dir_diff != DIAGDIRDIFF_90RIGHT) n.cost += 1; - } - - return true; - } -}; - -/* We don't need a follower but YAPF requires one. */ -struct DummyFollower : public CFollowTrackWater {}; - -/** - * Config struct of YAPF for route planning. - * Defines all 6 base YAPF modules as classes providing services for CYapfBaseT. - */ -template -struct CYapfRegion_TypesT { - typedef CYapfRegion_TypesT Types; ///< Shortcut for this struct type. - typedef Tpf_ Tpf; ///< Pathfinder type. - typedef DummyFollower TrackFollower; ///< Track follower helper class - typedef Tnode_list NodeList; - typedef Ship VehicleType; - - /** Pathfinder components (modules). */ - typedef CYapfBaseT PfBase; ///< Base pathfinder class. - typedef CYapfFollowRegionT PfFollow; ///< Node follower. - typedef CYapfOriginRegionT PfOrigin; ///< Origin provider. - typedef CYapfDestinationRegionT PfDestination; ///< Destination/distance provider. - typedef CYapfSegmentCostCacheNoneT PfCache; ///< Segment cost cache provider. - typedef CYapfCostRegionT PfCost; ///< Cost provider. -}; - -typedef NodeList, 12, 12> CRegionNodeListWater; - -struct CYapfRegionWater : CYapfT> { - explicit CYapfRegionWater(int max_nodes) { this->max_search_nodes = max_nodes; } -}; - /** * Finds a path at the water region level. Note that the starting region is always included if the path was found. * @param v The ship to find a path for. @@ -288,5 +231,5 @@ struct CYapfRegionWater : CYapfT YapfShipFindWaterRegionPath(const Ship *v, TileIndex start_tile, int max_returned_path_length) { - return CYapfRegionWater::FindWaterRegionPath(v, start_tile, max_returned_path_length); + return YapfShipRegions::FindWaterRegionPath(v, start_tile, max_returned_path_length); } From 42c9f84d74d198529fccb98d65270b12be7d0253 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 24 Sep 2025 22:44:41 +0100 Subject: [PATCH 083/280] Fix 3ac1a2f1e4: Game crash due to invalid vehicle type information. (#14628) Use std::variant instead of union for vehicle info. RailVehicleInfo is now non-POD so using in a union causes undefined behaviour. --- src/aircraft_cmd.cpp | 6 +- src/articulated_vehicles.cpp | 8 +- src/autoreplace_cmd.cpp | 8 +- src/autoreplace_gui.cpp | 2 +- src/build_vehicle_gui.cpp | 18 ++-- src/depot_gui.cpp | 2 +- src/elrail.cpp | 2 +- src/engine.cpp | 135 ++++++++++++++-------------- src/engine_base.h | 35 +++++--- src/engine_gui.cpp | 12 +-- src/engine_type.h | 34 +++++-- src/newgrf.cpp | 32 +++---- src/newgrf/newgrf_act0_aircraft.cpp | 2 +- src/newgrf/newgrf_act0_roadvehs.cpp | 2 +- src/newgrf/newgrf_act0_ships.cpp | 2 +- src/newgrf/newgrf_act0_trains.cpp | 2 +- src/newgrf_engine.cpp | 2 +- src/rail.cpp | 4 +- src/road.cpp | 4 +- src/roadveh_cmd.cpp | 14 +-- src/saveload/vehicle_sl.cpp | 2 +- src/ship_cmd.cpp | 6 +- src/train_cmd.cpp | 18 ++-- src/vehicle.cpp | 26 +++--- src/vehicle_base.h | 20 ----- src/vehicle_cmd.cpp | 8 +- 26 files changed, 208 insertions(+), 198 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 7a1b8b7a8c..91f0f7968f 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -200,7 +200,7 @@ void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteS static void GetAircraftIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); - uint8_t spritenum = e->u.air.image_index; + uint8_t spritenum = e->VehInfo().image_index; if (IsCustomVehicleSpriteNum(spritenum)) { GetCustomVehicleIcon(engine, DIR_W, image_type, result); @@ -267,7 +267,7 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoff */ CommandCost CmdBuildAircraft(DoCommandFlags flags, TileIndex tile, const Engine *e, Vehicle **ret) { - const AircraftVehicleInfo *avi = &e->u.air; + const AircraftVehicleInfo *avi = &e->VehInfo(); const Station *st = Station::GetByTile(tile); /* Prevent building aircraft types at places which can't handle them */ @@ -438,7 +438,7 @@ static void CheckIfAircraftNeedsService(Aircraft *v) Money Aircraft::GetRunningCost() const { const Engine *e = this->GetEngine(); - uint cost_factor = GetVehicleProperty(this, PROP_AIRCRAFT_RUNNING_COST_FACTOR, e->u.air.running_cost); + uint cost_factor = GetVehicleProperty(this, PROP_AIRCRAFT_RUNNING_COST_FACTOR, e->VehInfo().running_cost); return GetPrice(PR_RUNNING_AIRCRAFT, cost_factor, e->GetGRF()); } diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 9ffc0a6e8f..08c3c4416c 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -365,10 +365,10 @@ void AddArticulatedParts(Vehicle *first) t->track = front->track; t->railtypes = front->railtypes; - t->spritenum = e_artic->u.rail.image_index; + t->spritenum = e_artic->VehInfo().image_index; if (e_artic->CanCarryCargo()) { t->cargo_type = e_artic->GetDefaultCargoType(); - t->cargo_cap = e_artic->u.rail.capacity; // Callback 36 is called when the consist is finished + t->cargo_cap = e_artic->VehInfo().capacity; // Callback 36 is called when the consist is finished } else { t->cargo_type = front->cargo_type; // Needed for livery selection t->cargo_cap = 0; @@ -392,11 +392,11 @@ void AddArticulatedParts(Vehicle *first) rv->roadtype = front->roadtype; rv->compatible_roadtypes = front->compatible_roadtypes; - rv->spritenum = e_artic->u.road.image_index; + rv->spritenum = e_artic->VehInfo().image_index; if (e_artic->CanCarryCargo()) { rv->cargo_type = e_artic->GetDefaultCargoType(); assert(IsValidCargoType(rv->cargo_type)); - rv->cargo_cap = e_artic->u.road.capacity; // Callback 36 is called when the consist is finished + rv->cargo_cap = e_artic->VehInfo().capacity; // Callback 36 is called when the consist is finished } else { rv->cargo_type = front->cargo_type; // Needed for livery selection rv->cargo_cap = 0; diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 0798c679b3..454450c642 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -71,16 +71,16 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company) switch (type) { case VEH_TRAIN: { /* make sure the railtypes are compatible */ - if (!GetAllCompatibleRailTypes(e_from->u.rail.railtypes).Any(GetAllCompatibleRailTypes(e_to->u.rail.railtypes))) return false; + if (!GetAllCompatibleRailTypes(e_from->VehInfo().railtypes).Any(GetAllCompatibleRailTypes(e_to->VehInfo().railtypes))) return false; /* make sure we do not replace wagons with engines or vice versa */ - if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false; + if ((e_from->VehInfo().railveh_type == RAILVEH_WAGON) != (e_to->VehInfo().railveh_type == RAILVEH_WAGON)) return false; break; } case VEH_ROAD: /* make sure the roadtypes are compatible */ - if (!GetRoadTypeInfo(e_from->u.road.roadtype)->powered_roadtypes.Any(GetRoadTypeInfo(e_to->u.road.roadtype)->powered_roadtypes)) return false; + if (!GetRoadTypeInfo(e_from->VehInfo().roadtype)->powered_roadtypes.Any(GetRoadTypeInfo(e_to->VehInfo().roadtype)->powered_roadtypes)) return false; /* make sure that we do not replace a tram with a normal road vehicles or vice versa */ if (e_from->info.misc_flags.Test(EngineMiscFlag::RoadIsTram) != e_to->info.misc_flags.Test(EngineMiscFlag::RoadIsTram)) return false; @@ -88,7 +88,7 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company) case VEH_AIRCRAFT: /* make sure that we do not replace a plane with a helicopter or vice versa */ - if ((e_from->u.air.subtype & AIR_CTOL) != (e_to->u.air.subtype & AIR_CTOL)) return false; + if ((e_from->VehInfo().subtype & AIR_CTOL) != (e_to->VehInfo().subtype & AIR_CTOL)) return false; break; default: break; diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 081a8a8ace..67f9707769 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -140,7 +140,7 @@ class ReplaceVehicleWindow : public Window { case VEH_ROAD: if (draw_left && this->sel_roadtype != INVALID_ROADTYPE) { /* Ensure that the roadtype is specific to the selected one */ - if (e->u.road.roadtype != this->sel_roadtype) continue; + if (e->VehInfo().roadtype != this->sel_roadtype) continue; } break; diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index a40ad4ef35..0702fdeee5 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -726,8 +726,8 @@ static int DrawShipPurchaseInfo(int left, int right, int y, EngineID engine_numb /* Purchase cost - Max speed */ uint raw_speed = e->GetDisplayMaxSpeed(); - uint ocean_speed = e->u.ship.ApplyWaterClassSpeedFrac(raw_speed, true); - uint canal_speed = e->u.ship.ApplyWaterClassSpeedFrac(raw_speed, false); + uint ocean_speed = e->VehInfo().ApplyWaterClassSpeedFrac(raw_speed, true); + uint canal_speed = e->VehInfo().ApplyWaterClassSpeedFrac(raw_speed, false); if (ocean_speed == canal_speed) { if (te.cost != 0) { @@ -885,10 +885,10 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, switch (e->type) { default: NOT_REACHED(); case VEH_TRAIN: - if (e->u.rail.railveh_type == RAILVEH_WAGON) { - y = DrawRailWagonPurchaseInfo(left, right, y, engine_number, &e->u.rail, te); + if (e->VehInfo().railveh_type == RAILVEH_WAGON) { + y = DrawRailWagonPurchaseInfo(left, right, y, engine_number, &e->VehInfo(), te); } else { - y = DrawRailEnginePurchaseInfo(left, right, y, engine_number, &e->u.rail, te); + y = DrawRailEnginePurchaseInfo(left, right, y, engine_number, &e->VehInfo(), te); } articulated_cargo = true; break; @@ -920,7 +920,7 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, } /* Draw details that apply to all types except rail wagons. */ - if (e->type != VEH_TRAIN || e->u.rail.railveh_type != RAILVEH_WAGON) { + if (e->type != VEH_TRAIN || e->VehInfo().railveh_type != RAILVEH_WAGON) { /* Design date - Life length */ DrawString(left, right, y, GetString(STR_PURCHASE_INFO_DESIGNED_LIFE, ymd.year, TimerGameCalendar::DateToYear(e->GetLifeLengthInDays()))); y += GetCharacterHeight(FS_NORMAL); @@ -1395,7 +1395,7 @@ struct BuildVehicleWindow : Window { for (const Engine *e : Engine::IterateType(VEH_TRAIN)) { if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; - const RailVehicleInfo *rvi = &e->u.rail; + const RailVehicleInfo *rvi = &e->VehInfo(); if (this->filter.railtype != INVALID_RAILTYPE && !HasPowerOnRail(rvi->railtypes, this->filter.railtype)) continue; if (!IsEngineBuildable(eid, VEH_TRAIN, _local_company)) continue; @@ -1426,7 +1426,7 @@ struct BuildVehicleWindow : Window { if (std::ranges::find(list, variant, &GUIEngineListItem::engine_id) == list.end()) { const Engine *e = Engine::Get(variant); list.emplace_back(variant, e->info.variant_id, e->display_flags | EngineDisplayFlag::Shaded, 0); - if (e->u.rail.railveh_type != RAILVEH_WAGON) num_engines++; + if (e->VehInfo().railveh_type != RAILVEH_WAGON) num_engines++; } } @@ -1461,7 +1461,7 @@ struct BuildVehicleWindow : Window { if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue; - if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->u.road.roadtype, this->filter.roadtype)) continue; + if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->VehInfo().roadtype, this->filter.roadtype)) continue; if (!bdf.Filter(e->badges)) continue; /* Filter by name or NewGRF extra text */ diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 8306ec8b30..18856c2a95 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -229,7 +229,7 @@ void InitDepotWindowBlockSizes() if (!e->IsEnabled()) continue; uint w = TRAININFO_DEFAULT_VEHICLE_WIDTH; - if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->u.rail.image_index)) { + if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->VehInfo().image_index)) { w = e->GetGRF()->traininfo_vehicle_width; if (w != VEHICLEINFO_FULL_VEHICLE_WIDTH) { /* Hopeless. diff --git a/src/elrail.cpp b/src/elrail.cpp index 720da0f26b..14b145713c 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -582,7 +582,7 @@ void UpdateDisableElrailSettingState(bool disable, bool update_vehicles) { /* walk through all train engines */ for (Engine *e : Engine::IterateType(VEH_TRAIN)) { - RailVehicleInfo *rv_info = &e->u.rail; + RailVehicleInfo *rv_info = &e->VehInfo(); /* update railtype of engines intended to use elrail */ if (rv_info->intended_railtypes.Test(RAILTYPE_ELECTRIC)) { rv_info->railtypes.Set(RAILTYPE_ELECTRIC, !disable); diff --git a/src/engine.cpp b/src/engine.cpp index 68b9e1b0d1..15f0cfa5e9 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -78,24 +78,19 @@ Engine::Engine(VehicleType type, uint16_t local_id) /* Check if this base engine is within the original engine data range */ if (local_id >= _engine_counts[type]) { - /* 'power' defaults to zero, so we also have to default to 'wagon' */ - if (type == VEH_TRAIN) this->u.rail.railveh_type = RAILVEH_WAGON; + /* Initialise default type-specific information. */ + switch (type) { + case VEH_TRAIN: this->vehicle_info.emplace(); break; + case VEH_ROAD: this->vehicle_info.emplace(); break; + case VEH_SHIP: this->vehicle_info.emplace(); break; + case VEH_AIRCRAFT: this->vehicle_info.emplace(); break; + default: break; + } /* Set model life to maximum to make wagons available */ this->info.base_life = TimerGameCalendar::Year{0xFF}; - /* Set road vehicle tractive effort to the default value */ - if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C; /* Aircraft must have CT_INVALID as default, as there is no property */ this->info.cargo_type = INVALID_CARGO; this->info.cargo_label = (type == VEH_AIRCRAFT) ? CT_INVALID : CT_PASSENGERS; - /* Ships must have a non-zero acceleration. */ - if (type == VEH_SHIP) this->u.ship.acceleration = 1; - /* Set visual effect to the default value */ - switch (type) { - case VEH_TRAIN: this->u.rail.visual_effect = VE_DEFAULT; break; - case VEH_ROAD: this->u.road.visual_effect = VE_DEFAULT; break; - case VEH_SHIP: this->u.ship.visual_effect = VE_DEFAULT; break; - default: break; // The aircraft, disasters and especially visual effects have no NewGRF configured visual effects - } /* Set cargo aging period to the default value. */ this->info.cargo_age_period = Ticks::CARGO_AGING_TICKS; /* Not a variant */ @@ -110,33 +105,37 @@ Engine::Engine(VehicleType type, uint16_t local_id) switch (type) { default: NOT_REACHED(); - case VEH_TRAIN: - this->u.rail = _orig_rail_vehicle_info[local_id]; - this->original_image_index = this->u.rail.image_index; + case VEH_TRAIN: { + RailVehicleInfo &rvi = this->vehicle_info.emplace(_orig_rail_vehicle_info[local_id]); + this->original_image_index = rvi.image_index; this->info.string_id = STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KIRBY_PAUL_TANK_STEAM + local_id; /* Set the default model life of original wagons to "infinite" */ - if (this->u.rail.railveh_type == RAILVEH_WAGON) this->info.base_life = TimerGameCalendar::Year{0xFF}; + if (rvi.railveh_type == RAILVEH_WAGON) this->info.base_life = TimerGameCalendar::Year{0xFF}; break; + } - case VEH_ROAD: - this->u.road = _orig_road_vehicle_info[local_id]; - this->original_image_index = this->u.road.image_index; + case VEH_ROAD: { + RoadVehicleInfo &rvi = this->vehicle_info.emplace(_orig_road_vehicle_info[local_id]); + this->original_image_index = rvi.image_index; this->info.string_id = STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_REGAL_BUS + local_id; break; + } - case VEH_SHIP: - this->u.ship = _orig_ship_vehicle_info[local_id]; - this->original_image_index = this->u.ship.image_index; + case VEH_SHIP: { + ShipVehicleInfo &svi = this->vehicle_info.emplace(_orig_ship_vehicle_info[local_id]); + this->original_image_index = svi.image_index; this->info.string_id = STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER + local_id; break; + } - case VEH_AIRCRAFT: - this->u.air = _orig_aircraft_vehicle_info[local_id]; - this->original_image_index = this->u.air.image_index; + case VEH_AIRCRAFT: { + AircraftVehicleInfo &avi = this->vehicle_info.emplace(_orig_aircraft_vehicle_info[local_id]); + this->original_image_index = avi.image_index; this->info.string_id = STR_VEHICLE_NAME_AIRCRAFT_SAMPSON_U52 + local_id; break; + } } } @@ -174,11 +173,11 @@ bool Engine::CanCarryCargo() const */ switch (this->type) { case VEH_TRAIN: - if (this->u.rail.capacity == 0) return false; + if (this->VehInfo().capacity == 0) return false; break; case VEH_ROAD: - if (this->u.road.capacity == 0) return false; + if (this->VehInfo().capacity == 0) return false; break; case VEH_SHIP: @@ -210,7 +209,7 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const CargoType cargo_type = (v != nullptr) ? v->cargo_type : default_cargo; if (mail_capacity != nullptr && this->type == VEH_AIRCRAFT && IsCargoInClass(cargo_type, CargoClass::Passengers)) { - *mail_capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v); + *mail_capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->VehInfo().mail_capacity, v); } /* Check the refit capacity callback if we are not in the default configuration, or if we are using the new multiplier algorithm. */ @@ -225,24 +224,24 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const uint extra_mail_cap = 0; switch (this->type) { case VEH_TRAIN: - capacity = GetEngineProperty(this->index, PROP_TRAIN_CARGO_CAPACITY, this->u.rail.capacity, v); + capacity = GetEngineProperty(this->index, PROP_TRAIN_CARGO_CAPACITY, this->VehInfo().capacity, v); /* In purchase list add the capacity of the second head. Always use the plain property for this. */ - if (v == nullptr && this->u.rail.railveh_type == RAILVEH_MULTIHEAD) capacity += this->u.rail.capacity; + if (v == nullptr && this->VehInfo().railveh_type == RAILVEH_MULTIHEAD) capacity += this->VehInfo().capacity; break; case VEH_ROAD: - capacity = GetEngineProperty(this->index, PROP_ROADVEH_CARGO_CAPACITY, this->u.road.capacity, v); + capacity = GetEngineProperty(this->index, PROP_ROADVEH_CARGO_CAPACITY, this->VehInfo().capacity, v); break; case VEH_SHIP: - capacity = GetEngineProperty(this->index, PROP_SHIP_CARGO_CAPACITY, this->u.ship.capacity, v); + capacity = GetEngineProperty(this->index, PROP_SHIP_CARGO_CAPACITY, this->VehInfo().capacity, v); break; case VEH_AIRCRAFT: - capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_PASSENGER_CAPACITY, this->u.air.passenger_capacity, v); + capacity = GetEngineProperty(this->index, PROP_AIRCRAFT_PASSENGER_CAPACITY, this->VehInfo().passenger_capacity, v); if (!IsCargoInClass(cargo_type, CargoClass::Passengers)) { - extra_mail_cap = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v); + extra_mail_cap = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->VehInfo().mail_capacity, v); } if (IsValidCargoType(GetCargoTypeByLabel(CT_MAIL))) { if (!new_multipliers && cargo_type == GetCargoTypeByLabel(CT_MAIL)) return capacity + extra_mail_cap; @@ -284,25 +283,25 @@ Money Engine::GetRunningCost() const uint cost_factor; switch (this->type) { case VEH_ROAD: - base_price = this->u.road.running_cost_class; + base_price = this->VehInfo().running_cost_class; if (base_price == INVALID_PRICE) return 0; - cost_factor = GetEngineProperty(this->index, PROP_ROADVEH_RUNNING_COST_FACTOR, this->u.road.running_cost); + cost_factor = GetEngineProperty(this->index, PROP_ROADVEH_RUNNING_COST_FACTOR, this->VehInfo().running_cost); break; case VEH_TRAIN: - base_price = this->u.rail.running_cost_class; + base_price = this->VehInfo().running_cost_class; if (base_price == INVALID_PRICE) return 0; - cost_factor = GetEngineProperty(this->index, PROP_TRAIN_RUNNING_COST_FACTOR, this->u.rail.running_cost); + cost_factor = GetEngineProperty(this->index, PROP_TRAIN_RUNNING_COST_FACTOR, this->VehInfo().running_cost); break; case VEH_SHIP: base_price = PR_RUNNING_SHIP; - cost_factor = GetEngineProperty(this->index, PROP_SHIP_RUNNING_COST_FACTOR, this->u.ship.running_cost); + cost_factor = GetEngineProperty(this->index, PROP_SHIP_RUNNING_COST_FACTOR, this->VehInfo().running_cost); break; case VEH_AIRCRAFT: base_price = PR_RUNNING_AIRCRAFT; - cost_factor = GetEngineProperty(this->index, PROP_AIRCRAFT_RUNNING_COST_FACTOR, this->u.air.running_cost); + cost_factor = GetEngineProperty(this->index, PROP_AIRCRAFT_RUNNING_COST_FACTOR, this->VehInfo().running_cost); break; default: NOT_REACHED(); @@ -322,27 +321,27 @@ Money Engine::GetCost() const switch (this->type) { case VEH_ROAD: base_price = PR_BUILD_VEHICLE_ROAD; - cost_factor = GetEngineProperty(this->index, PROP_ROADVEH_COST_FACTOR, this->u.road.cost_factor); + cost_factor = GetEngineProperty(this->index, PROP_ROADVEH_COST_FACTOR, this->VehInfo().cost_factor); break; case VEH_TRAIN: - if (this->u.rail.railveh_type == RAILVEH_WAGON) { + if (this->VehInfo().railveh_type == RAILVEH_WAGON) { base_price = PR_BUILD_VEHICLE_WAGON; - cost_factor = GetEngineProperty(this->index, PROP_TRAIN_COST_FACTOR, this->u.rail.cost_factor); + cost_factor = GetEngineProperty(this->index, PROP_TRAIN_COST_FACTOR, this->VehInfo().cost_factor); } else { base_price = PR_BUILD_VEHICLE_TRAIN; - cost_factor = GetEngineProperty(this->index, PROP_TRAIN_COST_FACTOR, this->u.rail.cost_factor); + cost_factor = GetEngineProperty(this->index, PROP_TRAIN_COST_FACTOR, this->VehInfo().cost_factor); } break; case VEH_SHIP: base_price = PR_BUILD_VEHICLE_SHIP; - cost_factor = GetEngineProperty(this->index, PROP_SHIP_COST_FACTOR, this->u.ship.cost_factor); + cost_factor = GetEngineProperty(this->index, PROP_SHIP_COST_FACTOR, this->VehInfo().cost_factor); break; case VEH_AIRCRAFT: base_price = PR_BUILD_VEHICLE_AIRCRAFT; - cost_factor = GetEngineProperty(this->index, PROP_AIRCRAFT_COST_FACTOR, this->u.air.cost_factor); + cost_factor = GetEngineProperty(this->index, PROP_AIRCRAFT_COST_FACTOR, this->VehInfo().cost_factor); break; default: NOT_REACHED(); @@ -359,22 +358,22 @@ uint Engine::GetDisplayMaxSpeed() const { switch (this->type) { case VEH_TRAIN: - return GetEngineProperty(this->index, PROP_TRAIN_SPEED, this->u.rail.max_speed); + return GetEngineProperty(this->index, PROP_TRAIN_SPEED, this->VehInfo().max_speed); case VEH_ROAD: { uint max_speed = GetEngineProperty(this->index, PROP_ROADVEH_SPEED, 0); - return (max_speed != 0) ? max_speed * 2 : this->u.road.max_speed / 2; + return (max_speed != 0) ? max_speed * 2 : this->VehInfo().max_speed / 2; } case VEH_SHIP: - return GetEngineProperty(this->index, PROP_SHIP_SPEED, this->u.ship.max_speed) / 2; + return GetEngineProperty(this->index, PROP_SHIP_SPEED, this->VehInfo().max_speed) / 2; case VEH_AIRCRAFT: { uint max_speed = GetEngineProperty(this->index, PROP_AIRCRAFT_SPEED, 0); if (max_speed != 0) { return (max_speed * 128) / 10; } - return this->u.air.max_speed; + return this->VehInfo().max_speed; } default: NOT_REACHED(); @@ -392,9 +391,9 @@ uint Engine::GetPower() const /* Only trains and road vehicles have 'power'. */ switch (this->type) { case VEH_TRAIN: - return GetEngineProperty(this->index, PROP_TRAIN_POWER, this->u.rail.power); + return GetEngineProperty(this->index, PROP_TRAIN_POWER, this->VehInfo().power); case VEH_ROAD: - return GetEngineProperty(this->index, PROP_ROADVEH_POWER, this->u.road.power) * 10; + return GetEngineProperty(this->index, PROP_ROADVEH_POWER, this->VehInfo().power) * 10; default: NOT_REACHED(); } @@ -410,9 +409,9 @@ uint Engine::GetDisplayWeight() const /* Only trains and road vehicles have 'weight'. */ switch (this->type) { case VEH_TRAIN: - return GetEngineProperty(this->index, PROP_TRAIN_WEIGHT, this->u.rail.weight) << (this->u.rail.railveh_type == RAILVEH_MULTIHEAD ? 1 : 0); + return GetEngineProperty(this->index, PROP_TRAIN_WEIGHT, this->VehInfo().weight) << (this->VehInfo().railveh_type == RAILVEH_MULTIHEAD ? 1 : 0); case VEH_ROAD: - return GetEngineProperty(this->index, PROP_ROADVEH_WEIGHT, this->u.road.weight) / 4; + return GetEngineProperty(this->index, PROP_ROADVEH_WEIGHT, this->VehInfo().weight) / 4; default: NOT_REACHED(); } @@ -428,9 +427,9 @@ uint Engine::GetDisplayMaxTractiveEffort() const /* Only trains and road vehicles have 'tractive effort'. */ switch (this->type) { case VEH_TRAIN: - return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_TRAIN_TRACTIVE_EFFORT, this->u.rail.tractive_effort)) / 256; + return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_TRAIN_TRACTIVE_EFFORT, this->VehInfo().tractive_effort)) / 256; case VEH_ROAD: - return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_ROADVEH_TRACTIVE_EFFORT, this->u.road.tractive_effort)) / 256; + return (GROUND_ACCELERATION * this->GetDisplayWeight() * GetEngineProperty(this->index, PROP_ROADVEH_TRACTIVE_EFFORT, this->VehInfo().tractive_effort)) / 256; default: NOT_REACHED(); } @@ -454,7 +453,7 @@ uint16_t Engine::GetRange() const { switch (this->type) { case VEH_AIRCRAFT: - return GetEngineProperty(this->index, PROP_AIRCRAFT_RANGE, this->u.air.max_range); + return GetEngineProperty(this->index, PROP_AIRCRAFT_RANGE, this->VehInfo().max_range); default: NOT_REACHED(); } @@ -468,7 +467,7 @@ StringID Engine::GetAircraftTypeText() const { switch (this->type) { case VEH_AIRCRAFT: - switch (this->u.air.subtype) { + switch (this->VehInfo().subtype) { case AIR_HELI: return STR_LIVERY_HELICOPTER; case AIR_CTOL: return STR_LIVERY_SMALL_PLANE; case AIR_CTOL | AIR_FAST: return STR_LIVERY_LARGE_PLANE; @@ -625,7 +624,7 @@ void ShowEnginePreviewWindow(EngineID engine); static bool IsWagon(EngineID index) { const Engine *e = Engine::Get(index); - return e->type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON; + return e->type == VEH_TRAIN && e->VehInfo().railveh_type == RAILVEH_WAGON; } /** @@ -700,7 +699,7 @@ void SetYearEngineAgingStops() /* Exclude certain engines */ if (!ei->climates.Test(_settings_game.game_creation.landscape)) continue; - if (e->type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON) continue; + if (e->type == VEH_TRAIN && e->VehInfo().railveh_type == RAILVEH_WAGON) continue; /* Base year ending date on half the model life */ TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(ei->base_intro + (ei->lifelength.base() * CalendarTime::DAYS_IN_LEAP_YEAR) / 2); @@ -1107,13 +1106,13 @@ static void NewVehicleAvailable(Engine *e) if (e->type == VEH_TRAIN) { /* maybe make another rail type available */ - assert(e->u.rail.railtypes != RailTypes{}); - RailTypes introduced = GetAllIntroducesRailTypes(e->u.rail.railtypes); + assert(e->VehInfo().railtypes != RailTypes{}); + RailTypes introduced = GetAllIntroducesRailTypes(e->VehInfo().railtypes); for (Company *c : Company::Iterate()) c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes | introduced, TimerGameCalendar::date); } else if (e->type == VEH_ROAD) { /* maybe make another road type available */ - assert(e->u.road.roadtype < ROADTYPE_END); - for (Company *c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, TimerGameCalendar::date); + assert(e->VehInfo().roadtype < ROADTYPE_END); + for (Company *c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->VehInfo().roadtype)->introduces_roadtypes, TimerGameCalendar::date); } /* Only broadcast event if AIs are able to build this vehicle type. */ @@ -1268,12 +1267,12 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company) if (type == VEH_TRAIN && company != OWNER_DEITY) { /* Check if the rail type is available to this company */ const Company *c = Company::Get(company); - if (!GetAllCompatibleRailTypes(e->u.rail.railtypes).Any(c->avail_railtypes)) return false; + if (!GetAllCompatibleRailTypes(e->VehInfo().railtypes).Any(c->avail_railtypes)) return false; } if (type == VEH_ROAD && company != OWNER_DEITY) { /* Check if the road type is available to this company */ const Company *c = Company::Get(company); - if (!GetRoadTypeInfo(e->u.road.roadtype)->powered_roadtypes.Any(c->avail_roadtypes)) return false; + if (!GetRoadTypeInfo(e->VehInfo().roadtype)->powered_roadtypes.Any(c->avail_roadtypes)) return false; } return true; @@ -1319,7 +1318,7 @@ void CheckEngines() if (!e->IsEnabled()) continue; /* Don't consider train wagons, we need a powered engine available. */ - if (e->type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON) continue; + if (e->type == VEH_TRAIN && e->VehInfo().railveh_type == RAILVEH_WAGON) continue; /* We have an available engine... yay! */ if (e->flags.Test(EngineFlag::Available) && e->company_avail.Any()) return; diff --git a/src/engine_base.h b/src/engine_base.h index 82ea41cd8f..d8e6052524 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -35,7 +35,8 @@ using EngineDisplayFlags = EnumBitSet; typedef Pool EnginePool; extern EnginePool _engine_pool; -struct Engine : EnginePool::PoolItem<&_engine_pool> { +class Engine : public EnginePool::PoolItem<&_engine_pool> { +public: CompanyMask company_avail{}; ///< Bit for each company whether the engine is available for that company. CompanyMask company_hidden{}; ///< Bit for each company whether the engine is normally hidden in the build gui for that company. CompanyMask preview_asked{}; ///< Bit for each company which has already been offered a preview. @@ -64,13 +65,6 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { EngineID display_last_variant = EngineID::Invalid(); ///< NOSAVE client-side-only last variant selected. EngineInfo info{}; - union { - RailVehicleInfo rail; - RoadVehicleInfo road; - ShipVehicleInfo ship; - AircraftVehicleInfo air; - } u{}; - uint16_t list_position = 0; /* NewGRF related data */ @@ -78,6 +72,11 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { std::vector overrides{}; std::vector badges{}; +private: + /* Vehicle-type specific information. */ + std::variant vehicle_info{}; + +public: Engine() {} Engine(VehicleType type, uint16_t local_id); bool IsEnabled() const; @@ -177,6 +176,18 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { bool operator() (size_t index) { return Engine::Get(index)->type == this->vt; } }; + template + inline T &VehInfo() + { + return std::get(this->vehicle_info); + } + + template + inline const T &VehInfo() const + { + return std::get(this->vehicle_info); + } + /** * Returns an iterable ensemble of all valid engines of the given type * @param vt the VehicleType for engines to be valid @@ -234,22 +245,22 @@ inline const EngineInfo *EngInfo(EngineID e) inline const RailVehicleInfo *RailVehInfo(EngineID e) { - return &Engine::Get(e)->u.rail; + return &Engine::Get(e)->VehInfo(); } inline const RoadVehicleInfo *RoadVehInfo(EngineID e) { - return &Engine::Get(e)->u.road; + return &Engine::Get(e)->VehInfo(); } inline const ShipVehicleInfo *ShipVehInfo(EngineID e) { - return &Engine::Get(e)->u.ship; + return &Engine::Get(e)->VehInfo(); } inline const AircraftVehicleInfo *AircraftVehInfo(EngineID e) { - return &Engine::Get(e)->u.air; + return &Engine::Get(e)->VehInfo(); } #endif /* ENGINE_BASE_H */ diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 210cf3bdf1..19a4eff047 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -43,12 +43,12 @@ StringID GetEngineCategoryName(EngineID engine) switch (e->type) { default: NOT_REACHED(); case VEH_ROAD: - return GetRoadTypeInfo(e->u.road.roadtype)->strings.new_engine; + return GetRoadTypeInfo(e->VehInfo().roadtype)->strings.new_engine; case VEH_AIRCRAFT: return STR_ENGINE_PREVIEW_AIRCRAFT; case VEH_SHIP: return STR_ENGINE_PREVIEW_SHIP; case VEH_TRAIN: - assert(e->u.rail.railtypes.Any()); - return GetRailTypeInfo(e->u.rail.railtypes.GetNthSetBit(0).value())->strings.new_loco; + assert(e->VehInfo().railtypes.Any()); + return GetRailTypeInfo(e->VehInfo().railtypes.GetNthSetBit(0).value())->strings.new_loco; } } @@ -182,12 +182,12 @@ static std::string GetTrainEngineInfoString(const Engine &e) res << GetString(STR_ENGINE_PREVIEW_COST_WEIGHT, e.GetCost(), e.GetDisplayWeight()); res << '\n'; - if (e.u.rail.railtypes.Count() > 1) { + if (e.VehInfo().railtypes.Count() > 1) { std::string railtypes{}; std::string_view list_separator = GetListSeparator(); for (const auto &rt : _sorted_railtypes) { - if (!e.u.rail.railtypes.Test(rt)) continue; + if (!e.VehInfo().railtypes.Test(rt)) continue; if (!railtypes.empty()) railtypes += list_separator; AppendStringInPlace(railtypes, GetRailTypeInfo(rt)->strings.name); @@ -197,7 +197,7 @@ static std::string GetTrainEngineInfoString(const Engine &e) } bool is_maglev = true; - for (RailType rt : e.u.rail.railtypes) { + for (RailType rt : e.VehInfo().railtypes) { is_maglev &= GetRailTypeInfo(rt)->acceleration_type == VehicleAccelerationModel::Maglev; } diff --git a/src/engine_type.h b/src/engine_type.h index 1fefbe1ba1..640a99b73f 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -25,7 +25,7 @@ /** Unique identification number of an engine. */ using EngineID = PoolID; -struct Engine; +class Engine; /** Available types of rail vehicles. */ enum RailVehicleTypes : uint8_t { @@ -50,10 +50,30 @@ enum class VehicleAccelerationModel : uint8_t { Maglev, ///< Maglev acceleration model. }; +/** Meaning of the various bits of the visual effect. */ +enum VisualEffect : uint8_t { + VE_OFFSET_START = 0, ///< First bit that contains the offset (0 = front, 8 = centre, 15 = rear) + VE_OFFSET_COUNT = 4, ///< Number of bits used for the offset + VE_OFFSET_CENTRE = 8, ///< Value of offset corresponding to a position above the centre of the vehicle + + VE_TYPE_START = 4, ///< First bit used for the type of effect + VE_TYPE_COUNT = 2, ///< Number of bits used for the effect type + VE_TYPE_DEFAULT = 0, ///< Use default from engine class + VE_TYPE_STEAM = 1, ///< Steam plumes + VE_TYPE_DIESEL = 2, ///< Diesel fumes + VE_TYPE_ELECTRIC = 3, ///< Electric sparks + + VE_DISABLE_EFFECT = 6, ///< Flag to disable visual effect + VE_ADVANCED_EFFECT = VE_DISABLE_EFFECT, ///< Flag for advanced effects + VE_DISABLE_WAGON_POWER = 7, ///< Flag to disable wagon power + + VE_DEFAULT = 0xFF, ///< Default value to indicate that visual effect should be based on engine class +}; + /** Information about a rail vehicle. */ struct RailVehicleInfo { uint8_t image_index = 0; - RailVehicleTypes railveh_type{}; + RailVehicleTypes railveh_type = RAILVEH_WAGON; uint8_t cost_factor = 0; ///< Purchase cost factor; For multiheaded engines the sum of both engine prices. RailTypes railtypes{}; ///< Railtypes, mangled if elrail is disabled. RailTypes intended_railtypes{}; ///< Intended railtypes, regardless of elrail being enabled or disabled. @@ -67,7 +87,7 @@ struct RailVehicleInfo { uint8_t capacity = 0; ///< Cargo capacity of vehicle; For multiheaded engines the capacity of each single engine. uint16_t pow_wag_power = 0; ///< Extra power applied to consist if wagon should be powered uint8_t pow_wag_weight = 0; ///< Extra weight applied to consist if wagon should be powered - uint8_t visual_effect = 0; ///< Bitstuffed NewGRF visual effect data + uint8_t visual_effect = VE_DEFAULT; ///< Bitstuffed NewGRF visual effect data uint8_t shorten_factor = 0; ///< length on main map for this type is 8 - shorten_factor uint8_t tractive_effort = 0; ///< Tractive effort coefficient uint8_t air_drag = 0; ///< Coefficient of air drag @@ -80,12 +100,12 @@ struct ShipVehicleInfo { uint8_t image_index = 0; uint8_t cost_factor = 0; uint8_t running_cost = 0; - uint8_t acceleration = 0; ///< Acceleration (1 unit = 1/3.2 mph per tick = 0.5 km-ish/h per tick) + uint8_t acceleration = 1; ///< Acceleration (1 unit = 1/3.2 mph per tick = 0.5 km-ish/h per tick) uint16_t max_speed = 0; ///< Maximum speed (1 unit = 1/3.2 mph = 0.5 km-ish/h) uint16_t capacity = 0; SoundID sfx{}; bool old_refittable = 0; ///< Is ship refittable; only used during initialisation. Later use EngineInfo::refit_mask. - uint8_t visual_effect = 0; ///< Bitstuffed NewGRF visual effect data + uint8_t visual_effect = VE_DEFAULT; ///< Bitstuffed NewGRF visual effect data uint8_t ocean_speed_frac = 0; ///< Fraction of maximum speed for ocean tiles. uint8_t canal_speed_frac = 0; ///< Fraction of maximum speed for canal/river tiles. @@ -133,9 +153,9 @@ struct RoadVehicleInfo { uint8_t capacity = 0; uint8_t weight = 0; ///< Weight in 1/4t units uint8_t power = 0; ///< Power in 10hp units - uint8_t tractive_effort = 0; ///< Coefficient of tractive effort + uint8_t tractive_effort = 0x4C; ///< Coefficient of tractive effort uint8_t air_drag = 0; ///< Coefficient of air drag - uint8_t visual_effect = 0; ///< Bitstuffed NewGRF visual effect data + uint8_t visual_effect = VE_DEFAULT; ///< Bitstuffed NewGRF visual effect data uint8_t shorten_factor = 0; ///< length on main map for this type is 8 - shorten_factor RoadType roadtype{}; ///< Road type }; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index b6444a8e06..26a6a66fea 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -272,7 +272,7 @@ Engine *GetNewEngine(const GRFFile *file, VehicleType type, uint16_t internal_id } if (type == VEH_TRAIN) { _gted[e->index].railtypelabels.clear(); - for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); + for (RailType rt : e->VehInfo().railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); } GrfMsg(5, "Created new engine at index {} for GRFID {:x}, type {}, index {}", e->index, std::byteswap(file->grfid), type, internal_id); @@ -427,7 +427,7 @@ void ResetNewGRFData() /* Fill rail type label temporary data for default trains */ for (const Engine *e : Engine::IterateType(VEH_TRAIN)) { _gted[e->index].railtypelabels.clear(); - for (RailType rt : e->u.rail.railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); + for (RailType rt : e->VehInfo().railtypes) _gted[e->index].railtypelabels.push_back(GetRailTypeInfo(rt)->label); } /* Reset GRM reservations */ @@ -661,7 +661,7 @@ static void CalculateRefitMasks() /* If the NewGRF did not set any cargo properties, we apply default values. */ if (_gted[engine].defaultcargo_grf == nullptr) { /* If the vehicle has any capacity, apply the default refit masks */ - if (e->type != VEH_TRAIN || e->u.rail.capacity != 0) { + if (e->type != VEH_TRAIN || e->VehInfo().capacity != 0) { static constexpr LandscapeType T = LandscapeType::Temperate; static constexpr LandscapeType A = LandscapeType::Arctic; static constexpr LandscapeType S = LandscapeType::Tropic; @@ -716,8 +716,8 @@ static void CalculateRefitMasks() } break; } - e->u.ship.old_refittable = true; - } else if (e->type == VEH_TRAIN && e->u.rail.railveh_type != RAILVEH_WAGON) { + e->VehInfo().old_refittable = true; + } else if (e->type == VEH_TRAIN && e->VehInfo().railveh_type != RAILVEH_WAGON) { /* Train engines default to all cargoes, so you can build single-cargo consists with fast engines. * Trains loading multiple cargoes may start stations accepting unwanted cargoes. */ _gted[engine].cargo_allowed = {CargoClass::Passengers, CargoClass::Mail, CargoClass::Armoured, CargoClass::Express, CargoClass::Bulk, CargoClass::PieceGoods, CargoClass::Liquid}; @@ -792,7 +792,7 @@ static void CalculateRefitMasks() /* Ensure that the vehicle is either not refittable, or that the default cargo is one of the refittable cargoes. * Note: Vehicles refittable to no cargo are handle differently to vehicle refittable to a single cargo. The latter might have subtypes. */ - if (!only_defaultcargo && (e->type != VEH_SHIP || e->u.ship.old_refittable) && IsValidCargoType(ei->cargo_type) && !HasBit(ei->refit_mask, ei->cargo_type)) { + if (!only_defaultcargo && (e->type != VEH_SHIP || e->VehInfo().old_refittable) && IsValidCargoType(ei->cargo_type) && !HasBit(ei->refit_mask, ei->cargo_type)) { ei->cargo_type = INVALID_CARGO; } @@ -819,7 +819,7 @@ static void CalculateRefitMasks() ei->cargo_type = (CargoType)FindFirstBit(ei->refit_mask); } } - if (!IsValidCargoType(ei->cargo_type) && e->type == VEH_TRAIN && e->u.rail.railveh_type != RAILVEH_WAGON && e->u.rail.capacity == 0) { + if (!IsValidCargoType(ei->cargo_type) && e->type == VEH_TRAIN && e->VehInfo().railveh_type != RAILVEH_WAGON && e->VehInfo().capacity == 0) { /* For train engines which do not carry cargo it does not matter if their cargo type is invalid. * Fallback to the first available instead, if the cargo type has not been changed (as indicated by * cargo_label not being CT_INVALID). */ @@ -830,7 +830,7 @@ static void CalculateRefitMasks() if (!IsValidCargoType(ei->cargo_type)) ei->climates = {}; /* Clear refit_mask for not refittable ships */ - if (e->type == VEH_SHIP && !e->u.ship.old_refittable) { + if (e->type == VEH_SHIP && !e->VehInfo().old_refittable) { ei->refit_mask = 0; } } @@ -867,16 +867,16 @@ static void FinaliseEngineArray() switch (e->type) { case VEH_TRAIN: - for (RailType rt : e->u.rail.railtypes) { + for (RailType rt : e->VehInfo().railtypes) { AppendCopyableBadgeList(e->badges, GetRailTypeInfo(rt)->badges, GSF_TRAINS); } break; - case VEH_ROAD: AppendCopyableBadgeList(e->badges, GetRoadTypeInfo(e->u.road.roadtype)->badges, GSF_ROADVEHICLES); break; + case VEH_ROAD: AppendCopyableBadgeList(e->badges, GetRoadTypeInfo(e->VehInfo().roadtype)->badges, GSF_ROADVEHICLES); break; default: break; } /* Skip wagons, there livery is defined via the engine */ - if (e->type != VEH_TRAIN || e->u.rail.railveh_type != RAILVEH_WAGON) { + if (e->type != VEH_TRAIN || e->VehInfo().railveh_type != RAILVEH_WAGON) { LiveryScheme ls = GetEngineLiveryScheme(e->index, EngineID::Invalid(), nullptr); SetBit(_loaded_newgrf_features.used_liveries, ls); /* Note: For ships and roadvehicles we assume that they cannot be refitted between passenger and freight */ @@ -1693,14 +1693,14 @@ static void AfterLoadGRFs() for (Engine *e : Engine::IterateType(VEH_ROAD)) { if (_gted[e->index].rv_max_speed != 0) { /* Set RV maximum speed from the mph/0.8 unit value */ - e->u.road.max_speed = _gted[e->index].rv_max_speed * 4; + e->VehInfo().max_speed = _gted[e->index].rv_max_speed * 4; } RoadTramType rtt = e->info.misc_flags.Test(EngineMiscFlag::RoadIsTram) ? RTT_TRAM : RTT_ROAD; const GRFFile *file = e->GetGRF(); if (file == nullptr || _gted[e->index].roadtramtype == 0) { - e->u.road.roadtype = (rtt == RTT_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD; + e->VehInfo().roadtype = (rtt == RTT_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD; continue; } @@ -1713,7 +1713,7 @@ static void AfterLoadGRFs() RoadTypeLabel rtl = (*list)[_gted[e->index].roadtramtype]; RoadType rt = GetRoadTypeByLabel(rtl); if (rt != INVALID_ROADTYPE && GetRoadTramType(rt) == rtt) { - e->u.road.roadtype = rt; + e->VehInfo().roadtype = rt; continue; } } @@ -1730,8 +1730,8 @@ static void AfterLoadGRFs() } if (railtypes.Any()) { - e->u.rail.railtypes = railtypes; - e->u.rail.intended_railtypes = railtypes; + e->VehInfo().railtypes = railtypes; + e->VehInfo().intended_railtypes = railtypes; } else { /* Rail type is not available, so disable this engine */ e->info.climates = {}; diff --git a/src/newgrf/newgrf_act0_aircraft.cpp b/src/newgrf/newgrf_act0_aircraft.cpp index d246544784..d4e7df1298 100644 --- a/src/newgrf/newgrf_act0_aircraft.cpp +++ b/src/newgrf/newgrf_act0_aircraft.cpp @@ -35,7 +35,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint first, uint last, int pro if (e == nullptr) return CIR_INVALID_ID; // No engine could be allocated, so neither can any next vehicles EngineInfo *ei = &e->info; - AircraftVehicleInfo *avi = &e->u.air; + AircraftVehicleInfo *avi = &e->VehInfo(); switch (prop) { case 0x08: { // Sprite ID diff --git a/src/newgrf/newgrf_act0_roadvehs.cpp b/src/newgrf/newgrf_act0_roadvehs.cpp index e8cf67f6bb..34fd862c98 100644 --- a/src/newgrf/newgrf_act0_roadvehs.cpp +++ b/src/newgrf/newgrf_act0_roadvehs.cpp @@ -36,7 +36,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint first, uint last, int prop, B if (e == nullptr) return CIR_INVALID_ID; // No engine could be allocated, so neither can any next vehicles EngineInfo *ei = &e->info; - RoadVehicleInfo *rvi = &e->u.road; + RoadVehicleInfo *rvi = &e->VehInfo(); switch (prop) { case 0x05: // Road/tram type diff --git a/src/newgrf/newgrf_act0_ships.cpp b/src/newgrf/newgrf_act0_ships.cpp index 0e1bfe0b17..3b9c32b15c 100644 --- a/src/newgrf/newgrf_act0_ships.cpp +++ b/src/newgrf/newgrf_act0_ships.cpp @@ -37,7 +37,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint first, uint last, int prop, B if (e == nullptr) return CIR_INVALID_ID; // No engine could be allocated, so neither can any next vehicles EngineInfo *ei = &e->info; - ShipVehicleInfo *svi = &e->u.ship; + ShipVehicleInfo *svi = &e->VehInfo(); switch (prop) { case 0x08: { // Sprite ID diff --git a/src/newgrf/newgrf_act0_trains.cpp b/src/newgrf/newgrf_act0_trains.cpp index 8f8a4c4121..0e44e3a1b5 100644 --- a/src/newgrf/newgrf_act0_trains.cpp +++ b/src/newgrf/newgrf_act0_trains.cpp @@ -35,7 +35,7 @@ ChangeInfoResult RailVehicleChangeInfo(uint first, uint last, int prop, ByteRead if (e == nullptr) return CIR_INVALID_ID; // No engine could be allocated, so neither can any next vehicles EngineInfo *ei = &e->info; - RailVehicleInfo *rvi = &e->u.rail; + RailVehicleInfo *rvi = &e->VehInfo(); switch (prop) { case 0x05: { // Track type diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 5d1f7ba7fe..c1f355fe1c 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1138,7 +1138,7 @@ static void GetRotorOverrideSprite(EngineID engine, const struct Aircraft *v, En /* Only valid for helicopters */ assert(e->type == VEH_AIRCRAFT); - assert(!(e->u.air.subtype & AIR_CTOL)); + assert(!(e->VehInfo().subtype & AIR_CTOL)); /* We differ from TTDPatch by resolving the sprite using the primary vehicle 'v', and not using the rotor vehicle 'v->Next()->Next()'. * TTDPatch copies some variables between the vehicles each time, to somehow synchronize the rotor vehicle with the primary vehicle. diff --git a/src/rail.cpp b/src/rail.cpp index 852a4dce6f..d9e41087e3 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -129,7 +129,7 @@ RailTypes GetCompanyRailTypes(CompanyID company, bool introduces) if (ei->climates.Test(_settings_game.game_creation.landscape) && (e->company_avail.Test(company) || TimerGameCalendar::date >= e->intro_date + CalendarTime::DAYS_IN_YEAR)) { - const RailVehicleInfo *rvi = &e->u.rail; + const RailVehicleInfo *rvi = &e->VehInfo(); if (rvi->railveh_type != RAILVEH_WAGON) { assert(rvi->railtypes.Any()); @@ -159,7 +159,7 @@ RailTypes GetRailTypes(bool introduces) const EngineInfo *ei = &e->info; if (!ei->climates.Test(_settings_game.game_creation.landscape)) continue; - const RailVehicleInfo *rvi = &e->u.rail; + const RailVehicleInfo *rvi = &e->VehInfo(); if (rvi->railveh_type != RAILVEH_WAGON) { assert(rvi->railtypes.Any()); if (introduces) { diff --git a/src/road.cpp b/src/road.cpp index 27a6a9bb78..5b796f12ea 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -204,7 +204,7 @@ RoadTypes GetCompanyRoadTypes(CompanyID company, bool introduces) if (ei->climates.Test(_settings_game.game_creation.landscape) && (e->company_avail.Test(company) || TimerGameCalendar::date >= e->intro_date + CalendarTime::DAYS_IN_YEAR)) { - const RoadVehicleInfo *rvi = &e->u.road; + const RoadVehicleInfo *rvi = &e->VehInfo(); assert(rvi->roadtype < ROADTYPE_END); if (introduces) { rts.Set(GetRoadTypeInfo(rvi->roadtype)->introduces_roadtypes); @@ -231,7 +231,7 @@ RoadTypes GetRoadTypes(bool introduces) const EngineInfo *ei = &e->info; if (!ei->climates.Test(_settings_game.game_creation.landscape)) continue; - const RoadVehicleInfo *rvi = &e->u.road; + const RoadVehicleInfo *rvi = &e->VehInfo(); assert(rvi->roadtype < ROADTYPE_END); if (introduces) { rts.Set(GetRoadTypeInfo(rvi->roadtype)->introduces_roadtypes); diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 2117b85159..70717f15b8 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -105,7 +105,7 @@ int RoadVehicle::GetDisplayImageWidth(Point *offset) const static void GetRoadVehIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); - uint8_t spritenum = e->u.road.image_index; + uint8_t spritenum = e->VehInfo().image_index; if (IsCustomVehicleSpriteNum(spritenum)) { GetCustomVehicleIcon(engine, DIR_W, image_type, result); @@ -203,7 +203,7 @@ static uint GetRoadVehLength(const RoadVehicle *v) /* Use callback 11 */ veh_len = GetVehicleCallback(CBID_VEHICLE_LENGTH, 0, 0, v->engine_type, v); } - if (veh_len == CALLBACK_FAILED) veh_len = e->u.road.shorten_factor; + if (veh_len == CALLBACK_FAILED) veh_len = e->VehInfo().shorten_factor; if (veh_len != 0) { length -= Clamp(veh_len, 0, VEHICLE_LENGTH - 1); } @@ -263,12 +263,12 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length) CommandCost CmdBuildRoadVehicle(DoCommandFlags flags, TileIndex tile, const Engine *e, Vehicle **ret) { /* Check that the vehicle can drive on the road in question */ - RoadType rt = e->u.road.roadtype; + RoadType rt = e->VehInfo().roadtype; const RoadTypeInfo *rti = GetRoadTypeInfo(rt); if (!HasTileAnyRoadType(tile, rti->powered_roadtypes)) return CommandCost(STR_ERROR_DEPOT_WRONG_DEPOT_TYPE); if (flags.Test(DoCommandFlag::Execute)) { - const RoadVehicleInfo *rvi = &e->u.road; + const RoadVehicleInfo *rvi = &e->VehInfo(); RoadVehicle *v = new RoadVehicle(); *ret = v; @@ -1645,12 +1645,12 @@ static bool RoadVehController(RoadVehicle *v) Money RoadVehicle::GetRunningCost() const { const Engine *e = this->GetEngine(); - if (e->u.road.running_cost_class == INVALID_PRICE) return 0; + if (e->VehInfo().running_cost_class == INVALID_PRICE) return 0; - uint cost_factor = GetVehicleProperty(this, PROP_ROADVEH_RUNNING_COST_FACTOR, e->u.road.running_cost); + uint cost_factor = GetVehicleProperty(this, PROP_ROADVEH_RUNNING_COST_FACTOR, e->VehInfo().running_cost); if (cost_factor == 0) return 0; - return GetPrice(e->u.road.running_cost_class, cost_factor, e->GetGRF()); + return GetPrice(e->VehInfo().running_cost_class, cost_factor, e->GetGRF()); } bool RoadVehicle::Tick() diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 51ef51069d..3532c6ce87 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -439,7 +439,7 @@ void AfterLoadVehiclesPhase2(bool part_of_load) if (rv->IsFrontEngine()) { rv->gcache.last_speed = rv->cur_speed; // update displayed road vehicle speed - rv->roadtype = Engine::Get(rv->engine_type)->u.road.roadtype; + rv->roadtype = Engine::Get(rv->engine_type)->VehInfo().roadtype; rv->compatible_roadtypes = GetRoadTypeInfo(rv->roadtype)->powered_roadtypes; RoadTramType rtt = GetRoadTramType(rv->roadtype); for (RoadVehicle *u = rv; u != nullptr; u = u->Next()) { diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 434f852763..2591099c95 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -81,7 +81,7 @@ static inline TrackBits GetTileShipTrackStatus(TileIndex tile) static void GetShipIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result) { const Engine *e = Engine::Get(engine); - uint8_t spritenum = e->u.ship.image_index; + uint8_t spritenum = e->VehInfo().image_index; if (IsCustomVehicleSpriteNum(spritenum)) { GetCustomVehicleIcon(engine, DIR_W, image_type, result); @@ -247,7 +247,7 @@ void Ship::UpdateCache() Money Ship::GetRunningCost() const { const Engine *e = this->GetEngine(); - uint cost_factor = GetVehicleProperty(this, PROP_SHIP_RUNNING_COST_FACTOR, e->u.ship.running_cost); + uint cost_factor = GetVehicleProperty(this, PROP_SHIP_RUNNING_COST_FACTOR, e->VehInfo().running_cost); return GetPrice(PR_RUNNING_SHIP, cost_factor, e->GetGRF()); } @@ -886,7 +886,7 @@ CommandCost CmdBuildShip(DoCommandFlags flags, TileIndex tile, const Engine *e, int x; int y; - const ShipVehicleInfo *svi = &e->u.ship; + const ShipVehicleInfo *svi = &e->VehInfo(); Ship *v = new Ship(); *ret = v; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 93a5483cfc..136f321c71 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -146,7 +146,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes) for (Train *u = this; u != nullptr; u = u->Next()) { const Engine *e_u = u->GetEngine(); - const RailVehicleInfo *rvi_u = &e_u->u.rail; + const RailVehicleInfo *rvi_u = &e_u->VehInfo(); if (!e_u->info.misc_flags.Test(EngineMiscFlag::RailTilts)) train_can_tilt = false; min_curve_speed_mod = std::min(min_curve_speed_mod, u->GetCurveSpeedModifier()); @@ -441,7 +441,7 @@ int Train::GetCursorImageOffset() const int reference_width = TRAININFO_DEFAULT_VEHICLE_WIDTH; const Engine *e = this->GetEngine(); - if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->u.rail.image_index)) { + if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->VehInfo().image_index)) { reference_width = e->GetGRF()->traininfo_vehicle_width; } @@ -461,7 +461,7 @@ int Train::GetDisplayImageWidth(Point *offset) const int vehicle_pitch = 0; const Engine *e = this->GetEngine(); - if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->u.rail.image_index)) { + if (e->GetGRF() != nullptr && IsCustomVehicleSpriteNum(e->VehInfo().image_index)) { reference_width = e->GetGRF()->traininfo_vehicle_width; vehicle_pitch = e->GetGRF()->traininfo_vehicle_pitch; } @@ -515,7 +515,7 @@ static void GetRailIcon(EngineID engine, bool rear_head, int &y, EngineImageType { const Engine *e = Engine::Get(engine); Direction dir = rear_head ? DIR_E : DIR_W; - uint8_t spritenum = e->u.rail.image_index; + uint8_t spritenum = e->VehInfo().image_index; if (IsCustomVehicleSpriteNum(spritenum)) { GetCustomVehicleIcon(engine, dir, image_type, result); @@ -636,7 +636,7 @@ static std::vector GetFreeWagonsInDepot(TileIndex tile) */ static CommandCost CmdBuildRailWagon(DoCommandFlags flags, TileIndex tile, const Engine *e, Vehicle **ret) { - const RailVehicleInfo *rvi = &e->u.rail; + const RailVehicleInfo *rvi = &e->VehInfo(); /* Check that the wagon can drive on the track in question */ if (!IsCompatibleRail(rvi->railtypes, GetRailType(tile))) return CMD_ERROR; @@ -770,7 +770,7 @@ static void AddRearEngineToMultiheadedTrain(Train *v) */ CommandCost CmdBuildRailVehicle(DoCommandFlags flags, TileIndex tile, const Engine *e, Vehicle **ret) { - const RailVehicleInfo *rvi = &e->u.rail; + const RailVehicleInfo *rvi = &e->VehInfo(); if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(flags, tile, e, ret); @@ -4074,15 +4074,15 @@ Money Train::GetRunningCost() const do { const Engine *e = v->GetEngine(); - if (e->u.rail.running_cost_class == INVALID_PRICE) continue; + if (e->VehInfo().running_cost_class == INVALID_PRICE) continue; - uint cost_factor = GetVehicleProperty(v, PROP_TRAIN_RUNNING_COST_FACTOR, e->u.rail.running_cost); + uint cost_factor = GetVehicleProperty(v, PROP_TRAIN_RUNNING_COST_FACTOR, e->VehInfo().running_cost); if (cost_factor == 0) continue; /* Halve running cost for multiheaded parts */ if (v->IsMultiheaded()) cost_factor /= 2; - cost += GetPrice(e->u.rail.running_cost_class, cost_factor, e->GetGRF()); + cost += GetPrice(e->VehInfo().running_cost_class, cost_factor, e->GetGRF()); } while ((v = v->GetNextVehicle()) != nullptr); return cost; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index e6573b3726..bb1973e56e 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1925,7 +1925,7 @@ bool CanBuildVehicleInfrastructure(VehicleType type, uint8_t subtype) if (max > 0) { /* Can we actually build the vehicle type? */ for (const Engine *e : Engine::IterateType(type)) { - if (type == VEH_ROAD && GetRoadTramType(e->u.road.roadtype) != (RoadTramType)subtype) continue; + if (type == VEH_ROAD && GetRoadTramType(e->VehInfo().roadtype) != (RoadTramType)subtype) continue; if (e->company_avail.Test(_local_company)) return true; } return false; @@ -1955,7 +1955,7 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ switch (e->type) { default: NOT_REACHED(); case VEH_TRAIN: - if (v != nullptr && parent_engine_type != EngineID::Invalid() && (UsesWagonOverride(v) || (v->IsArticulatedPart() && e->u.rail.railveh_type != RAILVEH_WAGON))) { + if (v != nullptr && parent_engine_type != EngineID::Invalid() && (UsesWagonOverride(v) || (v->IsArticulatedPart() && e->VehInfo().railveh_type != RAILVEH_WAGON))) { /* Wagonoverrides use the colour scheme of the front engine. * Articulated parts use the colour scheme of the first part. (Not supported for articulated wagons) */ engine_type = parent_engine_type; @@ -1966,7 +1966,7 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ if (!IsValidCargoType(cargo_type)) cargo_type = e->GetDefaultCargoType(); if (!IsValidCargoType(cargo_type)) cargo_type = GetCargoTypeByLabel(CT_GOODS); // The vehicle does not carry anything, let's pick some freight cargo assert(IsValidCargoType(cargo_type)); - if (e->u.rail.railveh_type == RAILVEH_WAGON) { + if (e->VehInfo().railveh_type == RAILVEH_WAGON) { if (!CargoSpec::Get(cargo_type)->is_freight) { if (parent_engine_type == EngineID::Invalid()) { return LS_PASSENGER_WAGON_STEAM; @@ -1987,7 +1987,7 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ } else { bool is_mu = e->info.misc_flags.Test(EngineMiscFlag::RailIsMU); - switch (e->u.rail.engclass) { + switch (e->VehInfo().engclass) { default: NOT_REACHED(); case EC_STEAM: return LS_STEAM; case EC_DIESEL: return is_mu ? LS_DMU : LS_DIESEL; @@ -2024,7 +2024,7 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ return IsCargoInClass(cargo_type, CargoClass::Passengers) ? LS_PASSENGER_SHIP : LS_FREIGHT_SHIP; case VEH_AIRCRAFT: - switch (e->u.air.subtype) { + switch (e->VehInfo().subtype) { case AIR_HELI: return LS_HELICOPTER; case AIR_CTOL: return LS_SMALL_PLANE; case AIR_CTOL | AIR_FAST: return LS_LARGE_PLANE; @@ -2641,9 +2641,9 @@ void Vehicle::UpdateVisualEffect(bool allow_power_change) /* Evaluate properties */ uint8_t visual_effect; switch (e->type) { - case VEH_TRAIN: visual_effect = e->u.rail.visual_effect; break; - case VEH_ROAD: visual_effect = e->u.road.visual_effect; break; - case VEH_SHIP: visual_effect = e->u.ship.visual_effect; break; + case VEH_TRAIN: visual_effect = e->VehInfo().visual_effect; break; + case VEH_ROAD: visual_effect = e->VehInfo().visual_effect; break; + case VEH_SHIP: visual_effect = e->VehInfo().visual_effect; break; default: visual_effect = 1 << VE_DISABLE_EFFECT; break; } @@ -2670,7 +2670,7 @@ void Vehicle::UpdateVisualEffect(bool allow_power_change) (!HasBit(visual_effect, VE_DISABLE_EFFECT) && GB(visual_effect, VE_TYPE_START, VE_TYPE_COUNT) == VE_TYPE_DEFAULT)) { /* Only train engines have default effects. * Note: This is independent of whether the engine is a front engine or articulated part or whatever. */ - if (e->type != VEH_TRAIN || e->u.rail.railveh_type == RAILVEH_WAGON || !IsInsideMM(e->u.rail.engclass, EC_STEAM, EC_MONORAIL)) { + if (e->type != VEH_TRAIN || e->VehInfo().railveh_type == RAILVEH_WAGON || !IsInsideMM(e->VehInfo().engclass, EC_STEAM, EC_MONORAIL)) { if (visual_effect == VE_DEFAULT) { visual_effect = 1 << VE_DISABLE_EFFECT; } else { @@ -2679,9 +2679,9 @@ void Vehicle::UpdateVisualEffect(bool allow_power_change) } else { if (visual_effect == VE_DEFAULT) { /* Also set the offset */ - visual_effect = (VE_OFFSET_CENTRE - (e->u.rail.engclass == EC_STEAM ? 4 : 0)) << VE_OFFSET_START; + visual_effect = (VE_OFFSET_CENTRE - (e->VehInfo().engclass == EC_STEAM ? 4 : 0)) << VE_OFFSET_START; } - SB(visual_effect, VE_TYPE_START, VE_TYPE_COUNT, e->u.rail.engclass - EC_STEAM + VE_TYPE_STEAM); + SB(visual_effect, VE_TYPE_START, VE_TYPE_COUNT, e->VehInfo().engclass - EC_STEAM + VE_TYPE_STEAM); } } @@ -3063,7 +3063,7 @@ bool CanVehicleUseStation(EngineID engine_type, const Station *st) case VEH_AIRCRAFT: return st->facilities.Test(StationFacility::Airport) && - st->airport.GetFTA()->flags.Test(e->u.air.subtype & AIR_CTOL ? AirportFTAClass::Flag::Airplanes : AirportFTAClass::Flag::Helicopters); + st->airport.GetFTA()->flags.Test(e->VehInfo().subtype & AIR_CTOL ? AirportFTAClass::Flag::Airplanes : AirportFTAClass::Flag::Helicopters); default: return false; @@ -3124,7 +3124,7 @@ StringID GetVehicleCannotUseStationReason(const Vehicle *v, const Station *st) case VEH_AIRCRAFT: if (!st->facilities.Test(StationFacility::Airport)) return STR_ERROR_NO_AIRPORT; - if (v->GetEngine()->u.air.subtype & AIR_CTOL) { + if (v->GetEngine()->VehInfo().subtype & AIR_CTOL) { return STR_ERROR_AIRPORT_NO_PLANES; } else { return STR_ERROR_AIRPORT_NO_HELICOPTERS; diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 8fe5ec0f6d..aef3b4f246 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -64,26 +64,6 @@ struct NewGRFCache { auto operator<=>(const NewGRFCache &) const = default; }; -/** Meaning of the various bits of the visual effect. */ -enum VisualEffect : uint8_t { - VE_OFFSET_START = 0, ///< First bit that contains the offset (0 = front, 8 = centre, 15 = rear) - VE_OFFSET_COUNT = 4, ///< Number of bits used for the offset - VE_OFFSET_CENTRE = 8, ///< Value of offset corresponding to a position above the centre of the vehicle - - VE_TYPE_START = 4, ///< First bit used for the type of effect - VE_TYPE_COUNT = 2, ///< Number of bits used for the effect type - VE_TYPE_DEFAULT = 0, ///< Use default from engine class - VE_TYPE_STEAM = 1, ///< Steam plumes - VE_TYPE_DIESEL = 2, ///< Diesel fumes - VE_TYPE_ELECTRIC = 3, ///< Electric sparks - - VE_DISABLE_EFFECT = 6, ///< Flag to disable visual effect - VE_ADVANCED_EFFECT = VE_DISABLE_EFFECT, ///< Flag for advanced effects - VE_DISABLE_WAGON_POWER = 7, ///< Flag to disable wagon power - - VE_DEFAULT = 0xFF, ///< Default value to indicate that visual effect should be based on engine class -}; - /** Models for spawning visual effects. */ enum VisualEffectSpawnModel : uint8_t { VESM_NONE = 0, ///< No visual effect diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index c27fb92ded..c5a93b0f37 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -122,10 +122,10 @@ std::tuple CmdBuildVehicle(D /* Check whether the number of vehicles we need to build can be built according to pool space. */ uint num_vehicles; switch (type) { - case VEH_TRAIN: num_vehicles = (e->u.rail.railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) + CountArticulatedParts(eid, false); break; + case VEH_TRAIN: num_vehicles = (e->VehInfo().railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) + CountArticulatedParts(eid, false); break; case VEH_ROAD: num_vehicles = 1 + CountArticulatedParts(eid, false); break; case VEH_SHIP: num_vehicles = 1; break; - case VEH_AIRCRAFT: num_vehicles = e->u.air.subtype & AIR_CTOL ? 2 : 3; break; + case VEH_AIRCRAFT: num_vehicles = e->VehInfo().subtype & AIR_CTOL ? 2 : 3; break; default: NOT_REACHED(); // Safe due to IsDepotTile() } if (!Vehicle::CanAllocateItem(num_vehicles)) return { CommandCost(STR_ERROR_TOO_MANY_VEHICLES_IN_GAME), VehicleID::Invalid(), 0, 0, {} }; @@ -133,7 +133,7 @@ std::tuple CmdBuildVehicle(D /* Check whether we can allocate a unit number. Autoreplace does not allocate * an unit number as it will (always) reuse the one of the replaced vehicle * and (train) wagons don't have an unit number in any scenario. */ - UnitID unit_num = (flags.Test(DoCommandFlag::QueryCost) || flags.Test(DoCommandFlag::AutoReplace) || (type == VEH_TRAIN && e->u.rail.railveh_type == RAILVEH_WAGON)) ? 0 : GetFreeUnitNumber(type); + UnitID unit_num = (flags.Test(DoCommandFlag::QueryCost) || flags.Test(DoCommandFlag::AutoReplace) || (type == VEH_TRAIN && e->VehInfo().railveh_type == RAILVEH_WAGON)) ? 0 : GetFreeUnitNumber(type); if (unit_num == UINT16_MAX) return { CommandCost(STR_ERROR_TOO_MANY_VEHICLES_IN_GAME), VehicleID::Invalid(), 0, 0, {} }; /* If we are refitting we need to temporarily purchase the vehicle to be able to @@ -325,7 +325,7 @@ static CommandCost GetRefitCost(const Vehicle *v, EngineID engine_type, CargoTyp break; case VEH_TRAIN: - base_price = (e->u.rail.railveh_type == RAILVEH_WAGON) ? PR_BUILD_VEHICLE_WAGON : PR_BUILD_VEHICLE_TRAIN; + base_price = (e->VehInfo().railveh_type == RAILVEH_WAGON) ? PR_BUILD_VEHICLE_WAGON : PR_BUILD_VEHICLE_TRAIN; cost_factor <<= 1; expense_type = EXPENSES_TRAIN_RUN; break; From 80e58e751aafdd033abae43b72b7dbd827deafe3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 24 Sep 2025 22:45:18 +0100 Subject: [PATCH 084/280] Fix #14607: Bridge-over-station discrepancy depending on build order. (#14608) When building a custom station, the callback-derived tile layout is ignored during the bridge height test. This caused a discrepancy between building a station under a bridge vs building a bridge over the same station. Test the station tile layout callback during the bridge height test. --- src/station_cmd.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index ce85d755e2..c9a3924f87 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1480,14 +1480,23 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy RailStationTileLayout stl{statspec, numtracks, plat_len}; auto it = stl.begin(); TileIndex tile_track = tile_org; - for (uint i = 0; i != numtracks; ++i) { + for (uint i = 0; i != numtracks; ++i, tile_track += track_delta) { TileIndex tile = tile_track; - for (uint j = 0; j != plat_len; ++j) { - ret = IsRailStationBridgeAboveOk(tile, statspec, StationType::Rail, *it++ + axis); + for (uint j = 0; j != plat_len; ++j, tile += tile_delta, ++it) { + /* Don't check the layout if there's no bridge above anyway. */ + if (!IsBridgeAbove(tile)) continue; + + StationGfx gfx = *it + axis; + if (statspec != nullptr) { + uint32_t platinfo = GetPlatformInfo(AXIS_X, gfx, plat_len, numtracks, j, i, false); + /* As the station is not yet completely finished, the station does not yet exist. */ + uint16_t callback = GetStationCallback(CBID_STATION_BUILD_TILE_LAYOUT, platinfo, 0, statspec, nullptr, tile); + if (callback != CALLBACK_FAILED && callback <= UINT8_MAX) gfx = (callback & ~1) + axis; + } + + ret = IsRailStationBridgeAboveOk(tile, statspec, StationType::Rail, gfx); if (ret.Failed()) return ret; - tile += tile_delta; } - tile_track += track_delta; } /* Check if we can allocate a custom stationspec to this station */ From 6401855842d3daafcfd9c45c5c346ba87d396d36 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:04:50 +0200 Subject: [PATCH 085/280] Fix bff8501: Gcc 15 warns about duplicate type. (#14660) --- src/pathfinder/yapf/yapf_river_builder.cpp | 8 ++++---- src/pathfinder/yapf/yapf_ship_regions.cpp | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pathfinder/yapf/yapf_river_builder.cpp b/src/pathfinder/yapf/yapf_river_builder.cpp index 697ddd2e8f..d61e1aaa37 100644 --- a/src/pathfinder/yapf/yapf_river_builder.cpp +++ b/src/pathfinder/yapf/yapf_river_builder.cpp @@ -22,7 +22,7 @@ struct YapfRiverBuilderNode : CYapfNodeT; /* We don't need a follower but YAPF requires one. */ -struct DummyFollower {}; +struct RiverBuilderFollower {}; /* We don't need a vehicle but YAPF requires one. */ struct DummyVehicle : Vehicle {}; @@ -32,7 +32,7 @@ class YapfRiverBuilder; /* Types struct required for YAPF components. */ struct RiverBuilderTypes { using Tpf = YapfRiverBuilder; - using TrackFollower = DummyFollower; + using TrackFollower = RiverBuilderFollower; using NodeList = RiverBuilderNodeList; using VehicleType = DummyVehicle; }; @@ -74,7 +74,7 @@ public: return n.GetTile() == this->end_tile; } - inline bool PfCalcCost(Node &n, const DummyFollower *) + inline bool PfCalcCost(Node &n, const RiverBuilderFollower *) { n.cost = n.parent->cost + 1 + RandomRange(_settings_game.game_creation.river_route_random); return true; @@ -94,7 +94,7 @@ public: if (IsValidTile(t) && RiverFlowsDown(old_node.GetTile(), t)) { Node &node = Yapf().CreateNewNode(); node.Set(&old_node, t, INVALID_TRACKDIR, true); - Yapf().AddNewNode(node, DummyFollower{}); + Yapf().AddNewNode(node, RiverBuilderFollower{}); } } } diff --git a/src/pathfinder/yapf/yapf_ship_regions.cpp b/src/pathfinder/yapf/yapf_ship_regions.cpp index 089fde6073..ac0a52aac4 100644 --- a/src/pathfinder/yapf/yapf_ship_regions.cpp +++ b/src/pathfinder/yapf/yapf_ship_regions.cpp @@ -76,14 +76,14 @@ struct WaterRegionNode : CYapfNodeT { using WaterRegionNodeList = NodeList; /* We don't need a follower but YAPF requires one. */ -struct DummyFollower : public CFollowTrackWater {}; +struct WaterRegionFollower : public CFollowTrackWater {}; class YapfShipRegions; /* Types struct required for YAPF internals. */ struct WaterRegionTypes { using Tpf = YapfShipRegions; - using TrackFollower = DummyFollower; + using TrackFollower = WaterRegionFollower; using NodeList = WaterRegionNodeList; using VehicleType = Ship; }; From f4f1beba64cdb13c66a08118055933c266bd8a83 Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:37:50 +0200 Subject: [PATCH 086/280] Codechange: Moved PruneIntermediateNodeBranch to rail pathfinder. (#14662) --- src/pathfinder/yapf/yapf_base.hpp | 18 ---------------- src/pathfinder/yapf/yapf_rail.cpp | 35 +++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index f8888e1364..2c8a728953 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -185,24 +185,6 @@ public: } } - /** - * In some cases an intermediate node branch should be pruned. - * The most prominent case is when a red EOL signal is encountered, but - * there was a segment change (e.g. a rail type change) before that. If - * the branch would not be pruned, the rail type change location would - * remain the best intermediate node, and thus the vehicle would still - * go towards the red EOL signal. - */ - void PruneIntermediateNodeBranch(Node *n) - { - bool intermediate_on_branch = false; - while (n != nullptr && !n->segment->end_segment_reason.Test(EndSegmentReason::ChoiceFollows)) { - if (n == Yapf().best_intermediate_node) intermediate_on_branch = true; - n = n->parent; - } - if (intermediate_on_branch) Yapf().best_intermediate_node = n; - } - /** * AddNewNode() - called by Tderived::PfFollowNode() for each child node. * Nodes are evaluated here and added into open list diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 208b65b737..4d22118be5 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -544,14 +544,37 @@ struct CYapfRail_TypesT { typedef CYapfCostRailT PfCost; }; -struct CYapfRail : CYapfT> {}; -struct CYapfRailNo90 : CYapfT> {}; +template +struct CYapfRailBase : CYapfT { + typedef typename Types::NodeList::Item Node; -struct CYapfAnyDepotRail : CYapfT> {}; -struct CYapfAnyDepotRailNo90 : CYapfT> {}; + /** + * In some cases an intermediate node branch should be pruned. + * The most prominent case is when a red EOL signal is encountered, but + * there was a segment change (e.g. a rail type change) before that. If + * the branch would not be pruned, the rail type change location would + * remain the best intermediate node, and thus the vehicle would still + * go towards the red EOL signal. + */ + void PruneIntermediateNodeBranch(Node *n) + { + bool intermediate_on_branch = false; + while (n != nullptr && !n->segment->end_segment_reason.Test(EndSegmentReason::ChoiceFollows)) { + if (n == this->best_intermediate_node) intermediate_on_branch = true; + n = n->parent; + } + if (intermediate_on_branch) this->best_intermediate_node = n; + } +}; -struct CYapfAnySafeTileRail : CYapfT> {}; -struct CYapfAnySafeTileRailNo90 : CYapfT> {}; +struct CYapfRail : CYapfRailBase> {}; +struct CYapfRailNo90 : CYapfRailBase> {}; + +struct CYapfAnyDepotRail : CYapfRailBase> {}; +struct CYapfAnyDepotRailNo90 : CYapfRailBase> {}; + +struct CYapfAnySafeTileRail : CYapfRailBase> {}; +struct CYapfAnySafeTileRailNo90 : CYapfRailBase> {}; Track YapfTrainChooseTrack(const Train *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, bool reserve_track, PBSTileInfo *target, TileIndex *dest) From aa6fb0e9e519200715903dc29a26075ce2eb4d2b Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Fri, 26 Sep 2025 13:35:11 +0200 Subject: [PATCH 087/280] Codechange: Simplified logic of ship leaving a depot. (#14661) --- src/ship_cmd.cpp | 40 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 2591099c95..f741c93f8a 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -359,7 +359,12 @@ static bool CheckReverseShip(const Ship *v, Trackdir *trackdir = nullptr) return YapfShipCheckReverse(v, trackdir); } -static bool CheckShipLeaveDepot(Ship *v) +/** + * Checks whether a ship should stay in the depot. + * @param v Ship to check. + * @return True if the ship should stay in the depot, false if it has to leave. + */ +static bool CheckShipStayInDepot(Ship *v) { if (!v->IsChainInDepot()) return false; @@ -382,34 +387,13 @@ static bool CheckShipLeaveDepot(Ship *v) return u->type == VEH_SHIP && u->cur_speed != 0; })) return true; - TileIndex tile = v->tile; - Axis axis = GetShipDepotAxis(tile); + assert(v->GetVehicleTrackdir() == TRACKDIR_X_NE || v->GetVehicleTrackdir() == TRACKDIR_Y_NW); + v->direction = DiagDirToDir(TrackdirToExitdir(v->GetVehicleTrackdir())); + if (CheckReverseShip(v)) v->direction = ReverseDir(v->direction); - DiagDirection north_dir = ReverseDiagDir(AxisToDiagDir(axis)); - TileIndex north_neighbour = TileAdd(tile, TileOffsByDiagDir(north_dir)); - DiagDirection south_dir = AxisToDiagDir(axis); - TileIndex south_neighbour = TileAdd(tile, 2 * TileOffsByDiagDir(south_dir)); - - TrackBits north_tracks = DiagdirReachesTracks(north_dir) & GetTileShipTrackStatus(north_neighbour); - TrackBits south_tracks = DiagdirReachesTracks(south_dir) & GetTileShipTrackStatus(south_neighbour); - if (north_tracks && south_tracks) { - if (CheckReverseShip(v)) north_tracks = TRACK_BIT_NONE; - } - - if (north_tracks) { - /* Leave towards north */ - v->rotation = v->direction = DiagDirToDir(north_dir); - } else if (south_tracks) { - /* Leave towards south */ - v->rotation = v->direction = DiagDirToDir(south_dir); - } else { - /* Both ways blocked */ - return false; - } - - v->state = AxisToTrackBits(axis); + v->state = AxisToTrackBits(GetShipDepotAxis(v->tile)); + v->rotation = v->direction; v->vehstatus.Reset(VehState::Hidden); - v->cur_speed = 0; v->UpdateViewport(true, true); SetWindowDirty(WC_VEHICLE_DEPOT, v->tile); @@ -698,7 +682,7 @@ static void ShipController(Ship *v) if (v->current_order.IsType(OT_LOADING)) return; - if (CheckShipLeaveDepot(v)) return; + if (CheckShipStayInDepot(v)) return; v->ShowVisualEffect(); From 5822c8cc6555f1635d236777cd3e9db33be2aacb Mon Sep 17 00:00:00 2001 From: Kuhnovic <68320206+Kuhnovic@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:33:20 +0200 Subject: [PATCH 088/280] Codechange: Set YAPF startup nodes directly. (#14663) --- src/pathfinder/yapf/yapf_base.hpp | 12 ++--- src/pathfinder/yapf/yapf_common.hpp | 57 ++++++---------------- src/pathfinder/yapf/yapf_river_builder.cpp | 7 +-- src/pathfinder/yapf/yapf_ship_regions.cpp | 16 +++--- 4 files changed, 28 insertions(+), 64 deletions(-) diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 2c8a728953..9bb84488d5 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -35,7 +35,6 @@ * Requirements to your pathfinder class derived from CYapfBaseT: * -------------------------------------------------------------- * Your pathfinder derived class needs to implement following methods: - * inline void PfSetStartupNodes() * inline void PfFollowNode(Node &org) * inline bool PfCalcCost(Node &n) * inline bool PfCalcEstimate(Node &n) @@ -104,8 +103,6 @@ public: { this->vehicle = v; - Yapf().PfSetStartupNodes(); - for (;;) { this->num_steps++; Node *best_open_node = this->nodes.GetBestOpenNode(); @@ -162,14 +159,13 @@ public: /** Add new node (created by CreateNewNode and filled with data) into open list */ inline void AddStartupNode(Node &n) { + assert(n.parent == nullptr); + assert(this->num_steps == 0); + Yapf().PfNodeCacheFetch(n); /* insert the new node only if it is not there */ if (this->nodes.FindOpenNode(n.key) == nullptr) { this->nodes.InsertOpenNode(n); - } else { - /* if we are here, it means that node is already there - how it is possible? - * probably the train is in the position that both its ends point to the same tile/exit-dir - * very unlikely, but it happened */ } } @@ -191,6 +187,8 @@ public: */ void AddNewNode(Node &n, const TrackFollower &tf) { + assert(n.parent != nullptr); + /* evaluate the node */ bool cached = Yapf().PfNodeCacheFetch(n); if (!cached) { diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp index 7f358dcd33..538f3bd3bf 100644 --- a/src/pathfinder/yapf/yapf_common.hpp +++ b/src/pathfinder/yapf/yapf_common.hpp @@ -23,9 +23,6 @@ public: typedef typename Node::Key Key; ///< key to hash tables protected: - TileIndex origin_tile; ///< origin tile - TrackdirBits origin_trackdirs; ///< origin trackdir mask - /** to access inherited path finder */ inline Tpf &Yapf() { @@ -36,19 +33,12 @@ public: /** Set origin tile / trackdir mask */ void SetOrigin(TileIndex tile, TrackdirBits trackdirs) { - this->origin_tile = tile; - this->origin_trackdirs = trackdirs; - } - - /** Called when YAPF needs to place origin nodes into open list */ - void PfSetStartupNodes() - { - bool is_choice = (KillFirstBit(this->origin_trackdirs) != TRACKDIR_BIT_NONE); - for (TrackdirBits tdb = this->origin_trackdirs; tdb != TRACKDIR_BIT_NONE; tdb = KillFirstBit(tdb)) { + bool is_choice = (KillFirstBit(trackdirs) != TRACKDIR_BIT_NONE); + for (TrackdirBits tdb = trackdirs; tdb != TRACKDIR_BIT_NONE; tdb = KillFirstBit(tdb)) { Trackdir td = (Trackdir)FindFirstBit(tdb); - Node &n1 = Yapf().CreateNewNode(); - n1.Set(nullptr, this->origin_tile, td, is_choice); - Yapf().AddStartupNode(n1); + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, tile, td, is_choice); + Yapf().AddStartupNode(node); } } }; @@ -62,12 +52,6 @@ public: typedef typename Node::Key Key; ///< key to hash tables protected: - TileIndex origin_tile; ///< first origin tile - Trackdir origin_td; ///< first origin trackdir - TileIndex reverse_tile; ///< second (reverse) origin tile - Trackdir reverse_td; ///< second (reverse) origin trackdir - int reverse_penalty; ///< penalty to be added for using the reverse origin - /** to access inherited path finder */ inline Tpf &Yapf() { @@ -76,28 +60,19 @@ protected: public: /** set origin (tiles, trackdirs, etc.) */ - void SetOrigin(TileIndex tile, Trackdir td, TileIndex tiler = INVALID_TILE, Trackdir tdr = INVALID_TRACKDIR, int reverse_penalty = 0) + void SetOrigin(TileIndex forward_tile, Trackdir forward_td, TileIndex reverse_tile = INVALID_TILE, + Trackdir reverse_td = INVALID_TRACKDIR, int reverse_penalty = 0) { - this->origin_tile = tile; - this->origin_td = td; - this->reverse_tile = tiler; - this->reverse_td = tdr; - this->reverse_penalty = reverse_penalty; - } - - /** Called when YAPF needs to place origin nodes into open list */ - void PfSetStartupNodes() - { - if (this->origin_tile != INVALID_TILE && this->origin_td != INVALID_TRACKDIR) { - Node &n1 = Yapf().CreateNewNode(); - n1.Set(nullptr, this->origin_tile, this->origin_td, false); - Yapf().AddStartupNode(n1); + if (forward_tile != INVALID_TILE && forward_td != INVALID_TRACKDIR) { + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, forward_tile, forward_td, false); + Yapf().AddStartupNode(node); } - if (this->reverse_tile != INVALID_TILE && this->reverse_td != INVALID_TRACKDIR) { - Node &n2 = Yapf().CreateNewNode(); - n2.Set(nullptr, this->reverse_tile, this->reverse_td, false); - n2.cost = this->reverse_penalty; - Yapf().AddStartupNode(n2); + if (reverse_tile != INVALID_TILE && reverse_td != INVALID_TRACKDIR) { + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, reverse_tile, reverse_td, false); + node.cost = reverse_penalty; + Yapf().AddStartupNode(node); } } }; diff --git a/src/pathfinder/yapf/yapf_river_builder.cpp b/src/pathfinder/yapf/yapf_river_builder.cpp index d61e1aaa37..c084f841c9 100644 --- a/src/pathfinder/yapf/yapf_river_builder.cpp +++ b/src/pathfinder/yapf/yapf_river_builder.cpp @@ -47,7 +47,6 @@ public: using Key = Node::Key; protected: - TileIndex start_tile; ///< Start tile of the river TileIndex end_tile; ///< End tile of the river inline YapfRiverBuilder &Yapf() @@ -58,14 +57,10 @@ protected: public: YapfRiverBuilder(TileIndex start_tile, TileIndex end_tile) { - this->start_tile = start_tile; this->end_tile = end_tile; - } - void PfSetStartupNodes() - { Node &node = Yapf().CreateNewNode(); - node.Set(nullptr, this->start_tile, INVALID_TRACKDIR, false); + node.Set(nullptr, start_tile, INVALID_TRACKDIR, false); Yapf().AddStartupNode(node); } diff --git a/src/pathfinder/yapf/yapf_ship_regions.cpp b/src/pathfinder/yapf/yapf_ship_regions.cpp index ac0a52aac4..caa243fc10 100644 --- a/src/pathfinder/yapf/yapf_ship_regions.cpp +++ b/src/pathfinder/yapf/yapf_ship_regions.cpp @@ -113,7 +113,12 @@ public: void AddOrigin(const WaterRegionPatchDesc &water_region_patch) { if (water_region_patch.label == INVALID_WATER_REGION_PATCH) return; - if (!HasOrigin(water_region_patch)) this->origin_keys.emplace_back(water_region_patch); + if (!HasOrigin(water_region_patch)) { + this->origin_keys.emplace_back(water_region_patch); + Node &node = Yapf().CreateNewNode(); + node.Set(nullptr, water_region_patch); + Yapf().AddStartupNode(node); + } } bool HasOrigin(const WaterRegionPatchDesc &water_region_patch) @@ -126,15 +131,6 @@ public: this->dest.Set(water_region_patch); } - void PfSetStartupNodes() - { - for (const WaterRegionPatchKey &origin_key : this->origin_keys) { - Node &node = Yapf().CreateNewNode(); - node.Set(nullptr, origin_key); - Yapf().AddStartupNode(node); - } - } - inline void PfFollowNode(Node &old_node) { VisitWaterRegionPatchCallback visit_func = [&](const WaterRegionPatchDesc &water_region_patch) { From 0b99a0b66a9f3d9bff5b325258146dc713f1bc5c Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Fri, 26 Sep 2025 10:37:27 -0400 Subject: [PATCH 089/280] Feature: Draw infinite water when all borders are water (#13289) --- src/genworld_gui.cpp | 49 ++++++++++++++++----------- src/heightmap.cpp | 5 +++ src/landscape.cpp | 30 ++++++++++++++++ src/landscape.h | 2 ++ src/lang/english.txt | 7 ++-- src/object_cmd.cpp | 5 +++ src/settings_type.h | 8 +++++ src/table/settings/world_settings.ini | 7 ++++ src/void_cmd.cpp | 7 +++- src/water_cmd.cpp | 7 ++++ src/widgets/genworld_widget.h | 2 +- 11 files changed, 105 insertions(+), 24 deletions(-) diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index b91a51945e..f910f75cf3 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -115,7 +115,7 @@ static constexpr NWidgetPart _nested_generate_landscape_widgets[] = { NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetToolTip(STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1), + NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_BORDERS_PULLDOWN), SetToolTip(STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1), EndContainer(), EndContainer(), @@ -379,6 +379,7 @@ static DropDownList BuildTownNameDropDown() static const StringID _elevations[] = {STR_TERRAIN_TYPE_VERY_FLAT, STR_TERRAIN_TYPE_FLAT, STR_TERRAIN_TYPE_HILLY, STR_TERRAIN_TYPE_MOUNTAINOUS, STR_TERRAIN_TYPE_ALPINIST, STR_TERRAIN_TYPE_CUSTOM}; static const StringID _sea_lakes[] = {STR_SEA_LEVEL_VERY_LOW, STR_SEA_LEVEL_LOW, STR_SEA_LEVEL_MEDIUM, STR_SEA_LEVEL_HIGH, STR_SEA_LEVEL_CUSTOM}; static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT}; +static const StringID _borders[] = {STR_MAPGEN_BORDER_RANDOMIZE, STR_MAPGEN_BORDER_MANUAL, STR_MAPGEN_BORDER_INFINITE_WATER}; static const StringID _smoothness[] = {STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH}; static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE}; static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM}; @@ -471,7 +472,7 @@ struct GenerateLandscapeWindow : public Window { case WID_GL_RIVER_PULLDOWN: return GetString(_rivers[_settings_newgame.game_creation.amount_of_rivers]); case WID_GL_SMOOTHNESS_PULLDOWN: return GetString(_smoothness[_settings_newgame.game_creation.tgen_smoothness]); case WID_GL_VARIETY_PULLDOWN: return GetString(_variety[_settings_newgame.game_creation.variety]); - case WID_GL_BORDERS_RANDOM: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOMIZE : STR_MAPGEN_BORDER_MANUAL); + case WID_GL_BORDERS_PULLDOWN: return GetString(_borders[_settings_newgame.game_creation.water_border_presets]); case WID_GL_WATER_NE: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthEast) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); case WID_GL_WATER_NW: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthWest) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); case WID_GL_WATER_SE: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::SouthEast) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); @@ -507,12 +508,10 @@ struct GenerateLandscapeWindow : public Window { if (mode == GLWM_GENERATE) { this->SetWidgetDisabledState(WID_GL_SMOOTHNESS_PULLDOWN, _settings_newgame.game_creation.land_generator == LG_ORIGINAL); this->SetWidgetDisabledState(WID_GL_VARIETY_PULLDOWN, _settings_newgame.game_creation.land_generator == LG_ORIGINAL); - this->SetWidgetDisabledState(WID_GL_BORDERS_RANDOM, _settings_newgame.game_creation.land_generator == LG_ORIGINAL || !_settings_newgame.construction.freeform_edges); + this->SetWidgetDisabledState(WID_GL_BORDERS_PULLDOWN, _settings_newgame.game_creation.land_generator == LG_ORIGINAL); this->SetWidgetsDisabledState(_settings_newgame.game_creation.land_generator == LG_ORIGINAL || !_settings_newgame.construction.freeform_edges || _settings_newgame.game_creation.water_borders == BorderFlag::Random, WID_GL_WATER_NW, WID_GL_WATER_NE, WID_GL_WATER_SE, WID_GL_WATER_SW); - this->SetWidgetLoweredState(WID_GL_BORDERS_RANDOM, _settings_newgame.game_creation.water_borders == BorderFlag::Random); - this->SetWidgetLoweredState(WID_GL_WATER_NW, _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthWest)); this->SetWidgetLoweredState(WID_GL_WATER_NE, _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthEast)); this->SetWidgetLoweredState(WID_GL_WATER_SE, _settings_newgame.game_creation.water_borders.Test(BorderFlag::SouthEast)); @@ -622,10 +621,7 @@ struct GenerateLandscapeWindow : public Window { case WID_GL_SMOOTHNESS_PULLDOWN: strs = _smoothness; break; case WID_GL_VARIETY_PULLDOWN: strs = _variety; break; case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: strs = _rotation; break; - case WID_GL_BORDERS_RANDOM: - d = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOMIZE), GetStringBoundingBox(STR_MAPGEN_BORDER_MANUAL)); - break; - + case WID_GL_BORDERS_PULLDOWN: strs = _borders; break; case WID_GL_WATER_NE: case WID_GL_WATER_NW: case WID_GL_WATER_SE: @@ -807,7 +803,11 @@ struct GenerateLandscapeWindow : public Window { ShowDropDownMenu(this, _variety, _settings_newgame.game_creation.variety, WID_GL_VARIETY_PULLDOWN, 0, 0); break; - /* Freetype map borders */ + /* Map borders */ + case WID_GL_BORDERS_PULLDOWN: + ShowDropDownMenu(this, _borders, _settings_newgame.game_creation.water_border_presets, WID_GL_BORDERS_PULLDOWN, 0, 0); + break; + case WID_GL_WATER_NW: _settings_newgame.game_creation.water_borders.Flip(BorderFlag::NorthWest); SndClickBeep(); @@ -832,16 +832,6 @@ struct GenerateLandscapeWindow : public Window { this->InvalidateData(); break; - case WID_GL_BORDERS_RANDOM: - if (_settings_newgame.game_creation.water_borders == BorderFlag::Random) { - _settings_newgame.game_creation.water_borders.Reset(); - } else { - _settings_newgame.game_creation.water_borders = BorderFlag::Random; - } - SndClickBeep(); - this->InvalidateData(); - break; - case WID_GL_AI_BUTTON: ///< AI Settings ShowAIConfigWindow(); break; @@ -908,6 +898,25 @@ struct GenerateLandscapeWindow : public Window { break; } + case WID_GL_BORDERS_PULLDOWN: { + switch (index) { + case BFP_RANDOM: + _settings_newgame.game_creation.water_borders = BorderFlag::Random; + _settings_newgame.construction.freeform_edges = true; + break; + case BFP_MANUAL: + _settings_newgame.game_creation.water_borders = {}; + _settings_newgame.construction.freeform_edges = true; + break; + case BFP_INFINITE_WATER: + _settings_newgame.game_creation.water_borders = BORDERFLAGS_ALL; + _settings_newgame.construction.freeform_edges = false; + break; + } + _settings_newgame.game_creation.water_border_presets = static_cast(index); + break; + } + case WID_GL_WATER_PULLDOWN: { if ((uint)index == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) { this->widget_id = widget; diff --git a/src/heightmap.cpp b/src/heightmap.cpp index 543ef17952..9d7a09bf7e 100644 --- a/src/heightmap.cpp +++ b/src/heightmap.cpp @@ -9,6 +9,7 @@ #include "stdafx.h" #include "heightmap.h" +#include "landscape.h" #include "clear_map.h" #include "strings_func.h" #include "void_map.h" @@ -523,6 +524,10 @@ bool LoadHeightmap(DetailedFileType dft, std::string_view filename) GreyscaleToMapHeights(x, y, map); FixSlopes(); + + /* If all map borders are water, we will draw infinite water. */ + _settings_game.construction.freeform_edges = !IsMapSurroundedByWater(); + MarkWholeScreenDirty(); return true; diff --git a/src/landscape.cpp b/src/landscape.cpp index 61aa649874..621de24c01 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -637,6 +637,36 @@ void ClearSnowLine() _snow_line = nullptr; } +/** + * Check if all tiles on the map edge should be considered water borders. + * @return true If the edge of the map is flat and height 0, allowing for infinite water borders. + */ +bool IsMapSurroundedByWater() +{ + auto check_tile = [](uint x, uint y) -> bool { + auto [slope, h] = GetTilePixelSlopeOutsideMap(x, y); + return ((slope == SLOPE_FLAT) && (h == 0)); + }; + + /* Check the map corners. */ + if (!check_tile(0, 0)) return false; + if (!check_tile(0, Map::SizeY())) return false; + if (!check_tile(Map::SizeX(), 0)) return false; + if (!check_tile(Map::SizeX(), Map::SizeY())) return false; + + /* Check the map edges.*/ + for (uint x = 0; x <= Map::SizeX(); x++) { + if (!check_tile(x, 0)) return false; + if (!check_tile(x, Map::SizeY())) return false; + } + for (uint y = 1; y < Map::SizeY(); y++) { + if (!check_tile(0, y)) return false; + if (!check_tile(Map::SizeX(), y)) return false; + } + + return true; +} + /** * Clear a piece of landscape * @param flags of operation to conduct diff --git a/src/landscape.h b/src/landscape.h index db2a9781e4..3f33789694 100644 --- a/src/landscape.h +++ b/src/landscape.h @@ -33,6 +33,8 @@ uint8_t HighestSnowLine(); uint8_t LowestSnowLine(); void ClearSnowLine(); +bool IsMapSurroundedByWater(); + int GetSlopeZInCorner(Slope tileh, Corner corner); std::tuple GetFoundationSlope(TileIndex tile); diff --git a/src/lang/english.txt b/src/lang/english.txt index f33f4848fc..9aab6f47bb 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3428,8 +3428,11 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Southwes STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Random -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual + +###length 3 +STR_MAPGEN_BORDER_RANDOMIZE :Random +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Infinite Water STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index b17b30c9c3..4cf1c579e8 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -253,6 +253,11 @@ CommandCost CmdBuildObject(DoCommandFlags flags, TileIndex tile, ObjectType type Owner o = GetTileOwner(t); if (o != OWNER_NONE && o != OWNER_WATER) cost.AddCost(CheckOwnership(o, t)); + /* If freeform edges are disabled, don't allow building on edge tiles. */ + if (!_settings_game.construction.freeform_edges && (!IsInsideMM(TileX(t), 1, Map::MaxX() - 1) || !IsInsideMM(TileY(t), 1, Map::MaxY() - 1))) { + return CommandCost(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP); + } + /* However, the tile has to be clear of vehicles. */ cost.AddCost(EnsureNoVehicleOnGround(t)); } diff --git a/src/settings_type.h b/src/settings_type.h index 86350e4054..ebbe874da0 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -64,6 +64,13 @@ enum IndustryDensity : uint8_t { ID_END, ///< Number of industry density settings. }; +/** Possible options for the Borders pulldown in the Genworld GUI. */ +enum BorderFlagPresets : uint8_t { + BFP_RANDOM = 0, + BFP_MANUAL, + BFP_INFINITE_WATER, +}; + /** Possible values for the "timekeeping_units" setting. */ enum TimekeepingUnits : uint8_t { TKU_CALENDAR = 0, @@ -375,6 +382,7 @@ struct GameCreationSettings { uint8_t town_name; ///< the town name generator used for town names LandscapeType landscape; ///< the landscape we're currently in BorderFlags water_borders; ///< bitset of the borders that are water + BorderFlagPresets water_border_presets; ///< presets for map border options uint16_t custom_town_number; ///< manually entered number of towns uint16_t custom_industry_number; ///< manually entered number of industries uint8_t variety; ///< variety level applied to TGP diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini index a4c97cf854..f17bf4d729 100644 --- a/src/table/settings/world_settings.ini +++ b/src/table/settings/world_settings.ini @@ -268,6 +268,13 @@ def = 15 min = 0 max = 16 +[SDT_VAR] +var = game_creation.water_border_presets +type = SLE_UINT8 +def = BFP_RANDOM +min = BFP_RANDOM +max = BFP_INFINITE_WATER + [SDT_VAR] var = game_creation.custom_town_number type = SLE_UINT16 diff --git a/src/void_cmd.cpp b/src/void_cmd.cpp index 2665f4d2bf..a49483e91c 100644 --- a/src/void_cmd.cpp +++ b/src/void_cmd.cpp @@ -21,7 +21,12 @@ static void DrawTile_Void(TileInfo *ti) { - DrawGroundSprite(SPR_FLAT_BARE_LAND + SlopeToSpriteOffset(ti->tileh), PALETTE_ALL_BLACK); + /* If freeform edges are off, draw infinite water off the edges of the map. */ + if (!_settings_game.construction.freeform_edges) { + DrawGroundSprite(SPR_FLAT_WATER_TILE + SlopeToSpriteOffset(ti->tileh), PAL_NONE); + } else { + DrawGroundSprite(SPR_FLAT_BARE_LAND + SlopeToSpriteOffset(ti->tileh), PALETTE_ALL_BLACK); + } } diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 39a06374e1..6533d34f22 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -454,6 +454,13 @@ CommandCost CmdBuildLock(DoCommandFlags flags, TileIndex tile) DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile)); if (dir == INVALID_DIAGDIR) return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); + TileIndex lower_tile = TileAddByDiagDir(tile, ReverseDiagDir(dir)); + + /* If freeform edges are disabled, don't allow building on edge tiles. */ + if (!_settings_game.construction.freeform_edges && (!IsInsideMM(TileX(lower_tile), 1, Map::MaxX() - 1) || !IsInsideMM(TileY(lower_tile), 1, Map::MaxY() - 1))) { + return CommandCost(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP); + } + return DoBuildLock(tile, dir, flags); } diff --git a/src/widgets/genworld_widget.h b/src/widgets/genworld_widget.h index 8d852a117b..e57e4efd08 100644 --- a/src/widgets/genworld_widget.h +++ b/src/widgets/genworld_widget.h @@ -54,7 +54,7 @@ enum GenerateLandscapeWidgets : WidgetID { WID_GL_SMOOTHNESS_PULLDOWN, ///< Dropdown 'Smoothness'. WID_GL_VARIETY_PULLDOWN, ///< Dropdown 'Variety distribution'. - WID_GL_BORDERS_RANDOM, ///< 'Random'/'Manual' borders. + WID_GL_BORDERS_PULLDOWN, ///< Dropdown 'Map edges'. WID_GL_WATER_NW, ///< NW 'Water'/'Freeform'. WID_GL_WATER_NE, ///< NE 'Water'/'Freeform'. WID_GL_WATER_SE, ///< SE 'Water'/'Freeform'. From 41837d093bcf9a163a2ef919a3caac3c5c25d430 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 26 Sep 2025 19:00:45 +0100 Subject: [PATCH 090/280] Change: Record and show multiple errors for each NewGRF. (#14658) --- src/newgrf.cpp | 13 ++++++++----- src/newgrf/newgrf_actb.cpp | 27 +++++++++++++-------------- src/newgrf_config.cpp | 13 ++----------- src/newgrf_config.h | 6 ++++-- src/newgrf_gui.cpp | 31 +++++++++++++++++-------------- 5 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 26a6a66fea..15a06a53f4 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -148,9 +148,12 @@ GRFError *DisableGrf(StringID message, GRFConfig *config) if (message == STR_NULL) return nullptr; - config->error = {STR_NEWGRF_ERROR_MSG_FATAL, message}; - if (config == _cur_gps.grfconfig) config->error->param_value[0] = _cur_gps.nfo_line; - return &config->error.value(); + auto it = std::ranges::find(config->errors, _cur_gps.nfo_line, &GRFError::nfo_line); + if (it == std::end(config->errors)) { + it = config->errors.emplace(it, STR_NEWGRF_ERROR_MSG_FATAL, _cur_gps.nfo_line, message); + } + if (config == _cur_gps.grfconfig) it->param_value[0] = _cur_gps.nfo_line; + return &*it; } /** @@ -392,7 +395,7 @@ static void ResetNewGRF() static void ResetNewGRFErrors() { for (const auto &c : _grfconfig) { - c->error.reset(); + c->errors.clear(); } } @@ -1841,7 +1844,7 @@ void LoadNewGRF(SpriteID load_index, uint num_baseset) if (num_non_static == NETWORK_MAX_GRF_COUNT) { Debug(grf, 0, "'{}' is not loaded as the maximum number of non-static GRFs has been reached", c->filename); c->status = GCS_DISABLED; - c->error = {STR_NEWGRF_ERROR_MSG_FATAL, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED}; + c->errors.emplace_back(STR_NEWGRF_ERROR_MSG_FATAL, 0, STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED); continue; } num_non_static++; diff --git a/src/newgrf/newgrf_actb.cpp b/src/newgrf/newgrf_actb.cpp index 53aed45267..11a3f7e322 100644 --- a/src/newgrf/newgrf_actb.cpp +++ b/src/newgrf/newgrf_actb.cpp @@ -73,9 +73,6 @@ static void GRFLoadError(ByteReader &buf) /* This is a fatal error, so make sure the GRF is deactivated and no * more of it gets loaded. */ DisableGrf(); - - /* Make sure we show fatal errors, instead of silly infos from before */ - _cur_gps.grfconfig->error.reset(); } if (message_id >= lengthof(msgstr) && message_id != 0xFF) { @@ -88,39 +85,41 @@ static void GRFLoadError(ByteReader &buf) return; } - /* For now we can only show one message per newgrf file. */ - if (_cur_gps.grfconfig->error.has_value()) return; + /* An error may be emitted multiple times in different loading stages. Re-use if so. */ + auto it = std::ranges::find(_cur_gps.grfconfig->errors, _cur_gps.nfo_line, &GRFError::nfo_line); + if (it == std::end(_cur_gps.grfconfig->errors)) { + it = _cur_gps.grfconfig->errors.emplace(it, sevstr[severity], _cur_gps.nfo_line); + } - _cur_gps.grfconfig->error = {sevstr[severity]}; - GRFError *error = &_cur_gps.grfconfig->error.value(); + GRFError &error = *it; if (message_id == 0xFF) { /* This is a custom error message. */ if (buf.HasData()) { std::string_view message = buf.ReadString(); - error->custom_message = TranslateTTDPatchCodes(_cur_gps.grffile->grfid, lang, true, message, SCC_RAW_STRING_POINTER); + error.custom_message = TranslateTTDPatchCodes(_cur_gps.grffile->grfid, lang, true, message, SCC_RAW_STRING_POINTER); } else { GrfMsg(7, "GRFLoadError: No custom message supplied."); - error->custom_message.clear(); + error.custom_message.clear(); } } else { - error->message = msgstr[message_id]; + error.message = msgstr[message_id]; } if (buf.HasData()) { std::string_view data = buf.ReadString(); - error->data = TranslateTTDPatchCodes(_cur_gps.grffile->grfid, lang, true, data); + error.data = TranslateTTDPatchCodes(_cur_gps.grffile->grfid, lang, true, data); } else { GrfMsg(7, "GRFLoadError: No message data supplied."); - error->data.clear(); + error.data.clear(); } /* Only two parameter numbers can be used in the string. */ - for (uint i = 0; i < error->param_value.size() && buf.HasData(); i++) { + for (uint i = 0; i < error.param_value.size() && buf.HasData(); i++) { uint param_number = buf.ReadByte(); - error->param_value[i] = _cur_gps.grffile->GetParam(param_number); + error.param_value[i] = _cur_gps.grffile->GetParam(param_number); } } diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index eb4862c7a0..422fd57f4c 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -40,7 +40,7 @@ GRFConfig::GRFConfig(const GRFConfig &config) : name(config.name), info(config.info), url(config.url), - error(config.error), + errors(config.errors), version(config.version), min_loadable_version(config.min_loadable_version), flags(config.flags), @@ -156,15 +156,6 @@ GRFConfigList _grfconfig_newgame; GRFConfigList _grfconfig_static; uint _missing_extra_graphics = 0; -/** - * Construct a new GRFError. - * @param severity The severity of this error. - * @param message The actual error-string. - */ -GRFError::GRFError(StringID severity, StringID message) : message(message), severity(severity) -{ -} - /** * Get the value of the given user-changeable parameter. * @param info The grf parameter info to get the value for. @@ -472,7 +463,7 @@ compatible_grf: c->ident.md5sum = f->ident.md5sum; c->name = f->name; c->info = f->name; - c->error.reset(); + c->errors.clear(); c->version = f->version; c->min_loadable_version = f->min_loadable_version; c->num_valid_params = f->num_valid_params; diff --git a/src/newgrf_config.h b/src/newgrf_config.h index 337058f6b6..8b03088f96 100644 --- a/src/newgrf_config.h +++ b/src/newgrf_config.h @@ -107,12 +107,14 @@ struct GRFIdentifier { /** Information about why GRF had problems during initialisation */ struct GRFError { - GRFError(StringID severity, StringID message = {}); + GRFError(StringID severity, uint32_t nfo_line, StringID message = {}) + : message(message), severity(severity), nfo_line(nfo_line) {} std::string custom_message{}; ///< Custom message (if present) std::string data{}; ///< Additional data for message and custom_message StringID message{}; ///< Default message StringID severity{}; ///< Info / Warning / Error / Fatal + uint32_t nfo_line; ///< Line within NewGRF of error. std::array param_value{}; ///< Values of GRF parameters to show for message and custom_message }; @@ -169,7 +171,7 @@ struct GRFConfig { GRFTextWrapper name{}; ///< NOSAVE: GRF name (Action 0x08) GRFTextWrapper info{}; ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08) GRFTextWrapper url{}; ///< NOSAVE: URL belonging to this GRF. - std::optional error = std::nullopt; ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B) + std::vector errors; ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B) uint32_t version = 0; ///< NOSAVE: Version a NewGRF can set so only the newest NewGRF is shown uint32_t min_loadable_version = 0; ///< NOSAVE: Minimum compatible version a NewGRF can define diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index f33c298519..86a8b38e03 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -51,17 +51,20 @@ void ShowNewGRFError() for (const auto &c : _grfconfig) { /* Only show Fatal and Error level messages */ - if (!c->error.has_value() || (c->error->severity != STR_NEWGRF_ERROR_MSG_FATAL && c->error->severity != STR_NEWGRF_ERROR_MSG_ERROR)) continue; + if (c->errors.empty()) continue; + + const GRFError &error = c->errors.back(); + if (error.severity != STR_NEWGRF_ERROR_MSG_FATAL && error.severity != STR_NEWGRF_ERROR_MSG_ERROR) continue; std::vector params; params.emplace_back(c->GetName()); - params.emplace_back(c->error->message != STR_NULL ? c->error->message : STR_JUST_RAW_STRING); - params.emplace_back(c->error->custom_message); + params.emplace_back(error.message != STR_NULL ? error.message : STR_JUST_RAW_STRING); + params.emplace_back(error.custom_message); params.emplace_back(c->filename); - params.emplace_back(c->error->data); - for (const uint32_t &value : c->error->param_value) params.emplace_back(value); + params.emplace_back(error.data); + for (const uint32_t &value : error.param_value) params.emplace_back(value); - if (c->error->severity == STR_NEWGRF_ERROR_MSG_FATAL) { + if (error.severity == STR_NEWGRF_ERROR_MSG_FATAL) { ShowErrorMessage(GetEncodedStringWithArgs(STR_NEWGRF_ERROR_FATAL_POPUP, params), {}, WL_CRITICAL); } else { ShowErrorMessage(GetEncodedStringWithArgs(STR_NEWGRF_ERROR_POPUP, params), {}, WL_ERROR); @@ -81,15 +84,15 @@ static StringID GetGRFPaletteString(uint8_t palette) static void ShowNewGRFInfo(const GRFConfig &c, const Rect &r, bool show_params) { Rect tr = r.Shrink(WidgetDimensions::scaled.frametext); - if (c.error.has_value()) { - std::arrayparam_value)>> params{}; + for (const GRFError &error : c.errors) { + std::array> params{}; auto it = params.begin(); - *it++ = c.error->custom_message; // is skipped by built-in messages + *it++ = error.custom_message; // is skipped by built-in messages *it++ = c.filename; - *it++ = c.error->data; - for (const uint32_t &value : c.error->param_value) *it++ = value; + *it++ = error.data; + for (const uint32_t &value : error.param_value) *it++ = value; - tr.top = DrawStringMultiLine(tr, GetString(c.error->severity, GetStringWithArgs(c.error->message != STR_NULL ? c.error->message : STR_JUST_RAW_STRING, {params.begin(), it}))); + tr.top = DrawStringMultiLine(tr, GetString(error.severity, GetStringWithArgs(error.message != STR_NULL ? error.message : STR_JUST_RAW_STRING, {params.begin(), it}))); } /* Draw filename or not if it is not known (GRF sent over internet) */ @@ -868,8 +871,8 @@ struct NewGRFWindow : public Window, NewGRFScanCallback { } } DrawSprite(SPR_SQUARE, pal, square_left, tr.top + square_offset_y); - if (c->error.has_value()) DrawSprite(SPR_WARNING_SIGN, 0, warning_left, tr.top + warning_offset_y); - uint txtoffset = !c->error.has_value() ? 0 : warning.width; + if (!c->errors.empty()) DrawSprite(SPR_WARNING_SIGN, 0, warning_left, tr.top + warning_offset_y); + uint txtoffset = c->errors.empty() ? 0 : warning.width; DrawString(text_left + (rtl ? 0 : txtoffset), text_right - (rtl ? txtoffset : 0), tr.top + offset_y, std::move(text), h ? TC_WHITE : TC_ORANGE); tr.top += step_height; } From 18e28077cc9c5fdec7455e5ff9cc2a89d27982df Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 27 Sep 2025 01:50:33 +0100 Subject: [PATCH 091/280] Fix: League Table layout broken with RTL languages. (#14667) --- src/league_gui.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/league_gui.cpp b/src/league_gui.cpp index 52452e88ef..0624f2f17c 100644 --- a/src/league_gui.cpp +++ b/src/league_gui.cpp @@ -111,14 +111,14 @@ public: bool rtl = _current_text_dir == TD_RTL; Rect ordinal = ir.WithWidth(this->ordinal_width, rtl); - uint icon_left = ir.Indent(rtl ? this->text_width : this->ordinal_width, rtl).left; - Rect text = ir.WithWidth(this->text_width, !rtl); + Rect icon = ir.Indent(this->ordinal_width + WidgetDimensions::scaled.hsep_wide, rtl).WithWidth(this->icon.width, rtl); + Rect text = ir.Indent(this->ordinal_width + this->icon.width + WidgetDimensions::scaled.hsep_wide * 2, rtl); for (uint i = 0; i != this->companies.size(); i++) { const Company *c = this->companies[i]; DrawString(ordinal.left, ordinal.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)); - DrawCompanyIcon(c->index, icon_left, ir.top + icon_y_offset); + DrawCompanyIcon(c->index, icon.left, ir.top + icon_y_offset); DrawString(text.left, text.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_NAME, c->index, c->index, GetPerformanceTitleFromValue(c->old_economy[0].performance_history))); ir.top += this->line_height; @@ -133,7 +133,6 @@ public: for (uint i = 0; i < MAX_COMPANIES; i++) { this->ordinal_width = std::max(this->ordinal_width, GetStringBoundingBox(GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)).width); } - this->ordinal_width += WidgetDimensions::scaled.hsep_wide; // Keep some extra spacing uint widest_width = 0; StringID widest_title = STR_NULL; @@ -154,7 +153,7 @@ public: this->text_width = widest_width + WidgetDimensions::scaled.hsep_indent * 3; // Keep some extra spacing - size.width = WidgetDimensions::scaled.framerect.Horizontal() + this->ordinal_width + this->icon.width + this->text_width + WidgetDimensions::scaled.hsep_wide; + size.width = WidgetDimensions::scaled.framerect.Horizontal() + this->ordinal_width + WidgetDimensions::scaled.hsep_wide + this->icon.width + WidgetDimensions::scaled.hsep_wide + this->text_width; size.height = this->line_height * MAX_COMPANIES + WidgetDimensions::scaled.framerect.Vertical(); } From 910eeef17f66070ec32a9b868637691c80ec8841 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 27 Sep 2025 04:38:00 +0000 Subject: [PATCH 092/280] Update: Translations from eints --- src/lang/afrikaans.txt | 2 ++ src/lang/arabic_egypt.txt | 2 ++ src/lang/basque.txt | 2 ++ src/lang/belarusian.txt | 2 ++ src/lang/brazilian_portuguese.txt | 2 ++ src/lang/bulgarian.txt | 2 ++ src/lang/catalan.txt | 2 ++ src/lang/chuvash.txt | 2 ++ src/lang/croatian.txt | 2 ++ src/lang/czech.txt | 2 ++ src/lang/danish.txt | 2 ++ src/lang/dutch.txt | 2 ++ src/lang/english_AU.txt | 2 ++ src/lang/english_US.txt | 2 ++ src/lang/esperanto.txt | 2 ++ src/lang/estonian.txt | 2 ++ src/lang/faroese.txt | 2 ++ src/lang/finnish.txt | 2 ++ src/lang/french.txt | 2 ++ src/lang/frisian.txt | 2 ++ src/lang/gaelic.txt | 2 ++ src/lang/galician.txt | 2 ++ src/lang/german.txt | 2 ++ src/lang/greek.txt | 2 ++ src/lang/hebrew.txt | 2 ++ src/lang/hindi.txt | 2 ++ src/lang/hungarian.txt | 2 ++ src/lang/icelandic.txt | 2 ++ src/lang/ido.txt | 2 ++ src/lang/indonesian.txt | 2 ++ src/lang/irish.txt | 2 ++ src/lang/italian.txt | 2 ++ src/lang/japanese.txt | 2 ++ src/lang/korean.txt | 2 ++ src/lang/latin.txt | 2 ++ src/lang/latvian.txt | 2 ++ src/lang/lithuanian.txt | 2 ++ src/lang/luxembourgish.txt | 2 ++ src/lang/macedonian.txt | 2 ++ src/lang/malay.txt | 2 ++ src/lang/maltese.txt | 2 ++ src/lang/maori.txt | 2 ++ src/lang/marathi.txt | 2 ++ src/lang/norwegian_bokmal.txt | 2 ++ src/lang/norwegian_nynorsk.txt | 2 ++ src/lang/persian.txt | 2 ++ src/lang/polish.txt | 2 ++ src/lang/portuguese.txt | 2 ++ src/lang/romanian.txt | 2 ++ src/lang/russian.txt | 2 ++ src/lang/serbian.txt | 2 ++ src/lang/simplified_chinese.txt | 2 ++ src/lang/slovak.txt | 2 ++ src/lang/slovenian.txt | 2 ++ src/lang/spanish.txt | 2 ++ src/lang/spanish_MX.txt | 2 ++ src/lang/swedish.txt | 2 ++ src/lang/tamil.txt | 2 ++ src/lang/thai.txt | 2 ++ src/lang/traditional_chinese.txt | 2 ++ src/lang/turkish.txt | 2 ++ src/lang/ukrainian.txt | 2 ++ src/lang/urdu.txt | 2 ++ src/lang/vietnamese.txt | 2 ++ src/lang/welsh.txt | 2 ++ 65 files changed, 130 insertions(+) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 0071396cda..9b1b1f2d00 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -2846,6 +2846,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Suidwes STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vryeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Lukraak + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Lukraak STR_MAPGEN_BORDER_MANUAL :{BLACK}Handmatig diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 446c7df549..45f5a44a80 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -2769,6 +2769,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK} الج STR_MAPGEN_BORDER_FREEFORM :{BLACK} حر STR_MAPGEN_BORDER_WATER :{BLACK} ماء STR_MAPGEN_BORDER_RANDOM :{BLACK} عشوائي + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK} عشوائيا STR_MAPGEN_BORDER_MANUAL :{BLACK} يدوي diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 9ab90acd54..7c6f5ec08d 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -2687,6 +2687,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Hegomend STR_MAPGEN_BORDER_FREEFORM :{BLACK}Modu askea STR_MAPGEN_BORDER_WATER :{BLACK}Ura STR_MAPGEN_BORDER_RANDOM :{BLACK}Ausazkoa + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Ausazkoa STR_MAPGEN_BORDER_MANUAL :{BLACK}Eskuz egin diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 924bfd9c6f..088433e101 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -3631,6 +3631,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Паўд STR_MAPGEN_BORDER_FREEFORM :{BLACK}Зямля STR_MAPGEN_BORDER_WATER :{BLACK}Вада STR_MAPGEN_BORDER_RANDOM :{BLACK}Выпадковы + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Выпадковыя STR_MAPGEN_BORDER_MANUAL :{BLACK}Уручную diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index bb169f5799..fefdaba10e 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3429,6 +3429,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sudoeste STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma livre STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatório STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 4fe0633338..8358254842 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -3358,6 +3358,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Югоз STR_MAPGEN_BORDER_FREEFORM :{BLACK}Произволни STR_MAPGEN_BORDER_WATER :{BLACK}Вода STR_MAPGEN_BORDER_RANDOM :{BLACK}Случаен + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Случаен STR_MAPGEN_BORDER_MANUAL :{BLACK}Ръчно нагалсени diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 11352fd53f..8125287d6d 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3429,6 +3429,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sud-oest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma lliure STR_MAPGEN_BORDER_WATER :{BLACK}Aigua STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatori + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatori STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 5bad0832c4..4ba7521f99 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -1222,6 +1222,8 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Катталу # Strings for map borders at game generation +###length 3 + # SE Map generation diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 1f60e84316..3b47a5321b 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -3012,6 +3012,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Jugozapa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Slobodni oblik STR_MAPGEN_BORDER_WATER :{BLACK}Voda STR_MAPGEN_BORDER_RANDOM :{BLACK}Nasumično + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Nasumično STR_MAPGEN_BORDER_MANUAL :{BLACK}Ručno diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 51022ea029..52af5153df 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -3466,6 +3466,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Jihozáp STR_MAPGEN_BORDER_FREEFORM :{BLACK}terén STR_MAPGEN_BORDER_WATER :{BLACK}voda STR_MAPGEN_BORDER_RANDOM :{BLACK}náhodně + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}náhodně STR_MAPGEN_BORDER_MANUAL :{BLACK}vlastní diff --git a/src/lang/danish.txt b/src/lang/danish.txt index d498678ef3..2cf6189056 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sydvest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fri udformning STR_MAPGEN_BORDER_WATER :{BLACK}Vand STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfældige + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilfældige STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index ecd71919e2..0bd5d514a0 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Zuidwest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vrije vorm STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Willekeurig + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Willekeurig STR_MAPGEN_BORDER_MANUAL :{BLACK}Handmatig diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 804b09d79c..9b55f7cbb1 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Southwes STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Random STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index c04f5ce88f..5983f412d0 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Southwes STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Random STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 1b9aa8ce11..afe5f84a31 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -3256,6 +3256,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sudokcid STR_MAPGEN_BORDER_FREEFORM :{BLACK}Libermana STR_MAPGEN_BORDER_WATER :{BLACK}Akvo STR_MAPGEN_BORDER_RANDOM :{BLACK}Hazarde + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Hazarde STR_MAPGEN_BORDER_MANUAL :{BLACK}Permane diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 49dab0b1c7..1e9fa32ff4 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -3376,6 +3376,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Edel STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vaba STR_MAPGEN_BORDER_WATER :{BLACK}Vesi STR_MAPGEN_BORDER_RANDOM :{BLACK}Suvaline + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Suvaline STR_MAPGEN_BORDER_MANUAL :{BLACK}Määratud diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 15dba5c772..439b1d04dd 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -2524,6 +2524,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Útsynni STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Vatn STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilvildarligt + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilvildarligt STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuelt diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 2271da1991..8a8cbac8b1 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Lounas STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vapaa STR_MAPGEN_BORDER_WATER :{BLACK}Vesi STR_MAPGEN_BORDER_RANDOM :{BLACK}Sattumanvarainen + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Sattumanvarainen STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuaalinen diff --git a/src/lang/french.txt b/src/lang/french.txt index d1b844e658..0e4e6fc263 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -3429,6 +3429,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sud-Oues STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forme libre STR_MAPGEN_BORDER_WATER :{BLACK}Eau STR_MAPGEN_BORDER_RANDOM :{BLACK}Aléatoire + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aléatoire STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 81441e30a4..75a2cb27ac 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -2660,6 +2660,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Súdwest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Frij foarmje STR_MAPGEN_BORDER_WATER :{BLACK}Wetter STR_MAPGEN_BORDER_RANDOM :{BLACK}Samar wat + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Samar wat STR_MAPGEN_BORDER_MANUAL :{BLACK}Hânmjittich diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 4b246f9ae3..9f6df83f83 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -3032,6 +3032,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Iar-dhea STR_MAPGEN_BORDER_FREEFORM :{BLACK}Cruth saor STR_MAPGEN_BORDER_WATER :{BLACK}Uisge STR_MAPGEN_BORDER_RANDOM :{BLACK}Air thuaiream + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Air thuaiream STR_MAPGEN_BORDER_MANUAL :{BLACK}A làimh diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 4859d6aff2..b9a979c8a8 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -3427,6 +3427,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Suroeste STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma libre STR_MAPGEN_BORDER_WATER :{BLACK}Auga STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatorio STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/german.txt b/src/lang/german.txt index f02568c7c0..ec1cc44966 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -3425,6 +3425,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Südwest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Beliebig STR_MAPGEN_BORDER_WATER :{BLACK}Wasser STR_MAPGEN_BORDER_RANDOM :{BLACK}Zufällig + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Zufällig STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuell diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 4ad2d4028b..2c366e6440 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3521,6 +3521,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Νοτι STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ελεύθερη μορφή STR_MAPGEN_BORDER_WATER :{BLACK}Νερό STR_MAPGEN_BORDER_RANDOM :{BLACK}Τυχαία + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Τυχαία STR_MAPGEN_BORDER_MANUAL :{BLACK}Χειροκίνητος diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 403a05aa87..662b4e1086 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -3045,6 +3045,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}דרום STR_MAPGEN_BORDER_FREEFORM :{BLACK}יד חופשית STR_MAPGEN_BORDER_WATER :{BLACK}מים STR_MAPGEN_BORDER_RANDOM :{BLACK}אקראי + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}אקראי STR_MAPGEN_BORDER_MANUAL :{BLACK}ידני diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 658351a121..7d1a61c12f 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -1004,6 +1004,8 @@ STR_MAPGEN_TOWN_NAME_ITALIAN :इटैलि STR_MAPGEN_BORDER_WATER :{BLACK}जल STR_MAPGEN_BORDER_RANDOM :{BLACK}यादृच्छिक +###length 3 + # SE Map generation diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 5d137f1e27..b9b9067247 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3492,6 +3492,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Délnyug STR_MAPGEN_BORDER_FREEFORM :{BLACK}Szárazföld STR_MAPGEN_BORDER_WATER :{BLACK}Víz STR_MAPGEN_BORDER_RANDOM :{BLACK}Véletlen + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Véletlen STR_MAPGEN_BORDER_MANUAL :{BLACK}Kézi diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 8bcd7bb027..eeb4f28dd7 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -2630,6 +2630,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Suðvest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Frjálsar STR_MAPGEN_BORDER_WATER :{BLACK}Vatn STR_MAPGEN_BORDER_RANDOM :{BLACK}Slembin + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Slembnar STR_MAPGEN_BORDER_MANUAL :{BLACK}Forvaldar diff --git a/src/lang/ido.txt b/src/lang/ido.txt index b66649307a..9ce3042cab 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -1071,6 +1071,8 @@ STR_MAPGEN_BY :{BLACK}* # Strings for map borders at game generation +###length 3 + # SE Map generation diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 606976eaae..bce95528ef 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -3240,6 +3240,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Barat Da STR_MAPGEN_BORDER_FREEFORM :{BLACK}Bebas STR_MAPGEN_BORDER_WATER :{BLACK}Perairan STR_MAPGEN_BORDER_RANDOM :{BLACK}Acak + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Acak STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 5bb301b9ee..32eae7e2b3 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -3043,6 +3043,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Iardheis STR_MAPGEN_BORDER_FREEFORM :{BLACK}Saorfhoirme STR_MAPGEN_BORDER_WATER :{BLACK}Uisce STR_MAPGEN_BORDER_RANDOM :{BLACK}Randamach + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Randamach STR_MAPGEN_BORDER_MANUAL :{BLACK}De láimh diff --git a/src/lang/italian.txt b/src/lang/italian.txt index e3f80fa5c2..9e93da9af0 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sud-oves STR_MAPGEN_BORDER_FREEFORM :{BLACK}Variabile STR_MAPGEN_BORDER_WATER :{BLACK}Acqua STR_MAPGEN_BORDER_RANDOM :{BLACK}Casuale + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Casuale STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuale diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index f5170ca57f..b1419a6484 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -3176,6 +3176,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}南西 STR_MAPGEN_BORDER_FREEFORM :{BLACK}自由形成 STR_MAPGEN_BORDER_WATER :{BLACK}水域 STR_MAPGEN_BORDER_RANDOM :{BLACK}ランダム + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}ランダム設定 STR_MAPGEN_BORDER_MANUAL :{BLACK}手動設定 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 9ad3186e14..45c9642f8e 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3429,6 +3429,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}남서 STR_MAPGEN_BORDER_FREEFORM :{BLACK}변경 가능 STR_MAPGEN_BORDER_WATER :{BLACK}물 STR_MAPGEN_BORDER_RANDOM :{BLACK}임의 + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}임의 STR_MAPGEN_BORDER_MANUAL :{BLACK}사용자 정의 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 76eaa9afea..1091802ffc 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -3000,6 +3000,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Africus STR_MAPGEN_BORDER_FREEFORM :{BLACK}Quilibet STR_MAPGEN_BORDER_WATER :{BLACK}Aqua STR_MAPGEN_BORDER_RANDOM :{BLACK}Fortuiti + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Fortuiti STR_MAPGEN_BORDER_MANUAL :{BLACK}Manu diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index a342fe2b9b..62221c230c 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -3431,6 +3431,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Dienvidr STR_MAPGEN_BORDER_FREEFORM :{BLACK}Brīvā forma STR_MAPGEN_BORDER_WATER :{BLACK}Ūdens STR_MAPGEN_BORDER_RANDOM :{BLACK}Nejauša + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Nejaušas STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuāli diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 865935973c..bd4e4ad2aa 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -3463,6 +3463,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Pietvaka STR_MAPGEN_BORDER_FREEFORM :{BLACK}Laisva forma STR_MAPGEN_BORDER_WATER :{BLACK}Vanduo STR_MAPGEN_BORDER_RANDOM :{BLACK}Atsitiktinis + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Atsitiktiniai STR_MAPGEN_BORDER_MANUAL :{BLACK}Pasirinktiniai diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index a1d3b19840..1e3b62ef5a 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -3385,6 +3385,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Südwest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fräiform STR_MAPGEN_BORDER_WATER :{BLACK}Waasser STR_MAPGEN_BORDER_RANDOM :{BLACK}Zoufälleg + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Zoufall STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuell diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 552c372116..18b63a7eae 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1460,6 +1460,8 @@ STR_MAPGEN_BY :{BLACK}* # Strings for map borders at game generation +###length 3 + # SE Map generation diff --git a/src/lang/malay.txt b/src/lang/malay.txt index b484731b79..27ca9a0852 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -2527,6 +2527,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Barat da STR_MAPGEN_BORDER_FREEFORM :{BLACK}Bebas STR_MAPGEN_BORDER_WATER :{BLACK}Air STR_MAPGEN_BORDER_RANDOM :{BLACK}Rambang + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Rambang STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 2b95200f6f..597ed222da 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -974,6 +974,8 @@ STR_MAPGEN_BY :{BLACK}* # Strings for map borders at game generation +###length 3 + # SE Map generation diff --git a/src/lang/maori.txt b/src/lang/maori.txt index 0e1f95a9fc..6507cfa6a7 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -3426,6 +3426,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Tongamā STR_MAPGEN_BORDER_FREEFORM :{BLACK}Hanga noa STR_MAPGEN_BORDER_WATER :{BLACK}Wai STR_MAPGEN_BORDER_RANDOM :{BLACK}Matapōkere + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Matapōkere STR_MAPGEN_BORDER_MANUAL :{BLACK}Ā-ringa diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 7df164e113..3e98b72c54 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -1324,6 +1324,8 @@ STR_MAPGEN_TOWN_NAME_ITALIAN :ईटेलि # Strings for map borders at game generation STR_MAPGEN_BORDER_WATER :{BLACK}पाणी +###length 3 + STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index da763e6bdb..c0e7ebd892 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3430,6 +3430,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sørvest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Frihånds STR_MAPGEN_BORDER_WATER :{BLACK}Sjø STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfeldig + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilfeldige STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuelle diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 1c71fe8533..bcf128286a 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -2710,6 +2710,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sørvest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Frihands STR_MAPGEN_BORDER_WATER :{BLACK}Vatn STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfeldig + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilfeldig STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuell diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 86037e1e77..7504651f8e 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -2785,6 +2785,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}جنوب STR_MAPGEN_BORDER_FREEFORM :{BLACK}قالب آزاد STR_MAPGEN_BORDER_WATER :{BLACK}دریا STR_MAPGEN_BORDER_RANDOM :{BLACK}تصادفی + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}تصادفی STR_MAPGEN_BORDER_MANUAL :{BLACK}دستی diff --git a/src/lang/polish.txt b/src/lang/polish.txt index e620986c82..21f40b3f08 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3808,6 +3808,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Płd.-za STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ląd STR_MAPGEN_BORDER_WATER :{BLACK}Woda STR_MAPGEN_BORDER_RANDOM :{BLACK}Losowe + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Losowo STR_MAPGEN_BORDER_MANUAL :{BLACK}Użytkownika diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 6c1aa845e9..c5aa9fc218 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3429,6 +3429,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sudoeste STR_MAPGEN_BORDER_FREEFORM :{BLACK}Modo livre STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatório STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index eb1c78c721..4094e24a36 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -3376,6 +3376,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sud-vest STR_MAPGEN_BORDER_FREEFORM :{BLACK}Pământ STR_MAPGEN_BORDER_WATER :{BLACK}Apă STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleator + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleator STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 277fbec78e..834471c13d 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3603,6 +3603,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Юго- STR_MAPGEN_BORDER_FREEFORM :{BLACK}Свободный STR_MAPGEN_BORDER_WATER :{BLACK}Водный STR_MAPGEN_BORDER_RANDOM :{BLACK}Случайно + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Случайно STR_MAPGEN_BORDER_MANUAL :{BLACK}Вручную diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index f14ffc78a1..de1746c3c6 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -3431,6 +3431,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Jugozapa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Kopno STR_MAPGEN_BORDER_WATER :{BLACK}More STR_MAPGEN_BORDER_RANDOM :{BLACK}Proizvoljno + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Proizvoljno STR_MAPGEN_BORDER_MANUAL :{BLACK}Podešeno diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 136c41ea47..7fdcf877b7 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}西南 STR_MAPGEN_BORDER_FREEFORM :{BLACK}自由形式 STR_MAPGEN_BORDER_WATER :{BLACK}水面 STR_MAPGEN_BORDER_RANDOM :{BLACK}随机 + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}随机 STR_MAPGEN_BORDER_MANUAL :{BLACK}手动 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index daeb7280a0..4701412c18 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -3378,6 +3378,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Juho-zá STR_MAPGEN_BORDER_FREEFORM :{BLACK}Náhodne STR_MAPGEN_BORDER_WATER :{BLACK}Voda STR_MAPGEN_BORDER_RANDOM :{BLACK}Náhodne + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Náhodne STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuálne diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index a58b036798..971b8b9752 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -2930,6 +2930,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Jugozaho STR_MAPGEN_BORDER_FREEFORM :{BLACK}Poljubno STR_MAPGEN_BORDER_WATER :{BLACK}Voda STR_MAPGEN_BORDER_RANDOM :{BLACK}Naključno + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Naključno STR_MAPGEN_BORDER_MANUAL :{BLACK}Ročno diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 5341c2ca88..70640bd735 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -3398,6 +3398,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Suroeste STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma libre STR_MAPGEN_BORDER_WATER :{BLACK}Agua STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatorio STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 351e2d84ea..f21104fa5e 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -3422,6 +3422,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Suroeste STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma libre STR_MAPGEN_BORDER_WATER :{BLACK}Agua STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatorio STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 298b9d86b2..66d7390739 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Sydväst STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fri form STR_MAPGEN_BORDER_WATER :{BLACK}Vatten STR_MAPGEN_BORDER_RANDOM :{BLACK}På måfå + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}På måfå STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuella diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index fea48d823a..b9ece84d8e 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -3023,6 +3023,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}தெ STR_MAPGEN_BORDER_FREEFORM :{BLACK}இலவசமாக STR_MAPGEN_BORDER_WATER :{BLACK}தண்ணீர் STR_MAPGEN_BORDER_RANDOM :{BLACK}ஏதொவொன்று + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}ஏதோவொன்று STR_MAPGEN_BORDER_MANUAL :{BLACK}எனது diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 8c4ffb9ab7..9e7b2c7115 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -2861,6 +2861,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}ตะ STR_MAPGEN_BORDER_FREEFORM :{BLACK}ไม่ยึดติดรูปแบบ STR_MAPGEN_BORDER_WATER :{BLACK}น้ำ STR_MAPGEN_BORDER_RANDOM :{BLACK}สุ่ม + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}สุ่ม STR_MAPGEN_BORDER_MANUAL :{BLACK}ปรับแต่งเอง diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 8acba78a68..b9f596ba69 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}西南 STR_MAPGEN_BORDER_FREEFORM :{BLACK}自由地形 STR_MAPGEN_BORDER_WATER :{BLACK}水域 STR_MAPGEN_BORDER_RANDOM :{BLACK}隨機 + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}隨機 STR_MAPGEN_BORDER_MANUAL :{BLACK}手動 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index bbb8b60d96..1734004986 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -3338,6 +3338,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Güneyba STR_MAPGEN_BORDER_FREEFORM :{BLACK}Serbest STR_MAPGEN_BORDER_WATER :{BLACK}Su STR_MAPGEN_BORDER_RANDOM :{BLACK}Rastgele + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Rastgele STR_MAPGEN_BORDER_MANUAL :{BLACK}El ile diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 72b8665bfd..5ef10b2455 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -3537,6 +3537,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}півд STR_MAPGEN_BORDER_FREEFORM :{BLACK}вільний формат STR_MAPGEN_BORDER_WATER :{BLACK}вода STR_MAPGEN_BORDER_RANDOM :{BLACK}довільно + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}довільно STR_MAPGEN_BORDER_MANUAL :{BLACK}вручну diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 63aade5047..4fa01ee68c 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -2222,6 +2222,8 @@ STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}کھیل STR_MAPGEN_BORDER_FREEFORM :{BLACK}فری فارم STR_MAPGEN_BORDER_WATER :{BLACK}پانی STR_MAPGEN_BORDER_RANDOM :{BLACK}بے ترتیب + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}بے ترتیب STR_MAPGEN_BORDER_MANUAL :{BLACK}دستی diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index cac92cff53..8c211ff30f 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -3428,6 +3428,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}Tây Nam STR_MAPGEN_BORDER_FREEFORM :{BLACK}Dạng Tự Do STR_MAPGEN_BORDER_WATER :{BLACK}Nước STR_MAPGEN_BORDER_RANDOM :{BLACK}Ngẫu Nhiên + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Ngẫu Nhiên STR_MAPGEN_BORDER_MANUAL :{BLACK}Điều Chỉnh diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 066674e3c2..85133232b2 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -3414,6 +3414,8 @@ STR_MAPGEN_SOUTHWEST :{BLACK}De Orlle STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ffurfrydd STR_MAPGEN_BORDER_WATER :{BLACK}Dŵr STR_MAPGEN_BORDER_RANDOM :{BLACK}Ar hap + +###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Ar hap STR_MAPGEN_BORDER_MANUAL :{BLACK}Â Llaw From 5e7cb08411dedea5c12214d0cd18b9ccd086be70 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Wed, 24 Sep 2025 21:13:43 +0200 Subject: [PATCH 093/280] Fix #14549: changing interface scale could underflow map zoom --- src/zoom_type.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/zoom_type.h b/src/zoom_type.h index 06fb780aab..272d2fab95 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -12,8 +12,12 @@ #include "core/enum_type.hpp" -/** All zoom levels we know. */ -enum class ZoomLevel : uint8_t { +/** + * All zoom levels we know. + * + * The underlying type is signed so subtract-and-Clamp works without need for casting. + */ +enum class ZoomLevel : int8_t { /* Our possible zoom-levels */ Begin = 0, ///< Begin for iteration. Min = Begin, ///< Minimum zoom level. From 69ea970d6eebf9b1ef3b9302ed20062ee43d2fa3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 27 Sep 2025 13:08:06 +0100 Subject: [PATCH 094/280] Codefix 18e28077cc: Local variable icon shadowed member variable icon. (#14668) Rename rects used in league table to avoid name shadowing. Now uses the same naming as in ScriptLeagueWindow. --- src/league_gui.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/league_gui.cpp b/src/league_gui.cpp index 0624f2f17c..4278ad0ba0 100644 --- a/src/league_gui.cpp +++ b/src/league_gui.cpp @@ -57,7 +57,7 @@ static inline StringID GetPerformanceTitleFromValue(uint value) class PerformanceLeagueWindow : public Window { private: GUIList companies{}; - uint ordinal_width = 0; ///< The width of the ordinal number + uint rank_width = 0; ///< The width of the rank uint text_width = 0; ///< The width of the actual text int line_height = 0; ///< Height of the text lines Dimension icon{}; ///< Dimension of the company icon. @@ -110,17 +110,17 @@ public: int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2; bool rtl = _current_text_dir == TD_RTL; - Rect ordinal = ir.WithWidth(this->ordinal_width, rtl); - Rect icon = ir.Indent(this->ordinal_width + WidgetDimensions::scaled.hsep_wide, rtl).WithWidth(this->icon.width, rtl); - Rect text = ir.Indent(this->ordinal_width + this->icon.width + WidgetDimensions::scaled.hsep_wide * 2, rtl); + Rect rank_rect = ir.WithWidth(this->rank_width, rtl); + Rect icon_rect = ir.Indent(this->rank_width + WidgetDimensions::scaled.hsep_wide, rtl).WithWidth(this->icon.width, rtl); + Rect text_rect = ir.Indent(this->rank_width + this->icon.width + WidgetDimensions::scaled.hsep_wide * 2, rtl); for (uint i = 0; i != this->companies.size(); i++) { const Company *c = this->companies[i]; - DrawString(ordinal.left, ordinal.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)); + DrawString(rank_rect.left, rank_rect.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)); - DrawCompanyIcon(c->index, icon.left, ir.top + icon_y_offset); + DrawCompanyIcon(c->index, icon_rect.left, ir.top + icon_y_offset); - DrawString(text.left, text.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_NAME, c->index, c->index, GetPerformanceTitleFromValue(c->old_economy[0].performance_history))); + DrawString(text_rect.left, text_rect.right, ir.top + text_y_offset, GetString(STR_COMPANY_LEAGUE_COMPANY_NAME, c->index, c->index, GetPerformanceTitleFromValue(c->old_economy[0].performance_history))); ir.top += this->line_height; } } @@ -129,9 +129,9 @@ public: { if (widget != WID_PLT_BACKGROUND) return; - this->ordinal_width = 0; + this->rank_width = 0; for (uint i = 0; i < MAX_COMPANIES; i++) { - this->ordinal_width = std::max(this->ordinal_width, GetStringBoundingBox(GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)).width); + this->rank_width = std::max(this->rank_width, GetStringBoundingBox(GetString(STR_COMPANY_LEAGUE_COMPANY_RANK, i + 1)).width); } uint widest_width = 0; @@ -153,7 +153,7 @@ public: this->text_width = widest_width + WidgetDimensions::scaled.hsep_indent * 3; // Keep some extra spacing - size.width = WidgetDimensions::scaled.framerect.Horizontal() + this->ordinal_width + WidgetDimensions::scaled.hsep_wide + this->icon.width + WidgetDimensions::scaled.hsep_wide + this->text_width; + size.width = WidgetDimensions::scaled.framerect.Horizontal() + this->rank_width + WidgetDimensions::scaled.hsep_wide + this->icon.width + WidgetDimensions::scaled.hsep_wide + this->text_width; size.height = this->line_height * MAX_COMPANIES + WidgetDimensions::scaled.framerect.Vertical(); } From 0aaeb6f7e765d21c43bbcf54dca74edac8a82c94 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 27 Sep 2025 18:10:22 +0100 Subject: [PATCH 095/280] Codechange: Rename TrackFollowers to follower. (#14664) Replaces use of codestyle breaking `F` in places. --- src/pathfinder/yapf/yapf_base.hpp | 4 +-- src/pathfinder/yapf/yapf_costrail.hpp | 36 +++++++++++++------------- src/pathfinder/yapf/yapf_node_rail.hpp | 10 +++---- src/pathfinder/yapf/yapf_rail.cpp | 18 ++++++------- src/pathfinder/yapf/yapf_ship.cpp | 16 ++++++------ 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 9bb84488d5..6555b6539e 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -185,7 +185,7 @@ public: * AddNewNode() - called by Tderived::PfFollowNode() for each child node. * Nodes are evaluated here and added into open list */ - void AddNewNode(Node &n, const TrackFollower &tf) + void AddNewNode(Node &n, const TrackFollower &follower) { assert(n.parent != nullptr); @@ -197,7 +197,7 @@ public: this->stats_cache_hits++; } - bool valid = Yapf().PfCalcCost(n, &tf); + bool valid = Yapf().PfCalcCost(n, &follower); if (valid) valid = Yapf().PfCalcEstimate(n); diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 1c2b1e61fb..2cda842dd3 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -271,11 +271,11 @@ public: * Calculates only the cost of given node, adds it to the parent node cost * and stores the result into Node::cost member */ - inline bool PfCalcCost(Node &n, const TrackFollower *tf) + inline bool PfCalcCost(Node &n, const TrackFollower *follower) { assert(!n.flags_u.flags_s.target_seen); - assert(tf->new_tile == n.key.tile); - assert((HasTrackdir(tf->new_td_bits, n.key.td))); + assert(follower->new_tile == n.key.tile); + assert((HasTrackdir(follower->new_td_bits, n.key.td))); /* Does the node have some parent node? */ bool has_parent = (n.parent != nullptr); @@ -326,7 +326,7 @@ public: EndSegmentReasons end_segment_reason{}; - TrackFollower tf_local(v, Yapf().GetCompatibleRailTypes()); + TrackFollower follower_local{v, Yapf().GetCompatibleRailTypes()}; if (!has_parent) { /* We will jump to the middle of the cost calculator assuming that segment cache is not used. */ @@ -378,7 +378,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th segment_cost += Yapf().OneTileCost(cur.tile, cur.td); /* If we skipped some tunnel/bridge/station tiles, add their base cost */ - segment_cost += YAPF_TILE_LENGTH * tf->tiles_skipped; + segment_cost += YAPF_TILE_LENGTH * follower->tiles_skipped; /* Slope cost. */ segment_cost += Yapf().SlopeCost(cur.tile, cur.td); @@ -387,7 +387,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th segment_cost += Yapf().SignalCost(n, cur.tile, cur.td); /* Reserved tiles. */ - segment_cost += Yapf().ReservationCost(n, cur.tile, cur.td, tf->tiles_skipped); + segment_cost += Yapf().ReservationCost(n, cur.tile, cur.td, follower->tiles_skipped); end_segment_reason = segment.end_segment_reason; @@ -445,9 +445,9 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th /* Waypoint is also a good reason to finish. */ end_segment_reason.Set(EndSegmentReason::Waypoint); - } else if (tf->is_station) { + } else if (follower->is_station) { /* Station penalties. */ - uint platform_length = tf->tiles_skipped + 1; + uint platform_length = follower->tiles_skipped + 1; /* We don't know yet if the station is our target or not. Act like * if it is pass-through station (not our destination). */ segment_cost += Yapf().PfGetSettings().rail_station_penalty * platform_length; @@ -466,10 +466,10 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th if (n.num_signals_passed < this->sig_look_ahead_costs.size()) { int min_speed = 0; - int max_speed = tf->GetSpeedLimit(&min_speed); + int max_speed = follower->GetSpeedLimit(&min_speed); int max_veh_speed = std::min(v->GetDisplayMaxSpeed(), v->current_order.GetMaxSpeed()); if (max_speed < max_veh_speed) { - extra_cost += YAPF_TILE_LENGTH * (max_veh_speed - max_speed) * (4 + tf->tiles_skipped) / max_veh_speed; + extra_cost += YAPF_TILE_LENGTH * (max_veh_speed - max_speed) * (4 + follower->tiles_skipped) / max_veh_speed; } if (min_speed > max_veh_speed) { extra_cost += YAPF_TILE_LENGTH * (min_speed - max_veh_speed); @@ -483,13 +483,13 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th } /* Move to the next tile/trackdir. */ - tf = &tf_local; - tf_local.Init(v, Yapf().GetCompatibleRailTypes()); + follower = &follower_local; + follower_local.Init(v, Yapf().GetCompatibleRailTypes()); - if (!tf_local.Follow(cur.tile, cur.td)) { - assert(tf_local.err != TrackFollower::EC_NONE); + if (!follower_local.Follow(cur.tile, cur.td)) { + assert(follower_local.err != TrackFollower::EC_NONE); /* Can't move to the next tile (EOL?). */ - if (tf_local.err == TrackFollower::EC_RAIL_ROAD_TYPE) { + if (follower_local.err == TrackFollower::EC_RAIL_ROAD_TYPE) { end_segment_reason.Set(EndSegmentReason::RailType); } else { end_segment_reason.Set(EndSegmentReason::DeadEnd); @@ -502,14 +502,14 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th } /* Check if the next tile is not a choice. */ - if (KillFirstBit(tf_local.new_td_bits) != TRACKDIR_BIT_NONE) { + if (KillFirstBit(follower_local.new_td_bits) != TRACKDIR_BIT_NONE) { /* More than one segment will follow. Close this one. */ end_segment_reason.Set(EndSegmentReason::ChoiceFollows); break; } /* Gather the next tile/trackdir/tile_type/rail_type. */ - TILE next(tf_local.new_tile, (Trackdir)FindFirstBit(tf_local.new_td_bits)); + TILE next(follower_local.new_tile, (Trackdir)FindFirstBit(follower_local.new_td_bits)); if (TrackFollower::DoTrackMasking() && IsTileType(next.tile, MP_RAILWAY)) { if (HasSignalOnTrackdir(next.tile, next.td) && IsPbsSignal(GetSignalType(next.tile, TrackdirToTrack(next.td)))) { @@ -538,7 +538,7 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th if (segment_cost > MAX_SEGMENT_COST) { /* Potentially in the infinite loop (or only very long segment?). We should * not force it to finish prematurely unless we are on a regular tile. */ - if (IsTileType(tf->new_tile, MP_RAILWAY)) { + if (IsTileType(follower->new_tile, MP_RAILWAY)) { end_segment_reason.Set(EndSegmentReason::SegmentTooLong); break; } diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index 53483d30e3..cf493e1b95 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -177,17 +177,17 @@ struct CYapfRailNode : CYapfNodeT { template bool IterateTiles(const Train *v, Tpf &yapf, Tbase &obj, bool (Tfunc::*func)(TileIndex, Trackdir)) const { - typename Tbase::TrackFollower ft(v, yapf.GetCompatibleRailTypes()); + typename Tbase::TrackFollower follower{v, yapf.GetCompatibleRailTypes()}; TileIndex cur = this->base::GetTile(); Trackdir cur_td = this->base::GetTrackdir(); while (cur != this->GetLastTile() || cur_td != this->GetLastTrackdir()) { if (!((obj.*func)(cur, cur_td))) return false; - if (!ft.Follow(cur, cur_td)) break; - cur = ft.new_tile; - assert(KillFirstBit(ft.new_td_bits) == TRACKDIR_BIT_NONE); - cur_td = FindFirstTrackdir(ft.new_td_bits); + if (!follower.Follow(cur, cur_td)) break; + cur = follower.new_tile; + assert(KillFirstBit(follower.new_td_bits) == TRACKDIR_BIT_NONE); + cur_td = FindFirstTrackdir(follower.new_td_bits); } return (obj.*func)(cur, cur_td); diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 4d22118be5..57ca8098f4 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -229,9 +229,9 @@ public: */ inline void PfFollowNode(Node &old_node) { - TrackFollower F(Yapf().GetVehicle()); - if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) { - Yapf().AddMultipleNodes(&old_node, F); + TrackFollower follower{Yapf().GetVehicle()}; + if (follower.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) { + Yapf().AddMultipleNodes(&old_node, follower); } } @@ -320,9 +320,9 @@ public: */ inline void PfFollowNode(Node &old_node) { - TrackFollower F(Yapf().GetVehicle(), Yapf().GetCompatibleRailTypes()); - if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir()) && F.MaskReservedTracks()) { - Yapf().AddMultipleNodes(&old_node, F); + TrackFollower follower{Yapf().GetVehicle(), Yapf().GetCompatibleRailTypes()}; + if (follower.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir()) && follower.MaskReservedTracks()) { + Yapf().AddMultipleNodes(&old_node, follower); } } @@ -402,9 +402,9 @@ public: */ inline void PfFollowNode(Node &old_node) { - TrackFollower F(Yapf().GetVehicle()); - if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) { - Yapf().AddMultipleNodes(&old_node, F); + TrackFollower follower{Yapf().GetVehicle()}; + if (follower.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir())) { + Yapf().AddMultipleNodes(&old_node, follower); } } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index fcb2e3759c..bec4068a57 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -133,11 +133,11 @@ public: */ inline void PfFollowNode(Node &old_node) { - TrackFollower F(Yapf().GetVehicle()); - if (F.Follow(old_node.key.tile, old_node.key.td)) { + TrackFollower follower{Yapf().GetVehicle()}; + if (follower.Follow(old_node.key.tile, old_node.key.td)) { if (this->water_region_corridor.empty() - || std::ranges::find(this->water_region_corridor, GetWaterRegionInfo(F.new_tile)) != this->water_region_corridor.end()) { - Yapf().AddMultipleNodes(&old_node, F); + || std::ranges::find(this->water_region_corridor, GetWaterRegionInfo(follower.new_tile)) != this->water_region_corridor.end()) { + Yapf().AddMultipleNodes(&old_node, follower); } } } @@ -166,7 +166,7 @@ public: /** Returns a random tile/trackdir that can be reached from the current tile/trackdir, or tile/INVALID_TRACK if none is available. */ static std::pair GetRandomFollowUpTileTrackdir(const Ship *v, TileIndex tile, Trackdir dir) { - TrackFollower follower(v); + TrackFollower follower{v}; if (follower.Follow(tile, dir)) { TrackdirBits dirs = follower.new_td_bits; const TrackdirBits dirs_without_90_degree = dirs & ~TrackdirCrossesTrackdirs(dir); @@ -361,7 +361,7 @@ public: * Calculates only the cost of given node, adds it to the parent node cost * and stores the result into Node::cost member. */ - inline bool PfCalcCost(Node &n, const TrackFollower *tf) + inline bool PfCalcCost(Node &n, const TrackFollower *follower) { /* Base tile cost depending on distance. */ int c = IsDiagonalTrackdir(n.GetTrackdir()) ? YAPF_TILE_LENGTH : YAPF_TILE_CORNER_LENGTH; @@ -381,12 +381,12 @@ public: if (!IsPreferredShipDirection(n.GetTile(), n.GetTrackdir())) c += YAPF_TILE_LENGTH; /* Skipped tile cost for aqueducts. */ - c += YAPF_TILE_LENGTH * tf->tiles_skipped; + c += YAPF_TILE_LENGTH * follower->tiles_skipped; /* Ocean/canal speed penalty. */ const ShipVehicleInfo *svi = ShipVehInfo(Yapf().GetVehicle()->engine_type); uint8_t speed_frac = (GetEffectiveWaterClass(n.GetTile()) == WATER_CLASS_SEA) ? svi->ocean_speed_frac : svi->canal_speed_frac; - if (speed_frac > 0) c += YAPF_TILE_LENGTH * (1 + tf->tiles_skipped) * speed_frac / (256 - speed_frac); + if (speed_frac > 0) c += YAPF_TILE_LENGTH * (1 + follower->tiles_skipped) * speed_frac / (256 - speed_frac); /* Lock penalty. */ if (IsTileType(n.GetTile(), MP_WATER) && IsLock(n.GetTile()) && GetLockPart(n.GetTile()) == LOCK_PART_MIDDLE) { From bfe5fb73391a135fbca466e81acb06607fbbb17c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 27 Sep 2025 18:10:39 +0100 Subject: [PATCH 096/280] Codechange: FlatSet's contains() should be const. (#14665) This function does not modify contents, so should be marked const. --- src/core/flatset_type.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/flatset_type.hpp b/src/core/flatset_type.hpp index 2dc42d0b48..b69f1daebf 100644 --- a/src/core/flatset_type.hpp +++ b/src/core/flatset_type.hpp @@ -54,7 +54,7 @@ public: * @param key Key to test. * @return true iff the key exists in the set. */ - bool contains(const Tkey &key) + bool contains(const Tkey &key) const { return std::ranges::binary_search(this->data, key, Tcompare{}); } From 9307e1929e23685910e2031941aa625b91d67568 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 27 Sep 2025 18:11:42 +0100 Subject: [PATCH 097/280] Fix #14604: Clearing tiles to build objects did not update town ratings (#14616) --- src/object_cmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 4cf1c579e8..6cfed66e47 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -303,10 +303,10 @@ CommandCost CmdBuildObject(DoCommandFlags flags, TileIndex tile, ObjectType type for (TileIndex t : ta) { if (HasTileWaterGround(t)) { if (!IsWaterTile(t)) { - Command::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::NoWater).Set(DoCommandFlag::NoModifyTownRating), t); + Command::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::NoWater), t); } } else { - Command::Do(flags | DoCommandFlag::NoModifyTownRating, t); + Command::Do(flags, t); } } } From f64e1cdae0323314189286bed78c95ff58eba795 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 27 Sep 2025 18:12:49 +0100 Subject: [PATCH 098/280] Fix: Industry accept/produce when not contiguous range from 0 (#14555) --- src/industry_cmd.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index d1e273ab4b..08dbdc4efc 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1761,17 +1761,25 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, auto &industries = Industry::industries[type]; industries.insert(i->index); + size_t produced_count = 0; for (size_t index = 0; index < std::size(indspec->produced_cargo); ++index) { - if (!IsValidCargoType(indspec->produced_cargo[index])) break; - + if (IsValidCargoType(indspec->produced_cargo[index])) { + produced_count = index + 1; + } + } + for (size_t index = 0; index < produced_count; ++index) { Industry::ProducedCargo &p = i->produced.emplace_back(); p.cargo = indspec->produced_cargo[index]; p.rate = indspec->production_rate[index]; } + size_t accepted_count = 0; for (size_t index = 0; index < std::size(indspec->accepts_cargo); ++index) { - if (!IsValidCargoType(indspec->accepts_cargo[index])) break; - + if (IsValidCargoType(indspec->accepts_cargo[index])) { + accepted_count = index + 1; + } + } + for (size_t index = 0; index < accepted_count; ++index) { Industry::AcceptedCargo &a = i->accepted.emplace_back(); a.cargo = indspec->accepts_cargo[index]; } From e58fdb8840a9d0f23351031763d7da38cfd2be8a Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 27 Sep 2025 21:42:49 +0200 Subject: [PATCH 099/280] Codefix: shadowing of variables --- src/station_cmd.cpp | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index c9a3924f87..8a90e30f0e 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1478,11 +1478,8 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy TileIndexDiff track_delta = TileOffsByAxis(OtherAxis(axis)); // offset to go to the next track RailStationTileLayout stl{statspec, numtracks, plat_len}; - auto it = stl.begin(); - TileIndex tile_track = tile_org; - for (uint i = 0; i != numtracks; ++i, tile_track += track_delta) { - TileIndex tile = tile_track; - for (uint j = 0; j != plat_len; ++j, tile += tile_delta, ++it) { + for (auto [i, it, tile_track] = std::make_tuple(0, stl.begin(), tile_org); i != numtracks; ++i, tile_track += track_delta) { + for (auto [j, tile] = std::make_tuple(0, tile_track); j != plat_len; ++j, tile += tile_delta, ++it) { /* Don't check the layout if there's no bridge above anyway. */ if (!IsBridgeAbove(tile)) continue; @@ -1531,14 +1528,9 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy } Track track = AxisToTrack(axis); - - auto it = stl.begin(); - Company *c = Company::Get(st->owner); - TileIndex tile_track = tile_org; - for (uint i = 0; i != numtracks; ++i) { - TileIndex tile = tile_track; - for (uint j = 0; j != plat_len; ++j) { + for (auto [i, it, tile_track] = std::make_tuple(0, stl.begin(), tile_org); i != numtracks; ++i, tile_track += track_delta) { + for (auto [j, tile] = std::make_tuple(0, tile_track); j != plat_len; ++j, tile += tile_delta, ++it) { if (IsRailStationTile(tile) && HasStationReservation(tile)) { /* Check for trains having a reservation for this tile. */ Train *v = GetTrainForReservation(tile, AxisToTrack(GetRailStationAxis(tile))); @@ -1558,7 +1550,7 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy DeleteAnimatedTile(tile); uint8_t old_specindex = HasStationTileRail(tile) ? GetCustomStationSpecIndex(tile) : 0; - MakeRailStation(tile, st->owner, st->index, axis, *it++, rt); + MakeRailStation(tile, st->owner, st->index, axis, *it, rt); /* Free the spec if we overbuild something */ DeallocateSpecFromStation(st, old_specindex); @@ -1588,12 +1580,9 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy if (!IsStationTileBlocked(tile)) c->infrastructure.rail[rt]++; c->infrastructure.station++; - - tile += tile_delta; } AddTrackToSignalBuffer(tile_track, track, _current_company); YapfNotifyTrackLayoutChange(tile_track, track); - tile_track += track_delta; } for (uint i = 0; i < affected_vehicles.size(); ++i) { From 380f9e8b48978376754e10f52cbc1c40c607b226 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 28 Sep 2025 00:30:47 +0100 Subject: [PATCH 100/280] Change: Prefer normal/medium weight font in FontConfig fallback detection. (#14672) This way it behaves similar to Windows. --- src/os/unix/font_unix.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/os/unix/font_unix.cpp b/src/os/unix/font_unix.cpp index dd8f2f1d2a..978695a853 100644 --- a/src/os/unix/font_unix.cpp +++ b/src/os/unix/font_unix.cpp @@ -123,6 +123,22 @@ FT_Error GetFontByFaceName(std::string_view font_name, FT_Face *face) return err; } +/** + * Get distance between font weight and preferred font weights. + * @param weight Font weight from FontConfig. + * @return Distance from preferred weight, where lower values are preferred. + */ +static int GetPreferredWeightDistance(int weight) +{ + /* Prefer a font between normal and medium weight. */ + static constexpr int PREFERRED_WEIGHT_MIN = FC_WEIGHT_NORMAL; + static constexpr int PREFERRED_WEIGHT_MAX = FC_WEIGHT_MEDIUM; + + if (weight < PREFERRED_WEIGHT_MIN) return std::abs(weight - PREFERRED_WEIGHT_MIN); + if (weight > PREFERRED_WEIGHT_MAX) return weight - PREFERRED_WEIGHT_MAX; + return 0; +} + bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) { bool ret = false; @@ -164,9 +180,10 @@ bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string & FcPatternGetInteger(font, FC_SLANT, 0, &value); if (value != 0) continue; - /* We want the fatter font as they look better at small sizes. */ + /* We want a font near to medium weight. */ FcPatternGetInteger(font, FC_WEIGHT, 0, &value); - if (value <= best_weight) continue; + int weight = GetPreferredWeightDistance(value); + if (best_weight != -1 && weight > best_weight) continue; /* Possible match based on attributes, get index. */ int32_t index; @@ -179,7 +196,7 @@ bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string & Debug(fontcache, 1, "Font \"{}\" misses{} glyphs", FromFcString(file), missing ? "" : " no"); if (!missing) { - best_weight = value; + best_weight = weight; best_font = FromFcString(file); best_index = index; } From 6d3f39609f59bf57dbb6c27102a23d39c0fae330 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 14:32:27 +0100 Subject: [PATCH 101/280] Codechange: Add WithX/WithY methods to Rect. This simplifies creating a new Rect with specific horizontal or vertical coordinates. --- src/core/geometry_type.hpp | 44 ++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index f5bb66f554..9e7cf62583 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -211,8 +211,8 @@ struct Rect { [[nodiscard]] inline Rect WithWidth(int width, bool end) const { return end - ? Rect {this->right - width + 1, this->top, this->right, this->bottom} - : Rect {this->left, this->top, this->left + width - 1, this->bottom}; + ? this->WithX(this->right - width + 1, this->right) + : this->WithX(this->left, this->left + width - 1); } /** @@ -224,21 +224,21 @@ struct Rect { [[nodiscard]] inline Rect Indent(int indent, bool end) const { return end - ? Rect {this->left, this->top, this->right - indent, this->bottom} - : Rect {this->left + indent, this->top, this->right, this->bottom}; + ? this->WithX(this->left, this->right - indent) + : this->WithX(this->left + indent, this->right); } /** * Copy Rect and set its height. - * @param width height in pixels for new Rect. + * @param height height in pixels for new Rect. * @param end if set, set height at end of Rect, i.e. at bottom. * @return the new resized Rect. */ [[nodiscard]] inline Rect WithHeight(int height, bool end = false) const { return end - ? Rect {this->left, this->bottom - height + 1, this->right, this->bottom} - : Rect {this->left, this->top, this->right, this->top + height - 1}; + ? this->WithY(this->bottom - height + 1, this->bottom) + : this->WithY(this->top, this->top + height - 1); } /** @@ -264,6 +264,36 @@ struct Rect { int new_top = CentreBounds(this->top, this->bottom, height); return {new_left, new_top, new_left + width - 1, new_top + height - 1}; } + + /** + * Create a new Rect, replacing the left and right coordiates. + * @param new_left New left coordinate. + * @param new_right New right coordinate. + * @return The new Rect. + */ + [[nodiscard]] inline Rect WithX(int new_left, int new_right) const { return {new_left, this->top, new_right, this->bottom}; } + + /** + * Create a new Rect, replacing the top and bottom coordiates. + * @param new_top New top coordinate. + * @param new_bottom New bottom coordinate. + * @return The new Rect. + */ + [[nodiscard]] inline Rect WithY(int new_top, int new_bottom) const { return {this->left, new_top, this->right, new_bottom}; } + + /** + * Create a new Rect, replacing the left and right coordiates. + * @param other Rect containing the new left and right coordinates. + * @return The new Rect. + */ + [[nodiscard]] inline Rect WithX(const Rect &other) const { return this->WithX(other.left, other.right); } + + /** + * Create a new Rect, replacing the top and bottom coordiates. + * @param other Rect containing the new top and bottom coordinates. + * @return The new Rect. + */ + [[nodiscard]] inline Rect WithY(const Rect &other) const { return this->WithY(other.top, other.bottom); } }; /** From 31eec7106b5353550cf3f4825a68d9e8724e2b1c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Sep 2025 20:35:58 +0100 Subject: [PATCH 102/280] Codechange: Use Rect WithX/WithY in some places. --- src/build_vehicle_gui.cpp | 2 +- src/dropdown.cpp | 4 ++-- src/dropdown_common_type.h | 4 ++-- src/error_gui.cpp | 2 +- src/fios_gui.cpp | 4 ++-- src/misc_gui.cpp | 2 +- src/network/network_content_gui.cpp | 2 +- src/train_gui.cpp | 2 +- src/transparency_gui.cpp | 2 +- src/vehicle_gui.cpp | 6 +++--- src/widget.cpp | 26 ++++++++++++++------------ 11 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 0702fdeee5..f21a424f1e 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1030,7 +1030,7 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li if (has_variants) { Rect fr = tr.WithWidth(circle_width, rtl); - DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, {fr.left, textr.top, fr.right, textr.bottom}, SA_CENTER); + DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, fr.WithY(textr), SA_CENTER); } tr = tr.Indent(circle_width + WidgetDimensions::scaled.hsep_normal, rtl); diff --git a/src/dropdown.cpp b/src/dropdown.cpp index 2b2570f3db..d3df9a731a 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -248,7 +248,7 @@ struct DropdownWindow : Window { if (y < item_height) { if (item->masked || !item->Selectable()) return false; result = item->result; - click_result = item->OnClick({r.left, 0, r.right, item_height - 1}, {_cursor.pos.x - this->left, y}); + click_result = item->OnClick(r.WithY(0, item_height - 1), {_cursor.pos.x - this->left, y}); return true; } @@ -274,7 +274,7 @@ struct DropdownWindow : Window { if (--pos >= 0) continue; if (y + item_height - 1 <= ir.bottom) { - Rect full{ir.left, y, ir.right, y + item_height - 1}; + Rect full = ir.WithY(y, y + item_height - 1); bool selected = (this->selected_result == item->result) && item->Selectable(); if (selected) GfxFillRect(full, PC_BLACK); diff --git a/src/dropdown_common_type.h b/src/dropdown_common_type.h index 80362f6712..e29aa16163 100644 --- a/src/dropdown_common_type.h +++ b/src/dropdown_common_type.h @@ -41,8 +41,8 @@ public: PixelColour c2 = GetColourGradient(bg_colour, SHADE_LIGHTEST); int mid = CentreBounds(full.top, full.bottom, 0); - GfxFillRect(full.left, mid - WidgetDimensions::scaled.bevel.bottom, full.right, mid - 1, c1); - GfxFillRect(full.left, mid, full.right, mid + WidgetDimensions::scaled.bevel.top - 1, c2); + GfxFillRect(full.WithY(mid - WidgetDimensions::scaled.bevel.bottom, mid - 1), c1); + GfxFillRect(full.WithY(mid, mid + WidgetDimensions::scaled.bevel.top - 1), c2); } }; diff --git a/src/error_gui.cpp b/src/error_gui.cpp index 182ac7229f..ed5d0b2ab1 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -209,7 +209,7 @@ public: /* Note: NewGRF supplied error message often do not start with a colour code, so default to white. */ Rect top_section = r.WithHeight(this->height_summary + extra, false); Rect bottom_section = r.WithHeight(this->height_extra + extra, true); - Rect middle_section = { top_section.left, top_section.bottom, top_section.right, bottom_section.top }; + Rect middle_section = top_section.WithY(top_section.bottom, bottom_section.top); DrawStringMultiLineWithClipping(top_section, this->summary_msg.GetDecodedString(), TC_WHITE, SA_CENTER); DrawStringMultiLineWithClipping(middle_section, this->detailed_msg.GetDecodedString(), TC_WHITE, SA_CENTER); DrawStringMultiLineWithClipping(bottom_section, this->extra_msg.GetDecodedString(), TC_WHITE, SA_CENTER); diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 10e05908eb..6c2dfb8b90 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -527,9 +527,9 @@ public: const FiosItem *item = *it; if (item == this->selected) { - GfxFillRect(br.left, tr.top, br.right, tr.bottom, PC_DARK_BLUE); + GfxFillRect(br.WithY(tr), PC_DARK_BLUE); } else if (item == this->highlighted) { - GfxFillRect(br.left, tr.top, br.right, tr.bottom, PC_VERY_DARK_BLUE); + GfxFillRect(br.WithY(tr), PC_VERY_DARK_BLUE); } DrawString(tr, item->title.GetDecodedString(), _fios_colours[item->type.detailed]); tr = tr.Translate(0, this->resize.step_height); diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 719f5a5dfa..55b2b8b867 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -833,7 +833,7 @@ Rect QueryString::GetBoundingRect(const Window *w, WidgetID wid, size_t from, si const auto p1 = GetCharPosInString(tb->GetText(), from, FS_NORMAL); const auto p2 = from != to ? GetCharPosInString(tb->GetText(), to, FS_NORMAL) : p1; - return { Clamp(r.left + p1.left, r.left, r.right), r.top, Clamp(r.left + p2.right, r.left, r.right), r.bottom }; + return r.WithX(Clamp(r.left + p1.left, r.left, r.right), Clamp(r.left + p2.right, r.left, r.right)); } /** diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 13600aedba..a184511f98 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -673,7 +673,7 @@ public: case ContentInfo::State::DoesNotExist: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break; default: NOT_REACHED(); } - DrawSpriteIgnorePadding(sprite, pal, {checkbox.left, mr.top, checkbox.right, mr.bottom}, SA_CENTER); + DrawSpriteIgnorePadding(sprite, pal, checkbox.WithY(mr), SA_CENTER); StringID str = STR_CONTENT_TYPE_BASE_GRAPHICS + ci->type - CONTENT_TYPE_BASE_GRAPHICS; DrawString(type.left, type.right, mr.top + text_y_offset, str, TC_BLACK, SA_HOR_CENTER); diff --git a/src/train_gui.cpp b/src/train_gui.cpp index fc4262c89f..cfa018c0ec 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -401,7 +401,7 @@ void DrawTrainDetails(const Train *v, const Rect &r, int vscroll_pos, uint16_t v if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) { int py = r.top - line_height * vscroll_pos + text_y_offset; if (i > 0 || separate_sprite_row) { - if (vscroll_pos != 0) GfxFillRect(r.left, py - WidgetDimensions::scaled.matrix.top - 1, r.right, py - WidgetDimensions::scaled.matrix.top, GetColourGradient(COLOUR_GREY, SHADE_LIGHT)); + if (vscroll_pos != 0) GfxFillRect(r.WithY(py - WidgetDimensions::scaled.matrix.top - 1, py - WidgetDimensions::scaled.matrix.top), GetColourGradient(COLOUR_GREY, SHADE_LIGHT)); } switch (det_tab) { case TDW_TAB_CARGO: diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index 0c768f59ff..8574075b1e 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -62,7 +62,7 @@ public: 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, + DrawFrameRect(wr.WithY(fr), COLOUR_PALE_GREEN, HasBit(_invisibility_opt, i - WID_TT_BEGIN) ? FrameFlag::Lowered : FrameFlags{}); } break; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index fbd7a69b54..0ea6f71e44 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1042,7 +1042,7 @@ struct RefitWindow : public Window { switch (widget) { case WID_VR_VEHICLE_PANEL_DISPLAY: { Vehicle *v = Vehicle::Get(this->window_number); - DrawVehicleImage(v, {this->sprite_left, r.top, this->sprite_right, r.bottom}, + DrawVehicleImage(v, r.WithX(this->sprite_left, this->sprite_right), VehicleID::Invalid(), EIT_IN_DETAILS, this->hscroll != nullptr ? this->hscroll->GetPosition() : 0); /* Highlight selected vehicles. */ @@ -1791,7 +1791,7 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int DrawSprite(SPR_WARNING_SIGN, PAL_NONE, vehicle_button_x, ir.top + GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal + profit.height); } - DrawVehicleImage(v, {image_left, ir.top, image_right, ir.bottom}, selected_vehicle, EIT_IN_LIST, 0); + DrawVehicleImage(v, ir.WithX(image_left, image_right), selected_vehicle, EIT_IN_LIST, 0); if (_settings_client.gui.show_cargo_in_vehicle_lists) { /* Get the cargoes the vehicle can carry */ @@ -1843,7 +1843,7 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int for (int i = 0; i < static_cast(vehgroup.NumVehicles()); ++i) { if (image_left + WidgetDimensions::scaled.hsep_wide * i >= image_right) break; // Break if there is no more space to draw any more vehicles anyway. - DrawVehicleImage(vehgroup.vehicles_begin[i], {image_left + WidgetDimensions::scaled.hsep_wide * i, ir.top, image_right, ir.bottom}, selected_vehicle, EIT_IN_LIST, 0); + DrawVehicleImage(vehgroup.vehicles_begin[i], ir.WithX(image_left + WidgetDimensions::scaled.hsep_wide * i, image_right), selected_vehicle, EIT_IN_LIST, 0); } if (show_orderlist) DrawSmallOrderList(vehgroup.vehicles_begin[0]->orders, olr.left, olr.right, ir.top + GetCharacterHeight(FS_SMALL), this->order_arrow_width); diff --git a/src/widget.cpp b/src/widget.cpp index 1248d0fb16..cf89f126d7 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -510,8 +510,9 @@ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_ PixelColour c2 = GetColourGradient(colour, SHADE_LIGHTEST); /* draw "shaded" background */ - GfxFillRect(r.left, r.top + height, r.right, r.bottom - height, c2); - GfxFillRect(r.left, r.top + height, r.right, r.bottom - height, c1, FILLRECT_CHECKER); + Rect bg = r.Shrink(0, height); + GfxFillRect(bg, c2); + GfxFillRect(bg, c1, FILLRECT_CHECKER); /* track positions. These fractions are based on original 1x dimensions, but scale better. */ int left = r.left + r.Width() * 3 / 11; /* left track is positioned 3/11ths from the left */ @@ -520,10 +521,10 @@ static inline void DrawVerticalScrollbar(const Rect &r, Colours colour, bool up_ const uint8_t br = WidgetDimensions::scaled.bevel.right; /* draw shaded lines */ - GfxFillRect(left - bl, r.top + height, left - 1, r.bottom - height, c1); - GfxFillRect(left, r.top + height, left + br - 1, r.bottom - height, c2); - GfxFillRect(right - bl, r.top + height, right - 1, r.bottom - height, c1); - GfxFillRect(right, r.top + height, right + br - 1, r.bottom - height, c2); + GfxFillRect(bg.WithX(left - bl, left - 1), c1); + GfxFillRect(bg.WithX(left, left + br - 1), c2); + GfxFillRect(bg.WithX(right - bl, right - 1), c1); + GfxFillRect(bg.WithX(right, right + br - 1), c2); auto [top, bottom] = HandleScrollbarHittest(scrollbar, r.top, r.bottom, false); DrawFrameRect(r.left, top, r.right, bottom, colour, bar_dragged ? FrameFlag::Lowered : FrameFlags{}); @@ -549,8 +550,9 @@ static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool l PixelColour c2 = GetColourGradient(colour, SHADE_LIGHTEST); /* draw "shaded" background */ - GfxFillRect(r.left + width, r.top, r.right - width, r.bottom, c2); - GfxFillRect(r.left + width, r.top, r.right - width, r.bottom, c1, FILLRECT_CHECKER); + Rect bg = r.Shrink(width, 0); + GfxFillRect(bg, c2); + GfxFillRect(bg, c1, FILLRECT_CHECKER); /* track positions. These fractions are based on original 1x dimensions, but scale better. */ int top = r.top + r.Height() * 3 / 11; /* top track is positioned 3/11ths from the top */ @@ -559,10 +561,10 @@ static inline void DrawHorizontalScrollbar(const Rect &r, Colours colour, bool l const uint8_t bb = WidgetDimensions::scaled.bevel.bottom; /* draw shaded lines */ - GfxFillRect(r.left + width, top - bt, r.right - width, top - 1, c1); - GfxFillRect(r.left + width, top, r.right - width, top + bb - 1, c2); - GfxFillRect(r.left + width, bottom - bt, r.right - width, bottom - 1, c1); - GfxFillRect(r.left + width, bottom, r.right - width, bottom + bb - 1, c2); + GfxFillRect(bg.WithY(top - bt, top - 1), c1); + GfxFillRect(bg.WithY(top, top + bb - 1), c2); + GfxFillRect(bg.WithY(bottom - bt, bottom - 1), c1); + GfxFillRect(bg.WithY(bottom, bottom + bb - 1), c2); /* draw actual scrollbar */ auto [left, right] = HandleScrollbarHittest(scrollbar, r.left, r.right, true); From 37f737417cda13011d3a4db5226f83637d22448f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 28 Sep 2025 04:37:53 +0000 Subject: [PATCH 103/280] Update: Translations from eints english (au): 3 changes by krysclarke swedish: 3 changes by robert-i korean: 3 changes by telk5093 greek: 3 changes by gh658804 russian: 3 changes by Ln-Wolf finnish: 3 changes by hpiirai catalan: 3 changes by J0anJosep portuguese: 3 changes by jcteotonio portuguese (brazilian): 3 changes by pasantoro polish: 3 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 5 +++-- src/lang/catalan.txt | 5 +++-- src/lang/english_AU.txt | 5 +++-- src/lang/finnish.txt | 5 +++-- src/lang/greek.txt | 5 +++-- src/lang/korean.txt | 5 +++-- src/lang/polish.txt | 5 +++-- src/lang/portuguese.txt | 5 +++-- src/lang/russian.txt | 5 +++-- src/lang/swedish.txt | 5 +++-- 10 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index fefdaba10e..dd916cca9a 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3431,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatório -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Aleatório +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Água Infinita STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotação do mapa de altitudes: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome do mapa de altitudes: diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 8125287d6d..118391db10 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3431,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Aigua STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatori ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatori -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Aleatori +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Aigua infinita STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotació del mapa d'alçades: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nom del mapa d'alçades: diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 9b55f7cbb1..734f92210b 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Random -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Random +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Infinite Water STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 8a8cbac8b1..b58fc0438a 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Vesi STR_MAPGEN_BORDER_RANDOM :{BLACK}Sattumanvarainen ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Sattumanvarainen -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuaalinen +STR_MAPGEN_BORDER_RANDOMIZE :Satunnaiset +STR_MAPGEN_BORDER_MANUAL :Aseta käsin +STR_MAPGEN_BORDER_INFINITE_WATER :Ääretön vesi STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Korkeuskartan kierto: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Korkeuskartan nimi: diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 2c366e6440..9d6df28701 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3523,8 +3523,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Νερό STR_MAPGEN_BORDER_RANDOM :{BLACK}Τυχαία ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Τυχαία -STR_MAPGEN_BORDER_MANUAL :{BLACK}Χειροκίνητος +STR_MAPGEN_BORDER_RANDOMIZE :Τυχαία +STR_MAPGEN_BORDER_MANUAL :Χειροκίνητος +STR_MAPGEN_BORDER_INFINITE_WATER :Απεριόριστo Νερό STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Περιστροφή χάρτη υψομετρίας: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Όνομα χάρτη υψομετρίας: diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 45c9642f8e..4b47e9b0bd 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3431,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}물 STR_MAPGEN_BORDER_RANDOM :{BLACK}임의 ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}임의 -STR_MAPGEN_BORDER_MANUAL :{BLACK}사용자 정의 +STR_MAPGEN_BORDER_RANDOMIZE :임의 +STR_MAPGEN_BORDER_MANUAL :사용자 정의 +STR_MAPGEN_BORDER_INFINITE_WATER :물 (지도 밖까지 모두) STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}높이맵 방향: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}높이맵 이름: diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 21f40b3f08..ac8b8b1424 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3810,8 +3810,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Woda STR_MAPGEN_BORDER_RANDOM :{BLACK}Losowe ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Losowo -STR_MAPGEN_BORDER_MANUAL :{BLACK}Użytkownika +STR_MAPGEN_BORDER_RANDOMIZE :Losowe +STR_MAPGEN_BORDER_MANUAL :Ustalone +STR_MAPGEN_BORDER_INFINITE_WATER :Bezkres Wód STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Obrót mapy wysokości: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nazwa mapy wysokosci: diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index c5aa9fc218..61532a9114 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3431,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatório -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Aleatório +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Água Infinita STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotação mapa de alt.: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome mapa de alt.: diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 834471c13d..6631323b3a 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3605,8 +3605,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Водн STR_MAPGEN_BORDER_RANDOM :{BLACK}Случайно ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Случайно -STR_MAPGEN_BORDER_MANUAL :{BLACK}Вручную +STR_MAPGEN_BORDER_RANDOMIZE :Случайно +STR_MAPGEN_BORDER_MANUAL :Вручную +STR_MAPGEN_BORDER_INFINITE_WATER :Бескрайний океан STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Поворот карты: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Название карты: diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 66d7390739..31af4a5536 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Vatten STR_MAPGEN_BORDER_RANDOM :{BLACK}På måfå ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}På måfå -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuella +STR_MAPGEN_BORDER_RANDOMIZE :Slumpmässig +STR_MAPGEN_BORDER_MANUAL :Manuellt +STR_MAPGEN_BORDER_INFINITE_WATER :Obegränsat vatten STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Höjdkartans rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Namn på höjdkarta: From cb1c2409e6b0482705214f3d7afc938627097a75 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 25 Sep 2025 08:45:24 +0100 Subject: [PATCH 104/280] Codechange: Rework network client list buttons. Instead of calculating and storing which buttons to display for each line and then further calculating what each line should be when displaying it, store everything on one pass. This simplifies/deduplicates logic. --- src/network/network_gui.cpp | 409 ++++++++++++++++-------------------- 1 file changed, 183 insertions(+), 226 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 61975b476a..c1d1dfbf10 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1381,6 +1381,159 @@ public: using CompanyButton = Button; using ClientButton = Button; +/** + * Base interface for a network client list line. + */ +class ButtonLine { +public: + std::vector> buttons{}; ///< Buttons for this line. + + virtual ~ButtonLine() = default; + + /** + * Draw the button line. + * @param r Rect to draw within. + */ + virtual void Draw(Rect r) const = 0; + + template + T &AddButton(TArgs &&... args) + { + auto &button = this->buttons.emplace_back(std::make_unique(std::forward(args)...)); + return static_cast(*button); + } + + /** + * Get the button at a given point on the line. + * @param r Rect of line. + * @param pt Point of interest. + * @return Button at point, or \c nullptr if button isn't pressed. + */ + ButtonCommon *GetButton(Rect r, const Point &pt) const + { + bool rtl = _current_text_dir == TD_RTL; + for (auto &button : this->buttons) { + if (r.WithWidth(button->width, !rtl).Contains(pt)) return button.get(); + r = r.Indent(button->width + WidgetDimensions::scaled.hsep_normal, !rtl); + } + return nullptr; + } + + /** + * Get tooptip for a given point on the line. + * @param r Rect of line. + * @param pt Point of interest. + * @return EncodedString of tooltip, or \c std::nullopt if none. + */ + virtual std::optional GetTooltip(Rect r, const Point &pt) const + { + ButtonCommon *button = this->GetButton(r, pt); + if (button == nullptr) return {}; + return GetEncodedString(button->tooltip); + } + +protected: + /** + * Draw the buttons for this line. + * @param r Rect to draw within. + * @return Rect of remaining space. + */ + Rect DrawButtons(Rect r) const + { + bool rtl = _current_text_dir == TD_RTL; + for (auto &button : buttons) { + Rect br = r.CentreTo(r.Width(), button->height).WithWidth(button->width, !rtl); + DrawFrameRect(br, button->colour, {}); + DrawSpriteIgnorePadding(button->sprite, PAL_NONE, br, SA_CENTER); + if (button->disabled) { + GfxFillRect(br.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(button->colour, SHADE_DARKER), FILLRECT_CHECKER); + } + r = r.Indent(button->width + WidgetDimensions::scaled.hsep_normal, !rtl); + } + return r; + } +}; + +class CompanyButtonLine : public ButtonLine { +public: + CompanyButtonLine(CompanyID company_id) : company_id(company_id) {} + + void Draw(Rect r) const override + { + bool rtl = _current_text_dir == TD_RTL; + r = this->DrawButtons(r); + + Dimension d = GetSpriteSize(SPR_COMPANY_ICON); + PaletteID pal = Company::IsValidID(this->company_id) ? GetCompanyPalette(this->company_id) : PALETTE_TO_GREY; + DrawSpriteIgnorePadding(SPR_COMPANY_ICON, pal, r.WithWidth(d.width, rtl), SA_CENTER); + + Rect tr = r.CentreTo(r.Width(), GetCharacterHeight(FS_NORMAL)).Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); + if (this->company_id == COMPANY_SPECTATOR) { + DrawString(tr, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); + } else if (this->company_id == COMPANY_NEW_COMPANY) { + DrawString(tr, STR_NETWORK_CLIENT_LIST_NEW_COMPANY, TC_WHITE); + } else { + DrawString(tr, GetString(STR_COMPANY_NAME, this->company_id, this->company_id), TC_SILVER); + } + }; + +private: + CompanyID company_id; +}; + +class ClientButtonLine : public ButtonLine { +public: + ClientButtonLine(ClientPoolID client_pool_id) : client_pool_id(client_pool_id) {} + + void Draw(Rect r) const override + { + const NetworkClientInfo *ci = NetworkClientInfo::GetIfValid(this->client_pool_id); + if (ci == nullptr) return; + + bool rtl = _current_text_dir == TD_RTL; + r = this->DrawButtons(r); + + Rect tr = r.CentreTo(r.Width(), GetCharacterHeight(FS_NORMAL)); + + SpriteID player_icon = 0; + if (ci->client_id == _network_own_client_id) { + player_icon = SPR_PLAYER_SELF; + } else if (ci->client_id == CLIENT_ID_SERVER) { + player_icon = SPR_PLAYER_HOST; + } + + if (player_icon != 0) { + Dimension d = GetSpriteSize(player_icon); + DrawSpriteIgnorePadding(player_icon, PALETTE_TO_GREY, r.WithWidth(d.width, rtl), SA_CENTER); + tr = tr.Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); + } + + DrawString(tr, GetString(STR_JUST_RAW_STRING, ci->client_name), TC_BLACK); + } + + std::optional GetTooltip(Rect r, const Point &pt) const override + { + bool rtl = _current_text_dir == TD_RTL; + Dimension d = GetSpriteSize(SPR_PLAYER_SELF); + + if (r.WithWidth(d.width, rtl).Contains(pt)) { + const NetworkClientInfo *ci = NetworkClientInfo::GetIfValid(this->client_pool_id); + if (ci != nullptr) { + if (ci->client_id == _network_own_client_id) { + return GetEncodedString(STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP); + } else if (ci->client_id == CLIENT_ID_SERVER) { + return GetEncodedString(STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP); + } + } + } + + return this->ButtonLine::GetTooltip(r, pt); + } + +private: + ClientPoolID client_pool_id; +}; + /** * Main handle for clientlist */ @@ -1393,12 +1546,9 @@ private: Scrollbar *vscroll = nullptr; ///< Vertical scrollbar of this window. uint line_height = 0; ///< Current lineheight of each entry in the matrix. - uint line_count = 0; ///< Amount of lines in the matrix. int hover_index = -1; ///< Index of the current line we are hovering over, or -1 if none. - int player_self_index = -1; ///< The line the current player is on. - int player_host_index = -1; ///< The line the host is on. - std::map>> buttons{}; ///< Per line which buttons are available. + std::vector> buttons{}; ///< Per line which buttons are available. /** * Chat button on a Company is clicked. @@ -1504,34 +1654,24 @@ private: */ void RebuildListCompany(CompanyID company_id, CompanyID client_playas, bool can_join_company) { - ButtonCommon *chat_button = new CompanyButton(SPR_CHAT, company_id == COMPANY_SPECTATOR ? STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP : STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyChat); - - if (_network_server) this->buttons[line_count].push_back(std::make_unique(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP, COLOUR_RED, company_id, &NetworkClientListWindow::OnClickCompanyAdmin, company_id == COMPANY_SPECTATOR)); - this->buttons[line_count].emplace_back(chat_button); - if (can_join_company) this->buttons[line_count].push_back(std::make_unique(SPR_JOIN, STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyJoin, company_id != COMPANY_SPECTATOR && Company::Get(company_id)->is_ai)); - - this->line_count += 1; + ButtonLine &company_line = *this->buttons.emplace_back(std::make_unique(company_id)); + if (_network_server) company_line.AddButton(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP, COLOUR_RED, company_id, &NetworkClientListWindow::OnClickCompanyAdmin, company_id == COMPANY_SPECTATOR); + ButtonCommon &chat_button = company_line.AddButton(SPR_CHAT, company_id == COMPANY_SPECTATOR ? STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP : STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyChat); + if (can_join_company) company_line.AddButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP, COLOUR_ORANGE, company_id, &NetworkClientListWindow::OnClickCompanyJoin, company_id != COMPANY_SPECTATOR && Company::Get(company_id)->is_ai); bool has_players = false; for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { if (ci->client_playas != company_id) continue; has_players = true; - if (_network_server) this->buttons[line_count].push_back(std::make_unique(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP, COLOUR_RED, ci->client_id, &NetworkClientListWindow::OnClickClientAdmin, _network_own_client_id == ci->client_id)); - if (_network_own_client_id != ci->client_id) this->buttons[line_count].push_back(std::make_unique(SPR_CHAT, STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP, COLOUR_ORANGE, ci->client_id, &NetworkClientListWindow::OnClickClientChat)); - if (_network_own_client_id != ci->client_id && client_playas != COMPANY_SPECTATOR && !ci->CanJoinCompany(client_playas)) this->buttons[line_count].push_back(std::make_unique(SPR_JOIN, STR_NETWORK_CLIENT_LIST_COMPANY_AUTHORIZE_TOOLTIP, COLOUR_GREEN, ci->client_id, &NetworkClientListWindow::OnClickClientAuthorize)); - - if (ci->client_id == _network_own_client_id) { - this->player_self_index = this->line_count; - } else if (ci->client_id == CLIENT_ID_SERVER) { - this->player_host_index = this->line_count; - } - - this->line_count += 1; + ButtonLine &line = *this->buttons.emplace_back(std::make_unique(ci->index)); + if (_network_server) line.AddButton(SPR_ADMIN, STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP, COLOUR_RED, ci->client_id, &NetworkClientListWindow::OnClickClientAdmin, _network_own_client_id == ci->client_id); + if (_network_own_client_id != ci->client_id) line.AddButton(SPR_CHAT, STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP, COLOUR_ORANGE, ci->client_id, &NetworkClientListWindow::OnClickClientChat); + if (_network_own_client_id != ci->client_id && client_playas != COMPANY_SPECTATOR && !ci->CanJoinCompany(client_playas)) line.AddButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_COMPANY_AUTHORIZE_TOOLTIP, COLOUR_GREEN, ci->client_id, &NetworkClientListWindow::OnClickClientAuthorize); } /* Disable the chat button when there are players in this company. */ - chat_button->disabled = !has_players; + chat_button.disabled = !has_players; } /** @@ -1543,14 +1683,11 @@ private: CompanyID client_playas = own_ci == nullptr ? COMPANY_SPECTATOR : own_ci->client_playas; this->buttons.clear(); - this->line_count = 0; - this->player_host_index = -1; - this->player_self_index = -1; /* As spectator, show a line to create a new company. */ if (client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { - this->buttons[line_count].push_back(std::make_unique(SPR_JOIN, STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP, COLOUR_ORANGE, COMPANY_SPECTATOR, &NetworkClientListWindow::OnClickCompanyNew)); - this->line_count += 1; + ButtonLine &line = *this->buttons.emplace_back(std::make_unique(COMPANY_NEW_COMPANY)); + line.AddButton(SPR_JOIN, STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP, COLOUR_ORANGE, COMPANY_SPECTATOR, &NetworkClientListWindow::OnClickCompanyNew); } if (client_playas != COMPANY_SPECTATOR) { @@ -1567,40 +1704,7 @@ private: /* Spectators */ this->RebuildListCompany(COMPANY_SPECTATOR, client_playas, client_playas != COMPANY_SPECTATOR); - this->vscroll->SetCount(this->line_count); - } - - /** - * Get the button at a specific point on the WID_CL_MATRIX. - * @param pt The point to look for a button. - * @return The button or a nullptr if there was none. - */ - ButtonCommon *GetButtonAtPoint(Point pt) - { - uint index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CL_MATRIX); - Rect matrix = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); - - bool rtl = _current_text_dir == TD_RTL; - uint x = rtl ? matrix.left : matrix.right; - - /* Find the buttons for this row. */ - auto button_find = this->buttons.find(index); - if (button_find == this->buttons.end()) return nullptr; - - /* Check if we want to display a tooltip for any of the buttons. */ - for (auto &button : button_find->second) { - uint left = rtl ? x : x - button->width; - uint right = rtl ? x + button->width : x; - - if (IsInsideMM(pt.x, left, right)) { - return button.get(); - } - - int width = button->width + WidgetDimensions::scaled.framerect.Horizontal(); - x += rtl ? width : -width; - } - - return nullptr; + this->vscroll->SetCount(this->buttons.size()); } public: @@ -1614,7 +1718,7 @@ public: void OnInit() override { - RebuildList(); + this->RebuildList(); } void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override @@ -1718,7 +1822,11 @@ public: break; case WID_CL_MATRIX: { - ButtonCommon *button = this->GetButtonAtPoint(pt); + auto it = this->vscroll->GetScrolledItemFromWidget(this->buttons, pt.y, this, WID_CL_MATRIX); + if (it == std::end(this->buttons)) break; + + Rect r = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + ButtonCommon *button = (*it)->GetButton(r, pt); if (button == nullptr) break; button->OnClick(this, pt); @@ -1731,34 +1839,14 @@ public: { switch (widget) { case WID_CL_MATRIX: { - int index = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CL_MATRIX); + auto it = this->vscroll->GetScrolledItemFromWidget(this->buttons, pt.y, this, WID_CL_MATRIX); + if (it == std::end(this->buttons)) break; - bool rtl = _current_text_dir == TD_RTL; - Rect matrix = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + Rect r = this->GetWidget(WID_CL_MATRIX)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + auto tooltip = (*it)->GetTooltip(r, pt); + if (!tooltip.has_value()) break; - Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - uint text_left = matrix.left + (rtl ? 0 : d.width + WidgetDimensions::scaled.hsep_wide); - uint text_right = matrix.right - (rtl ? d.width + WidgetDimensions::scaled.hsep_wide : 0); - - Dimension d2 = GetSpriteSize(SPR_PLAYER_SELF); - uint offset_x = WidgetDimensions::scaled.hsep_indent - d2.width - ScaleGUITrad(3); - - uint player_icon_x = rtl ? text_right - offset_x - d2.width : text_left + offset_x; - - if (IsInsideMM(pt.x, player_icon_x, player_icon_x + d2.width)) { - if (index == this->player_self_index) { - GuiShowTooltips(this, GetEncodedString(STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP), close_cond); - return true; - } else if (index == this->player_host_index) { - GuiShowTooltips(this, GetEncodedString(STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP), close_cond); - return true; - } - } - - ButtonCommon *button = this->GetButtonAtPoint(pt); - if (button == nullptr) return false; - - GuiShowTooltips(this, GetEncodedString(button->tooltip), close_cond); + GuiShowTooltips(this, std::move(*tooltip), close_cond); return true; }; } @@ -1852,154 +1940,23 @@ public: } } - /** - * Draw the buttons for a single line in the matrix. - * - * The x-position in RTL is the most left or otherwise the most right pixel - * we can draw the buttons from. - * - * @param x The x-position to start with the buttons. Updated during this function. - * @param y The y-position to start with the buttons. - * @param buttons The buttons to draw. - */ - void DrawButtons(int &x, uint y, const std::vector> &buttons) const - { - Rect r; - - for (auto &button : buttons) { - bool rtl = _current_text_dir == TD_RTL; - - int offset = (this->line_height - button->height) / 2; - r.left = rtl ? x : x - button->width + 1; - r.right = rtl ? x + button->width - 1 : x; - r.top = y + offset; - r.bottom = r.top + button->height - 1; - - DrawFrameRect(r, button->colour, {}); - DrawSprite(button->sprite, PAL_NONE, r.left + WidgetDimensions::scaled.framerect.left, r.top + WidgetDimensions::scaled.framerect.top); - if (button->disabled) { - GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(button->colour, SHADE_DARKER), FILLRECT_CHECKER); - } - - int width = button->width + WidgetDimensions::scaled.hsep_normal; - x += rtl ? width : -width; - } - } - - /** - * Draw a company and its clients on the matrix. - * @param company_id The company to draw. - * @param r The rect to draw within. - * @param line The Nth line we are drawing. Updated during this function. - */ - void DrawCompany(CompanyID company_id, const Rect &r, uint &line) const - { - bool rtl = _current_text_dir == TD_RTL; - int text_y_offset = CentreBounds(0, this->line_height, GetCharacterHeight(FS_NORMAL)); - - Dimension d = GetSpriteSize(SPR_COMPANY_ICON); - int offset = CentreBounds(0, this->line_height, d.height); - - uint line_start = this->vscroll->GetPosition(); - uint line_end = line_start + this->vscroll->GetCapacity(); - - uint y = r.top + (this->line_height * (line - line_start)); - - /* Draw the company line (if in range of scrollbar). */ - if (IsInsideMM(line, line_start, line_end)) { - int icon_left = r.WithWidth(d.width, rtl).left; - Rect tr = r.Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); - int &x = rtl ? tr.left : tr.right; - - /* If there are buttons for this company, draw them. */ - auto button_find = this->buttons.find(line); - if (button_find != this->buttons.end()) { - this->DrawButtons(x, y, button_find->second); - } - - if (company_id == COMPANY_SPECTATOR) { - DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset); - DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); - } else if (company_id == COMPANY_NEW_COMPANY) { - DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset); - DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_NEW_COMPANY, TC_WHITE); - } else { - DrawCompanyIcon(company_id, icon_left, y + offset); - - DrawString(tr.left, tr.right, y + text_y_offset, GetString(STR_COMPANY_NAME, company_id, company_id), TC_SILVER); - } - } - - y += this->line_height; - line++; - - for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (ci->client_playas != company_id) continue; - - /* Draw the player line (if in range of scrollbar). */ - if (IsInsideMM(line, line_start, line_end)) { - Rect tr = r.Indent(WidgetDimensions::scaled.hsep_indent, rtl); - - /* If there are buttons for this client, draw them. */ - auto button_find = this->buttons.find(line); - if (button_find != this->buttons.end()) { - int &x = rtl ? tr.left : tr.right; - this->DrawButtons(x, y, button_find->second); - } - - SpriteID player_icon = 0; - if (ci->client_id == _network_own_client_id) { - player_icon = SPR_PLAYER_SELF; - } else if (ci->client_id == CLIENT_ID_SERVER) { - player_icon = SPR_PLAYER_HOST; - } - - if (player_icon != 0) { - Dimension d2 = GetSpriteSize(player_icon); - int offset_y = CentreBounds(0, this->line_height, d2.height); - DrawSprite(player_icon, PALETTE_TO_GREY, rtl ? tr.right - d2.width : tr.left, y + offset_y); - tr = tr.Indent(d2.width + WidgetDimensions::scaled.hsep_normal, rtl); - } - - DrawString(tr.left, tr.right, y + text_y_offset, GetString(STR_JUST_RAW_STRING, ci->client_name), TC_BLACK); - } - - y += this->line_height; - line++; - } - } - void DrawWidget(const Rect &r, WidgetID widget) const override { switch (widget) { case WID_CL_MATRIX: { - Rect ir = r.Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); - uint line = 0; + Rect ir = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); if (this->hover_index >= 0) { Rect br = r.WithHeight(this->line_height).Translate(0, this->hover_index * this->line_height); GfxFillRect(br.Shrink(WidgetDimensions::scaled.bevel), GREY_SCALE(9)); } - NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id); - CompanyID client_playas = own_ci == nullptr ? COMPANY_SPECTATOR : own_ci->client_playas; - - if (client_playas == COMPANY_SPECTATOR && !NetworkMaxCompaniesReached()) { - this->DrawCompany(COMPANY_NEW_COMPANY, ir, line); + auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->buttons); + for (auto it = first; it != last; ++it) { + (*it)->Draw(ir); + ir = ir.Translate(0, this->line_height); } - if (client_playas != COMPANY_SPECTATOR) { - this->DrawCompany(client_playas, ir, line); - } - - for (const Company *c : Company::Iterate()) { - if (client_playas == c->index) continue; - this->DrawCompany(c->index, ir, line); - } - - /* Spectators */ - this->DrawCompany(COMPANY_SPECTATOR, ir, line); - break; } } From 81530e2574134bf21471aaf1d2aaa4aaa763eaf2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 25 Sep 2025 08:45:25 +0100 Subject: [PATCH 105/280] Change: Support interface scaling in network client list buttons. --- src/network/network_gui.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index c1d1dfbf10..a8d2fc4859 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1339,7 +1339,7 @@ public: colour(colour), disabled(disabled) { - Dimension d = GetSpriteSize(sprite); + Dimension d = GetScaledSpriteSize(sprite); this->height = d.height + WidgetDimensions::scaled.framerect.Vertical(); this->width = d.width + WidgetDimensions::scaled.framerect.Horizontal(); } @@ -1463,7 +1463,7 @@ public: bool rtl = _current_text_dir == TD_RTL; r = this->DrawButtons(r); - Dimension d = GetSpriteSize(SPR_COMPANY_ICON); + Dimension d = GetScaledSpriteSize(SPR_COMPANY_ICON); PaletteID pal = Company::IsValidID(this->company_id) ? GetCompanyPalette(this->company_id) : PALETTE_TO_GREY; DrawSpriteIgnorePadding(SPR_COMPANY_ICON, pal, r.WithWidth(d.width, rtl), SA_CENTER); @@ -1503,7 +1503,7 @@ public: } if (player_icon != 0) { - Dimension d = GetSpriteSize(player_icon); + Dimension d = GetScaledSpriteSize(player_icon); DrawSpriteIgnorePadding(player_icon, PALETTE_TO_GREY, r.WithWidth(d.width, rtl), SA_CENTER); tr = tr.Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); } @@ -1514,7 +1514,7 @@ public: std::optional GetTooltip(Rect r, const Point &pt) const override { bool rtl = _current_text_dir == TD_RTL; - Dimension d = GetSpriteSize(SPR_PLAYER_SELF); + Dimension d = GetScaledSpriteSize(SPR_PLAYER_SELF); if (r.WithWidth(d.width, rtl).Contains(pt)) { const NetworkClientInfo *ci = NetworkClientInfo::GetIfValid(this->client_pool_id); @@ -1754,7 +1754,7 @@ public: break; case WID_CL_MATRIX: { - uint height = std::max({GetSpriteSize(SPR_COMPANY_ICON).height, GetSpriteSize(SPR_JOIN).height, GetSpriteSize(SPR_ADMIN).height, GetSpriteSize(SPR_CHAT).height}); + uint height = std::max({GetScaledSpriteSize(SPR_COMPANY_ICON).height, GetScaledSpriteSize(SPR_JOIN).height, GetScaledSpriteSize(SPR_ADMIN).height, GetScaledSpriteSize(SPR_CHAT).height}); height += WidgetDimensions::scaled.framerect.Vertical(); this->line_height = std::max(height, (uint)GetCharacterHeight(FS_NORMAL)) + padding.height; From ff674829f5b335e4ae59d34eaf722944247ab19f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 28 Sep 2025 14:09:36 +0100 Subject: [PATCH 106/280] Codechange: Replace Rect CentreTo with CentreToHeight. (#14675) So far all callers only need to centre vertically, so not having to provide the existing width simplifies calls. --- src/company_gui.cpp | 8 ++++---- src/core/geometry_type.hpp | 8 +++----- src/dropdown_common_type.h | 4 ++-- src/genworld_gui.cpp | 3 +-- src/network/network_gui.cpp | 6 +++--- src/newgrf_badge_gui.cpp | 4 ++-- src/widget.cpp | 2 +- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 9debd59c5b..66dc383cbb 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1333,8 +1333,8 @@ public: Rect ir = r.Shrink(WidgetDimensions::scaled.frametext, RectPadding::zero).WithHeight(this->line_height); bool rtl = _current_text_dir == TD_RTL; - Rect br = ir.CentreTo(ir.Width(), SETTING_BUTTON_HEIGHT).WithWidth(SETTING_BUTTON_WIDTH, rtl); - Rect tr = ir.Shrink(RectPadding::zero, WidgetDimensions::scaled.matrix).CentreTo(ir.Width(), GetCharacterHeight(FS_NORMAL)).Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); + Rect br = ir.CentreToHeight(SETTING_BUTTON_HEIGHT).WithWidth(SETTING_BUTTON_WIDTH, rtl); + Rect tr = ir.Shrink(RectPadding::zero, WidgetDimensions::scaled.matrix).CentreToHeight(GetCharacterHeight(FS_NORMAL)).Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); DrawArrowButtons(br.left, br.top, COLOUR_YELLOW, this->selected_var == UINT_MAX - 1 ? this->click_state : 0, true, true); DrawString(tr, GetString(STR_FACE_SETTING_NUMERIC, STR_FACE_STYLE, this->face.style + 1, GetNumCompanyManagerFaceStyles()), TC_WHITE); @@ -1352,8 +1352,8 @@ public: const uint8_t var = static_cast(*it - vars.data()); const FaceVar &facevar = **it; - Rect br = ir.CentreTo(ir.Width(), SETTING_BUTTON_HEIGHT).WithWidth(SETTING_BUTTON_WIDTH, rtl); - Rect tr = ir.Shrink(RectPadding::zero, WidgetDimensions::scaled.matrix).CentreTo(ir.Width(), GetCharacterHeight(FS_NORMAL)).Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); + Rect br = ir.CentreToHeight(SETTING_BUTTON_HEIGHT).WithWidth(SETTING_BUTTON_WIDTH, rtl); + Rect tr = ir.Shrink(RectPadding::zero, WidgetDimensions::scaled.matrix).CentreToHeight(GetCharacterHeight(FS_NORMAL)).Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl); uint val = vars[var].GetBits(this->face); if (facevar.type == FaceVarType::Toggle) { diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index 9e7cf62583..ccc610fa90 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -253,16 +253,14 @@ struct Rect { } /** - * Centre a dimension within this Rect. - * @param width The horizontal dimension. + * Centre a vertical dimension within this Rect. * @param height The vertical dimension. * @return the new resized Rect. */ - [[nodiscard]] inline Rect CentreTo(int width, int height) const + [[nodiscard]] inline Rect CentreToHeight(int height) const { - int new_left = CentreBounds(this->left, this->right, width); int new_top = CentreBounds(this->top, this->bottom, height); - return {new_left, new_top, new_left + width - 1, new_top + height - 1}; + return {this->left, new_top, this->right, new_top + height - 1}; } /** diff --git a/src/dropdown_common_type.h b/src/dropdown_common_type.h index e29aa16163..81e2b36be9 100644 --- a/src/dropdown_common_type.h +++ b/src/dropdown_common_type.h @@ -216,7 +216,7 @@ public: bool rtl = TEnd ^ (_current_text_dir == TD_RTL); int w = SETTING_BUTTON_WIDTH; - if (r.WithWidth(w, rtl).CentreTo(w, SETTING_BUTTON_HEIGHT).Contains(pt)) return this->click; + if (r.WithWidth(w, rtl).CentreToHeight(SETTING_BUTTON_HEIGHT).Contains(pt)) return this->click; return this->TBase::OnClick(r.Indent(w + WidgetDimensions::scaled.hsep_wide, rtl), pt); } @@ -226,7 +226,7 @@ public: bool rtl = TEnd ^ (_current_text_dir == TD_RTL); int w = SETTING_BUTTON_WIDTH; - Rect br = r.WithWidth(w, rtl).CentreTo(w, SETTING_BUTTON_HEIGHT); + Rect br = r.WithWidth(w, rtl).CentreToHeight(SETTING_BUTTON_HEIGHT); DrawBoolButton(br.left, br.top, this->button_colour, this->background_colour, this->on, true); this->TBase::Draw(full, r.Indent(w + WidgetDimensions::scaled.hsep_wide, rtl), sel, click_result, bg_colour); diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index f910f75cf3..8bef4e4c81 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -1419,8 +1419,7 @@ struct GenerateProgressWindow : public Window { DrawFrameRect(r, COLOUR_GREY, {FrameFlag::BorderOnly, FrameFlag::Lowered}); Rect br = r.Shrink(WidgetDimensions::scaled.bevel); DrawFrameRect(br.WithWidth(br.Width() * GenWorldStatus::percent / 100, _current_text_dir == TD_RTL), COLOUR_MAUVE, {}); - DrawString(br.left, br.right, CentreBounds(br.top, br.bottom, GetCharacterHeight(FS_NORMAL)), - GetString(STR_GENERATION_PROGRESS, GenWorldStatus::percent), TC_FROMSTRING, SA_HOR_CENTER); + DrawString(br.CentreToHeight(GetCharacterHeight(FS_NORMAL)), GetString(STR_GENERATION_PROGRESS, GenWorldStatus::percent), TC_FROMSTRING, SA_HOR_CENTER); break; } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index a8d2fc4859..a437f776f7 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1442,7 +1442,7 @@ protected: { bool rtl = _current_text_dir == TD_RTL; for (auto &button : buttons) { - Rect br = r.CentreTo(r.Width(), button->height).WithWidth(button->width, !rtl); + Rect br = r.CentreToHeight(button->height).WithWidth(button->width, !rtl); DrawFrameRect(br, button->colour, {}); DrawSpriteIgnorePadding(button->sprite, PAL_NONE, br, SA_CENTER); if (button->disabled) { @@ -1467,7 +1467,7 @@ public: PaletteID pal = Company::IsValidID(this->company_id) ? GetCompanyPalette(this->company_id) : PALETTE_TO_GREY; DrawSpriteIgnorePadding(SPR_COMPANY_ICON, pal, r.WithWidth(d.width, rtl), SA_CENTER); - Rect tr = r.CentreTo(r.Width(), GetCharacterHeight(FS_NORMAL)).Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); + Rect tr = r.CentreToHeight(GetCharacterHeight(FS_NORMAL)).Indent(d.width + WidgetDimensions::scaled.hsep_normal, rtl); if (this->company_id == COMPANY_SPECTATOR) { DrawString(tr, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER); } else if (this->company_id == COMPANY_NEW_COMPANY) { @@ -1493,7 +1493,7 @@ public: bool rtl = _current_text_dir == TD_RTL; r = this->DrawButtons(r); - Rect tr = r.CentreTo(r.Width(), GetCharacterHeight(FS_NORMAL)); + Rect tr = r.CentreToHeight(GetCharacterHeight(FS_NORMAL)); SpriteID player_icon = 0; if (ci->client_id == _network_own_client_id) { diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 0c6b1f82de..8c10484df4 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -280,7 +280,7 @@ public: bool rtl = (_current_text_dir == TD_RTL); int w = SETTING_BUTTON_WIDTH; - Rect br = r.WithWidth(w, TEnd ^ rtl).CentreTo(w, SETTING_BUTTON_HEIGHT); + Rect br = r.WithWidth(w, TEnd ^ rtl).CentreToHeight(SETTING_BUTTON_HEIGHT); if (br.WithWidth(w / 2, rtl).Contains(pt)) return this->click_up; if (br.WithWidth(w / 2, !rtl).Contains(pt)) return this->click_down; @@ -298,7 +298,7 @@ public: if (click_result == this->click_down) state = 2; } - Rect br = r.WithWidth(w, TEnd ^ rtl).CentreTo(w, SETTING_BUTTON_HEIGHT); + Rect br = r.WithWidth(w, TEnd ^ rtl).CentreToHeight(SETTING_BUTTON_HEIGHT); DrawUpDownButtons(br.left, br.top, this->button_colour, state, this->click_up != 0, this->click_down != 0); this->TBase::Draw(full, r.Indent(w + WidgetDimensions::scaled.hsep_wide, TEnd ^ rtl), sel, click_result, bg_colour); diff --git a/src/widget.cpp b/src/widget.cpp index cf89f126d7..b99da3d4bf 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -752,7 +752,7 @@ static inline void DrawButtonDropdown(const Rect &r, Colours colour, bool clicke Rect text = r.Indent(NWidgetLeaf::dropdown_dimension.width, !rtl); DrawFrameRect(text, colour, clicked_button ? FrameFlag::Lowered : FrameFlags{}); if (!str.empty()) { - text = text.CentreTo(text.Width(), GetCharacterHeight(FS_NORMAL)).Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); + text = text.CentreToHeight(GetCharacterHeight(FS_NORMAL)).Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); DrawString(text, str, TC_BLACK, align); } From 5ed8f1203bbb9696176f091fec78404d6ce72f9e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 28 Sep 2025 18:09:57 +0100 Subject: [PATCH 107/280] Codechange: Cleanup unnecessary includes of spritecache.h (#14678) --- src/aircraft_cmd.cpp | 1 - src/aircraft_gui.cpp | 1 - src/depot_gui.cpp | 2 +- src/fontcache.h | 4 ++-- src/fontcache/spritefontcache.cpp | 1 + src/newgrf/newgrf_act12.cpp | 1 + src/newgrf_canal.cpp | 1 - src/rail_gui.cpp | 1 - src/roadveh_cmd.cpp | 1 - src/ship_cmd.cpp | 1 - src/ship_gui.cpp | 1 - src/spritecache_internal.h | 2 +- src/train_cmd.cpp | 1 - src/vehicle_gui.cpp | 1 - 14 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 91f0f7968f..f3cd7f09b7 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -16,7 +16,6 @@ #include "news_func.h" #include "newgrf_engine.h" #include "newgrf_sound.h" -#include "spritecache.h" #include "error_func.h" #include "strings_func.h" #include "command_func.h" diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp index 5b7d67582b..3709dfb721 100644 --- a/src/aircraft_gui.cpp +++ b/src/aircraft_gui.cpp @@ -14,7 +14,6 @@ #include "strings_func.h" #include "vehicle_func.h" #include "window_gui.h" -#include "spritecache.h" #include "zoom_func.h" #include "table/strings.h" diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 18856c2a95..3644a31694 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -17,7 +17,7 @@ #include "viewport_func.h" #include "command_func.h" #include "depot_base.h" -#include "spritecache.h" +#include "spritecache_type.h" #include "strings_func.h" #include "sound_func.h" #include "vehicle_func.h" diff --git a/src/fontcache.h b/src/fontcache.h index 099f9b17e6..a74e0a57b6 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -10,9 +10,9 @@ #ifndef FONTCACHE_H #define FONTCACHE_H +#include "gfx_type.h" #include "provider_manager.h" -#include "string_type.h" -#include "spritecache.h" +#include "spritecache_type.h" /** Glyphs are characters from a font. */ typedef uint32_t GlyphID; diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index 96f9fd8cc3..a1c2f29770 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../fontcache.h" #include "../gfx_layout.h" +#include "../spritecache.h" #include "../string_func.h" #include "../zoom_func.h" #include "spritefontcache.h" diff --git a/src/newgrf/newgrf_act12.cpp b/src/newgrf/newgrf_act12.cpp index 2e0250775b..124d2f1afe 100644 --- a/src/newgrf/newgrf_act12.cpp +++ b/src/newgrf/newgrf_act12.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../debug.h" #include "../fontcache.h" +#include "../spritecache.h" #include "newgrf_bytereader.h" #include "newgrf_internal.h" diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp index 4cb05922dd..0e593ba749 100644 --- a/src/newgrf_canal.cpp +++ b/src/newgrf_canal.cpp @@ -13,7 +13,6 @@ #include "newgrf_canal.h" #include "water.h" #include "water_map.h" -#include "spritecache.h" #include "safeguards.h" diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 7b9a503577..3ff53b0648 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -29,7 +29,6 @@ #include "dropdown_func.h" #include "tunnelbridge.h" #include "tilehighlight_func.h" -#include "spritecache.h" #include "core/geometry_func.hpp" #include "hotkeys.h" #include "engine_base.h" diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 70717f15b8..060ec3694b 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -28,7 +28,6 @@ #include "depot_map.h" #include "effectvehicle_func.h" #include "roadstop_base.h" -#include "spritecache.h" #include "core/random_func.hpp" #include "company_base.h" #include "core/backup_type.hpp" diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index f741c93f8a..c976cabc0a 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -19,7 +19,6 @@ #include "pathfinder/yapf/yapf.h" #include "pathfinder/yapf/yapf_ship_regions.h" #include "newgrf_sound.h" -#include "spritecache.h" #include "strings_func.h" #include "window_func.h" #include "timer/timer_game_calendar.h" diff --git a/src/ship_gui.cpp b/src/ship_gui.cpp index 7bdedb82dc..eb5eb4d42f 100644 --- a/src/ship_gui.cpp +++ b/src/ship_gui.cpp @@ -14,7 +14,6 @@ #include "vehicle_gui.h" #include "strings_func.h" #include "vehicle_func.h" -#include "spritecache.h" #include "zoom_func.h" #include "table/strings.h" diff --git a/src/spritecache_internal.h b/src/spritecache_internal.h index 5d7b02e615..367db3601e 100644 --- a/src/spritecache_internal.h +++ b/src/spritecache_internal.h @@ -13,7 +13,7 @@ #include "core/math_func.hpp" #include "gfx_type.h" #include "spritecache_type.h" -#include "spriteloader/spriteloader.hpp" +#include "spriteloader/sprite_file_type.hpp" #include "table/sprites.h" diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 136f321c71..5723eb11cf 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -26,7 +26,6 @@ #include "newgrf_station.h" #include "effectvehicle_func.h" #include "network/network.h" -#include "spritecache.h" #include "core/random_func.hpp" #include "company_base.h" #include "newgrf.h" diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 0ea6f71e44..251b905aa1 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -30,7 +30,6 @@ #include "dropdown_func.h" #include "timetable.h" #include "articulated_vehicles.h" -#include "spritecache.h" #include "core/geometry_func.hpp" #include "core/container_func.hpp" #include "company_base.h" From 126669e10d9de26ae4c6d44958a4e7f9e8abeed5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Sep 2025 18:00:54 +0100 Subject: [PATCH 108/280] Codechange: Make GetRail/RoadTypeInfoIndex() a member method. This follows a similar pattern used for cargoes, houses and objects. Also fixes incorrect documentation of GetRoadTypeInfoIndex(). --- src/newgrf_railtype.cpp | 2 +- src/newgrf_roadtype.cpp | 2 +- src/rail.cpp | 12 ++++++++++++ src/rail.h | 15 ++------------- src/road.cpp | 12 ++++++++++++ src/road.h | 15 ++------------- 6 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 0d215971b8..67754addb2 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -35,7 +35,7 @@ case 0x43: return TimerGameCalendar::date.base(); case 0x44: return to_underlying(HouseZone::TownEdge); case 0x45: { - auto rt = GetRailTypeInfoIndex(this->rti); + RailType rt = this->rti->Index(); uint8_t local = GetReverseRailTypeTranslation(rt, this->ro.grffile); if (local == 0xFF) local = 0xFE; return 0xFFFF | local << 16; diff --git a/src/newgrf_roadtype.cpp b/src/newgrf_roadtype.cpp index e48a67b11a..6b40a1e0d8 100644 --- a/src/newgrf_roadtype.cpp +++ b/src/newgrf_roadtype.cpp @@ -69,7 +69,7 @@ uint32_t GetTrackTypes(TileIndex tile, const GRFFile *grffile) case 0x43: return TimerGameCalendar::date.base(); case 0x44: return to_underlying(HouseZone::TownEdge); case 0x45: { - auto rt = GetRoadTypeInfoIndex(this->rti); + RoadType rt = this->rti->Index(); uint8_t local = GetReverseRoadTypeTranslation(rt, this->ro.grffile); if (local == 0xFF) local = 0xFE; if (RoadTypeIsRoad(rt)) { diff --git a/src/rail.cpp b/src/rail.cpp index d9e41087e3..590676aa87 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -19,6 +19,18 @@ #include "safeguards.h" +/** + * Get the RailType for this RailTypeInfo. + * @return RailType in static RailTypeInfo definitions. + */ +RailType RailTypeInfo::Index() const +{ + extern RailTypeInfo _railtypes[RAILTYPE_END]; + size_t index = this - _railtypes; + assert(index < RAILTYPE_END); + return static_cast(index); +} + /** * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile. */ diff --git a/src/rail.h b/src/rail.h index 4a294e213d..631a7989d0 100644 --- a/src/rail.h +++ b/src/rail.h @@ -286,6 +286,8 @@ public: { return 82 * this->fallback_railtype; } + + RailType Index() const; }; @@ -301,19 +303,6 @@ inline const RailTypeInfo *GetRailTypeInfo(RailType railtype) return &_railtypes[railtype]; } -/** - * Returns the railtype for a Railtype information. - * @param rti Pointer to static RailTypeInfo - * @return Railtype in static railtype definitions - */ -inline RailType GetRailTypeInfoIndex(const RailTypeInfo *rti) -{ - extern RailTypeInfo _railtypes[RAILTYPE_END]; - size_t index = rti - _railtypes; - assert(index < RAILTYPE_END && rti == _railtypes + index); - return static_cast(index); -} - /** * Returns all compatible railtypes for a set of railtypes. * @param railtypes Set of railtypes to get the compatible railtypes from. diff --git a/src/road.cpp b/src/road.cpp index 5b796f12ea..51bdf1900d 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -23,6 +23,18 @@ #include "safeguards.h" +/** + * Get the RoadType for this RoadTypeInfo. + * @return RoadType in static RoadTypeInfo definitions. + */ +RoadType RoadTypeInfo::Index() const +{ + extern RoadTypeInfo _roadtypes[ROADTYPE_END]; + size_t index = this - _roadtypes; + assert(index < ROADTYPE_END); + return static_cast(index); +} + /** * Return if the tile is a valid tile for a crossing. * diff --git a/src/road.h b/src/road.h index 76355d216e..a3c689419f 100644 --- a/src/road.h +++ b/src/road.h @@ -185,6 +185,8 @@ public: { return this->group[ROTSG_GROUND] != nullptr; } + + RoadType Index() const; }; /** @@ -231,19 +233,6 @@ inline const RoadTypeInfo *GetRoadTypeInfo(RoadType roadtype) return &_roadtypes[roadtype]; } -/** - * Returns the railtype for a Railtype information. - * @param rti Pointer to static RailTypeInfo - * @return Railtype in static railtype definitions - */ -inline RoadType GetRoadTypeInfoIndex(const RoadTypeInfo *rti) -{ - extern RoadTypeInfo _roadtypes[ROADTYPE_END]; - size_t index = rti - _roadtypes; - assert(index < ROADTYPE_END && rti == _roadtypes + index); - return static_cast(index); -} - /** * Checks if an engine of the given RoadType got power on a tile with a given * RoadType. This would normally just be an equality check, but for electrified From ca8fb69ffd1baa6bb3e8d2afd4ac6b3a089a0f78 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Sep 2025 21:07:01 +0100 Subject: [PATCH 109/280] Codechange: Use std algorithm when allocating rail/road type. Use `std::ranges::find()` instead of a `for`-loop to allocate rail and road types. --- src/rail_cmd.cpp | 45 +++++++++++++++++++-------------------- src/road_cmd.cpp | 55 ++++++++++++++++++++++-------------------------- 2 files changed, 47 insertions(+), 53 deletions(-) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index fa70279955..e7c9c627cf 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -148,34 +148,33 @@ void InitRailTypes() */ RailType AllocateRailType(RailTypeLabel label) { - for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - RailTypeInfo *rti = &_railtypes[rt]; + auto it = std::ranges::find(_railtypes, 0, &RailTypeInfo::label); + if (it == std::end(_railtypes)) return INVALID_RAILTYPE; - if (rti->label == 0) { - /* Set up new rail type */ - *rti = _original_railtypes[RAILTYPE_RAIL]; - rti->label = label; - rti->alternate_labels.clear(); + RailTypeInfo &rti = *it; + RailType rt = rti.Index(); - /* Make us compatible with ourself. */ - rti->powered_railtypes = rt; - rti->compatible_railtypes = rt; + /* Set up new rail type based on default rail. */ + rti = _original_railtypes[RAILTYPE_RAIL]; + rti.label = label; + rti.alternate_labels.clear(); - /* We also introduce ourself. */ - rti->introduces_railtypes = rt; + /* Make us compatible with ourself. */ + rti.powered_railtypes = rt; + rti.compatible_railtypes = rt; - /* Default sort order; order of allocation, but with some - * offsets so it's easier for NewGRF to pick a spot without - * changing the order of other (original) rail types. - * The << is so you can place other railtypes in between the - * other railtypes, the 7 is to be able to place something - * before the first (default) rail type. */ - rti->sorting_order = rt << 4 | 7; - return rt; - } - } + /* We also introduce ourself. */ + rti.introduces_railtypes = rt; - return INVALID_RAILTYPE; + /* Default sort order; order of allocation, but with some + * offsets so it's easier for NewGRF to pick a spot without + * changing the order of other (original) rail types. + * The << is so you can place other railtypes in between the + * other railtypes, the 7 is to be able to place something + * before the first (default) rail type. */ + rti.sorting_order = rt << 4 | 7; + + return rt; } static const uint8_t _track_sloped_sprites[14] = { diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index eea76ef76a..f2609fc617 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -129,43 +129,38 @@ void InitRoadTypes() */ RoadType AllocateRoadType(RoadTypeLabel label, RoadTramType rtt) { - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - RoadTypeInfo *rti = &_roadtypes[rt]; + auto it = std::ranges::find(_roadtypes, 0, &RoadTypeInfo::label); + if (it == std::end(_roadtypes)) return INVALID_ROADTYPE; - if (rti->label == 0) { - /* Set up new road type */ - *rti = _original_roadtypes[(rtt == RTT_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD]; - rti->label = label; - rti->alternate_labels.clear(); - rti->flags = {}; - rti->introduction_date = CalendarTime::INVALID_DATE; + RoadTypeInfo &rti = *it; + RoadType rt = rti.Index(); - /* Make us compatible with ourself. */ - rti->powered_roadtypes = rt; + /* Set up new road type based on default tram or road. */ + rti = _original_roadtypes[(rtt == RTT_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD]; + rti.label = label; + rti.alternate_labels.clear(); + rti.flags = {}; + rti.introduction_date = CalendarTime::INVALID_DATE; - /* We also introduce ourself. */ - rti->introduces_roadtypes = rt; + /* Make us compatible with ourself. */ + rti.powered_roadtypes = rt; - /* Default sort order; order of allocation, but with some - * offsets so it's easier for NewGRF to pick a spot without - * changing the order of other (original) road types. - * The << is so you can place other roadtypes in between the - * other roadtypes, the 7 is to be able to place something - * before the first (default) road type. */ - rti->sorting_order = rt << 2 | 7; + /* We also introduce ourself. */ + rti.introduces_roadtypes = rt; - /* Set bitmap of road/tram types */ - if (rtt == RTT_TRAM) { - _roadtypes_tram.Set(rt); - } else { - _roadtypes_road.Set(rt); - } + /* Default sort order; order of allocation, but with some + * offsets so it's easier for NewGRF to pick a spot without + * changing the order of other (original) road types. + * The << is so you can place other roadtypes in between the + * other roadtypes, the 7 is to be able to place something + * before the first (default) road type. */ + rti.sorting_order = rt << 2 | 7; - return rt; - } - } + /* Set bitmap of road/tram types */ + _roadtypes_road.Set(rt, rtt == RTT_ROAD); + _roadtypes_tram.Set(rt, rtt == RTT_TRAM); - return INVALID_ROADTYPE; + return rt; } /** From 29136350cfee87b2b3869aa8034852e57b3aec8c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Sep 2025 21:14:17 +0100 Subject: [PATCH 110/280] Codechange: Initialise rail/road types with range-for. Replace double loop with single loop that performs both parts together. --- src/rail_cmd.cpp | 15 +++++++-------- src/road_cmd.cpp | 15 +++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index e7c9c627cf..e2ee0b781b 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -129,15 +129,14 @@ static bool CompareRailTypes(const RailType &first, const RailType &second) */ void InitRailTypes() { - for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - RailTypeInfo *rti = &_railtypes[rt]; - ResolveRailTypeGUISprites(rti); - if (rti->flags.Test(RailTypeFlag::Hidden)) _railtypes_hidden_mask.Set(rt); - } - _sorted_railtypes.clear(); - for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - if (_railtypes[rt].label == 0) continue; + for (RailTypeInfo &rti : _railtypes) { + RailType rt = rti.Index(); + + ResolveRailTypeGUISprites(&rti); + _railtypes_hidden_mask.Set(rt, rti.flags.Test(RailTypeFlag::Hidden)); + + if (rti.label == 0) continue; _sorted_railtypes.push_back(rt); } std::sort(_sorted_railtypes.begin(), _sorted_railtypes.end(), CompareRailTypes); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index f2609fc617..4b5d93682d 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -110,15 +110,14 @@ static bool CompareRoadTypes(const RoadType &first, const RoadType &second) */ void InitRoadTypes() { - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - RoadTypeInfo *rti = &_roadtypes[rt]; - ResolveRoadTypeGUISprites(rti); - if (rti->flags.Test(RoadTypeFlag::Hidden)) _roadtypes_hidden_mask.Set(rt); - } - _sorted_roadtypes.clear(); - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - if (_roadtypes[rt].label == 0) continue; + for (RoadTypeInfo &rti : _roadtypes) { + RoadType rt = rti.Index(); + + ResolveRoadTypeGUISprites(&rti); + _roadtypes_hidden_mask.Set(rt, rti.flags.Test(RoadTypeFlag::Hidden)); + + if (rti.label == 0) continue; _sorted_roadtypes.push_back(rt); } std::sort(_sorted_roadtypes.begin(), _sorted_roadtypes.end(), CompareRoadTypes); From c8220494de28c993141b657a9d082becf61f0bee Mon Sep 17 00:00:00 2001 From: Su Date: Sun, 28 Sep 2025 20:18:23 +0100 Subject: [PATCH 111/280] Change: replace the "(City)" identifier in the town directory with the city icon (#14634) --- src/lang/english.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 9aab6f47bb..240fc2ac05 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3691,7 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- None - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to centre main view on town. Ctrl+Click to open a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} From 8eaf511f0c7929454eb8b083e3a1e777004db77c Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 29 Sep 2025 04:39:03 +0000 Subject: [PATCH 112/280] Update: Translations from eints english (us): 3 changes by 2TallTyler galician: 9 changes by pvillaverde --- src/lang/afrikaans.txt | 1 - src/lang/arabic_egypt.txt | 1 - src/lang/belarusian.txt | 1 - src/lang/brazilian_portuguese.txt | 1 - src/lang/bulgarian.txt | 1 - src/lang/catalan.txt | 1 - 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 | 6 +++--- src/lang/esperanto.txt | 1 - src/lang/estonian.txt | 1 - src/lang/finnish.txt | 1 - src/lang/french.txt | 1 - src/lang/galician.txt | 12 +++++++++--- src/lang/german.txt | 1 - src/lang/greek.txt | 1 - src/lang/hebrew.txt | 1 - src/lang/hungarian.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/maori.txt | 1 - src/lang/norwegian_bokmal.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/tamil.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/vietnamese.txt | 1 - src/lang/welsh.txt | 1 - 51 files changed, 12 insertions(+), 55 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 9b1b1f2d00..9c98637e23 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -3075,7 +3075,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Tik 'n n # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Geen - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Stad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Dorpname - klik op 'n naam om skerm daarna te skuif. Ctrl+klik om 'n nuwe venster vir die dorp oop te maak STR_TOWN_POPULATION :{BLACK}Wêreldbevolking: {COMMA} diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 45f5a44a80..0a1b38a540 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -2992,7 +2992,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}ادخل # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}-بدون- STR_TOWN_DIRECTORY_TOWN :{ORANGE}{RLE}{TOWN}{BLACK} {RLM}({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{RLE}{TOWN}{YELLOW} (مدينة){BLACK} {RLM}({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}اسم المدينة - اضغط على الاسم لتوسيط الشاشة عليها. اضغط + كنترول لفتح شاشة عرض جديدة للضاحية. STR_TOWN_POPULATION :{BLACK}سكان العالم: {COMMA} diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 088433e101..814bd6c575 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -3880,7 +3880,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Увяд # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Няма - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Мегаполіс){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Сьпіс гарадоў: пстрычка па назьве паказвае горад у асноўным вакне. Ctrl+пстрычка — у дадатковым вакне. STR_TOWN_POPULATION :{BLACK}Насельніцтва: {COMMA} diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index dd916cca9a..762bcab373 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3692,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduz STR_TOWN_DIRECTORY_CAPTION :{WHITE}Localidades ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nenhum - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Cidade){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes das localidades - clique em um nome para centralizar a visualização principal na cidade. Ctrl+Clique para abrir uma nova visualização na localização da localidade STR_TOWN_POPULATION :{BLACK}População mundial: {COMMA} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 8358254842..a45f727b20 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -3620,7 +3620,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Въве STR_TOWN_DIRECTORY_CAPTION :{WHITE}Градове ({COMMA} от {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Отсъства - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (метрополис){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Имена на градовете - натиснете на името, за да центрирате камерата върху този град. Ctrl+Click отваря прозорец с нов изглед към града STR_TOWN_POPULATION :{BLACK}Обща популация на картата: {COMMA} diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 118391db10..9f29851a9c 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3692,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Posa un STR_TOWN_DIRECTORY_CAPTION :{WHITE}Poblacions ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Cap - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA} -{YELLOW} ciutat{BLACK}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms de les poblacions - feu clic al nom d'una població per a centrar-hi la vista principal. Amb Ctrl+clic, s'obre una vista nova centrada on hi ha la població. STR_TOWN_POPULATION :{BLACK}Població mundial: {COMMA} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 3b47a5321b..2fcb9bb0b3 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -3249,7 +3249,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Unesi im # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ništa - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Grad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Imena gradova - klikni na ime kako bi centrirao pogled na grad. Ctrl+klik otvara novi prozor sa lokacijom grada STR_TOWN_POPULATION :{BLACK}Svjetsko stanovništvo: {COMMA} diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 52af5153df..06d4ae0371 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -3723,7 +3723,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Zadej n STR_TOWN_DIRECTORY_CAPTION :{WHITE}Města ({COMMA} z {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nic - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (velkoměsto){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Jména měst - pohled na město zaměříš kliknutím na jeho jméno. Při stisknutém Ctrl otevřeš nový pohled STR_TOWN_POPULATION :{BLACK}Populace světa: {COMMA} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 2cf6189056..dd755db6fa 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3690,7 +3690,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Indtast STR_TOWN_DIRECTORY_CAPTION :{WHITE}Byer ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ingen - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (storby){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Bynavne - klik på et navn for at centrere skærmen over byen. Ctrl+Klik åbner et nyt vindue ved byens lokalitet. STR_TOWN_POPULATION :{BLACK}Verdens befolkning: {COMMA} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 0bd5d514a0..884055d6d7 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3690,7 +3690,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Geef een STR_TOWN_DIRECTORY_CAPTION :{WHITE}Steden ({COMMA} van {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE} Geen STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (groeistad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Plaatsnamen - klik op naam om het scherm te centreren op de stad. Ctrl+klik opent een nieuw kijkvenster op de locatie van de stad STR_TOWN_POPULATION :{BLACK}Wereldbevolking: {COMMA} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 734f92210b..0b1ba3134d 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3691,7 +3691,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- None - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to centre main view on town. Ctrl+Click to open a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 5983f412d0..10ad2ad02a 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Random -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Random +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Infinite Water STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Heightmap name: @@ -3690,7 +3691,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- None - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to center main view on town. Ctrl+Click to open a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index afe5f84a31..f8ee39b52d 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -3479,7 +3479,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enigu no # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}-Neniu - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Urbego){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Urbonomoj - klaku nomon por centri vidpukto ĉe la urbo. Ctrl+Klak por malfermi novan vidujon ĉe la urba loko STR_TOWN_POPULATION :{BLACK}Monda enloĝantaro: {COMMA} diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 1e9fa32ff4..7c4f765321 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -3628,7 +3628,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Sisesta # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Puudub - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Linn){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Astuste nimed - vajuta nimele, et viia vaade asustusele. Ctrl+klõps avab uue vaate linna asukohas STR_TOWN_POPULATION :{BLACK}Maailma rahvaarv: {COMMA} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index b58fc0438a..a377d6509c 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3691,7 +3691,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Syötä STR_TOWN_DIRECTORY_CAPTION :{WHITE}Kunnat ({COMMA}/{COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ei mitään - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (kaupunki){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Kuntien nimet – keskitä päänäkymä kuntaan napsauttamalla nimeä. Ctrl+napsautus avaa uuden näkymäikkunan kunnan sijaintiin STR_TOWN_POPULATION :{BLACK}Maailman asukasluku: {COMMA} diff --git a/src/lang/french.txt b/src/lang/french.txt index 0e4e6fc263..a142fa8764 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -3691,7 +3691,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Entrer u STR_TOWN_DIRECTORY_CAPTION :{WHITE}Villes ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}− Aucune − STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Métropole){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms des villes - Cliquer sur un nom pour centrer la vue principale sur la ville. Ctrl-clic pour ouvrir une nouvelle vue sur la ville. STR_TOWN_POPULATION :{BLACK}Population mondiale{NBSP}: {COMMA} diff --git a/src/lang/galician.txt b/src/lang/galician.txt index b9a979c8a8..c4ec239fcd 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -3349,6 +3349,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtro: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Sobrescribir arquivo STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Estás seguro de que queres rescribir este arquivo? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Borrar ficheiro +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Estás seguro de que queres borrar este ficheiro? STR_SAVELOAD_DIRECTORY :{STRING} (Directorio) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Directorio pai) @@ -3429,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Auga STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aleatorio -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual +STR_MAPGEN_BORDER_RANDOMIZE :Aleatorio +STR_MAPGEN_BORDER_MANUAL :Manual +STR_MAPGEN_BORDER_INFINITE_WATER :Auga infinita STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotación do mapa de alturas: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome do mapa de alturas: @@ -3689,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Escribe STR_TOWN_DIRECTORY_CAPTION :{WHITE}Vilas ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ningunha - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Vila){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes de vilas - pincha no nome para centrar a vista na vila. Ctrl+Clic abre unha nova fiestra na localización da vila STR_TOWN_POPULATION :{BLACK}Poboación mundial: {COMMA} @@ -4186,6 +4188,7 @@ STR_PURCHASE_INFO_ALL_BUT :Todos excepto { STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforzo máximo de tracción: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Autonomía: {GOLD}{COMMA} cadros STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Tipo de aeronave: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Tipos de ferrocarril: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Todos os tipos de carga @@ -4369,6 +4372,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Custo de mantem STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Custo de mantemento: {CURRENCY_LONG}/período STR_ENGINE_PREVIEW_CAPACITY :Capacidade: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Tipos de ferrocarril: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituír {STRING} - {STRING} @@ -5267,9 +5271,11 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... pont STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte remataría fóra do mapa STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para a estación STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para unha estación de estrada +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é moi baixa para o porto STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para a boia STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para un punto de ruta de ferrocarril STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para un punto de ruta de estrada +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é moi baixa para a exclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Non se pode construír un túnel aí... diff --git a/src/lang/german.txt b/src/lang/german.txt index ec1cc44966..53da600dc2 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -3687,7 +3687,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Text fü STR_TOWN_DIRECTORY_CAPTION :{WHITE}Städte ({COMMA} von {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keine - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Großstadt){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Städtenamen – Klick auf den Namen zentriert Hauptansicht auf die Stadt. Mit Strg+Klick wird eine neue Zusatzansicht auf die Stadt geöffnet STR_TOWN_POPULATION :{BLACK}Weltbevölkerung: {COMMA} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 9d6df28701..2c97b15f41 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3784,7 +3784,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Δώστ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Πόλεις ({COMMA} από {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Τίποτα - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Πόλη){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ονόματα πόλεων - πατήστε στο όνομα για κεντράρισμα της κύριας προβολής στην πόλη. Ctrl+Κλικ για άνοιγμα νέου παραθύρου προβολής στην τοποθεσία της πόλης STR_TOWN_POPULATION :{BLACK}Παγκόσμιος πληθυσμός: {COMMA} diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 662b4e1086..2347dcba42 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -3280,7 +3280,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}הכנס # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- אין - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}שמות ערים - לחץ על שם כדי למקד את התצוגה על העיר. Ctrl+לחיצה פותח חלונית תצוגה חדשה על מיקום העיר STR_TOWN_POPULATION :{BLACK}אוכלוסיית העולם: {COMMA} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index b9b9067247..3bb4c6f731 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3754,7 +3754,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Felirat STR_TOWN_DIRECTORY_CAPTION :{WHITE}Városok ({COMMA}, {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nincs - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Város){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Városnevek - kattints egy névre a város megnézéséhez. Ctrl+kattintással új nézet nyílik a városnál STR_TOWN_POPULATION :{BLACK}Világnépesség: {COMMA} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index bce95528ef..f0f0168d50 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -3487,7 +3487,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Masukkan # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Tidak Ada - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Kota){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nama-nama kota - Klik pada nama untuk mengarahkan pandangan utama pada kota. Ctrl+Click akan membuka viewport baru pada lokasi kota STR_TOWN_POPULATION :{BLACK}Populasi Dunia: {COMMA} diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 32eae7e2b3..69038bddc3 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -3281,7 +3281,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Iontrái # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ceann ar bith - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Cathair){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ainmneacha bailte - cliceáil ar ainm le go mbeidh an baile i lár an scáileán. Osclaítear amharc nua ar shuíomh an bhaile le Ctrl+Cliceáil STR_TOWN_POPULATION :{BLACK}Daonra domhanda: {COMMA} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 9e93da9af0..caca858051 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -3682,7 +3682,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Inserire # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nessuna - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Metropoli){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomi delle città - fare clic su un nome per centrare la visuale principale sulla città. Ctrl+Clic per aprire una nuova finestra di visualizzazione sulla posizione della città STR_TOWN_POPULATION :{BLACK}Popolazione mondiale: {COMMA} diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index b1419a6484..a3dc9d4207 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -3424,7 +3424,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}標識 STR_TOWN_DIRECTORY_CAPTION :{WHITE}街一覧 ({COMMA} の {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- なし- STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (都市){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}街の名前 - メイン画面を街の場所に移動するには名前をクリックします。Ctrl+クリックで新しいビューポートに表示します STR_TOWN_POPULATION :{BLACK}地域人口: {COMMA}人 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 4b47e9b0bd..a2edd95224 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3692,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}팻말 STR_TOWN_DIRECTORY_CAPTION :{WHITE}도시 목록 ({1:COMMA}개 중 {0:COMMA}개) STR_TOWN_DIRECTORY_NONE :{ORANGE}(없음) STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (대도시){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}도시 이름 - 이 도시로 시점을 변경하려면 클릭하세요. CTRL+클릭하면 이 도시 위치를 기준으로 새로운 외부 화면을 엽니다 STR_TOWN_POPULATION :{BLACK}총 인구 수: {COMMA} diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 1091802ffc..e9c79abb82 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -3234,7 +3234,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Inscribe # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nulla - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Urbs){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomina oppidorum - preme in nomen ut conspectus supra oppidum locetur. Ctrl+Preme ut novam fenestram conspectus supra oppidum aperiatur STR_TOWN_POPULATION :{BLACK}Incolae mundi: {COMMA} diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 62221c230c..2c84ecb6ea 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -3696,7 +3696,6 @@ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Pilsēta STR_TOWN_DIRECTORY_NONE :{G=m}{ORANGE}- Neviens - STR_TOWN_DIRECTORY_NONE.kas :{ORANGE}- Neviena - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Pilsēta){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to.Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā STR_TOWN_POPULATION :{BLACK}Pasaules iedzīvotāju skaits: {COMMA} diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index bd4e4ad2aa..70b83009e7 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -3716,7 +3716,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Įrašyk STR_TOWN_DIRECTORY_CAPTION :{WHITE}Miestai ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}Nėra STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Miestas){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Spragtelėjus ant pavadinimo, miestas bus parodytas ekrano centre. Spragtelėkite laikant nuspaudus „Ctrl“ klavišą, kad atverti papildomą peržiūros langą į pasirinktą miestą STR_TOWN_POPULATION :{BLACK}Pasaulio populiacija: {COMMA} diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 1e3b62ef5a..3b7b5fafa1 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -3647,7 +3647,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Gëff en STR_TOWN_DIRECTORY_CAPTION :{WHITE}Stied ({COMMA} vu {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keng - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Stad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Stiednimm - klick op den Numm fir d'Usiicht drop ze zentréieren. Ctrl+Klick erstellt eng nei Usiicht vun der Stad STR_TOWN_POPULATION :{BLACK}Weltbevölkerung: {COMMA} diff --git a/src/lang/maori.txt b/src/lang/maori.txt index 6507cfa6a7..69e81d94e7 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -3688,7 +3688,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Tāurua STR_TOWN_DIRECTORY_CAPTION :{WHITE}Tāone ({COMMA} o te {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Kore - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Tāone nui){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ingoa o ngā tāone - pāwhiria he ingoa kia neke i te tirohanga matua ki te tāone. Pātaki+Pāwhiri kia huaki i tētahi atu tirohanga i te tauwāhi o te tāone STR_TOWN_POPULATION :{BLACK}Taupori o te ao: {COMMA} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index c0e7ebd892..3a7c14dafc 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3692,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Skriv in STR_TOWN_DIRECTORY_CAPTION :{WHITE}Byer ({COMMA} av {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ingen - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (By){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Bynavn - klikk på navnet for å gå til byen. Ctrl+klikk for å åpne et nytt tilleggsvindu over byen STR_TOWN_POPULATION :{BLACK}Verdensbefolkning: {COMMA} diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 7504651f8e..09b8b4d198 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -3003,7 +3003,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}برای STR_TOWN_DIRECTORY_CAPTION :{WHITE}شهرها ({COMMA} از {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- هیچکدام - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}نام شهرها - برای مرکز قرار دادن نمای اصلی روی شهر، روی نام کلیک کنید. Ctrl+Click برای باز کردن یک نمای جدید در موقعیت شهر. STR_TOWN_POPULATION :{BLACK}جمعیت جهان: {COMMA} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index ac8b8b1424..9c35d70698 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -4071,7 +4071,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Wpisz na STR_TOWN_DIRECTORY_CAPTION :{WHITE}Miasta ({COMMA} z {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Żaden - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Metropolia){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nazwy miast - kliknij na nazwę miasta, aby wyśrodkować na nim widok główny. Użyj Ctrl, aby otworzyć nowy podgląd na lokalizację miasta STR_TOWN_POPULATION :{BLACK}Populacja świata: {COMMA} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 61532a9114..560ef2bf4f 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3692,7 +3692,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduz STR_TOWN_DIRECTORY_CAPTION :{WHITE}Localidades ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nenhuma - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Cidade){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes das localidades - clique no nome para centrar a visualização na cidade. Ctrl+Clique para abrir um novo visualizador na localização da localidade STR_TOWN_POPULATION :{BLACK}População Mundial: {COMMA} diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 4094e24a36..b08d2f80ea 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -3631,7 +3631,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introdu STR_TOWN_DIRECTORY_CAPTION :{WHITE}Orașe ({COMMA} din {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nimic - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (oraș){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Numele orașelor - clic pe un nume pentru a centra imaginea pe orașul respectiv. Ctrl+Click pentru a deshide o fereastra cu locația orașului STR_TOWN_POPULATION :{BLACK}Populația totală: {COMMA} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 6631323b3a..de883b9d6b 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3866,7 +3866,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Введ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Города ({COMMA} / {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Нет - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Мегаполис){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Список городов. Щелчок по названию показывает город в основном окне. Ctrl+щелчок показывает в дополнительном окне. STR_TOWN_POPULATION :{BLACK}Население: {COMMA} diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index de1746c3c6..e0f8b059c5 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -3676,7 +3676,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Unos naz # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Prazno - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (City){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Imena naselja - klikom na naziv glavni pogled se premešta na to naselje. Ctrl+klik otvara novi pogled na lokaciju naselja STR_TOWN_POPULATION :{BLACK}Svetska populacija: {COMMA} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 7fdcf877b7..89e700d3b5 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -3690,7 +3690,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}为标 STR_TOWN_DIRECTORY_CAPTION :{WHITE}城镇({COMMA} 座,共 {COMMA}座) STR_TOWN_DIRECTORY_NONE :{ORANGE}- 无 - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK}({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW}(都市){BLACK}({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK} 城镇名称 - 点击名称可以将屏幕中心{}移动到城镇所在的位置。按住 点选将会在新视点中显示城镇位置 STR_TOWN_POPULATION :{BLACK}地图人口总数:{COMMA} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 4701412c18..cbb3c6743a 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -3630,7 +3630,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Zadajte # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Žiadne - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Veľkomesto){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Názvy miest - kliknite na názov pre pohľad na mesto. Ctrl+Klik otvorí nové okno s pohľadom na mesto STR_TOWN_POPULATION :{BLACK}Svetová populácia: {COMMA} diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 971b8b9752..4f08febbaa 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -3157,7 +3157,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Vpiši i # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Brez - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Mesto){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Imena mest - klikni na ime za pogled na mesto. Ctrl+Klik odpre nov pogled na lokaciji mesta STR_TOWN_POPULATION :{BLACK}Svetovno prebivalstvo: {COMMA} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 70640bd735..3c578f94a5 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -3660,7 +3660,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduc STR_TOWN_DIRECTORY_CAPTION :{WHITE}Municipios ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ninguna - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Ciudad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nombres de los municipios - Clica sobre un nombre para centrar la vista principal en el municipio. Ctrl+clic abre una ventana de visualización en dicha posición STR_TOWN_POPULATION :{BLACK}Población mundial: {COMMA} diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index f21104fa5e..f005e3ab34 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -3684,7 +3684,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Indicar STR_TOWN_DIRECTORY_CAPTION :{WHITE}Pueblos ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ninguno - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (ciudad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nombres de pueblos. Clic en un nombre centra la vista principal en el pueblo. Ctrl+Clic abre una vista aparte en su ubicación STR_TOWN_POPULATION :{BLACK}Población mundial: {COMMA} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 31af4a5536..6544a8248b 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3691,7 +3691,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Mata in STR_TOWN_DIRECTORY_CAPTION :{WHITE}Städer ({COMMA} av {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Inga - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Stad){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Stadsnamn - klicka på ett namn för att centrera huvudvyn på staden. Ctrl+Klick för att öppna en ny fönstervy över stadens läge STR_TOWN_POPULATION :{BLACK}Global folkmängd: {COMMA} diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index b9ece84d8e..10ccf21cd3 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -3243,7 +3243,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}கு STR_TOWN_DIRECTORY_CAPTION :{WHITE}நகரங்கள் ({1:COMMA}இல் {0:COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- ஒன்றுமில்லை - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (மாநகரம்){BLACK} ({COMMA}) STR_TOWN_POPULATION :{BLACK}உலக மக்கள்தொகை: {COMMA} # Town view window diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 9e7b2c7115..98eec60d46 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -3085,7 +3085,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}กร # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- ไม่มี - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (เมือง){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}ชื่อเมือง - คลิ๊กเมาส์ที่ชื่อเมือง STR_TOWN_POPULATION :{BLACK}ประชากรโดยรวมทั้งแผนที่: {COMMA} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index b9f596ba69..56033a4f94 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -3690,7 +3690,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}輸入 STR_TOWN_DIRECTORY_CAPTION :{WHITE}市鎮({COMMA} 座,總共 {COMMA} 座) STR_TOWN_DIRECTORY_NONE :{ORANGE}- 無 - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (城市){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}市鎮名稱 - 點選名稱可將市鎮置於畫面正中央。按住 點選可於市鎮位置開啟新檢視視窗 STR_TOWN_POPULATION :{BLACK}世界人口:{COMMA} diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 1734004986..63f61b4003 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -3594,7 +3594,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Tabela i # Town directory window STR_TOWN_DIRECTORY_NONE :{ORANGE}- Hiçbiri - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Şehir){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Şehir isimleri - şehre bakmak için ismine tıkla. Ctrl + Sol Tıklama şehrin olduğu yere ait bir görünüm penceresi açar. STR_TOWN_POPULATION :{BLACK}Dünya nüfusu: {COMMA} diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 5ef10b2455..c525d5020f 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -3799,7 +3799,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Введ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Міста ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- немає - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Мегаполіс){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Назви міст - натисніть на назву, щоб показати місто у центрі екрану. Ctrl+клац мишею відкриває нове вікно з видом на місто STR_TOWN_POPULATION :{BLACK}Населення світу: {COMMA} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 8c211ff30f..45cadcf237 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -3690,7 +3690,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Nhập t STR_TOWN_DIRECTORY_CAPTION :{WHITE}Đô Thị ({COMMA} đến {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Không Có - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (đô thị){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Tên các đô thị - nháy vào tên để xem trung tâm đô thị. Ctrl+Click mở cửa sổ mới của đô thị STR_TOWN_POPULATION :{BLACK}Dân số thế giới: {COMMA} diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 85133232b2..761db4c555 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -3676,7 +3676,6 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Rhowch e STR_TOWN_DIRECTORY_CAPTION :{WHITE}Trefi ({COMMA} o {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Dim - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Dinas){BLACK} ({COMMA}) STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Enwau trefi - cliciwch ar enw tref i ganoli'r brif olygfa ar y dref. Ctrl+Clic i agor ffenest golwg newydd ar leoliad y dref STR_TOWN_POPULATION :{BLACK}Poblogaeth y Byd: {COMMA} From f8aa2e64e42e3cb6c4ac9de35ff8f903641b66c2 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 29 Sep 2025 19:23:02 +0100 Subject: [PATCH 113/280] Add: Include build cost in rail/road dropdowns. (#14599) --- src/dropdown_common_type.h | 26 ++++++++++++++++++++++++++ src/newgrf_badge_gui.cpp | 12 ++++++------ src/newgrf_badge_gui.h | 4 ++-- src/rail_gui.cpp | 4 ++-- src/road_gui.cpp | 6 +++--- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/dropdown_common_type.h b/src/dropdown_common_type.h index 81e2b36be9..dac1500d46 100644 --- a/src/dropdown_common_type.h +++ b/src/dropdown_common_type.h @@ -260,6 +260,32 @@ public: } }; +/** + * Drop down spacer component. + * @tparam TBase Base component. + * @tparam TEnd Position space at end if true, or start if false. + */ +template +class DropDownSpacer : public TBase { +public: + template + explicit DropDownSpacer(Args&&... args) : TBase(std::forward(args)...) {} + + uint Width() const override { return WidgetDimensions::scaled.hsep_wide + this->TBase::Width(); } + + int OnClick(const Rect &r, const Point &pt) const override + { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + return this->TBase::OnClick(r.Indent(WidgetDimensions::scaled.hsep_wide, rtl), pt); + } + + void Draw(const Rect &full, const Rect &r, bool sel, int click_result, Colours bg_colour) const override + { + bool rtl = TEnd ^ (_current_text_dir == TD_RTL); + this->TBase::Draw(full, r.Indent(WidgetDimensions::scaled.hsep_wide, rtl), sel, click_result, bg_colour); + } +}; + /** * Drop down component that makes the item unselectable. * @tparam TBase Base component. diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 8c10484df4..491986c82b 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -240,17 +240,17 @@ private: Dimension dim{}; }; -using DropDownListBadgeItem = DropDownBadges; -using DropDownListBadgeIconItem = DropDownBadges; +using DropDownListBadgeItem = DropDownBadges, FS_SMALL, true>>; +using DropDownListBadgeIconItem = DropDownBadges, FS_SMALL, true>>; -std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, std::string &&str, int value, bool masked, bool shaded) +std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, std::string &&str, int value, bool masked, bool shaded) { - return std::make_unique(gui_classes, badges, feature, introduction_date, std::move(str), value, masked, shaded); + return std::make_unique(gui_classes, badges, feature, introduction_date, GetString(STR_JUST_CURRENCY_SHORT, cost), std::move(str), value, masked, shaded); } -std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked, bool shaded) +std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked, bool shaded) { - return std::make_unique(gui_classes, badges, feature, introduction_date, dim, sprite, palette, std::move(str), value, masked, shaded); + return std::make_unique(gui_classes, badges, feature, introduction_date, GetString(STR_JUST_CURRENCY_SHORT, cost), dim, sprite, palette, std::move(str), value, masked, shaded); } /** diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index e73186d951..b908cf7f55 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -50,8 +50,8 @@ private: int DrawBadgeNameList(Rect r, std::span badges, GrfSpecFeature feature); void DrawBadgeColumn(Rect r, int column_group, const GUIBadgeClasses &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, PaletteID remap); -std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, std::string &&str, int value, bool masked = false, bool shaded = false); -std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, std::string &&str, int value, bool masked = false, bool shaded = false); +std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked = false, bool shaded = false); DropDownList BuildBadgeClassConfigurationList(const class GUIBadgeClasses &badge_class, uint columns, std::span column_separators); bool HandleBadgeConfigurationDropDownClick(GrfSpecFeature feature, uint columns, int result, int click_result, BadgeFilterChoices &choices); diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 3ff53b0648..a0d8688096 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -2065,12 +2065,12 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option) const RailTypeInfo *rti = GetRailTypeInfo(rt); if (for_replacement) { - list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, RailBuildCost(rt), GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt))); } else { std::string str = rti->max_speed > 0 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed) : GetString(rti->strings.menu_text); - list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, d, rti->gui_sprites.build_x_rail, PAL_NONE, std::move(str), rt, !avail_railtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, RailBuildCost(rt), d, rti->gui_sprites.build_x_rail, PAL_NONE, std::move(str), rt, !avail_railtypes.Test(rt))); } } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index e3d29dbd38..3e37167a76 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1805,12 +1805,12 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b const RoadTypeInfo *rti = GetRoadTypeInfo(rt); if (for_replacement) { - list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_roadtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, RoadBuildCost(rt), GetString(rti->strings.replace_text), rt, !avail_roadtypes.Test(rt))); } else { std::string str = rti->max_speed > 0 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed / 2) : GetString(rti->strings.menu_text); - list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, d, rti->gui_sprites.build_x_road, PAL_NONE, std::move(str), rt, !avail_roadtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, RoadBuildCost(rt), d, rti->gui_sprites.build_x_road, PAL_NONE, std::move(str), rt, !avail_roadtypes.Test(rt))); } } @@ -1854,7 +1854,7 @@ DropDownList GetScenRoadTypeDropDownList(RoadTramTypes rtts) std::string str = rti->max_speed > 0 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed / 2) : GetString(rti->strings.menu_text); - list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, d, rti->gui_sprites.build_x_road, PAL_NONE, std::move(str), rt, !avail_roadtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, RoadBuildCost(rt), d, rti->gui_sprites.build_x_road, PAL_NONE, std::move(str), rt, !avail_roadtypes.Test(rt))); } if (list.empty()) { From dcc3a6775203130610ad96d601d32e767b194687 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 29 Sep 2025 21:02:08 +0100 Subject: [PATCH 114/280] Fix 9cdf740097: Don't make copy of format providers when making a screenshot. (#14681) While here, use projection instead of lambda to select provider. --- src/screenshot.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 224241ec52..c12693c5a4 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -48,10 +48,10 @@ uint _heightmap_highest_peak; ///< When saving a heightmap, this contain */ static ScreenshotProvider *GetScreenshotProvider() { - auto providers = ProviderManager::GetProviders(); + const auto &providers = ProviderManager::GetProviders(); if (providers.empty()) return nullptr; - auto it = std::ranges::find_if(providers, [](const auto &p) { return p->GetName() == _screenshot_format_name; }); + auto it = std::ranges::find(providers, _screenshot_format_name, &ScreenshotProvider::GetName); if (it != std::end(providers)) return *it; return providers.front(); From aa7eb089c6260ab96fcc2d2523f68e6242b14781 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 29 Sep 2025 21:16:42 +0200 Subject: [PATCH 115/280] Codechange: make all Providers fully const (Font/Screenshot/Sound) --- src/fontcache.h | 4 ++-- src/fontcache/freetypefontcache.cpp | 4 ++-- src/fontcache/spritefontcache.cpp | 4 ++-- src/os/macosx/font_osx.cpp | 4 ++-- src/os/windows/font_win32.cpp | 4 ++-- src/provider_manager.h | 8 ++++---- src/screenshot.cpp | 2 +- src/screenshot_bmp.cpp | 2 +- src/screenshot_pcx.cpp | 2 +- src/screenshot_png.cpp | 2 +- src/screenshot_type.h | 2 +- src/soundloader_opus.cpp | 2 +- src/soundloader_raw.cpp | 2 +- src/soundloader_type.h | 2 +- src/soundloader_wav.cpp | 2 +- 15 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/fontcache.h b/src/fontcache.h index a74e0a57b6..b03f84514d 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -229,8 +229,8 @@ public: ProviderManager::Unregister(*this); } - virtual std::unique_ptr LoadFont(FontSize fs, FontType fonttype) = 0; - virtual bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) = 0; + virtual std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const = 0; + virtual bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) const = 0; }; class FontProviderManager : ProviderManager { diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 9d52ab8f77..0e3de26877 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -225,7 +225,7 @@ public: * format is 'font family name' or 'font family name, font style'. * @param fs The font size to load. */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override { if (fonttype != FontType::TrueType) return nullptr; @@ -271,7 +271,7 @@ public: return LoadFont(fs, face, font, GetFontCacheFontSize(fs)); } - bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) override + bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) const override { #ifdef WITH_FONTCONFIG if (FontConfigFindFallbackFont(settings, language_isocode, callback)) return true; diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index a1c2f29770..0ed1cff34e 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -157,14 +157,14 @@ class SpriteFontCacheFactory : public FontCacheFactory { public: SpriteFontCacheFactory() : FontCacheFactory("sprite", "Sprite font provider") {} - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override { if (fonttype != FontType::Sprite) return nullptr; return std::make_unique(fs); } - bool FindFallbackFont(struct FontCacheSettings *, const std::string &, class MissingGlyphSearcher *) override + bool FindFallbackFont(struct FontCacheSettings *, const std::string &, class MissingGlyphSearcher *) const override { return false; } diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index 20c24f078a..e406a790b2 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -211,7 +211,7 @@ public: * fallback search, use it. Otherwise, try to resolve it by font name. * @param fs The font size to load. */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override { if (fonttype != FontType::TrueType) return nullptr; @@ -259,7 +259,7 @@ public: return std::make_unique(fs, std::move(font_ref), GetFontCacheFontSize(fs)); } - bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) override + bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) const override { /* Determine fallback font using CoreText. This uses the language isocode * to find a suitable font. CoreText is available from 10.5 onwards. */ diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 7413eb70cb..da30507260 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -276,7 +276,7 @@ public: * fallback search, use it. Otherwise, try to resolve it by font name. * @param fs The font size to load. */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override { if (fonttype != FontType::TrueType) return nullptr; @@ -308,7 +308,7 @@ public: return LoadWin32Font(fs, logfont, GetFontCacheFontSize(fs), font); } - bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) override + bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) const override { Debug(fontcache, 1, "Trying fallback fonts"); EFCParam langInfo; diff --git a/src/provider_manager.h b/src/provider_manager.h index 5ab398de34..377a17af28 100644 --- a/src/provider_manager.h +++ b/src/provider_manager.h @@ -25,7 +25,7 @@ public: ProviderManager &operator=(ProviderManager const &) = delete; - static void Register(TProviderType &instance) + static void Register(const TProviderType &instance) { /* Insert according to comparator. */ auto &providers = GetProviders(); @@ -33,7 +33,7 @@ public: providers.insert(it, &instance); } - static void Unregister(TProviderType &instance) + static void Unregister(const TProviderType &instance) { auto &providers = GetProviders(); providers.erase(std::find(std::begin(providers), std::end(providers), &instance)); @@ -43,9 +43,9 @@ public: * Get the currently known providers. * @return The known providers. */ - static std::vector &GetProviders() + static std::vector &GetProviders() { - static std::vector providers{}; + static std::vector providers{}; return providers; } }; diff --git a/src/screenshot.cpp b/src/screenshot.cpp index c12693c5a4..d06db8b154 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -46,7 +46,7 @@ uint _heightmap_highest_peak; ///< When saving a heightmap, this contain * If the selected provider is not found, then the first provider will be used instead. * @returns ScreenshotProvider, or null if none exist. */ -static ScreenshotProvider *GetScreenshotProvider() +static const ScreenshotProvider *GetScreenshotProvider() { const auto &providers = ProviderManager::GetProviders(); if (providers.empty()) return nullptr; diff --git a/src/screenshot_bmp.cpp b/src/screenshot_bmp.cpp index 6ad3c8dd98..260eefc6fa 100644 --- a/src/screenshot_bmp.cpp +++ b/src/screenshot_bmp.cpp @@ -43,7 +43,7 @@ class ScreenshotProvider_Bmp : public ScreenshotProvider { public: ScreenshotProvider_Bmp() : ScreenshotProvider("bmp", "BMP", 10) {} - bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) override + bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) const override { uint bpp; // bytes per pixel switch (pixelformat) { diff --git a/src/screenshot_pcx.cpp b/src/screenshot_pcx.cpp index e3c4c70441..024609a212 100644 --- a/src/screenshot_pcx.cpp +++ b/src/screenshot_pcx.cpp @@ -41,7 +41,7 @@ class ScreenshotProvider_Pcx : public ScreenshotProvider { public: ScreenshotProvider_Pcx() : ScreenshotProvider("pcx", "PCX", 20) {} - bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) override + bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) const override { uint maxlines; uint y; diff --git a/src/screenshot_png.cpp b/src/screenshot_png.cpp index c0c868bbe0..b636861b64 100644 --- a/src/screenshot_png.cpp +++ b/src/screenshot_png.cpp @@ -31,7 +31,7 @@ class ScreenshotProvider_Png : public ScreenshotProvider { public: ScreenshotProvider_Png() : ScreenshotProvider("png", "PNG", 0) {} - bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) override + bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) const override { png_color rq[256]; uint i, y, n; diff --git a/src/screenshot_type.h b/src/screenshot_type.h index d93f7c20bb..4859952899 100644 --- a/src/screenshot_type.h +++ b/src/screenshot_type.h @@ -36,7 +36,7 @@ public: ProviderManager::Unregister(*this); } - virtual bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) = 0; + virtual bool MakeImage(std::string_view name, const ScreenshotCallback &callb, uint w, uint h, int pixelformat, const Colour *palette) const = 0; }; #endif /* SCREENSHOT_TYPE_H */ diff --git a/src/soundloader_opus.cpp b/src/soundloader_opus.cpp index 7bb924e9bc..79252641cf 100644 --- a/src/soundloader_opus.cpp +++ b/src/soundloader_opus.cpp @@ -34,7 +34,7 @@ public: static constexpr size_t DECODE_BUFFER_SAMPLES = 5760 * 2; static constexpr size_t DECODE_BUFFER_BYTES = DECODE_BUFFER_SAMPLES * sizeof(opus_int16); - bool Load(SoundEntry &sound, bool new_format, std::vector &data) override + bool Load(SoundEntry &sound, bool new_format, std::vector &data) const override { if (!new_format) return false; diff --git a/src/soundloader_raw.cpp b/src/soundloader_raw.cpp index 7caaf52905..2ac0efc1fb 100644 --- a/src/soundloader_raw.cpp +++ b/src/soundloader_raw.cpp @@ -22,7 +22,7 @@ public: static constexpr uint16_t RAW_SAMPLE_RATE = 11025; ///< Sample rate of raw pcm samples. static constexpr uint8_t RAW_SAMPLE_BITS = 8; ///< Bit depths of raw pcm samples. - bool Load(SoundEntry &sound, bool new_format, std::vector &data) override + bool Load(SoundEntry &sound, bool new_format, std::vector &data) const override { /* Raw sounds are apecial case for the jackhammer sound (name in Windows sample.cat is "Corrupt sound") * It's not a RIFF file, but raw PCM data. diff --git a/src/soundloader_type.h b/src/soundloader_type.h index 2f00cc8284..8c91052fd1 100644 --- a/src/soundloader_type.h +++ b/src/soundloader_type.h @@ -26,7 +26,7 @@ public: ProviderManager::Unregister(*this); } - virtual bool Load(SoundEntry &sound, bool new_format, std::vector &data) = 0; + virtual bool Load(SoundEntry &sound, bool new_format, std::vector &data) const = 0; }; #endif /* SOUNDLOADER_TYPE_H */ diff --git a/src/soundloader_wav.cpp b/src/soundloader_wav.cpp index 36897aab73..72dbf0a056 100644 --- a/src/soundloader_wav.cpp +++ b/src/soundloader_wav.cpp @@ -23,7 +23,7 @@ public: static constexpr uint16_t DEFAULT_SAMPLE_RATE = 11025; - bool Load(SoundEntry &sound, bool new_format, std::vector &data) override + bool Load(SoundEntry &sound, bool new_format, std::vector &data) const override { RandomAccessFile &file = *sound.file; From 8a8ebabb9d106e0f5ad96b19d7830154d810b052 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 29 Sep 2025 22:08:16 +0100 Subject: [PATCH 116/280] Change: Provide road and rail overlay sprites for bridge decks. (#14557) This allows bridges designed primarily with NewGRF railtypes and roadtypes to be at least somewhat compatible with built-in rail and road. --- media/baseset/openttd.grf | Bin 631667 -> 641653 bytes media/baseset/openttd.grf.hash | 2 +- media/baseset/openttd/CMakeLists.txt | 2 + media/baseset/openttd/bridge_decks.nfo | 36 +++++++++++++++++ media/baseset/openttd/bridge_decks.png | Bin 0 -> 7771 bytes media/baseset/openttd/openttd.nfo | 1 + src/newgrf/newgrf_act5.cpp | 1 + src/rail.h | 1 + src/table/railtypes.h | 8 ++-- src/table/sprites.h | 10 ++++- src/tunnelbridge_cmd.cpp | 54 ++++++++++++++++--------- 11 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 media/baseset/openttd/bridge_decks.nfo create mode 100644 media/baseset/openttd/bridge_decks.png diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index 620cc8ab981eb34ffd83886fd9e17befd31631eb..4464c415f3a7cfa8e124513b97ec6b079eda21fa 100644 GIT binary patch delta 10126 zcmex-OzrCwbx{Te_aL_>UM?vv+e}6V1{MYehW|c|qFY579Wv^9K|CI(qRf=^RE3n( zrVYE-;2GjNt}jxWgD8Foq|L;RR!O!x%m=hA%e*81OSPFcdQ|FiaOe%~;%i zC4;g3N(NK=l?>+gD;X^9S29@JuVk>bU&&x^zmmbR{YnPsY^!=uSTHd%Fz_(QGdM6j z{LjE}hmnE7$&SH+!HL0z!HvO#!IvS7A(^3sp_5@D!%l{a3@;fN86_DF89f;j87mnl zGA?7>&Ul3JEaN4{D~#6|Z!q3sY+z_$c)%juz|gE|%E;KR&dA8f%E`{!t(tv-lZ}Nj zld)g$G4sS?c6kf57v3NxSqhQD00}~keS3F}f zE!r@Fk+zUexPW)kN7J1pQ zaSA9o&?qd#8W@^I7#U65g;?1+Ss57_y9F3C8CfpW^KxbP^RZ@{W}7l*o)BbaoXm58 zYlRxiH115(6UNNhMMWEQnWpi+2#y7=?EjFqsy; zsN9jjD7qqn(R9Z)=Avoh8xk0c7bGxBc1$>MfKhtK1g0X>1rr!$I}RN9z$m}r08>%+ zN?At5jt>um>zVqMSLiUev+H1S@UJh#wnm2u@;;z)WPZE$NyX=28JL% zh5&{jh7g7@h6si@hIEEvhGvFo467LqGF)eP!@$TW&Zxua$QaI;!`R3;opBB0LB?y0 zuNfJbM47ahY?!>6!kFTil9^JO(wQ=uvY8qf>Ol!bp@E@A!<3PcwOu_kn}vg&m8DB9 zlaYm;g@uvPG`mkF^9Jt=Bks&h(`=TB%9*At>@Nh^7(pQO0XNfRr5E~49BeOy88ct# zybyk%%QQvdfCZ!J3-c4k%%)T1AJ{Q+?6A9F#xz;(LBRt@M$;XR%%+oNZ?rNpKPYFc zFFIk$Y&u2yh5v&-M#dK#AJkoNV3c~W;YQ+%wI|G&CQF_Oz2R`elxd3i0f!eF7xq19 zU=(}tfst*6!vizs$)ed8uCZihW@jHTWu79O{gQ=|XYpMNy{7d@u8Fh`n??QD4u@IGOih%S$b$OvV>=7fhK=C-Xe` z_u$IQ4UCx=OqjDLbG66JQtU|_;pc@*|eAMg4x3bFGHC+1#W6RJjv81 zbU_J}hM#Q`wd7`CIK}|V&*I>CV_;}uWMDATV=!PaVlZJaW3XUwVDMu|VyI!5!*Gb9 z{w0F|qamXYV=HC=!YF9mxz}%>r zebCQ}n}OjFihpWR{bR}C$l%YA%uvfPhv6W@a|RwpT}BVaSjKF|V#ZR&a>h!=YN&U3 z8#PVa)Ur)Y8CltTlrC^^aB^|hbFi~cl3T#X!D7m2T4XvyYK92JKNpOd=8AVnGBIW@ zuwz;*++lIR;y~;RZ)WBt{2j3!sux0;7V~s8b$H#VVw%s>(KRER)zs8Bv(+fR3%eAN}h^jh-b)PC}C(}n9i_<;Sj?O zhIb6ijFOD{j4q5(j0KFXjI$UwFdk#P&G?a#ok@ntkjaH9geie3lPRC6kg1rdl&PEv zQueAgie@LS zF1Acio??6<%*MrPYC4(wMZ^nT)=b9C%*+>}jO-6wn5OW&Ps~^}gb*Vk5d}zSJ znAxuWBL876Q;Wunaz>UzicAd*paudYeqmMV9wr6`dstQK!4SX@!;r(!z%YYh3&RzL z9}IGgF7=FAj1w5QG2UThVp3yrV@hJGV(Md>$Fz!R6Vo=P9Zb8J8eSO4H83=(nP#@B zm}Z)qDJgd;Wty6rDJvKqM|%WF8hHDlZxsCelBGdWhEsJ z?rAdFH!K*HUMMoEzEF7}!p6hF&N@r#fy4!m7d}kN^~xtC*jUWWl;=r2@VJqDBVvaP z6C=|NPu4|ZrrA;pG8mOl*swA&GIA@u@MbkLHC-a|Vgn=Ni@6VGuBc#RF=J+B=X|03 zLWMOubBU1YjdL$FJKC7dl$9SGVmDLD%+6jSaN!7(s>%z^7q>blJlM;a^g@k=FFP~y z!M_JDnUxq#C)7`4R#H-aP|T9KgeUWYPp80z8B9uMC)60ZUZ^qVyg1z{$H?-s`Gv}h zhg_LCnb}J?Ofxf8PHIe;aX|gWeda|RrZ0LPct1?rnekAEm66euG2w*|bLKp*2Rkl! zEYx^;gfZjg2jjflz%14JdIDKbHN1(rbz-jr!XtmE1ABW`eGAPpU}w$ zM%9PQShF*`L{wghzud^0nVs1t_KKA~(=@Y5!qoIq1*qM30i1t{k6%L3TMvp~g$9Nu ziA>WrF=Zt)(@fJY5miv!DVv#^X7&jwtEebFV0j?JlWjUlfP;sdLrFzR<%Ke%*##B0 zX?&(Etn3dYUg*5Ax}d|6nLUd~+04vrgA9|Z@&OZ;%q3yvzM#dNCSeI~R zXJ;)@_SvIIZGE?d_cxmw92b1Z%mycfFy*Y28-b+a) zRh5^aOtYk3{ywPja{Iw6jH)lKn5M~`ka@U;$y90Q7N$vZFOD#onavbn=~Kwee(Cw( zAEU~{Y0Oo?!FuF6QF}5-;VLZ(Eh>?*=fytgJj;WSu4%2R?n@pdXxR~Xb z^_Z=hU75X^{g?xogP1`@a|1)8x@oIwZgzI2Qin=reP*ValCp|&xAF~6ZY32J6=kJ< z#msEe8{#i`*_6yoIVLH*;Ad2NAFtM{fFkzZ0 zdm-q72cy{u2_{CS2gxkTb7V{}NIx)SQZjqs#=^?P!v4bLMH-9JTJ1SOroJ%bP*Tb?ohy-B_<`61+#ACy_n4?@=%pg`GVq#*%x-QD$Nx(&3v%)hT@7@ zjLHusU+iKMG`%tVf)XR+f!PmkawsdAX3rJK&OK;&(1Y33%=AJ14>mI;)6BX2H*P*$ zazLKN%#@Mw<@^`VUy3vHnr1#+{nG4$-NW{mTey|XKxrX!E>C98jpqmCFZMnRWi!pr z%%01AvE=2Cmp67!eAvchX8NLrnbWlB#heSfW=>{OR(?^-G?(M$1*S~1hproT-H3hV z!fcv7=Y{;M*qiq*zI_z(uwL}#BIfKFTsL0=raS<*;OCb_>1u^JwwI3Z@Q`TN_{g<7^RAGRw|xlu*9R0O|?O z1(y-9<`)kW14Eb|wE1Ph;KUHZki*c$u%6)-0~e!BJ!1~zG{zl_R~TP0{$ylgVq@Z9 z;sV#<;4&ezLrlpG)HyKCoFD=!6wJ)bGBZtcb2Cjdv!@BY5MokMc_GH4tfZv$K$_9? zg$!?Y<{U^Vp{%T|{KEKw45Qf#SEkI&7nXvirrC@6%$OKCIJvmFxj2-R9w@%3S9#&c zVV09)#+aF%{UVaZG;<}-i(oc(7A8hkwhh`Bbl8;47?qSvA9yonzR+SZ&0fd#BKgHk zc6Ls7R#P+68HNvZUNkbAzA$(&izz$z#XOb`9HwRud|#YlG=0JKpo-bdl<7eF4Z{ap znN*Z6B)!I8(OSi?2^MAL1wt<(ZbUMfF}_fEF!RMUM#c?&%*wOGUNpb3exdZB z?xDs`ai%F!FGFukzma~EiPem?S3dhe$jj)Le5__>?aG-Cy4lQ>n$$8)FWvxk)cYA3 z80vW#kR!?)XGGzPC$&t|4ka^F(;Ovb71aqcIc7PgnP#Rhc!ktd)znl~rb(D(nr12~ zE32rez7S$meZk7Ds-mi@JV(ULwB9WHf)=Cd3$YhE4{l#b&0Y1gfNUUzDmkF99U`i#Dxmt;v|9)iITv`j%=!hmcsP_*RMk!haG6fxQ#NDg;^EMxdJ)X3qO8oscth%j+l$l}DSX*;I7~Cm zlvI>el(|`$9$1_RxZ%&1IhVtf)$~QZ{ELY!+??#JDIb?YhP4fxX(71$28Ma`Gy{&%8uDD4lt_Rh+}1( z%a^J2!0*Ma6SEmPUfg*wi^+`fr5y8Iex)1oJ7(YHdhwTuQR$^EYvx>m%*>a14;&8E zGS+ikkbN2R;wGcegV+-a7Y!I0AIKb-%_w|A{(!>E^c%Mx#Ju>yBw~8Q{y`oSquGg{ zH`{oXl+1EW=ZcvsfePdozh9o%*}LNhqxg#-C(Rg@9!`D`%cQFI^5(B5rTsGfP50W|s+11^tYZMGOD>+drB zWsqgGWsGI4Wt_{nm+>y+FGgV|4JJz_Hzt3k5T-Du2&O1-sr-ONuvuMzQMg@|kx`h3 zjh&-gS?~oXCl5OdJ1ZM&zv2Tib{=*Pb`~~{7i?@CljQ{&S#AivkmF)u<>unx;$WXH zd&B01;tOLIb~aYV2a+!&nAv7a*T0B5;PXI>k>iFe2OFCxs|d$D$r~{*!cW9JPihmotJfsyTj10(-}*Nki(4KErPc{>^&s4Qq;I9{$vzlQfIPYa%J*k3T6sr3TKLh zhNpP5m@uP2y9ft68;>v}W49118!I~tJI@PVF2Q~Q4t5T94mOq-Y!3vv87K3xb8vBR zakH{KP0wdcE>5eisM!|W!EG!ok9!$QF@}Ty` z#v3P@=JMZg=xEq+hiRVR3;T|GCU&k3uNddO(D5`x)79 z$aMT?7Mv$}V?QHneaHWuSxmE~U;KY4f8akO`%CwOrA*UhXVh-2WST60&~#-fQ@>(I zHdD9qiWsJL)sr5q&FYMdW`{&UBg1>a0Saq{wxAEX#WJKZ6frb1Okr5XaDd@D!&?Ss zMkz)EMmNS-#$v`!#s!Sq80*h4K4$#M$j_w4WW(go6wj2+RKirnRKrxq)WFmP4R{rIA3_Y(C6ghVq=^t&&ADHf5ZNT@Cz|!PIk5zV(g4l zp}i*s|`XnQf^MA3~lMzNQyFJ8Q4V&r_#{-W)LF4Gjz z2lo%Oy%c6*<9guCC|v)7Z6n8yHb$WrCvRFERJzH-D0rf6BhQ02CVs99Z8w!(axt<$ z$Y*Ap!grJB#pfH_UKHGDW8~e)^HA}H&PyexsoW=dPP8#`uwC?jnSFC9Bj<}VJ0~$s z1<(o_|@$!q_Fi`SSD2x|ge&+J#=ueOSoUBJyzYrg|OF$i5;t zB4MqIDcDA>QW)wP7BHM(_{1R1Xa^qQX<+PR>|yL7 z^L!rm2l^MJA6PPRuph9!V8gMDOG%lVgGJo+nb6SlBOAa;@NDWo6;u=He82 z;rF8DM9>Z66U8t37+GE{W?jzD!pi!fZb#Sy{S%=FblBKAxw#h#ztB7o`d}#|$BNb$ zXJ33{nkDhThmm{6!upqtH(oMLk$I8vV)BhCJH(j!6dr^!vc0&>#3}NSpRHY$g_VW% z#SZ31O_qakZrltE^3(|`=|)YFHZ>96dNv+TjvgfuUQnBfg@X-L63adiW8voH;CR8$ z#li*}`Qzf8DS1Pgk>iH)3sqhYHbxe9PEHOk4$k?a2MjLgGjhHVVdCPvp!mR+nRA)I zh4>2zF9LT+Gjg2J;1FTq;#F2!!SkY>k?n%#jmih|Cp;f`@Nsa8aP#nTv9Ph#FX!Ur zeX;Nb*8~3p0XI|*_%rcvKUm4MkmtdX8}-JKq#;Mh+gH2Wre*oZK&*Zs@XbOyyyGAhnZ)J z(2lkTvo7po=bIwT$id6^V$F@18&MD17)36$-N?Nm{-TYAhj&W7*bChUb}#0?Sjfn6 z<0~`I6!90%FTTBG+t9|$H&tRr+eMxiCmE$y^4yri$nxMMqx1vkjXWpX7-e4aF!Db5 z`cmPB_=7fPo+)w{+HNW^a@_d&kcUzJrP2%Co5~w`7!_{%GjVV&XnV=SsI+ksGY1Fv z%TtW(Fa4P&Dqo!RF!km{7WR6UK9!gK50hTHKYY&ArFO&rMsF2W55@;le8`NuLs%L2vV`gG{p~2QA!py?Vbc2VJrB8^BjhU5& zMHkDG&?^@ZCDLq_HcCd~7=SYHUfkY{FN<9wjN$o?Yih5U{RrbQeNl3pk>v9i{` zh<*`sBbkxyh4YK#6Fp2zI35JOP<`S3V(J6+2U;)MUgSJbeXxm{X$jW_)f4J3R&-3b z;KRuCpzcNDg{h3}7p6TZd$8ky_l+V(z86Pscwg9kmsoe6)yr`*uGGBk@+IxMI;j|>kH)vbxcb{9&BJ_ zzM%R->_NqYN=EhIsv_z<*?LymwMK@G0s58|s5xDT>#)}76896UZcyQu@ z3KJXK4K+r-1JiC?zL57|+KKHq)-bay;W;ql!M77LUR-%7!pMF@{iQcE%Mz}WayJ=Q z%y_Wx#(@XFnU-*z>|tbi=(=IX!-^C8*;rYa7jZB>*z-c=;*^(lH>N$*z3`ZYm1Q2+ z&0_~OUM^x}KdJdZj)j@IeiqL{xrOp9EX>pR4hmcpyb<{F3ezNkgC#FZPZlus3EdQU zA@Fb+3o~<<$c6KdWSQE;9{8~_GdD?qBGikUfk6tR`4n0L9~T36%z3ek zQQ$=E1-T2iZrI&0XPV3Z(By&Lg!pQkZ?V;qu{jWGqPP>IJY2&xmFGs@!L|ebOq2L-EPQ49$nW7* z7AD3%fdi8+`Z9M5u|5j8(7@Co@+kU|4O5HQBNwJdiPH?AMHrBNC9Hu58s~F|3?J2- zFklSy;Tu1aU}WqNV`5}tW@2PynIOW<%>00xk?95d3juC6_Gv;aEG*0{%q%a&Z%8mP zG2M{lnj^r*4gzfKFBBdqKCrkU|G=DSG2aU*9yT^k9v+^0PIgvS7SxTFXPf+HLI1tUqb|UJ*q6@Qb7_l(1Y~Xlt z;l-2}yDliaFrSciViF_cg)9~(rga<-*d9E+vFwHQg@PT&UMzoc@L6 zo)P{c{a@*t0S4hPGF zL`K#JSugxwm@{#+y(qiU%+AC#mxGyw`GGtm%L~yLdCZ_TZsUWgH(HqHa=idq=ljC` zLdAng4`OeeVw%hSqV7c8jcG3&A6z;R%gA#h_JsV4*aur)oMB{pQT*Z`(_Fq6&mY7+ z*m+>bgIFe3)*G>m_53GhKUn`_){UJH6mQxxGtCuv@av`5joFNB4|cw^d&u@u_{A

o;OghBAsjh`ngW$nj$5gKszHoY=)EakAv*#0NJn)IEIqAeK?;#*CMnPEN>rB>qt1 zq1nq#jM5KFZce&5@j}civsXbZ%uI7+Zrr>Pvt!r8&5weanPUM?vv?+iu;1{MYehW|#5qFY579Wpo>7#JA%85tOgrz;jR zickNrm{Fp=K9jM%K9i}vK9jk. +// + -1 * 0 0C "Bridge decks" + -1 * 3 05 1B 18 + + -1 sprites/bridge_decks.png 8bpp 96 16 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 16 16 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 176 16 64 39 -31 -8 normal + -1 sprites/bridge_decks.png 8bpp 256 16 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 336 16 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 416 16 64 39 -31 -8 normal + + -1 sprites/bridge_decks.png 8bpp 96 71 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 16 71 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 176 71 64 39 -31 -8 normal + -1 sprites/bridge_decks.png 8bpp 256 71 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 336 71 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 416 71 64 39 -31 -8 normal + + -1 sprites/bridge_decks.png 8bpp 96 126 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 16 126 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 176 126 64 39 -31 -8 normal + -1 sprites/bridge_decks.png 8bpp 256 126 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 336 126 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 416 126 64 39 -31 -8 normal + +// X and Y axis are swapped for road surface. + -1 sprites/bridge_decks.png 8bpp 16 181 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 96 181 64 31 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 176 181 64 39 -31 -8 normal + -1 sprites/bridge_decks.png 8bpp 256 181 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 336 181 64 23 -31 0 normal + -1 sprites/bridge_decks.png 8bpp 416 181 64 39 -31 -8 normal diff --git a/media/baseset/openttd/bridge_decks.png b/media/baseset/openttd/bridge_decks.png new file mode 100644 index 0000000000000000000000000000000000000000..a602e0ed73a5e7eaec0de77fd56928e5c7bf4f18 GIT binary patch literal 7771 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 literal 0 HcmV?d00001 diff --git a/media/baseset/openttd/openttd.nfo b/media/baseset/openttd/openttd.nfo index 9cfce9ffdd..862345d11e 100644 --- a/media/baseset/openttd/openttd.nfo +++ b/media/baseset/openttd/openttd.nfo @@ -100,3 +100,4 @@ #include "palette.nfo" #include "road_waypoints.nfo" #include "overlay_rocks.nfo" +#include "bridge_decks.nfo" diff --git a/src/newgrf/newgrf_act5.cpp b/src/newgrf/newgrf_act5.cpp index e9b590dfb2..efa1f99d2a 100644 --- a/src/newgrf/newgrf_act5.cpp +++ b/src/newgrf/newgrf_act5.cpp @@ -78,6 +78,7 @@ static constexpr auto _action5_types = std::to_array({ /* 0x18 */ { A5BLOCK_ALLOW_OFFSET, SPR_PALETTE_BASE, 1, PALETTE_SPRITE_COUNT, "Palette" }, /* 0x19 */ { A5BLOCK_ALLOW_OFFSET, SPR_ROAD_WAYPOINTS_BASE, 1, ROAD_WAYPOINTS_SPRITE_COUNT, "Road waypoints" }, /* 0x1A */ { A5BLOCK_ALLOW_OFFSET, SPR_OVERLAY_ROCKS_BASE, 1, OVERLAY_ROCKS_SPRITE_COUNT, "Overlay rocks" }, + /* 0x1B */ { A5BLOCK_ALLOW_OFFSET, SPR_BRIDGE_DECKS_BASE, 1, BRIDGE_DECKS_SPRITE_COUNT, "Bridge decks" }, }); /** diff --git a/src/rail.h b/src/rail.h index 631a7989d0..b65f2351c8 100644 --- a/src/rail.h +++ b/src/rail.h @@ -131,6 +131,7 @@ public: SpriteID single_sloped;///< single piece of rail for slopes SpriteID crossing; ///< level crossing, rail in X direction SpriteID tunnel; ///< tunnel sprites base + SpriteID bridge_deck; ///< bridge deck sprites base } base_sprites; /** diff --git a/src/table/railtypes.h b/src/table/railtypes.h index 0b0112322e..2788212a96 100644 --- a/src/table/railtypes.h +++ b/src/table/railtypes.h @@ -25,7 +25,7 @@ static const RailTypeInfo _original_railtypes[] = { SPR_RAIL_SINGLE_NORTH, SPR_RAIL_SINGLE_SOUTH, SPR_RAIL_SINGLE_EAST, SPR_RAIL_SINGLE_WEST, SPR_TRACKS_FOR_SLOPES_RAIL_BASE, SPR_CROSSING_OFF_X_RAIL, - SPR_TUNNEL_ENTRY_REAR_RAIL + SPR_TUNNEL_ENTRY_REAR_RAIL, SPR_BRIDGE_DECKS_RAIL, }, /* GUI sprites */ @@ -123,7 +123,7 @@ static const RailTypeInfo _original_railtypes[] = { SPR_RAIL_SINGLE_NORTH, SPR_RAIL_SINGLE_SOUTH, SPR_RAIL_SINGLE_EAST, SPR_RAIL_SINGLE_WEST, SPR_TRACKS_FOR_SLOPES_RAIL_BASE, SPR_CROSSING_OFF_X_RAIL, - SPR_TUNNEL_ENTRY_REAR_RAIL + SPR_TUNNEL_ENTRY_REAR_RAIL, SPR_BRIDGE_DECKS_RAIL, }, /* GUI sprites */ @@ -225,7 +225,7 @@ static const RailTypeInfo _original_railtypes[] = { SPR_MONO_SINGLE_NORTH, SPR_MONO_SINGLE_SOUTH, SPR_MONO_SINGLE_EAST, SPR_MONO_SINGLE_WEST, SPR_TRACKS_FOR_SLOPES_MONO_BASE, SPR_CROSSING_OFF_X_MONO, - SPR_TUNNEL_ENTRY_REAR_MONO + SPR_TUNNEL_ENTRY_REAR_MONO, SPR_BRIDGE_DECKS_MONO, }, /* GUI sprites */ @@ -323,7 +323,7 @@ static const RailTypeInfo _original_railtypes[] = { SPR_MGLV_SINGLE_NORTH, SPR_MGLV_SINGLE_SOUTH, SPR_MGLV_SINGLE_EAST, SPR_MGLV_SINGLE_WEST, SPR_TRACKS_FOR_SLOPES_MAGLEV_BASE, SPR_CROSSING_OFF_X_MAGLEV, - SPR_TUNNEL_ENTRY_REAR_MAGLEV + SPR_TUNNEL_ENTRY_REAR_MAGLEV, SPR_BRIDGE_DECKS_MGLV, }, /* GUI sprites */ diff --git a/src/table/sprites.h b/src/table/sprites.h index 573bead42f..caef133af7 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -321,8 +321,16 @@ static const uint16_t ROAD_WAYPOINTS_SPRITE_COUNT = 4; static constexpr SpriteID SPR_OVERLAY_ROCKS_BASE = SPR_ROAD_WAYPOINTS_BASE + ROAD_WAYPOINTS_SPRITE_COUNT; static constexpr uint16_t OVERLAY_ROCKS_SPRITE_COUNT = 19 * 5; /* Rock overlays: plain, snow 1, snow 2, snow 3 and full snow. */ +/** Bridge deck sprites. */ +static constexpr SpriteID SPR_BRIDGE_DECKS_BASE = SPR_OVERLAY_ROCKS_BASE + OVERLAY_ROCKS_SPRITE_COUNT; +static constexpr uint16_t BRIDGE_DECKS_SPRITE_COUNT = 6 * 4; /* Bridge deck sprites: 6 directions * (3 track types + 1 road type). */ +static const SpriteID SPR_BRIDGE_DECKS_RAIL = SPR_BRIDGE_DECKS_BASE + 0; +static const SpriteID SPR_BRIDGE_DECKS_MONO = SPR_BRIDGE_DECKS_BASE + 6; +static const SpriteID SPR_BRIDGE_DECKS_MGLV = SPR_BRIDGE_DECKS_BASE + 12; +static const SpriteID SPR_BRIDGE_DECKS_ROAD = SPR_BRIDGE_DECKS_BASE + 18; + /* From where can we start putting NewGRFs? */ -static const SpriteID SPR_NEWGRFS_BASE = SPR_OVERLAY_ROCKS_BASE + OVERLAY_ROCKS_SPRITE_COUNT; +static const SpriteID SPR_NEWGRFS_BASE = SPR_BRIDGE_DECKS_BASE + BRIDGE_DECKS_SPRITE_COUNT; /* Manager face sprites */ static const SpriteID SPR_GRADIENT = 874; // background gradient behind manager face diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 6180c1ffb5..7ffe333249 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -135,6 +135,19 @@ bool HasBridgeFlatRamp(Slope tileh, Axis axis) return (tileh != SLOPE_FLAT); } +/** + * Test if bridge piece uses a custom sprite table. + * @param bridge_type Bridge type. + * @param piece Bridge piece. + * @return True iff a custom sprite table is used for the bridge piece. + */ +static bool BridgeHasCustomSpriteTable(BridgeType bridge_type, BridgePieces piece) +{ + assert(piece < NUM_BRIDGE_PIECES); + const BridgeSpec *bridge = GetBridgeSpec(bridge_type); + return piece < bridge->sprite_table.size() && !bridge->sprite_table[piece].empty(); +} + /** * Get the sprite table for a rail/road bridge piece. * @param bridge_type Bridge type. @@ -1158,8 +1171,9 @@ static void GetBridgeRoadCatenary(const RoadTypeInfo *rti, TileIndex head_tile, * @param z the z of the bridge * @param offset sprite offset identifying flat to sloped bridge tiles * @param head are we drawing bridge head? + * @param is_custom_layout Set if the bridge uses a custom sprite layout. */ -static void DrawBridgeRoadBits(TileIndex head_tile, int x, int y, int z, int offset, bool head) +static void DrawBridgeRoadBits(TileIndex head_tile, int x, int y, int z, int offset, bool head, bool is_custom_layout) { RoadType road_rt = GetRoadTypeRoad(head_tile); RoadType tram_rt = GetRoadTypeTram(head_tile); @@ -1178,6 +1192,9 @@ static void DrawBridgeRoadBits(TileIndex head_tile, int x, int y, int z, int off if (road_rti != nullptr) { if (road_rti->UsesOverlay()) { seq_back[0] = GetCustomRoadSprite(road_rti, head_tile, ROTSG_BRIDGE, head ? TCX_NORMAL : TCX_ON_BRIDGE) + offset; + } else if (is_custom_layout) { + /* For custom layouts draw a custom bridge deck. */ + seq_back[0] = SPR_BRIDGE_DECKS_ROAD + offset; } } else if (tram_rti != nullptr) { if (tram_rti->UsesOverlay()) { @@ -1428,13 +1445,16 @@ static void DrawTile_TunnelBridge(TileInfo *ti) DrawBridgeMiddle(ti, BridgePillarFlag::EdgeNE + tunnelbridge_direction); } else { // IsBridge(ti->tile) DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(tunnelbridge_direction))); + bool is_custom_layout; // Set if rail/road bridge uses a custom layout. uint base_offset = GetBridgeRampDirectionBaseOffset(tunnelbridge_direction); std::span psid; if (transport_type != TRANSPORT_WATER) { + BridgeType bridge_type = GetBridgeType(ti->tile); if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head base_offset += GetBridgeSpriteTableBaseOffset(transport_type, ti->tile); - psid = GetBridgeSpriteTable(GetBridgeType(ti->tile), BRIDGE_PIECE_HEAD); + psid = GetBridgeSpriteTable(bridge_type, BRIDGE_PIECE_HEAD); + is_custom_layout = BridgeHasCustomSpriteTable(bridge_type, BRIDGE_PIECE_HEAD); } else { psid = _aqueduct_sprite_table_heads; } @@ -1473,23 +1493,18 @@ static void DrawTile_TunnelBridge(TileInfo *ti) } /* DrawBridgeRoadBits() calls EndSpriteCombine() and StartSpriteCombine() */ - DrawBridgeRoadBits(ti->tile, ti->x, ti->y, z, offset, true); + DrawBridgeRoadBits(ti->tile, ti->x, ti->y, z, offset, true, is_custom_layout); EndSpriteCombine(); } else if (transport_type == TRANSPORT_RAIL) { const RailTypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile)); - if (rti->UsesOverlay()) { - SpriteID surface = GetCustomRailSprite(rti, ti->tile, RTSG_BRIDGE); - if (surface != 0) { - if (HasBridgeFlatRamp(ti->tileh, DiagDirToAxis(tunnelbridge_direction))) { - AddSortableSpriteToDraw(surface + ((DiagDirToAxis(tunnelbridge_direction) == AXIS_X) ? RTBO_X : RTBO_Y), PAL_NONE, *ti, {{0, 0, TILE_HEIGHT}, {TILE_SIZE, TILE_SIZE, 0}, {}}); - } else { - AddSortableSpriteToDraw(surface + RTBO_SLOPE + tunnelbridge_direction, PAL_NONE, *ti, {{}, {TILE_SIZE, TILE_SIZE, TILE_HEIGHT}, {}}); - } + SpriteID surface = rti->UsesOverlay() ? GetCustomRailSprite(rti, ti->tile, RTSG_BRIDGE) : rti->base_sprites.bridge_deck; + if (surface != 0) { + if (HasBridgeFlatRamp(ti->tileh, DiagDirToAxis(tunnelbridge_direction))) { + AddSortableSpriteToDraw(surface + ((DiagDirToAxis(tunnelbridge_direction) == AXIS_X) ? RTBO_X : RTBO_Y), PAL_NONE, *ti, {{0, 0, TILE_HEIGHT}, {TILE_SIZE, TILE_SIZE, 0}, {}}); + } else { + AddSortableSpriteToDraw(surface + RTBO_SLOPE + tunnelbridge_direction, PAL_NONE, *ti, {{}, {TILE_SIZE, TILE_SIZE, TILE_HEIGHT}, {}}); } - /* Don't fallback to non-overlay sprite -- the spec states that - * if an overlay is present then the bridge surface must be - * present. */ } /* PBS debugging, draw reserved tracks darker */ @@ -1614,16 +1629,19 @@ void DrawBridgeMiddle(const TileInfo *ti, BridgePillarFlags blocked_pillars) TransportType transport_type = GetTunnelBridgeTransportType(rampsouth); Axis axis = GetBridgeAxis(ti->tile); BridgePillarFlags pillars; + bool is_custom_layout; // Set if rail/road bridge uses a custom layout. uint base_offset = GetBridgeMiddleAxisBaseOffset(axis); std::span psid; bool drawfarpillar; if (transport_type != TRANSPORT_WATER) { BridgeType bridge_type = GetBridgeType(rampsouth); + BridgePieces bridge_piece = CalcBridgePiece(GetTunnelBridgeLength(ti->tile, rampnorth) + 1, GetTunnelBridgeLength(ti->tile, rampsouth) + 1); drawfarpillar = !HasBit(GetBridgeSpec(bridge_type)->flags, 0); base_offset += GetBridgeSpriteTableBaseOffset(transport_type, rampsouth); - psid = GetBridgeSpriteTable(bridge_type, CalcBridgePiece(GetTunnelBridgeLength(ti->tile, rampnorth) + 1, GetTunnelBridgeLength(ti->tile, rampsouth) + 1)); + psid = GetBridgeSpriteTable(bridge_type, bridge_piece); pillars = GetBridgeTilePillarFlags(ti->tile, rampnorth, rampsouth, bridge_type, transport_type); + is_custom_layout = BridgeHasCustomSpriteTable(bridge_type, bridge_piece); } else { drawfarpillar = true; psid = _aqueduct_sprite_table_middle; @@ -1653,11 +1671,11 @@ void DrawBridgeMiddle(const TileInfo *ti, BridgePillarFlags blocked_pillars) if (transport_type == TRANSPORT_ROAD) { /* DrawBridgeRoadBits() calls EndSpriteCombine() and StartSpriteCombine() */ - DrawBridgeRoadBits(rampsouth, x, y, bridge_z, axis ^ 1, false); + DrawBridgeRoadBits(rampsouth, x, y, bridge_z, axis ^ 1, false, is_custom_layout); } else if (transport_type == TRANSPORT_RAIL) { const RailTypeInfo *rti = GetRailTypeInfo(GetRailType(rampsouth)); - if (rti->UsesOverlay() && !IsInvisibilitySet(TO_BRIDGES)) { - SpriteID surface = GetCustomRailSprite(rti, rampsouth, RTSG_BRIDGE, TCX_ON_BRIDGE); + if (!IsInvisibilitySet(TO_BRIDGES)) { + SpriteID surface = rti->UsesOverlay() ? GetCustomRailSprite(rti, rampsouth, RTSG_BRIDGE, TCX_ON_BRIDGE) : rti->base_sprites.bridge_deck; if (surface != 0) { AddSortableSpriteToDraw(surface + axis, PAL_NONE, x, y, bridge_z, {{}, {TILE_SIZE, TILE_SIZE, 0}, {}}, IsTransparencySet(TO_BRIDGES)); } From 3087194d80f479355a139e2190011adc6f649806 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 28 Sep 2025 19:10:16 +0100 Subject: [PATCH 117/280] Codechange: Use Rects for group window drawing. Simplifies handling of LTR/RTL coordinates. --- src/group_gui.cpp | 75 +++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index df081be946..e697fb4a38 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -281,19 +281,17 @@ private: /** * Draw a row in the group list. - * @param y Top of the row. - * @param left Left of the row. - * @param right Right of the row. + * @param r Rect to draw row in. * @param g_id Group to list. * @param indent Indentation level. * @param protection Whether autoreplace protection is set. * @param has_children Whether the group has children and should have a fold / unfold button. */ - void DrawGroupInfo(int y, int left, int right, GroupID g_id, uint16_t level_mask = 0, uint8_t indent = 0, bool protection = false, bool has_children = false) const + void DrawGroupInfo(Rect r, GroupID g_id, uint16_t level_mask = 0, uint8_t indent = 0, bool protection = false, bool has_children = false) const { /* Highlight the group if a vehicle is dragged over it */ if (g_id == this->group_over) { - GfxFillRect(left + WidgetDimensions::scaled.bevel.left, y + WidgetDimensions::scaled.framerect.top, right - WidgetDimensions::scaled.bevel.right, y + this->tiny_step_height - 1 - WidgetDimensions::scaled.framerect.bottom, GetColourGradient(COLOUR_GREY, SHADE_LIGHTEST)); + GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), GetColourGradient(COLOUR_GREY, SHADE_LIGHTEST)); } if (g_id == NEW_GROUP) return; @@ -307,25 +305,29 @@ private: const int level_width = rtl ? -WidgetDimensions::scaled.hsep_indent : WidgetDimensions::scaled.hsep_indent; const PixelColour linecolour = GetColourGradient(COLOUR_ORANGE, SHADE_NORMAL); + r = r.Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); if (indent > 0) { /* Draw tree continuation lines. */ - int tx = (rtl ? right - WidgetDimensions::scaled.framerect.right : left + WidgetDimensions::scaled.framerect.left) + offset; + int tx = (rtl ? r.right : r.left) + offset; for (uint lvl = 1; lvl <= indent; ++lvl) { - if (HasBit(level_mask, lvl)) GfxDrawLine(tx, y, tx, y + this->tiny_step_height - 1, linecolour, WidgetDimensions::scaled.fullbevel.top); + if (HasBit(level_mask, lvl)) GfxDrawLine(tx, r.top, tx, r.bottom, linecolour, WidgetDimensions::scaled.fullbevel.top); if (lvl < indent) tx += level_width; } /* Draw our node in the tree. */ - int ycentre = y + this->tiny_step_height / 2 - 1; - if (!HasBit(level_mask, indent)) GfxDrawLine(tx, y, tx, ycentre, linecolour, WidgetDimensions::scaled.fullbevel.top); + int ycentre = CentreBounds(r.top, r.bottom, WidgetDimensions::scaled.fullbevel.top); + if (!HasBit(level_mask, indent)) GfxDrawLine(tx, r.top, tx, ycentre, linecolour, WidgetDimensions::scaled.fullbevel.top); GfxDrawLine(tx, ycentre, tx + offset - (rtl ? -1 : 1), ycentre, linecolour, WidgetDimensions::scaled.fullbevel.top); } /* draw fold / unfold button */ - int x = rtl ? right - WidgetDimensions::scaled.framerect.right - this->column_size[VGC_FOLD].width + 1 : left + WidgetDimensions::scaled.framerect.left; + r = r.Indent(indent * WidgetDimensions::scaled.hsep_indent, rtl); if (has_children) { - DrawSprite(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, x + indent * level_width, y + (this->tiny_step_height - this->column_size[VGC_FOLD].height) / 2); + DrawSpriteIgnorePadding(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, r.WithWidth(this->column_size[VGC_FOLD].width, rtl), SA_CENTER); } + /* Group name text column shrinks to fit available space. */ + int text_width = this->column_size[VGC_NAME].width - indent * WidgetDimensions::scaled.hsep_indent; + /* draw group name */ std::string str; if (IsAllGroupID(g_id)) { @@ -335,19 +337,22 @@ private: } else { str = GetString(STR_GROUP_NAME, g_id); } - x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_NAME].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_FOLD].width; - DrawString(x + (rtl ? 0 : indent * WidgetDimensions::scaled.hsep_indent), x + this->column_size[VGC_NAME].width - 1 - (rtl ? indent * WidgetDimensions::scaled.hsep_indent : 0), y + (this->tiny_step_height - this->column_size[VGC_NAME].height) / 2, std::move(str), colour); + r = r.Indent(this->column_size[VGC_FOLD].width + WidgetDimensions::scaled.hsep_normal, rtl); + DrawString(r.WithWidth(text_width, rtl).CentreToHeight(this->column_size[VGC_NAME].height), std::move(str), colour); /* draw autoreplace protection */ - x = rtl ? x - WidgetDimensions::scaled.hsep_wide - this->column_size[VGC_PROTECT].width : x + WidgetDimensions::scaled.hsep_wide + this->column_size[VGC_NAME].width; - if (protection) DrawSprite(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROTECT].height) / 2); + r = r.Indent(text_width + WidgetDimensions::scaled.hsep_wide, rtl); + if (protection) { + DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, r.WithWidth(this->column_size[VGC_PROTECT].width, rtl), SA_CENTER); + } /* draw autoreplace status */ - x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_AUTOREPLACE].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_PROTECT].width; - if (stats.autoreplace_defined) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_AUTOREPLACE].height) / 2); + r = r.Indent(this->column_size[VGC_PROTECT].width + WidgetDimensions::scaled.hsep_normal, rtl); + if (stats.autoreplace_defined) { + DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, r.WithWidth(this->column_size[VGC_AUTOREPLACE].width, rtl), SA_CENTER); + } /* draw the profit icon */ - x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_PROFIT].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_AUTOREPLACE].width; SpriteID spr; uint num_vehicle_min_age = GetGroupNumVehicleMinAge(this->vli.company, g_id, this->vli.vtype); Money profit_last_year_min_age = GetGroupProfitLastYearMinAge(this->vli.company, g_id, this->vli.vtype); @@ -360,16 +365,18 @@ private: } else { spr = SPR_PROFIT_LOT; } - DrawSprite(spr, PAL_NONE, x, y + (this->tiny_step_height - this->column_size[VGC_PROFIT].height) / 2); + + r = r.Indent(this->column_size[VGC_AUTOREPLACE].width + WidgetDimensions::scaled.hsep_normal, rtl); + DrawSpriteIgnorePadding(spr, PAL_NONE, r.WithWidth(this->column_size[VGC_PROFIT].width, rtl), SA_CENTER); /* draw the number of vehicles of the group */ - x = rtl ? x - WidgetDimensions::scaled.hsep_normal - this->column_size[VGC_NUMBER].width : x + WidgetDimensions::scaled.hsep_normal + this->column_size[VGC_PROFIT].width; + r = r.Indent(this->column_size[VGC_PROFIT].width + WidgetDimensions::scaled.hsep_normal, rtl); int num_vehicle_with_subgroups = GetGroupNumVehicle(this->vli.company, g_id, this->vli.vtype); int num_vehicle = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype).num_vehicle; if (IsAllGroupID(g_id) || IsDefaultGroupID(g_id) || num_vehicle_with_subgroups == num_vehicle) { - DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL); + DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL); } else { - DrawString(x, x + this->column_size[VGC_NUMBER].width - 1, y + (this->tiny_step_height - this->column_size[VGC_NUMBER].height) / 2, GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE); + DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE); } } @@ -594,11 +601,11 @@ public: { switch (widget) { case WID_GL_ALL_VEHICLES: - DrawGroupInfo(r.top, r.left, r.right, ALL_GROUP); + DrawGroupInfo(r, ALL_GROUP); break; case WID_GL_DEFAULT_VEHICLES: - DrawGroupInfo(r.top, r.left, r.right, DEFAULT_GROUP); + DrawGroupInfo(r, DEFAULT_GROUP); break; case WID_GL_INFO: { @@ -634,19 +641,18 @@ public: } case WID_GL_LIST_GROUP: { - int y1 = r.top; + Rect row = r.WithHeight(this->tiny_step_height); + auto [first, last] = this->group_sb->GetVisibleRangeIterators(this->groups); for (auto it = first; it != last; ++it) { const Group *g = it->group; - assert(g->owner == this->owner); - DrawGroupInfo(y1, r.left, r.right, g->index, it->level_mask, it->indent, g->flags.Test(GroupFlag::ReplaceProtection), g->folded || (std::next(it) != std::end(this->groups) && std::next(it)->indent > it->indent)); - - y1 += this->tiny_step_height; + DrawGroupInfo(row, g->index, it->level_mask, it->indent, g->flags.Test(GroupFlag::ReplaceProtection), g->folded || (std::next(it) != std::end(this->groups) && std::next(it)->indent > it->indent)); + row = row.Translate(0, this->tiny_step_height); } if ((uint)this->group_sb->GetPosition() + this->group_sb->GetCapacity() > this->groups.size()) { - DrawGroupInfo(y1, r.left, r.right, NEW_GROUP); + DrawGroupInfo(row, NEW_GROUP); } break; } @@ -733,11 +739,10 @@ public: if (it->group->folded || (std::next(it) != std::end(this->groups) && std::next(it)->indent > it->indent)) { /* The group has children, check if the user clicked the fold / unfold button. */ - NWidgetCore *group_display = this->GetWidget(widget); - int x = _current_text_dir == TD_RTL ? - group_display->pos_x + group_display->current_x - WidgetDimensions::scaled.framerect.right - it->indent * WidgetDimensions::scaled.hsep_indent - this->column_size[VGC_FOLD].width : - group_display->pos_x + WidgetDimensions::scaled.framerect.left + it->indent * WidgetDimensions::scaled.hsep_indent; - if (click_count > 1 || (pt.x >= x && pt.x < (int)(x + this->column_size[VGC_FOLD].width))) { + bool rtl = _current_text_dir == TD_RTL; + Rect r = this->GetWidget(widget)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect, RectPadding::zero); + r = r.Indent(it->indent * WidgetDimensions::scaled.hsep_indent, rtl).WithWidth(this->column_size[VGC_FOLD].width, rtl); + if (click_count > 1 || r.Contains(pt)) { GroupID g = this->vli.ToGroupID(); if (!IsAllGroupID(g) && !IsDefaultGroupID(g)) { From 42084ca5168eb4f640c14528da79dc9b2c4f004e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 28 Sep 2025 19:23:57 +0100 Subject: [PATCH 118/280] Change: Make groups window group list aware of interface scaling. --- src/group_gui.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index e697fb4a38..aa761e7c72 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -240,24 +240,24 @@ private: */ uint ComputeGroupInfoSize() { - this->column_size[VGC_FOLD] = maxdim(GetSpriteSize(SPR_CIRCLE_FOLDED), GetSpriteSize(SPR_CIRCLE_UNFOLDED)); + this->column_size[VGC_FOLD] = maxdim(GetScaledSpriteSize(SPR_CIRCLE_FOLDED), GetScaledSpriteSize(SPR_CIRCLE_UNFOLDED)); this->tiny_step_height = this->column_size[VGC_FOLD].height; this->column_size[VGC_NAME] = maxdim(GetStringBoundingBox(STR_GROUP_DEFAULT_TRAINS + this->vli.vtype), GetStringBoundingBox(STR_GROUP_ALL_TRAINS + this->vli.vtype)); this->column_size[VGC_NAME].width = std::max(170u, this->column_size[VGC_NAME].width) + WidgetDimensions::scaled.hsep_indent; this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_NAME].height); - this->column_size[VGC_PROTECT] = GetSpriteSize(SPR_GROUP_REPLACE_PROTECT); + this->column_size[VGC_PROTECT] = GetScaledSpriteSize(SPR_GROUP_REPLACE_PROTECT); this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_PROTECT].height); - this->column_size[VGC_AUTOREPLACE] = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE); + this->column_size[VGC_AUTOREPLACE] = GetScaledSpriteSize(SPR_GROUP_REPLACE_ACTIVE); this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_AUTOREPLACE].height); this->column_size[VGC_PROFIT].width = 0; this->column_size[VGC_PROFIT].height = 0; static const SpriteID profit_sprites[] = {SPR_PROFIT_NA, SPR_PROFIT_NEGATIVE, SPR_PROFIT_SOME, SPR_PROFIT_LOT}; for (const auto &profit_sprite : profit_sprites) { - Dimension d = GetSpriteSize(profit_sprite); + Dimension d = GetScaledSpriteSize(profit_sprite); this->column_size[VGC_PROFIT] = maxdim(this->column_size[VGC_PROFIT], d); } this->tiny_step_height = std::max(this->tiny_step_height, this->column_size[VGC_PROFIT].height); From 9eacb889f810eb1668f1e783f0c4296aaf62af0d Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 30 Sep 2025 04:38:08 +0000 Subject: [PATCH 119/280] Update: Translations from eints english (au): 1 change by krysclarke greek: 1 change by gh658804 hungarian: 4 changes by vargaviktor russian: 1 change by Ln-Wolf finnish: 1 change by hpiirai portuguese: 1 change by jcteotonio portuguese (brazilian): 1 change by pasantoro --- src/lang/brazilian_portuguese.txt | 1 + src/lang/english_AU.txt | 1 + src/lang/finnish.txt | 1 + src/lang/greek.txt | 1 + src/lang/hungarian.txt | 6 ++++-- src/lang/portuguese.txt | 1 + src/lang/russian.txt | 1 + 7 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 762bcab373..d3b6f76991 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3692,6 +3692,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduz STR_TOWN_DIRECTORY_CAPTION :{WHITE}Localidades ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nenhum - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes das localidades - clique em um nome para centralizar a visualização principal na cidade. Ctrl+Clique para abrir uma nova visualização na localização da localidade STR_TOWN_POPULATION :{BLACK}População mundial: {COMMA} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 0b1ba3134d..10cc0ac016 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3691,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- None - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to centre main view on town. Ctrl+Click to open a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index a377d6509c..6427a51c2a 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3691,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Syötä STR_TOWN_DIRECTORY_CAPTION :{WHITE}Kunnat ({COMMA}/{COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ei mitään - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Kuntien nimet – keskitä päänäkymä kuntaan napsauttamalla nimeä. Ctrl+napsautus avaa uuden näkymäikkunan kunnan sijaintiin STR_TOWN_POPULATION :{BLACK}Maailman asukasluku: {COMMA} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 2c97b15f41..5ec9e67770 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3784,6 +3784,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Δώστ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Πόλεις ({COMMA} από {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Τίποτα - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ονόματα πόλεων - πατήστε στο όνομα για κεντράρισμα της κύριας προβολής στην πόλη. Ctrl+Κλικ για άνοιγμα νέου παραθύρου προβολής στην τοποθεσία της πόλης STR_TOWN_POPULATION :{BLACK}Παγκόσμιος πληθυσμός: {COMMA} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 3bb4c6f731..167ffc89fb 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3494,8 +3494,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Víz STR_MAPGEN_BORDER_RANDOM :{BLACK}Véletlen ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Véletlen -STR_MAPGEN_BORDER_MANUAL :{BLACK}Kézi +STR_MAPGEN_BORDER_RANDOMIZE :Véletlen +STR_MAPGEN_BORDER_MANUAL :Kézi +STR_MAPGEN_BORDER_INFINITE_WATER :Végtelen víz STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Magasságtérkép elforgatása: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Magasságtérkép neve: @@ -3754,6 +3755,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Felirat STR_TOWN_DIRECTORY_CAPTION :{WHITE}Városok ({COMMA}, {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nincs - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Városnevek - kattints egy névre a város megnézéséhez. Ctrl+kattintással új nézet nyílik a városnál STR_TOWN_POPULATION :{BLACK}Világnépesség: {COMMA} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 560ef2bf4f..bc417f32d4 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3692,6 +3692,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Introduz STR_TOWN_DIRECTORY_CAPTION :{WHITE}Localidades ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nenhuma - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes das localidades - clique no nome para centrar a visualização na cidade. Ctrl+Clique para abrir um novo visualizador na localização da localidade STR_TOWN_POPULATION :{BLACK}População Mundial: {COMMA} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index de883b9d6b..e1aefd3319 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3866,6 +3866,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Введ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Города ({COMMA} / {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Нет - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Список городов. Щелчок по названию показывает город в основном окне. Ctrl+щелчок показывает в дополнительном окне. STR_TOWN_POPULATION :{BLACK}Население: {COMMA} From 5d5d27841b328176640ce934779e76886aebe14e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 30 Sep 2025 22:16:50 +0100 Subject: [PATCH 120/280] Fix: Bootstrap ignored default OpenTTD truetype fonts. (#14684) Bootstrapping assumed that glyphs must be missing if there is no baseset, ignoring whether there actually are glyphs missing. --- src/bootstrap_gui.cpp | 2 +- src/fontcache/spritefontcache.cpp | 1 + src/strings.cpp | 7 +++---- src/strings_func.h | 2 +- src/textfile_gui.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index ae04d45b7b..1cfd582c0d 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -380,7 +380,7 @@ bool HandleBootstrap() /* Initialise the font cache. */ InitializeUnicodeGlyphMap(); /* Next "force" finding a suitable non-sprite font as the local font is missing. */ - CheckForMissingGlyphs(false); + CheckForMissingGlyphs(); /* Initialise the palette. The biggest step is 'faking' some recolour sprites. * This way the mauve and gray colours work and we can show the user interface. */ diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index 0ed1cff34e..8d67237266 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -94,6 +94,7 @@ void InitializeUnicodeGlyphMap(FontSize fs) SetUnicodeGlyph(fs, unicode_map.code, 0); } else { SpriteID sprite = base + key - ASCII_LETTERSTART; + if (!SpriteExists(sprite)) continue; SetUnicodeGlyph(fs, unicode_map.code, sprite); } } diff --git a/src/strings.cpp b/src/strings.cpp index f4ff461bc7..b4050dca0c 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -2356,15 +2356,14 @@ class LanguagePackGlyphSearcher : public MissingGlyphSearcher { * mean it might use characters that are not in the * font, which is the whole reason this check has * been added. - * @param base_font Whether to look at the base font as well. * @param searcher The methods to use to search for strings to check. * If nullptr the loaded language pack searcher is used. */ -void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher) +void CheckForMissingGlyphs(MissingGlyphSearcher *searcher) { static LanguagePackGlyphSearcher pack_searcher; if (searcher == nullptr) searcher = &pack_searcher; - bool bad_font = !base_font || searcher->FindMissingGlyphs(); + bool bad_font = searcher->FindMissingGlyphs(); #if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) if (bad_font) { /* We found an unprintable character... lets try whether we can find @@ -2390,7 +2389,7 @@ void CheckForMissingGlyphs(bool base_font, MissingGlyphSearcher *searcher) ShowErrorMessage(GetEncodedString(STR_JUST_RAW_STRING, std::move(err_str)), {}, WL_WARNING); } - if (bad_font && base_font) { + if (bad_font) { /* Our fallback font does miss characters too, so keep the * user chosen font as that is more likely to be any good than * the wild guess we made */ diff --git a/src/strings_func.h b/src/strings_func.h index 7bb9ae99ff..e883504b41 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -195,6 +195,6 @@ public: bool FindMissingGlyphs(); }; -void CheckForMissingGlyphs(bool base_font = true, MissingGlyphSearcher *search = nullptr); +void CheckForMissingGlyphs(MissingGlyphSearcher *search = nullptr); #endif /* STRINGS_FUNC_H */ diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 75650c52ef..4c3f31d49b 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -923,7 +923,7 @@ void TextfileWindow::LoadText(std::string_view buf) this->AfterLoadText(); this->ReflowContent(); - CheckForMissingGlyphs(true, this); + CheckForMissingGlyphs(this); /* The font may have changed when searching for glyphs, so ensure widget sizes are updated just in case. */ this->ReInit(); From 632ab6a4e51bb3cdab12f77798dadf0d741f697f Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 1 Oct 2025 04:38:32 +0000 Subject: [PATCH 121/280] Update: Translations from eints chinese (traditional): 4 changes by KogentaSan english (us): 1 change by 2TallTyler korean: 1 change by telk5093 polish: 1 change by pAter-exe --- src/lang/english_US.txt | 1 + src/lang/korean.txt | 1 + src/lang/polish.txt | 1 + src/lang/traditional_chinese.txt | 6 ++++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 10ad2ad02a..3640eda96c 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3691,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Enter a STR_TOWN_DIRECTORY_CAPTION :{WHITE}Towns ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- None - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Town names - click on name to center main view on town. Ctrl+Click to open a new viewport on town location STR_TOWN_POPULATION :{BLACK}World population: {COMMA} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index a2edd95224..e0bb797da5 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3692,6 +3692,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}팻말 STR_TOWN_DIRECTORY_CAPTION :{WHITE}도시 목록 ({1:COMMA}개 중 {0:COMMA}개) STR_TOWN_DIRECTORY_NONE :{ORANGE}(없음) STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}도시 이름 - 이 도시로 시점을 변경하려면 클릭하세요. CTRL+클릭하면 이 도시 위치를 기준으로 새로운 외부 화면을 엽니다 STR_TOWN_POPULATION :{BLACK}총 인구 수: {COMMA} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 9c35d70698..6785c742b8 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -4071,6 +4071,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Wpisz na STR_TOWN_DIRECTORY_CAPTION :{WHITE}Miasta ({COMMA} z {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Żaden - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nazwy miast - kliknij na nazwę miasta, aby wyśrodkować na nim widok główny. Użyj Ctrl, aby otworzyć nowy podgląd na lokalizację miasta STR_TOWN_POPULATION :{BLACK}Populacja świata: {COMMA} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 56033a4f94..73cb73984e 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}水域 STR_MAPGEN_BORDER_RANDOM :{BLACK}隨機 ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}隨機 -STR_MAPGEN_BORDER_MANUAL :{BLACK}手動 +STR_MAPGEN_BORDER_RANDOMIZE :隨機 +STR_MAPGEN_BORDER_MANUAL :手動 +STR_MAPGEN_BORDER_INFINITE_WATER :無盡水域 STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度圖旋轉: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度圖名稱: @@ -3690,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}輸入 STR_TOWN_DIRECTORY_CAPTION :{WHITE}市鎮({COMMA} 座,總共 {COMMA} 座) STR_TOWN_DIRECTORY_NONE :{ORANGE}- 無 - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK}({COMMA}){YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}市鎮名稱 - 點選名稱可將市鎮置於畫面正中央。按住 點選可於市鎮位置開啟新檢視視窗 STR_TOWN_POPULATION :{BLACK}世界人口:{COMMA} From 97674ac2a21b2a15a11a90d61ba610cfcf3bec3e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 3 Oct 2025 22:28:28 +0100 Subject: [PATCH 122/280] Fix f6c5da4cad: dump_info should not reverse non-ASCII label. (#14697) Cargo/rail/road types labels are already in appropriate endian-ness. --- src/console_cmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 338c9a209a..d3b086f606 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2699,7 +2699,7 @@ static std::string FormatLabel(uint32_t label) return fmt::format("{:c}{:c}{:c}{:c}", GB(label, 24, 8), GB(label, 16, 8), GB(label, 8, 8), GB(label, 0, 8)); } - return fmt::format("{:08X}", std::byteswap(label)); + return fmt::format("{:08X}", label); } static void ConDumpRoadTypes() From 4d4096630378477528e2d045b3805b0df8ecf830 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Sep 2025 14:13:57 +0100 Subject: [PATCH 123/280] Codechange: Use FlatSet to store and test alternate rail/road types. --- src/newgrf/newgrf_act0_railtypes.cpp | 2 +- src/newgrf/newgrf_act0_roadtypes.cpp | 2 +- src/rail.cpp | 3 +-- src/rail.h | 3 ++- src/road.cpp | 3 +-- src/road.h | 3 ++- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/newgrf/newgrf_act0_railtypes.cpp b/src/newgrf/newgrf_act0_railtypes.cpp index 27394f8bf4..d37a3684ec 100644 --- a/src/newgrf/newgrf_act0_railtypes.cpp +++ b/src/newgrf/newgrf_act0_railtypes.cpp @@ -204,7 +204,7 @@ static ChangeInfoResult RailTypeReserveInfo(uint first, uint last, int prop, Byt if (type_map[id] != INVALID_RAILTYPE) { int n = buf.ReadByte(); for (int j = 0; j != n; j++) { - _railtypes[type_map[id]].alternate_labels.push_back(std::byteswap(buf.ReadDWord())); + _railtypes[type_map[id]].alternate_labels.insert(std::byteswap(buf.ReadDWord())); } break; } diff --git a/src/newgrf/newgrf_act0_roadtypes.cpp b/src/newgrf/newgrf_act0_roadtypes.cpp index 2eff6b05fd..4fa5746ce9 100644 --- a/src/newgrf/newgrf_act0_roadtypes.cpp +++ b/src/newgrf/newgrf_act0_roadtypes.cpp @@ -192,7 +192,7 @@ static ChangeInfoResult RoadTypeReserveInfo(uint first, uint last, int prop, Byt if (type_map[id] != INVALID_ROADTYPE) { int n = buf.ReadByte(); for (int j = 0; j != n; j++) { - _roadtypes[type_map[id]].alternate_labels.push_back(std::byteswap(buf.ReadDWord())); + _roadtypes[type_map[id]].alternate_labels.insert(std::byteswap(buf.ReadDWord())); } break; } diff --git a/src/rail.cpp b/src/rail.cpp index 590676aa87..7e7174fef2 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -205,8 +205,7 @@ RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels) if (allow_alternate_labels) { /* Test if any rail type defines the label as an alternate. */ for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) { - const RailTypeInfo *rti = GetRailTypeInfo(r); - if (std::ranges::find(rti->alternate_labels, label) != rti->alternate_labels.end()) return r; + if (GetRailTypeInfo(r)->alternate_labels.contains(label)) return r; } } diff --git a/src/rail.h b/src/rail.h index b65f2351c8..9865f81003 100644 --- a/src/rail.h +++ b/src/rail.h @@ -15,6 +15,7 @@ #include "gfx_type.h" #include "core/bitmath_func.hpp" #include "core/enum_type.hpp" +#include "core/flatset_type.hpp" #include "economy_func.h" #include "slope_type.h" #include "strings_type.h" @@ -227,7 +228,7 @@ public: /** * Rail type labels this type provides in addition to the main label. */ - std::vector alternate_labels; + FlatSet alternate_labels; /** * Colour on mini-map diff --git a/src/road.cpp b/src/road.cpp index 51bdf1900d..590abfa07c 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -275,8 +275,7 @@ RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels) if (allow_alternate_labels) { /* Test if any road type defines the label as an alternate. */ for (RoadType r = ROADTYPE_BEGIN; r != ROADTYPE_END; r++) { - const RoadTypeInfo *rti = GetRoadTypeInfo(r); - if (std::ranges::find(rti->alternate_labels, label) != rti->alternate_labels.end()) return r; + if (GetRoadTypeInfo(r)->alternate_labels.contains(label)) return r; } } diff --git a/src/road.h b/src/road.h index a3c689419f..b67df0e70a 100644 --- a/src/road.h +++ b/src/road.h @@ -13,6 +13,7 @@ #include "road_type.h" #include "gfx_type.h" #include "core/bitmath_func.hpp" +#include "core/flatset_type.hpp" #include "strings_type.h" #include "timer/timer_game_calendar.h" #include "core/enum_type.hpp" @@ -137,7 +138,7 @@ public: /** * Road type labels this type provides in addition to the main label. */ - std::vector alternate_labels; + FlatSet alternate_labels; /** * Colour on mini-map From 6fdacb0759144b13099867b590a548db7df7ae01 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 1 Oct 2025 21:54:40 +0100 Subject: [PATCH 124/280] Codechange: Use find/find_if to search for rail/road types by label. Replaces manual loops. --- src/rail.cpp | 16 ++++++---------- src/road.cpp | 16 ++++++---------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/rail.cpp b/src/rail.cpp index 7e7174fef2..b977c1c963 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -194,20 +194,16 @@ RailTypes GetRailTypes(bool introduces) */ RailType GetRailTypeByLabel(RailTypeLabel label, bool allow_alternate_labels) { + extern RailTypeInfo _railtypes[RAILTYPE_END]; if (label == 0) return INVALID_RAILTYPE; - /* Loop through each rail type until the label is found */ - for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) { - const RailTypeInfo *rti = GetRailTypeInfo(r); - if (rti->label == label) return r; + auto it = std::ranges::find(_railtypes, label, &RailTypeInfo::label); + if (it == std::end(_railtypes) && allow_alternate_labels) { + /* Test if any rail type defines the label as an alternate. */ + it = std::ranges::find_if(_railtypes, [label](const RailTypeInfo &rti) { return rti.alternate_labels.contains(label); }); } - if (allow_alternate_labels) { - /* Test if any rail type defines the label as an alternate. */ - for (RailType r = RAILTYPE_BEGIN; r != RAILTYPE_END; r++) { - if (GetRailTypeInfo(r)->alternate_labels.contains(label)) return r; - } - } + if (it != std::end(_railtypes)) return it->Index(); /* No matching label was found, so it is invalid */ return INVALID_RAILTYPE; diff --git a/src/road.cpp b/src/road.cpp index 590abfa07c..18478e9598 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -264,20 +264,16 @@ RoadTypes GetRoadTypes(bool introduces) */ RoadType GetRoadTypeByLabel(RoadTypeLabel label, bool allow_alternate_labels) { + extern RoadTypeInfo _roadtypes[ROADTYPE_END]; if (label == 0) return INVALID_ROADTYPE; - /* Loop through each road type until the label is found */ - for (RoadType r = ROADTYPE_BEGIN; r != ROADTYPE_END; r++) { - const RoadTypeInfo *rti = GetRoadTypeInfo(r); - if (rti->label == label) return r; + auto it = std::ranges::find(_roadtypes, label, &RoadTypeInfo::label); + if (it == std::end(_roadtypes) && allow_alternate_labels) { + /* Test if any road type defines the label as an alternate. */ + it = std::ranges::find_if(_roadtypes, [label](const RoadTypeInfo &rti) { return rti.alternate_labels.contains(label); }); } - if (allow_alternate_labels) { - /* Test if any road type defines the label as an alternate. */ - for (RoadType r = ROADTYPE_BEGIN; r != ROADTYPE_END; r++) { - if (GetRoadTypeInfo(r)->alternate_labels.contains(label)) return r; - } - } + if (it != std::end(_roadtypes)) return it->Index(); /* No matching label was found, so it is invalid */ return INVALID_ROADTYPE; From c9fbc41636ff7c39629e6426e5f6ca98dc7bc43c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 5 Oct 2025 07:57:09 +0100 Subject: [PATCH 125/280] Codechange: Script list iterator tidying. (#14698) * Use `iter->` instead of `(*iter).` * Use prefix instead of postfix operators * Use `auto` instead of explicit iterator type. * Use `std::next()` instead of assignment then increment. * Use range-for where possible. --- src/script/api/script_list.cpp | 118 ++++++++++++++++----------------- 1 file changed, 57 insertions(+), 61 deletions(-) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 134b80287b..90bc74d0b7 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -95,7 +95,7 @@ public: this->has_no_more_items = false; this->bucket_iter = this->list->buckets.begin(); - this->bucket_list = &(*this->bucket_iter).second; + this->bucket_list = &this->bucket_iter->second; this->bucket_list_iter = this->bucket_list->begin(); this->item_next = *this->bucket_list_iter; @@ -121,14 +121,14 @@ public: return; } - this->bucket_list_iter++; + ++this->bucket_list_iter; if (this->bucket_list_iter == this->bucket_list->end()) { - this->bucket_iter++; + ++this->bucket_iter; if (this->bucket_iter == this->list->buckets.end()) { this->bucket_list = nullptr; return; } - this->bucket_list = &(*this->bucket_iter).second; + this->bucket_list = &this->bucket_iter->second; this->bucket_list_iter = this->bucket_list->begin(); } this->item_next = *this->bucket_list_iter; @@ -186,7 +186,7 @@ public: /* Go to the end of the bucket-list */ this->bucket_iter = this->list->buckets.end(); --this->bucket_iter; - this->bucket_list = &(*this->bucket_iter).second; + this->bucket_list = &this->bucket_iter->second; /* Go to the end of the items in the bucket */ this->bucket_list_iter = this->bucket_list->end(); @@ -220,14 +220,12 @@ public: this->bucket_list = nullptr; return; } - this->bucket_iter--; - this->bucket_list = &(*this->bucket_iter).second; + --this->bucket_iter; + this->bucket_list = &this->bucket_iter->second; /* Go to the end of the items in the bucket */ this->bucket_list_iter = this->bucket_list->end(); - --this->bucket_list_iter; - } else { - this->bucket_list_iter--; } + --this->bucket_list_iter; this->item_next = *this->bucket_list_iter; } @@ -276,7 +274,7 @@ public: this->has_no_more_items = false; this->item_iter = this->list->items.begin(); - this->item_next = (*this->item_iter).first; + this->item_next = this->item_iter->first; SQInteger item_current = this->item_next; FindNext(); @@ -297,8 +295,8 @@ public: this->has_no_more_items = true; return; } - this->item_iter++; - if (this->item_iter != this->list->items.end()) item_next = (*this->item_iter).first; + ++this->item_iter; + if (this->item_iter != this->list->items.end()) item_next = this->item_iter->first; } SQInteger Next() override @@ -350,7 +348,7 @@ public: this->item_iter = this->list->items.end(); --this->item_iter; - this->item_next = (*this->item_iter).first; + this->item_next = this->item_iter->first; SQInteger item_current = this->item_next; FindNext(); @@ -375,9 +373,9 @@ public: /* Use 'end' as marker for 'beyond begin' */ this->item_iter = this->list->items.end(); } else { - this->item_iter--; + --this->item_iter; } - if (this->item_iter != this->list->items.end()) item_next = (*this->item_iter).first; + if (this->item_iter != this->list->items.end()) item_next = this->item_iter->first; } SQInteger Next() override @@ -412,9 +410,9 @@ bool ScriptList::SaveObject(HSQUIRRELVM vm) sq_pushbool(vm, this->sort_ascending ? SQTrue : SQFalse); sq_arrayappend(vm, -2); sq_newtable(vm); - for (ScriptListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) { - sq_pushinteger(vm, iter->first); - sq_pushinteger(vm, iter->second); + for (const auto &item : this->items) { + sq_pushinteger(vm, item.first); + sq_pushinteger(vm, item.second); sq_rawset(vm, -3); } sq_arrayappend(vm, -2); @@ -509,13 +507,13 @@ void ScriptList::RemoveItem(SQInteger item) { this->modifications++; - ScriptListMap::iterator item_iter = this->items.find(item); + auto item_iter = this->items.find(item); if (item_iter == this->items.end()) return; SQInteger value = item_iter->second; this->sorter->Remove(item); - ScriptListBucket::iterator bucket_iter = this->buckets.find(value); + auto bucket_iter = this->buckets.find(value); assert(bucket_iter != this->buckets.end()); bucket_iter->second.erase(item); if (bucket_iter->second.empty()) this->buckets.erase(bucket_iter); @@ -558,7 +556,7 @@ SQInteger ScriptList::Count() SQInteger ScriptList::GetValue(SQInteger item) { - ScriptListMap::const_iterator item_iter = this->items.find(item); + auto item_iter = this->items.find(item); return item_iter == this->items.end() ? 0 : item_iter->second; } @@ -566,14 +564,14 @@ bool ScriptList::SetValue(SQInteger item, SQInteger value) { this->modifications++; - ScriptListMap::iterator item_iter = this->items.find(item); + auto item_iter = this->items.find(item); if (item_iter == this->items.end()) return false; SQInteger value_old = item_iter->second; if (value_old == value) return true; this->sorter->Remove(item); - ScriptListBucket::iterator bucket_iter = this->buckets.find(value_old); + auto bucket_iter = this->buckets.find(value_old); assert(bucket_iter != this->buckets.end()); bucket_iter->second.erase(item); if (bucket_iter->second.empty()) this->buckets.erase(bucket_iter); @@ -624,10 +622,9 @@ void ScriptList::AddList(ScriptList *list) this->buckets = list->buckets; this->modifications++; } else { - ScriptListMap *list_items = &list->items; - for (auto &it : *list_items) { - this->AddItem(it.first); - this->SetValue(it.first, it.second); + for (const auto &item : list->items) { + this->AddItem(item.first); + this->SetValue(item.first, item.second); } } } @@ -652,8 +649,8 @@ void ScriptList::RemoveAboveValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second > value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second > value) this->RemoveItem(iter->first); } } @@ -662,8 +659,8 @@ void ScriptList::RemoveBelowValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second < value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second < value) this->RemoveItem(iter->first); } } @@ -672,8 +669,8 @@ void ScriptList::RemoveBetweenValue(SQInteger start, SQInteger end) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second > start && (*iter).second < end) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second > start && iter->second < end) this->RemoveItem(iter->first); } } @@ -682,8 +679,8 @@ void ScriptList::RemoveValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second == value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second == value) this->RemoveItem(iter->first); } } @@ -701,10 +698,10 @@ void ScriptList::RemoveTop(SQInteger count) switch (this->sorter_type) { default: NOT_REACHED(); case SORT_BY_VALUE: - for (ScriptListBucket::iterator iter = this->buckets.begin(); iter != this->buckets.end(); iter = this->buckets.begin()) { - ScriptItemList *items = &(*iter).second; + for (auto iter = this->buckets.begin(); iter != this->buckets.end(); iter = this->buckets.begin()) { + ScriptItemList *items = &iter->second; size_t size = items->size(); - for (ScriptItemList::iterator iter = items->begin(); iter != items->end(); iter = items->begin()) { + for (auto iter = items->begin(); iter != items->end(); iter = items->begin()) { if (--count < 0) return; this->RemoveItem(*iter); /* When the last item is removed from the bucket, the bucket itself is removed. @@ -716,9 +713,9 @@ void ScriptList::RemoveTop(SQInteger count) break; case SORT_BY_ITEM: - for (ScriptListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter = this->items.begin()) { + for (auto iter = this->items.begin(); iter != this->items.end(); iter = this->items.begin()) { if (--count < 0) return; - this->RemoveItem((*iter).first); + this->RemoveItem(iter->first); } break; } @@ -738,10 +735,10 @@ void ScriptList::RemoveBottom(SQInteger count) switch (this->sorter_type) { default: NOT_REACHED(); case SORT_BY_VALUE: - for (ScriptListBucket::reverse_iterator iter = this->buckets.rbegin(); iter != this->buckets.rend(); iter = this->buckets.rbegin()) { - ScriptItemList *items = &(*iter).second; + for (auto iter = this->buckets.rbegin(); iter != this->buckets.rend(); iter = this->buckets.rbegin()) { + ScriptItemList *items = &iter->second; size_t size = items->size(); - for (ScriptItemList::reverse_iterator iter = items->rbegin(); iter != items->rend(); iter = items->rbegin()) { + for (auto iter = items->rbegin(); iter != items->rend(); iter = items->rbegin()) { if (--count < 0) return; this->RemoveItem(*iter); /* When the last item is removed from the bucket, the bucket itself is removed. @@ -753,9 +750,9 @@ void ScriptList::RemoveBottom(SQInteger count) break; case SORT_BY_ITEM: - for (ScriptListMap::reverse_iterator iter = this->items.rbegin(); iter != this->items.rend(); iter = this->items.rbegin()) { + for (auto iter = this->items.rbegin(); iter != this->items.rend(); iter = this->items.rbegin()) { if (--count < 0) return; - this->RemoveItem((*iter).first); + this->RemoveItem(iter->first); } break; } @@ -768,9 +765,8 @@ void ScriptList::RemoveList(ScriptList *list) if (list == this) { Clear(); } else { - ScriptListMap *list_items = &list->items; - for (ScriptListMap::iterator iter = list_items->begin(); iter != list_items->end(); iter++) { - this->RemoveItem((*iter).first); + for (const auto &item : list->items) { + this->RemoveItem(item.first); } } } @@ -780,8 +776,8 @@ void ScriptList::KeepAboveValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second <= value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second <= value) this->RemoveItem(iter->first); } } @@ -790,8 +786,8 @@ void ScriptList::KeepBelowValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second >= value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second >= value) this->RemoveItem(iter->first); } } @@ -800,8 +796,8 @@ void ScriptList::KeepBetweenValue(SQInteger start, SQInteger end) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second <= start || (*iter).second >= end) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second <= start || iter->second >= end) this->RemoveItem(iter->first); } } @@ -810,8 +806,8 @@ void ScriptList::KeepValue(SQInteger value) this->modifications++; for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).second != value) this->RemoveItem((*iter).first); + next_iter = std::next(iter); + if (iter->second != value) this->RemoveItem(iter->first); } } @@ -848,7 +844,7 @@ SQInteger ScriptList::_get(HSQUIRRELVM vm) SQInteger idx; sq_getinteger(vm, 2, &idx); - ScriptListMap::const_iterator item_iter = this->items.find(idx); + auto item_iter = this->items.find(idx); if (item_iter == this->items.end()) return SQ_ERROR; sq_pushinteger(vm, item_iter->second); @@ -932,14 +928,14 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) /* Push the function to call */ sq_push(vm, 2); - for (ScriptListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) { + for (const auto &item : this->items) { /* Check for changing of items. */ int previous_modification_count = this->modifications; /* Push the root table as instance object, this is what squirrel does for meta-functions. */ sq_pushroottable(vm); /* Push all arguments for the valuator function. */ - sq_pushinteger(vm, (*iter).first); + sq_pushinteger(vm, item.first); for (int i = 0; i < nparam - 1; i++) { sq_push(vm, i + 3); } @@ -980,7 +976,7 @@ SQInteger ScriptList::Valuate(HSQUIRRELVM vm) return sq_throwerror(vm, "modifying valuated list outside of valuator function"); } - this->SetValue((*iter).first, value); + this->SetValue(item.first, value); /* Pop the return value. */ sq_poptop(vm); From a617d009cca418255a9682fd83c9cebc6423303e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 5 Oct 2025 15:47:33 +0100 Subject: [PATCH 126/280] Codechange: Dereference with `x->` instead of `(*x).` (#14700) --- src/ai/ai_scanner.cpp | 2 +- src/bitmap_type.h | 4 ++-- src/blitter/32bpp_sse2.cpp | 4 ++-- src/core/geometry_type.hpp | 6 +++--- src/fileio.cpp | 2 +- src/misc/dbg_helpers.cpp | 2 +- src/script/api/script_controller.cpp | 2 +- src/script/api/script_error.cpp | 2 +- src/script/script_config.cpp | 2 +- src/station_base.h | 4 ++-- src/viewport.cpp | 4 ++-- src/viewport_sprite_sorter_sse4.cpp | 4 ++-- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index 70e5b55148..f4b0552684 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -137,5 +137,5 @@ AILibrary *AIScannerLibrary::FindLibrary(const std::string &library, int version ScriptInfoList::iterator it = this->info_list.find(library_name); if (it == this->info_list.end()) return nullptr; - return static_cast((*it).second); + return static_cast(it->second); } diff --git a/src/bitmap_type.h b/src/bitmap_type.h index 4dd356e48a..acf3b3d22b 100644 --- a/src/bitmap_type.h +++ b/src/bitmap_type.h @@ -118,9 +118,9 @@ public: inline TileIterator& operator ++() override { - (*this).OrthogonalTileIterator::operator++(); + this->OrthogonalTileIterator::operator++(); while (this->tile != INVALID_TILE && !this->bitmap->HasTile(TileIndex(this->tile))) { - (*this).OrthogonalTileIterator::operator++(); + this->OrthogonalTileIterator::operator++(); } return *this; } diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp index 6fc08ca6cd..791952a095 100644 --- a/src/blitter/32bpp_sse2.cpp +++ b/src/blitter/32bpp_sse2.cpp @@ -113,7 +113,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(SpriteType sprite_type, const SpriteLoader else break; dst_rgba++; } - (*dst_rgba_line).data = nb_pix_transp; + dst_rgba_line->data = nb_pix_transp; Colour *nb_right = dst_rgba_line + 1; dst_rgba_line = reinterpret_cast(reinterpret_cast(dst_rgba_line) + info.sprite_line_size); @@ -126,7 +126,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(SpriteType sprite_type, const SpriteLoader else break; dst_rgba--; } - (*nb_right).data = nb_pix_transp; + nb_right->data = nb_pix_transp; } } diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index ccc610fa90..e46315899e 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -62,14 +62,14 @@ struct Dimension { bool operator< (const Dimension &other) const { - int x = (*this).width - other.width; + int x = this->width - other.width; if (x != 0) return x < 0; - return (*this).height < other.height; + return this->height < other.height; } bool operator== (const Dimension &other) const { - return (*this).width == other.width && (*this).height == other.height; + return this->width == other.width && this->height == other.height; } }; diff --git a/src/fileio.cpp b/src/fileio.cpp index 981d37c8cd..da9ae826ab 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -593,7 +593,7 @@ bool ExtractTar(const std::string &tar_filename, Subdirectory subdir) /* We don't know the file. */ if (it == _tar_list[subdir].end()) return false; - const auto &dirname = (*it).second; + const auto &dirname = it->second; /* The file doesn't have a sub directory! */ if (dirname.empty()) { diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp index 7e2d4314c4..bc51801fa9 100644 --- a/src/misc/dbg_helpers.cpp +++ b/src/misc/dbg_helpers.cpp @@ -91,7 +91,7 @@ bool DumpTarget::FindKnownName(size_t type_id, const void *ptr, std::string &nam KNOWN_NAMES::const_iterator it = m_known_names.find(KnownStructKey(type_id, ptr)); if (it != m_known_names.end()) { /* we have found it */ - name = (*it).second; + name = it->second; return true; } return false; diff --git a/src/script/api/script_controller.cpp b/src/script/api/script_controller.cpp index 774b089ef5..65c5970bda 100644 --- a/src/script/api/script_controller.cpp +++ b/src/script/api/script_controller.cpp @@ -116,7 +116,7 @@ ScriptController::ScriptController(::CompanyID company) : LoadedLibraryList::iterator it = controller.loaded_library.find(library_name); if (it != controller.loaded_library.end()) { - fake_class = (*it).second; + fake_class = it->second; } else { int next_number = ++controller.loaded_library_count; diff --git a/src/script/api/script_error.cpp b/src/script/api/script_error.cpp index 953e9d8d38..34c1dfb9d5 100644 --- a/src/script/api/script_error.cpp +++ b/src/script/api/script_error.cpp @@ -54,7 +54,7 @@ ScriptError::ScriptErrorMapString ScriptError::error_map_string = ScriptError::S ScriptErrorMap::iterator it = error_map.find(internal_string_id); if (it == error_map.end()) return ERR_UNKNOWN; - return (*it).second; + return it->second; } /* static */ void ScriptError::RegisterErrorMap(StringID internal_string_id, ScriptErrorType ai_error_msg) diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index a599a7e30a..7243af22af 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -85,7 +85,7 @@ int ScriptConfig::GetSetting(const std::string &name) const { const auto it = this->settings.find(name); if (it == this->settings.end()) return this->info->GetSettingDefaultValue(name); - return (*it).second; + return it->second; } void ScriptConfig::SetSetting(std::string_view name, int value) diff --git a/src/station_base.h b/src/station_base.h index b1d26cc721..d8e62d2339 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -599,9 +599,9 @@ public: inline TileIterator& operator ++() override { - (*this).OrthogonalTileIterator::operator++(); + this->OrthogonalTileIterator::operator++(); while (this->tile != INVALID_TILE && !st->TileBelongsToAirport(this->tile)) { - (*this).OrthogonalTileIterator::operator++(); + this->OrthogonalTileIterator::operator++(); } return *this; } diff --git a/src/viewport.cpp b/src/viewport.cpp index 734a34bb7a..83d08f5c56 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1637,8 +1637,8 @@ static void ViewportSortParentSprites(ParentSpriteToSortVector *psdv) auto ssum = std::max(s->xmax, s->xmin) + std::max(s->ymax, s->ymin); auto prev = sprite_list.before_begin(); auto x = sprite_list.begin(); - while (x != sprite_list.end() && ((*x).first <= ssum)) { - auto p = (*x).second; + while (x != sprite_list.end() && x->first <= ssum) { + auto p = x->second; if (p == s) { /* We found the current sprite, remove it and move on. */ x = sprite_list.erase_after(prev); diff --git a/src/viewport_sprite_sorter_sse4.cpp b/src/viewport_sprite_sorter_sse4.cpp index a5ce747dc1..448502ef0c 100644 --- a/src/viewport_sprite_sorter_sse4.cpp +++ b/src/viewport_sprite_sorter_sse4.cpp @@ -87,8 +87,8 @@ void ViewportSortParentSpritesSSE41(ParentSpriteToSortVector *psdv) auto ssum = std::max(s->xmax, s->xmin) + std::max(s->ymax, s->ymin); auto prev = sprite_list.before_begin(); auto x = sprite_list.begin(); - while (x != sprite_list.end() && ((*x).first <= ssum)) { - auto p = (*x).second; + while (x != sprite_list.end() && x->first <= ssum) { + auto p = x->second; if (p == s) { /* We found the current sprite, remove it and move on. */ x = sprite_list.erase_after(prev); From f935e34d90b36543fc4331b4312b50d856ef8f8d Mon Sep 17 00:00:00 2001 From: Rito12 Date: Wed, 8 Oct 2025 17:10:47 +0200 Subject: [PATCH 127/280] Codefix: Remove double SetDirty() calls. --- src/build_vehicle_gui.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index f21a424f1e..812e9e3280 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1931,7 +1931,6 @@ struct BuildVehicleWindow : Window { /* We need to refresh if a filter is removed. */ this->eng_list.ForceRebuild(); - this->SetDirty(); break; } @@ -1943,7 +1942,6 @@ struct BuildVehicleWindow : Window { SetBadgeFilter(this->badge_filter_choices, BadgeID(index)); } this->eng_list.ForceRebuild(); - this->SetDirty(); } break; } From 8e055156e390ca255bcfe286726b21936321fd81 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 11 Oct 2025 10:22:50 +0100 Subject: [PATCH 128/280] Codefix: Make sure safeguards.h is the last included non-table header. (#14687) --- src/console_cmds.cpp | 5 ++++- src/fontcache/freetypefontcache.cpp | 7 ++++--- src/heightmap.cpp | 6 ++++-- src/openttd.cpp | 4 ++-- src/os/unix/unix.cpp | 9 ++++----- src/saveload/saveload.cpp | 15 ++++++++++++--- src/string.cpp | 8 +++----- src/video/allegro_v.cpp | 4 ++-- src/video/win32_v.cpp | 12 +++++++----- 9 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index d3b086f606..ffc6b13665 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -46,6 +46,10 @@ #include "company_cmd.h" #include "misc_cmd.h" +#if defined(WITH_ZLIB) +#include "network/network_content.h" +#endif /* WITH_ZLIB */ + #include "table/strings.h" #include "safeguards.h" @@ -2176,7 +2180,6 @@ static bool ConNetworkAuthorizedKey(std::span argv) /* Content downloading only is available with ZLIB */ #if defined(WITH_ZLIB) -#include "network/network_content.h" /** Resolve a string to a content type. */ static ContentType StringToContentType(std::string_view str) diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 0e3de26877..254b722415 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -7,6 +7,8 @@ /** @file freetypefontcache.cpp FreeType font cache implementation. */ +#ifdef WITH_FREETYPE + #include "../stdafx.h" #include "../debug.h" @@ -20,14 +22,13 @@ #include "../table/control_codes.h" -#include "../safeguards.h" - -#ifdef WITH_FREETYPE #include #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_TRUETYPE_TABLES_H +#include "../safeguards.h" + /** Font cache for fonts that are based on a freetype font. */ class FreeTypeFontCache : public TrueTypeFontCache { private: diff --git a/src/heightmap.cpp b/src/heightmap.cpp index 9d7a09bf7e..0bbc79cb3d 100644 --- a/src/heightmap.cpp +++ b/src/heightmap.cpp @@ -22,6 +22,10 @@ #include "table/strings.h" +#ifdef WITH_PNG +#include +#endif /* WITH_PNG */ + #include "safeguards.h" /** @@ -72,8 +76,6 @@ static inline uint8_t RGBToGreyscale(uint8_t red, uint8_t green, uint8_t blue) #ifdef WITH_PNG -#include - /** * The PNG Heightmap loader. */ diff --git a/src/openttd.cpp b/src/openttd.cpp index a26aa68a97..4317b99e64 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -88,13 +88,13 @@ #include "table/strings.h" -#include "safeguards.h" - #ifdef __EMSCRIPTEN__ # include # include #endif +#include "safeguards.h" + void CallLandscapeTick(); void DoPaletteAnimations(); void MusicLoop(); diff --git a/src/os/unix/unix.cpp b/src/os/unix/unix.cpp index 36ee069637..5bc89cceac 100644 --- a/src/os/unix/unix.cpp +++ b/src/os/unix/unix.cpp @@ -14,7 +14,6 @@ #include "../../fios.h" #include "../../thread.h" - #include #include #include @@ -26,6 +25,10 @@ #include #endif +#ifdef WITH_ICONV +#include +#endif /* WITH_ICONV */ + #ifdef __EMSCRIPTEN__ # include #endif @@ -85,10 +88,6 @@ bool FiosIsHiddenFile(const std::filesystem::path &path) #ifdef WITH_ICONV -#include -#include "../../debug.h" -#include "../../string_func.h" - std::optional GetCurrentLocale(const char *param); #define INTERNALCODE "UTF-8" diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index f602bd1524..9f759cc7b0 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -56,6 +56,18 @@ # include #endif +#ifdef WITH_LZO +#include +#endif + +#if defined(WITH_ZLIB) +#include +#endif /* WITH_ZLIB */ + +#if defined(WITH_LIBLZMA) +#include +#endif /* WITH_LIBLZMA */ + #include "table/strings.h" #include "../safeguards.h" @@ -2417,7 +2429,6 @@ struct FileWriter : SaveFilter { *******************************************/ #ifdef WITH_LZO -#include /** Buffer size for the LZO compressor */ static const uint LZO_BUFFER_SIZE = 8192; @@ -2546,7 +2557,6 @@ struct NoCompSaveFilter : SaveFilter { ********************************************/ #if defined(WITH_ZLIB) -#include /** Filter using Zlib compression. */ struct ZlibLoadFilter : LoadFilter { @@ -2665,7 +2675,6 @@ struct ZlibSaveFilter : SaveFilter { ********************************************/ #if defined(WITH_LIBLZMA) -#include /** * Have a copy of an initialised LZMA stream. We need this as it's diff --git a/src/string.cpp b/src/string.cpp index 18827e5904..09b3f7250d 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -28,7 +28,10 @@ #ifdef WITH_ICU_I18N /* Required by StrNaturalCompare. */ +# include +# include # include +# include # include "language.h" # include "gfx_func.h" #endif /* WITH_ICU_I18N */ @@ -453,8 +456,6 @@ int StrNaturalCompare(std::string_view s1, std::string_view s2, bool ignore_garb #ifdef WITH_ICU_I18N -#include - /** * Search if a string is contained in another string using the current locale. * @@ -601,9 +602,6 @@ bool ConvertHexToBytes(std::string_view hex, std::span bytes) #elif defined(WITH_ICU_I18N) -#include -#include - /** String iterator using ICU as a backend. */ class IcuStringIterator : public StringIterator { diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 424fafa2a9..11f0d63e9b 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -28,14 +28,14 @@ #include "allegro_v.h" #include -#include "../safeguards.h" - #ifdef _DEBUG /* Allegro replaces SEGV/ABRT signals meaning that the debugger will never * be triggered, so rereplace the signals and make the debugger useful. */ #include #endif +#include "../safeguards.h" + static FVideoDriver_Allegro iFVideoDriver_Allegro; static BITMAP *_allegro_screen; diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 728b2be9f9..d8600faa65 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -32,6 +32,13 @@ #include #endif +#ifdef WITH_OPENGL +#include +#include "../3rdparty/opengl/glext.h" +#include "../3rdparty/opengl/wglext.h" +#include "opengl.h" +#endif /* WITH_OPENGL */ + #include "../safeguards.h" /* Missing define in MinGW headers. */ @@ -1285,11 +1292,6 @@ void VideoDriver_Win32GDI::Paint() #ifdef WITH_OPENGL -#include -#include "../3rdparty/opengl/glext.h" -#include "../3rdparty/opengl/wglext.h" -#include "opengl.h" - #ifndef PFD_SUPPORT_COMPOSITION # define PFD_SUPPORT_COMPOSITION 0x00008000 #endif From a949197264cb2b40ed65c47dc845f2dc4235b7e4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 15 Oct 2025 23:16:00 +0100 Subject: [PATCH 129/280] Fix ef71ce0a9d: Crash when user enters a blank line in the console. (#14711) Crash caused by reading outside the bounds of string_view (though not the underlying buffer) --- src/console_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console_gui.cpp b/src/console_gui.cpp index db8831f259..06db00510f 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -453,7 +453,7 @@ void IConsoleClose() static std::optional IConsoleHistoryAdd(std::string_view cmd) { /* Strip all spaces at the begin */ - while (IsWhitespace(cmd[0])) cmd.remove_prefix(1); + while (!cmd.empty() && IsWhitespace(cmd[0])) cmd.remove_prefix(1); /* Do not put empty command in history */ if (cmd.empty()) return std::nullopt; From c627c64cc574f6afb9c08210e7c88282891079a4 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 16 Oct 2025 04:38:47 +0000 Subject: [PATCH 130/280] Update: Translations from eints swedish: 1 change by robert-i norwegian (bokmal): 4 changes by eriksorngard chinese (simplified): 4 changes by WenSimEHRP catalan: 1 change by J0anJosep danish: 4 changes by bscargo latvian: 8 changes by lexuslatvia dutch: 4 changes by Afoklala french: 5 changes by ottdfevr --- src/lang/catalan.txt | 1 + src/lang/danish.txt | 6 ++++-- src/lang/dutch.txt | 6 ++++-- src/lang/french.txt | 7 +++++-- src/lang/latvian.txt | 10 ++++++++-- src/lang/norwegian_bokmal.txt | 6 ++++-- src/lang/simplified_chinese.txt | 6 ++++-- src/lang/swedish.txt | 1 + 8 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 9f29851a9c..24174ac869 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3692,6 +3692,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Posa un STR_TOWN_DIRECTORY_CAPTION :{WHITE}Poblacions ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Cap - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms de les poblacions - feu clic al nom d'una població per a centrar-hi la vista principal. Amb Ctrl+clic, s'obre una vista nova centrada on hi ha la població. STR_TOWN_POPULATION :{BLACK}Població mundial: {COMMA} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index dd755db6fa..066774cc60 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Vand STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfældige ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilfældige -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel +STR_MAPGEN_BORDER_RANDOMIZE :Tilfældig +STR_MAPGEN_BORDER_MANUAL :Manuel +STR_MAPGEN_BORDER_INFINITE_WATER :Uendeligt vand STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Højdekortets rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Højdekortets navn: @@ -3690,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Indtast STR_TOWN_DIRECTORY_CAPTION :{WHITE}Byer ({COMMA} of {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ingen - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Bynavne - klik på et navn for at centrere skærmen over byen. Ctrl+Klik åbner et nyt vindue ved byens lokalitet. STR_TOWN_POPULATION :{BLACK}Verdens befolkning: {COMMA} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 884055d6d7..db922cb602 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Willekeurig ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Willekeurig -STR_MAPGEN_BORDER_MANUAL :{BLACK}Handmatig +STR_MAPGEN_BORDER_RANDOMIZE :Willekeurig +STR_MAPGEN_BORDER_MANUAL :Handmatig +STR_MAPGEN_BORDER_INFINITE_WATER :Onbeperkt water STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotatie van hoogtekaart: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Naam van hoogtekaart: @@ -3690,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Geef een STR_TOWN_DIRECTORY_CAPTION :{WHITE}Steden ({COMMA} van {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE} Geen STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Plaatsnamen - klik op naam om het scherm te centreren op de stad. Ctrl+klik opent een nieuw kijkvenster op de locatie van de stad STR_TOWN_POPULATION :{BLACK}Wereldbevolking: {COMMA} diff --git a/src/lang/french.txt b/src/lang/french.txt index a142fa8764..d9b622afd8 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -3431,8 +3431,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Eau STR_MAPGEN_BORDER_RANDOM :{BLACK}Aléatoire ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Aléatoire -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel +STR_MAPGEN_BORDER_RANDOMIZE :Aléatoire +STR_MAPGEN_BORDER_MANUAL :Manuel +STR_MAPGEN_BORDER_INFINITE_WATER :Eau à l'infini STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotation de la carte d'altitude{NBSP}: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nom de la carte d'altitude{NBSP}: @@ -3691,6 +3692,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Entrer u STR_TOWN_DIRECTORY_CAPTION :{WHITE}Villes ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}− Aucune − STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Noms des villes - Cliquer sur un nom pour centrer la vue principale sur la ville. Ctrl-clic pour ouvrir une nouvelle vue sur la ville. STR_TOWN_POPULATION :{BLACK}Population mondiale{NBSP}: {COMMA} @@ -5270,6 +5272,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... pont STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Le pont finirait en dehors de la carte STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Le pont est trop bas pour les gares STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Le pont est trop bas pour les arrêts de bus +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Le pont est trop bas pour le port STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Le pont est trop bas pour les bouées STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle de route diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 2c84ecb6ea..95111c22df 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -3353,6 +3353,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filtrs: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Pārrakstīt datni STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Vai tiešām vēlaties pārrakstīt esošās datnes? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Dzēst Failu +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Vai tiešām vēlaties dzēst failu? STR_SAVELOAD_DIRECTORY :{STRING} (Vietne) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Īpašnieka katalogs) @@ -3433,8 +3435,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Ūdens STR_MAPGEN_BORDER_RANDOM :{BLACK}Nejauša ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Nejaušas -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuāli +STR_MAPGEN_BORDER_RANDOMIZE :Nejaušas +STR_MAPGEN_BORDER_MANUAL :Manuāli +STR_MAPGEN_BORDER_INFINITE_WATER :Bezgalīgs Ūdens STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Augstumu kartes pagriešana: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Augstumu kartes nosaukums: @@ -3696,6 +3699,7 @@ STR_TOWN_DIRECTORY_CAPTION :{WHITE}Pilsēta STR_TOWN_DIRECTORY_NONE :{G=m}{ORANGE}- Neviens - STR_TOWN_DIRECTORY_NONE.kas :{ORANGE}- Neviena - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to.Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā STR_TOWN_POPULATION :{BLACK}Pasaules iedzīvotāju skaits: {COMMA} @@ -4195,6 +4199,7 @@ STR_PURCHASE_INFO_ALL_BUT :visu, izņemot STR_PURCHASE_INFO_MAX_TE :{BLACK}Maksimālais vilces spēks: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Apgabas: {GOLD}{COMMA} lauciņi STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Lidaparāta veids: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Sliežu veidi: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Visi kravu veidi @@ -4378,6 +4383,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Darbības izmak STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Darbības izmaksas: {CURRENCY_LONG}/periodā STR_ENGINE_PREVIEW_CAPACITY :Ietilpība: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Ietilpība: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Sliežu veidi: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Nomainīt {STRING} - {STRING} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 3a7c14dafc..a674b766cb 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3432,8 +3432,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Sjø STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfeldig ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Tilfeldige -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuelle +STR_MAPGEN_BORDER_RANDOMIZE :Tilfeldige +STR_MAPGEN_BORDER_MANUAL :Manuelle +STR_MAPGEN_BORDER_INFINITE_WATER :Uendelig vann STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Høydekartrotering: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Høydekartnavn: @@ -3692,6 +3693,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Skriv in STR_TOWN_DIRECTORY_CAPTION :{WHITE}Byer ({COMMA} av {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ingen - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Bynavn - klikk på navnet for å gå til byen. Ctrl+klikk for å åpne et nytt tilleggsvindu over byen STR_TOWN_POPULATION :{BLACK}Verdensbefolkning: {COMMA} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 89e700d3b5..067950f22a 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -3430,8 +3430,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}水面 STR_MAPGEN_BORDER_RANDOM :{BLACK}随机 ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}随机 -STR_MAPGEN_BORDER_MANUAL :{BLACK}手动 +STR_MAPGEN_BORDER_RANDOMIZE :随机 +STR_MAPGEN_BORDER_MANUAL :手动 +STR_MAPGEN_BORDER_INFINITE_WATER :无尽水域 STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度图旋转: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度图名称: @@ -3690,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}为标 STR_TOWN_DIRECTORY_CAPTION :{WHITE}城镇({COMMA} 座,共 {COMMA}座) STR_TOWN_DIRECTORY_NONE :{ORANGE}- 无 - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK}({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK}({COMMA}){YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK} 城镇名称 - 点击名称可以将屏幕中心{}移动到城镇所在的位置。按住 点选将会在新视点中显示城镇位置 STR_TOWN_POPULATION :{BLACK}地图人口总数:{COMMA} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 6544a8248b..a0f29b1edf 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3691,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Mata in STR_TOWN_DIRECTORY_CAPTION :{WHITE}Städer ({COMMA} av {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Inga - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Stadsnamn - klicka på ett namn för att centrera huvudvyn på staden. Ctrl+Klick för att öppna en ny fönstervy över stadens läge STR_TOWN_POPULATION :{BLACK}Global folkmängd: {COMMA} From bf3a07c5d211cea3eb32967e40be65307274b46d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 19 Oct 2025 11:45:13 +0100 Subject: [PATCH 131/280] Codechange: Silence uninitialized variable warning from GCC. (#14715) `is_custom_layout` is not used uninitialized but GCC does not know that and produces a warning. --- src/tunnelbridge_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 7ffe333249..00138c1957 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1445,7 +1445,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti) DrawBridgeMiddle(ti, BridgePillarFlag::EdgeNE + tunnelbridge_direction); } else { // IsBridge(ti->tile) DrawFoundation(ti, GetBridgeFoundation(ti->tileh, DiagDirToAxis(tunnelbridge_direction))); - bool is_custom_layout; // Set if rail/road bridge uses a custom layout. + bool is_custom_layout = false; // Set if rail/road bridge uses a custom layout. uint base_offset = GetBridgeRampDirectionBaseOffset(tunnelbridge_direction); std::span psid; From 75ca1e3cda8c6cc38f85558e1cae7cbc351d0fd5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 3 Oct 2025 17:35:47 +0100 Subject: [PATCH 132/280] Fix a46a3a97f3: Incorrect parameter order for CmdSetCompanyManagerFace. Style and bits were mixed up. Switch everything to style first, as the most significant parameter. --- src/company_cmd.cpp | 6 +++--- src/company_gui.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index e9fc5f94ff..ef62b91538 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -925,7 +925,7 @@ CommandCost CmdCompanyCtrl(DoCommandFlags flags, CompanyCtrlAction cca, CompanyI if (!_company_manager_face.empty()) { auto cmf = ParseCompanyManagerFaceCode(_company_manager_face); if (cmf.has_value()) { - Command::SendNet(STR_NULL, c->index, cmf->bits, cmf->style); + Command::SendNet(STR_NULL, c->index, cmf->style, cmf->bits); } } @@ -1050,11 +1050,11 @@ CommandCost CmdCompanyAllowListCtrl(DoCommandFlags flags, CompanyAllowListCtrlAc /** * Change the company manager's face. * @param flags operation to perform - * @param bits The bits of company manager face. * @param style The style of the company manager face. + * @param bits The bits of company manager face. * @return the cost of this operation or an error */ -CommandCost CmdSetCompanyManagerFace(DoCommandFlags flags, uint32_t bits, uint style) +CommandCost CmdSetCompanyManagerFace(DoCommandFlags flags, uint style, uint32_t bits) { CompanyManagerFace tmp_face{style, bits, {}}; if (!IsValidCompanyManagerFace(tmp_face)) return CMD_ERROR; diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 66dc383cbb..bf336ed35a 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1384,7 +1384,7 @@ public: /* OK button */ case WID_SCMF_ACCEPT: - Command::Post(this->face.bits, this->face.style); + Command::Post(this->face.style, this->face.bits); [[fallthrough]]; /* Cancel button */ From 9f7f314f8152e4a67202ad0a8d02d5a5ea8b2908 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 3 Oct 2025 17:36:57 +0100 Subject: [PATCH 133/280] Codechange: [Script] Add regression test for company president gender. --- regression/regression/main.nut | 16 ++++++++++++++++ regression/regression/result.txt | 11 ++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/regression/regression/main.nut b/regression/regression/main.nut index b9df4ebb4a..d029cea996 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -461,6 +461,21 @@ function Regression::Company() } } +function Regression::CompanyGender() +{ + print(""); + print("--Company Gender--"); + /* Check gender switching behaviour matches API. */ + print(" GetPresidentGender(): " + AICompany.GetPresidentGender(AICompany.COMPANY_SELF)); + print(" SetPresidentGender(): " + AICompany.SetPresidentGender(AICompany.GENDER_MALE)); + print(" GetPresidentGender(): " + AICompany.GetPresidentGender(AICompany.COMPANY_SELF)); + print(" SetPresidentGender(): " + AICompany.SetPresidentGender(AICompany.GENDER_FEMALE)); + print(" GetPresidentGender(): " + AICompany.GetPresidentGender(AICompany.COMPANY_SELF)); + /* Setting to existing gender should fail. */ + print(" SetPresidentGender(): " + AICompany.SetPresidentGender(AICompany.GENDER_FEMALE)); + print(" GetPresidentGender(): " + AICompany.GetPresidentGender(AICompany.COMPANY_SELF)); +} + function Regression::Engine() { local j = 0; @@ -2096,6 +2111,7 @@ function Regression::Start() this.Vehicle(); /* Order has to be after Vehicle */ this.Order(); + this.CompanyGender(); print(""); print(" First Subsidy Test"); PrintSubsidy(0); diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 6a88a5297d..ec60ce3651 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -10006,6 +10006,15 @@ ERROR: IsEnd() is invalid as Begin() is never called foreach(): 20 => 23596 +--Company Gender-- + GetPresidentGender(): 1 + SetPresidentGender(): true + GetPresidentGender(): 0 + SetPresidentGender(): true + GetPresidentGender(): 1 + SetPresidentGender(): false + GetPresidentGender(): 1 + First Subsidy Test --Subsidy (0) -- IsValidSubsidy(): true @@ -10107,7 +10116,7 @@ ERROR: IsEnd() is invalid as Begin() is never called constructor failed with: excessive CPU usage in list filter function Your script made an error: excessive CPU usage in valuator function -*FUNCTION [Start()] regression/main.nut line [2168] +*FUNCTION [Start()] regression/main.nut line [2184] [Infinite] CLOSURE [list] INSTANCE From 2396353c160e39ad1903eea8ecd073f563a889b3 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Wed, 22 Oct 2025 13:42:17 +0100 Subject: [PATCH 134/280] Codechange: Optimize FlowRiver (#13264) --- src/core/strong_typedef_type.hpp | 27 ++++++++++++++++++ src/landscape.cpp | 47 ++++++++++++++++---------------- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/src/core/strong_typedef_type.hpp b/src/core/strong_typedef_type.hpp index a89ec0460f..e818228d50 100644 --- a/src/core/strong_typedef_type.hpp +++ b/src/core/strong_typedef_type.hpp @@ -158,4 +158,31 @@ namespace StrongType { }; } +/** + * Implementation of std::hash for StrongType::Typedef. + * + * This specialization of std::hash allows hashing of StrongType::Typedef instances + * by leveraging the hash of the base type. + * + * Example Usage: + * using MyType = StrongType::Typedef; + * std::unordered_map my_map; + * + * @tparam TBaseType The underlying type of the StrongType::Typedef. + * @tparam TProperties Additional properties for the StrongType::Typedef. + */ +template +struct std::hash> { + /** + * Computes the hash value for a StrongType::Typedef instance. + * + * @param t The StrongType::Typedef instance to hash. + * @return The hash value of the base type of t. + */ + std::size_t operator()(const StrongType::Typedef &t) const noexcept + { + return std::hash()(t.base()); + } +}; + #endif /* STRONG_TYPEDEF_TYPE_HPP */ diff --git a/src/landscape.cpp b/src/landscape.cpp index 621de24c01..983c3e4f56 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -27,7 +27,6 @@ #include "effectvehicle_func.h" #include "landscape_type.h" #include "animated_tile_func.h" -#include "core/flatset_type.hpp" #include "core/random_func.hpp" #include "object_base.h" #include "company_func.h" @@ -43,6 +42,8 @@ #include "table/strings.h" #include "table/sprites.h" +#include + #include "safeguards.h" extern const TileTypeProcs @@ -1240,28 +1241,29 @@ bool RiverFlowsDown(TileIndex begin, TileIndex end) */ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint min_river_length) { - uint height_begin = TileHeight(begin); - if (IsWaterTile(begin)) { return { DistanceManhattan(spring, begin) > min_river_length, GetTileZ(begin) == 0 }; } - FlatSet marks; + int height_begin = TileHeight(begin); + + std::unordered_set marks; marks.insert(begin); - /* Breadth first search for the closest tile we can flow down to. */ - std::list queue; + std::vector queue; queue.push_back(begin); + /* Breadth first search for the closest tile we can flow down to. + * We keep the queue to find the Nth tile for lake guessing. The tiles + * in the queue are neatly ordered by insertion. + */ bool found = false; - uint count = 0; // Number of tiles considered; to be used for lake location guessing. TileIndex end; - do { - end = queue.front(); - queue.pop_front(); + for (size_t i = 0; i != queue.size(); i++) { + end = queue[i]; - uint height_end = TileHeight(end); - if (IsTileFlat(end) && (height_end < height_begin || (height_end == height_begin && IsWaterTile(end)))) { + int height_end; + if (IsTileFlat(end, &height_end) && (height_end < height_begin || (height_end == height_begin && IsWaterTile(end)))) { found = true; break; } @@ -1270,31 +1272,29 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint TileIndex t = end + TileOffsByDiagDir(d); if (IsValidTile(t) && !marks.contains(t) && RiverFlowsDown(end, t)) { marks.insert(t); - count++; queue.push_back(t); } } - } while (!queue.empty()); + } bool main_river = false; if (found) { /* Flow further down hill. */ std::tie(found, main_river) = FlowRiver(spring, end, min_river_length); - } else if (count > 32) { + } else if (queue.size() > 32) { /* Maybe we can make a lake. Find the Nth of the considered tiles. */ - auto cit = marks.cbegin(); - std::advance(cit, RandomRange(count - 1)); - TileIndex lake_centre = *cit; + TileIndex lake_centre = queue[RandomRange(static_cast(queue.size()))]; + int height_lake; if (IsValidTile(lake_centre) && - /* A river, or lake, can only be built on flat slopes. */ - IsTileFlat(lake_centre) && - /* We want the lake to be built at the height of the river. */ - TileHeight(begin) == TileHeight(lake_centre) && /* We don't want the lake at the entry of the valley. */ lake_centre != begin && /* We don't want lakes in the desert. */ (_settings_game.game_creation.landscape != LandscapeType::Tropic || GetTropicZone(lake_centre) != TROPICZONE_DESERT) && + /* A river, or lake, can only be built on flat slopes. */ + IsTileFlat(lake_centre, &height_lake) && + /* We want the lake to be built at the height of the river. */ + height_lake == height_begin && /* We only want a lake if the river is long enough. */ DistanceManhattan(spring, lake_centre) > min_river_length) { end = lake_centre; @@ -1304,7 +1304,7 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint /* Run the loop twice, so artefacts from going circular in one direction get (mostly) hidden. */ for (uint loops = 0; loops < 2; ++loops) { for (auto tile : SpiralTileSequence(lake_centre, diameter)) { - MakeLake(tile, height_begin); + MakeLake(tile, height_lake); } } @@ -1312,7 +1312,6 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint } } - marks.clear(); if (found) YapfBuildRiver(begin, end, spring, main_river); return { found, main_river }; } From 8e8eebd7858c320b10c8aef9f5e335e19c5344d3 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Thu, 23 Oct 2025 08:24:58 -0400 Subject: [PATCH 135/280] Doc: Define policy on AI usage in OpenTTD development (#14537) --- CONTRIBUTING.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 668d73d700..fe1687daca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -196,6 +196,29 @@ These include: You may also want the guide to [compiling OpenTTD](./COMPILING.md). +## Use of AI + +OpenTTD is a labour of love, created by people. + +Please refrain from submitting issues or pull requests that have been generated by an LLM or other fully-automated tools. +Any submission that is in violation of this policy will be closed, and the submitter may be blocked from this repository without warning. + +If you submit an issue, you need to understand what your issue description is saying. +You need to be able to answer questions about your bug report or feature request. +Using an AI tool to _proofread_ your issue/comment text is acceptable. Using an AI tool to _write_ your issue/comment text is not. + +If you submit a pull request, you need to understand what every line of code you've changed does. +If you can't explain why your PR is doing something, then do not submit it. +Using an AI tool to generate entire lines of code is unacceptable. + +The rationale behind this policy is that automated contributions are a waste of the maintainers' time. +Humans spend their time and brainpower reviewing every submission. +Issues or pull requests generated by automation tools create an imbalance of effort between the submitter and the reviewer. +Nobody learns anything when a maintainer reviews code written by an LLM. + +Additionally, AI-generated code conflicts with this project's license (GPL v2), since you cannot truly release code for use if you didn't author it yourself. + + ## Project goals ### What are the goals of the official branch? From 5c89dff677d9fa180626136a12caa8a354a18a94 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 23 Oct 2025 20:59:58 +0100 Subject: [PATCH 136/280] Codechange: Iterate road/tram masks instead of checking each type. (#14716) --- src/company_base.h | 6 ++++-- src/company_cmd.cpp | 20 ++++---------------- src/road.h | 14 -------------- src/road_type.h | 16 ++++++++++++++++ src/town_cmd.cpp | 12 +++--------- 5 files changed, 27 insertions(+), 41 deletions(-) diff --git a/src/company_base.h b/src/company_base.h index cdaca96dc4..a1409c84ed 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -45,8 +45,10 @@ struct CompanyInfrastructure { return std::accumulate(std::begin(this->rail), std::end(this->rail), 0U); } - uint32_t GetRoadTotal() const; - uint32_t GetTramTotal() const; + uint32_t GetRoadTramTotal(RoadTramType rtt) const; + + inline uint32_t GetRoadTotal() const { return GetRoadTramTotal(RTT_ROAD); } + inline uint32_t GetTramTotal() const { return GetRoadTramTotal(RTT_TRAM); } }; class FreeUnitIDGenerator { diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index ef62b91538..577f54b4b4 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -1291,26 +1291,14 @@ int CompanyServiceInterval(const Company *c, VehicleType type) /** * Get total sum of all owned road bits. + * @param rtt RoadTramType to get total for. * @return Combined total road road bits. */ -uint32_t CompanyInfrastructure::GetRoadTotal() const +uint32_t CompanyInfrastructure::GetRoadTramTotal(RoadTramType rtt) const { uint32_t total = 0; - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - if (RoadTypeIsRoad(rt)) total += this->road[rt]; - } - return total; -} - -/** - * Get total sum of all owned tram bits. - * @return Combined total of tram road bits. - */ -uint32_t CompanyInfrastructure::GetTramTotal() const -{ - uint32_t total = 0; - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - if (RoadTypeIsTram(rt)) total += this->road[rt]; + for (RoadType rt : GetMaskForRoadTramType(rtt)) { + total += this->road[rt]; } return total; } diff --git a/src/road.h b/src/road.h index b67df0e70a..4918d7cc80 100644 --- a/src/road.h +++ b/src/road.h @@ -21,20 +21,6 @@ #include "newgrf_badge_type.h" #include "economy_func.h" - -enum RoadTramType : bool { - RTT_ROAD, - RTT_TRAM, -}; - -enum RoadTramTypes : uint8_t { - RTTB_ROAD = 1 << RTT_ROAD, - RTTB_TRAM = 1 << RTT_TRAM, -}; -DECLARE_ENUM_AS_BIT_SET(RoadTramTypes) - -static const RoadTramType _roadtramtypes[] = { RTT_ROAD, RTT_TRAM }; - /** Roadtype flag bit numbers. */ enum class RoadTypeFlag : uint8_t { Catenary = 0, ///< Bit number for adding catenary diff --git a/src/road_type.h b/src/road_type.h index 07a6deb69e..99b5f8a40b 100644 --- a/src/road_type.h +++ b/src/road_type.h @@ -31,6 +31,22 @@ DECLARE_INCREMENT_DECREMENT_OPERATORS(RoadType) using RoadTypes = EnumBitSet; +/** + * The different types of road type. + */ +enum RoadTramType : bool { + RTT_ROAD, ///< Road road type. + RTT_TRAM, ///< Tram road type. +}; + +enum RoadTramTypes : uint8_t { + RTTB_ROAD = 1 << RTT_ROAD, ///< Road road type bit. + RTTB_TRAM = 1 << RTT_TRAM, ///< Tram road type bit. +}; +DECLARE_ENUM_AS_BIT_SET(RoadTramTypes) + +static const RoadTramType _roadtramtypes[] = { RTT_ROAD, RTT_TRAM }; + /** * Enumeration for the road parts on a tile. * diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index dea412c698..b3c95ba053 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -965,14 +965,9 @@ RoadType GetTownRoadType() const RoadTypeInfo *best = nullptr; const uint16_t assume_max_speed = 50; - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - if (RoadTypeIsTram(rt)) continue; - + for (RoadType rt : GetMaskForRoadTramType(RTT_ROAD)) { const RoadTypeInfo *rti = GetRoadTypeInfo(rt); - /* Unused road type. */ - if (rti->label == 0) continue; - /* Can town build this road. */ if (!rti->flags.Test(RoadTypeFlag::TownBuild)) continue; @@ -997,10 +992,9 @@ RoadType GetTownRoadType() static TimerGameCalendar::Date GetTownRoadTypeFirstIntroductionDate() { const RoadTypeInfo *best = nullptr; - for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { - if (RoadTypeIsTram(rt)) continue; + for (RoadType rt : GetMaskForRoadTramType(RTT_ROAD)) { const RoadTypeInfo *rti = GetRoadTypeInfo(rt); - if (rti->label == 0) continue; // Unused road type. + if (!rti->flags.Test(RoadTypeFlag::TownBuild)) continue; // Town can't build this road type. if (best != nullptr && rti->introduction_date >= best->introduction_date) continue; From fd32d1447e2e10b44c4fdfc695e943d2e0dd8aab Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 11 Oct 2025 17:00:40 +0100 Subject: [PATCH 137/280] Codechange: Remove StationIDStack and SmallStack. Use a std::vector or std::span instead. --- src/aircraft_cmd.cpp | 3 +- src/cargopacket.cpp | 26 ++-- src/cargopacket.h | 16 +- src/core/CMakeLists.txt | 1 - src/core/smallstack_type.hpp | 266 --------------------------------- src/economy.cpp | 20 +-- src/linkgraph/linkgraphjob.cpp | 4 +- src/order_base.h | 2 +- src/order_cmd.cpp | 14 +- src/station_base.h | 2 +- src/station_cmd.cpp | 6 +- src/station_type.h | 3 - src/vehicle_base.h | 4 +- 13 files changed, 49 insertions(+), 318 deletions(-) delete mode 100644 src/core/smallstack_type.hpp diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index f3cd7f09b7..dce6e04f57 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -135,7 +135,8 @@ static StationID FindNearestHangar(const Aircraft *v) next_dest = Station::GetIfValid(v->current_order.GetDestination().ToStationID()); } else { last_dest = GetTargetAirportIfValid(v); - next_dest = Station::GetIfValid(v->GetNextStoppingStation().value); + std::vector next_station = v->GetNextStoppingStation(); + if (!next_station.empty()) next_dest = Station::GetIfValid(next_station.back()); } } diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index 38d9489490..f8c736c3a8 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -404,13 +404,13 @@ void VehicleCargoList::AgeCargo() * @return MoveToAction to be performed. */ /* static */ VehicleCargoList::MoveToAction VehicleCargoList::ChooseAction(const CargoPacket *cp, StationID cargo_next, - StationID current_station, bool accepted, StationIDStack next_station) + StationID current_station, bool accepted, std::span next_station) { if (cargo_next == StationID::Invalid()) { return (accepted && cp->first_station != current_station) ? MTA_DELIVER : MTA_KEEP; } else if (cargo_next == current_station) { return MTA_DELIVER; - } else if (next_station.Contains(cargo_next)) { + } else if (std::ranges::find(next_station, cargo_next) != std::end(next_station)) { return MTA_KEEP; } else { return MTA_TRANSFER; @@ -432,7 +432,7 @@ void VehicleCargoList::AgeCargo() * @param current_tile Current tile the cargo handling is happening on. * return If any cargo will be unloaded. */ -bool VehicleCargoList::Stage(bool accepted, StationID current_station, StationIDStack next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile) +bool VehicleCargoList::Stage(bool accepted, StationID current_station, std::span next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile) { this->AssertCountConsistency(); assert(this->action_counts[MTA_LOAD] == 0); @@ -468,9 +468,9 @@ bool VehicleCargoList::Stage(bool accepted, StationID current_station, StationID } else { FlowStat new_shares = flow_it->second; new_shares.ChangeShare(current_station, INT_MIN); - StationIDStack excluded = next_station; - while (!excluded.IsEmpty() && !new_shares.GetShares()->empty()) { - new_shares.ChangeShare(excluded.Pop(), INT_MIN); + for (auto station_it = next_station.rbegin(); station_it != next_station.rend(); ++station_it) { + if (!new_shares.GetShares()->empty()) break; + new_shares.ChangeShare(*station_it, INT_MIN); } if (new_shares.GetShares()->empty()) { cargo_next = StationID::Invalid(); @@ -739,11 +739,11 @@ bool StationCargoList::ShiftCargo(Taction &action, StationID next) * @return Amount of cargo actually moved. */ template -uint StationCargoList::ShiftCargo(Taction action, StationIDStack next, bool include_invalid) +uint StationCargoList::ShiftCargo(Taction action, std::span next, bool include_invalid) { uint max_move = action.MaxMove(); - while (!next.IsEmpty()) { - this->ShiftCargo(action, next.Pop()); + for (auto it = next.rbegin(); it != next.rend(); ++it) { + this->ShiftCargo(action, *it); if (action.MaxMove() == 0) break; } if (include_invalid && action.MaxMove() > 0) { @@ -814,7 +814,7 @@ uint StationCargoList::Truncate(uint max_move, StationCargoAmountMap *cargo_per_ * @param current_tile Current tile the cargo handling is happening on. * @return Amount of cargo actually reserved. */ -uint StationCargoList::Reserve(uint max_move, VehicleCargoList *dest, StationIDStack next_station, TileIndex current_tile) +uint StationCargoList::Reserve(uint max_move, VehicleCargoList *dest, std::span next_station, TileIndex current_tile) { return this->ShiftCargo(CargoReservation(this, dest, max_move, current_tile), next_station, true); } @@ -831,7 +831,7 @@ uint StationCargoList::Reserve(uint max_move, VehicleCargoList *dest, StationIDS * modes of loading are exclusive, though. If cargo is reserved we don't * need to load unreserved cargo. */ -uint StationCargoList::Load(uint max_move, VehicleCargoList *dest, StationIDStack next_station, TileIndex current_tile) +uint StationCargoList::Load(uint max_move, VehicleCargoList *dest, std::span next_station, TileIndex current_tile) { uint move = std::min(dest->ActionCount(VehicleCargoList::MTA_LOAD), max_move); if (move > 0) { @@ -839,7 +839,7 @@ uint StationCargoList::Load(uint max_move, VehicleCargoList *dest, StationIDStac dest->Reassign(move); return move; } else { - return this->ShiftCargo(CargoLoad(this, dest, max_move, current_tile), next_station, true); + return this->ShiftCargo(CargoLoad{this, dest, max_move, current_tile}, next_station, true); } } @@ -853,7 +853,7 @@ uint StationCargoList::Load(uint max_move, VehicleCargoList *dest, StationIDStac */ uint StationCargoList::Reroute(uint max_move, StationCargoList *dest, StationID avoid, StationID avoid2, const GoodsEntry *ge) { - return this->ShiftCargo(StationCargoReroute(this, dest, max_move, avoid, avoid2, ge), avoid, false); + return this->ShiftCargo(StationCargoReroute(this, dest, max_move, avoid, avoid2, ge), {&avoid, 1}, false); } /* diff --git a/src/cargopacket.h b/src/cargopacket.h index 8b4c7b6d40..35cfd2cce4 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -371,7 +371,7 @@ protected: void RemoveFromMeta(const CargoPacket *cp, MoveToAction action, uint count); static MoveToAction ChooseAction(const CargoPacket *cp, StationID cargo_next, - StationID current_station, bool accepted, StationIDStack next_station); + StationID current_station, bool accepted, std::span next_station); public: /** The station cargo list needs to control the unloading. */ @@ -469,7 +469,7 @@ public: void InvalidateCache(); - bool Stage(bool accepted, StationID current_station, StationIDStack next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile); + bool Stage(bool accepted, StationID current_station, std::span next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile); /** * Marks all cargo in the vehicle as to be kept. This is mostly useful for @@ -543,7 +543,7 @@ public: bool ShiftCargo(Taction &action, StationID next); template - uint ShiftCargo(Taction action, StationIDStack next, bool include_invalid); + uint ShiftCargo(Taction action, std::span next, bool include_invalid); void Append(CargoPacket *cp, StationID next); @@ -552,10 +552,10 @@ public: * @param next Station the cargo is headed for. * @return If there is any cargo for that station. */ - inline bool HasCargoFor(StationIDStack next) const + inline bool HasCargoFor(std::span next) const { - while (!next.IsEmpty()) { - if (this->packets.find(next.Pop()) != this->packets.end()) return true; + for (const StationID &station : next) { + if (this->packets.find(station) != this->packets.end()) return true; } /* Packets for StationID::Invalid() can go anywhere. */ return this->packets.find(StationID::Invalid()) != this->packets.end(); @@ -603,8 +603,8 @@ public: * amount of cargo to be moved. Second parameter is destination (if * applicable), return value is amount of cargo actually moved. */ - uint Reserve(uint max_move, VehicleCargoList *dest, StationIDStack next, TileIndex current_tile); - uint Load(uint max_move, VehicleCargoList *dest, StationIDStack next, TileIndex current_tile); + uint Reserve(uint max_move, VehicleCargoList *dest, std::span next, TileIndex current_tile); + uint Load(uint max_move, VehicleCargoList *dest, std::span next, TileIndex current_tile); uint Truncate(uint max_move = UINT_MAX, StationCargoAmountMap *cargo_per_source = nullptr); uint Reroute(uint max_move, StationCargoList *dest, StationID avoid, StationID avoid2, const GoodsEntry *ge); diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 224cfba0eb..fa76393137 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -22,7 +22,6 @@ add_files( pool_type.hpp random_func.cpp random_func.hpp - smallstack_type.hpp string_builder.cpp string_builder.hpp string_consumer.cpp diff --git a/src/core/smallstack_type.hpp b/src/core/smallstack_type.hpp deleted file mode 100644 index 3b26951453..0000000000 --- a/src/core/smallstack_type.hpp +++ /dev/null @@ -1,266 +0,0 @@ -/* - * 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 smallstack_type.hpp Minimal stack that uses a pool to avoid pointers and doesn't allocate any heap memory if there is only one valid item. */ - -#ifndef SMALLSTACK_TYPE_HPP -#define SMALLSTACK_TYPE_HPP - -/** - * A simplified pool which stores values instead of pointers and doesn't - * redefine operator new/delete. It also never zeroes memory and always reuses - * it. - */ -template -class SimplePool { -public: - inline SimplePool() : first_unused(0), first_free(0) {} - - /** - * Get the item at position index. - * @return Item at index. - */ - inline Titem &Get(Tindex index) { return this->data[index]; } - - /** - * Create a new item and return its index. - * @return Index of new item. - */ - inline Tindex Create() - { - Tindex index = this->FindFirstFree(); - if (index < Tmax_size) { - this->data[index].valid = true; - this->first_free = index + 1; - this->first_unused = std::max(this->first_unused, this->first_free); - } - return index; - } - - /** - * Destroy (or rather invalidate) the item at the given index. - * @param index Index of item to be destroyed. - */ - inline void Destroy(Tindex index) - { - this->data[index].valid = false; - this->first_free = std::min(this->first_free, index); - } - -private: - - inline Tindex FindFirstFree() - { - Tindex index = this->first_free; - for (; index < this->first_unused; index++) { - if (!this->data[index].valid) return index; - } - - if (index >= this->data.size() && index < Tmax_size) { - this->data.resize(index + 1); - } - return index; - } - - struct SimplePoolPoolItem : public Titem { - bool valid; - }; - - Tindex first_unused; - Tindex first_free; - - std::vector data; -}; - -/** - * Base class for SmallStack. We cannot add this into SmallStack itself as - * certain compilers don't like it. - */ -template -struct SmallStackItem { - Tindex next; ///< Pool index of next item. - Titem value; ///< Value of current item. - - /** - * Create a new item. - * @param value Value of the item. - * @param next Next item in the stack. - */ - inline SmallStackItem(const Titem &value, Tindex next) : - next(next), value(value) {} - SmallStackItem() = default; -}; - -/** - * Minimal stack that uses a pool to avoid pointers. It has some peculiar - * properties that make it useful for passing around lists of IDs but not much - * else: - * 1. It always includes an invalid item as bottom. - * 2. It doesn't have a deep copy operation but uses smart pointers instead. - * Every copy is thus implicitly shared. - * 3. Its items are immutable. - * 4. Due to 2. and 3. memory management can be done by "branch counting". - * Whenever you copy a smallstack, the first item on the heap increases its - * branch_count, signifying that there are multiple items "in front" of it. - * When deleting a stack items are deleted up to the point where - * branch_count > 0. - * 5. You can choose your own index type, so that you can align it with your - * value type. E.G. value types of 16 bits length like to be combined with - * index types of the same length. - * @tparam Titem Value type to be used. - * @tparam Tindex Index type to use for the pool. - * @tparam Tinvalid_value Value to construct invalid item to keep at the bottom of each stack. - * @tparam Tgrowth_step Growth step for pool. - * @tparam Tmax_size Maximum size for pool. - */ -template -class SmallStack : public SmallStackItem { -public: - static constexpr Titem Tinvalid{Tinvalid_value}; - - typedef SmallStackItem Item; - - /** - * SmallStack item that can be kept in a pool. - */ - struct PooledSmallStack : public Item { - Tindex branch_count; ///< Number of branches in the tree structure this item is parent of - }; - - typedef SimplePool SmallStackPool; - - /** - * Constructor for a stack with one or two items in it. - * @param value Initial item. If not missing or Tinvalid there will be Tinvalid below it. - */ - inline SmallStack(const Titem &value = Tinvalid) : Item(value, Tmax_size) {} - - /** - * Remove the head of stack and all other items members that are unique to it. - */ - inline ~SmallStack() - { - while (this->next != Tmax_size) this->Pop(); - } - - /** - * Shallow copy the stack, marking the first item as branched. - * @param other Stack to copy from - */ - inline SmallStack(const SmallStack &other) : Item(other) { this->Branch(); } - - /** - * Shallow copy the stack, marking the first item as branched. - * @param other Stack to copy from - * @return This smallstack. - */ - inline SmallStack &operator=(const SmallStack &other) - { - if (this == &other) return *this; - while (this->next != Tmax_size) this->Pop(); - this->next = other.next; - this->value = other.value; - /* Deleting and branching are independent operations, so it's fine to - * acquire separate locks for them. */ - this->Branch(); - return *this; - } - - /** - * Pushes a new item onto the stack if there is still space in the - * underlying pool. Otherwise the topmost item's value gets overwritten. - * @param item Item to be pushed. - */ - inline void Push(const Titem &item) - { - if (this->value != Tinvalid) { - Tindex new_item = SmallStack::GetPool().Create(); - if (new_item != Tmax_size) { - PooledSmallStack &pushed = SmallStack::GetPool().Get(new_item); - pushed.value = this->value; - pushed.next = this->next; - pushed.branch_count = 0; - this->next = new_item; - } - } - this->value = item; - } - - /** - * Pop an item from the stack. - * @return Current top of stack. - */ - inline Titem Pop() - { - Titem ret = this->value; - if (this->next == Tmax_size) { - this->value = Tinvalid; - } else { - PooledSmallStack &popped = SmallStack::GetPool().Get(this->next); - this->value = popped.value; - if (popped.branch_count == 0) { - SmallStack::GetPool().Destroy(this->next); - } else { - --popped.branch_count; - if (popped.next != Tmax_size) { - ++(SmallStack::GetPool().Get(popped.next).branch_count); - } - } - /* Accessing popped here is no problem as the pool will only set - * the validity flag, not actually delete the item, on Destroy(). */ - this->next = popped.next; - } - return ret; - } - - /** - * Check if the stack is empty. - * @return If the stack is empty. - */ - inline bool IsEmpty() const - { - return this->value == Tinvalid && this->next == Tmax_size; - } - - /** - * Check if the given item is contained in the stack. - * @param item Item to look for. - * @return If the item is in the stack. - */ - inline bool Contains(const Titem &item) const - { - if (item == Tinvalid || item == this->value) return true; - if (this->next != Tmax_size) { - const SmallStack *in_list = this; - do { - in_list = static_cast( - static_cast(&SmallStack::GetPool().Get(in_list->next))); - if (in_list->value == item) return true; - } while (in_list->next != Tmax_size); - } - return false; - } - -protected: - static SmallStackPool &GetPool() - { - static SmallStackPool pool; - return pool; - } - - /** - * Create a branch in the pool if necessary. - */ - inline void Branch() - { - if (this->next != Tmax_size) { - ++(SmallStack::GetPool().Get(this->next).branch_count); - } - } -}; - -#endif diff --git a/src/economy.cpp b/src/economy.cpp index 824066e898..8001d3afd8 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1270,7 +1270,7 @@ void PrepareUnload(Vehicle *front_v) assert(CargoPayment::CanAllocateItem()); front_v->cargo_payment = new CargoPayment(front_v); - StationIDStack next_station = front_v->GetNextStoppingStation(); + std::vector next_station = front_v->GetNextStoppingStation(); if (front_v->orders == nullptr || (front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { Station *st = Station::Get(front_v->last_station_visited); for (Vehicle *v = front_v; v != nullptr; v = v->Next()) { @@ -1433,7 +1433,7 @@ struct FinalizeRefitAction { CargoArray &consist_capleft; ///< Capacities left in the consist. Station *st; ///< Station to reserve cargo from. - StationIDStack &next_station; ///< Next hops to reserve cargo for. + std::span next_station; ///< Next hops to reserve cargo for. bool do_reserve; ///< If the vehicle should reserve. /** @@ -1443,7 +1443,7 @@ struct FinalizeRefitAction * @param next_station Next hops to reserve cargo for. * @param do_reserve If we should reserve cargo or just add up the capacities. */ - FinalizeRefitAction(CargoArray &consist_capleft, Station *st, StationIDStack &next_station, bool do_reserve) : + FinalizeRefitAction(CargoArray &consist_capleft, Station *st, std::span next_station, bool do_reserve) : consist_capleft(consist_capleft), st(st), next_station(next_station), do_reserve(do_reserve) {} /** @@ -1471,7 +1471,7 @@ struct FinalizeRefitAction * @param next_station Possible next stations the vehicle can travel to. * @param new_cargo_type Target cargo for refit. */ -static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station *st, StationIDStack next_station, CargoType new_cargo_type) +static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station *st, std::span next_station, CargoType new_cargo_type) { Vehicle *v_start = v->GetFirstEnginePart(); if (!IterateVehicleParts(v_start, IsEmptyAction())) return; @@ -1538,16 +1538,16 @@ static bool MayLoadUnderExclusiveRights(const Station *st, const Vehicle *v) struct ReserveCargoAction { Station *st; - StationIDStack *next_station; + std::span next_station; - ReserveCargoAction(Station *st, StationIDStack *next_station) : + ReserveCargoAction(Station *st, std::span next_station) : st(st), next_station(next_station) {} bool operator()(Vehicle *v) { if (v->cargo_cap > v->cargo.RemainingCount() && MayLoadUnderExclusiveRights(st, v)) { st->goods[v->cargo_type].GetOrCreateData().cargo.Reserve(v->cargo_cap - v->cargo.RemainingCount(), - &v->cargo, *next_station, v->GetCargoTile()); + &v->cargo, next_station, v->GetCargoTile()); } return true; @@ -1563,7 +1563,7 @@ struct ReserveCargoAction { * @param consist_capleft If given, save free capacities after reserving there. * @param next_station Station(s) the vehicle will stop at next. */ -static void ReserveConsist(Station *st, Vehicle *u, CargoArray *consist_capleft, StationIDStack *next_station) +static void ReserveConsist(Station *st, Vehicle *u, CargoArray *consist_capleft, std::span next_station) { /* If there is a cargo payment not all vehicles of the consist have tried to do the refit. * In that case, only reserve if it's a fixed refit and the equivalent of "articulated chain" @@ -1618,14 +1618,14 @@ static void LoadUnloadVehicle(Vehicle *front) StationID last_visited = front->last_station_visited; Station *st = Station::Get(last_visited); - StationIDStack next_station = front->GetNextStoppingStation(); + std::vector next_station = front->GetNextStoppingStation(); bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CARGO_AUTO_REFIT; CargoArray consist_capleft{}; if (_settings_game.order.improved_load && use_autorefit ? front->cargo_payment == nullptr : (front->current_order.GetLoadType() & OLFB_FULL_LOAD) != 0) { ReserveConsist(st, front, (use_autorefit && front->load_unload_ticks != 0) ? &consist_capleft : nullptr, - &next_station); + next_station); } /* We have not waited enough time till the next round of loading/unloading */ diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index 5287fb633b..f83e3341a9 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -132,11 +132,11 @@ LinkGraphJob::~LinkGraphJob() !(*lg)[node_id].HasEdgeTo(dest_id) || (*lg)[node_id][dest_id].LastUpdate() == EconomyTime::INVALID_DATE) { /* Edge has been removed. Delete flows. */ - StationIDStack erased = flows.DeleteFlows(to); + std::vector erased = flows.DeleteFlows(to); /* Delete old flows for source stations which have been deleted * from the new flows. This avoids flow cycles between old and * new flows. */ - while (!erased.IsEmpty()) geflows.erase(erased.Pop()); + for (const StationID &station : erased) geflows.erase(station); } else if ((*lg)[node_id][dest_id].last_unrestricted_update == EconomyTime::INVALID_DATE) { /* Edge is fully restricted. */ flows.RestrictFlows(to); diff --git a/src/order_base.h b/src/order_base.h index 1b0f6b1752..5a2511bae0 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -367,7 +367,7 @@ public: */ inline VehicleOrderID GetNumManualOrders() const { return this->num_manual_orders; } - StationIDStack GetNextStoppingStation(const Vehicle *v, VehicleOrderID first = INVALID_VEH_ORDER_ID, uint hops = 0) const; + std::vector GetNextStoppingStation(const Vehicle *v, VehicleOrderID first = INVALID_VEH_ORDER_ID, uint hops = 0) const; VehicleOrderID GetNextDecisionNode(VehicleOrderID next, uint hops) const; void InsertOrderAt(Order &&order, VehicleOrderID index); diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 9f968a461f..32df9ffd30 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -361,14 +361,14 @@ VehicleOrderID OrderList::GetNextDecisionNode(VehicleOrderID next, uint hops) co * @pre The vehicle is currently loading and v->last_station_visited is meaningful. * @note This function may draw a random number. Don't use it from the GUI. */ -StationIDStack OrderList::GetNextStoppingStation(const Vehicle *v, VehicleOrderID first, uint hops) const +std::vector OrderList::GetNextStoppingStation(const Vehicle *v, VehicleOrderID first, uint hops) const { VehicleOrderID next = first; if (first == INVALID_VEH_ORDER_ID) { next = v->cur_implicit_order_index; if (next >= this->GetNumOrders()) { next = this->GetFirstOrder(); - if (next == INVALID_VEH_ORDER_ID) return StationID::Invalid(); + if (next == INVALID_VEH_ORDER_ID) return {}; } else { /* GetNext never returns INVALID_VEH_ORDER_ID if there is a valid station in the list. * As the given "next" is already valid and a station in the list, we @@ -392,9 +392,9 @@ StationIDStack OrderList::GetNextStoppingStation(const Vehicle *v, VehicleOrderI } else if (skip_to == INVALID_VEH_ORDER_ID || skip_to == first) { next = (advance == first) ? INVALID_VEH_ORDER_ID : advance; } else { - StationIDStack st1 = this->GetNextStoppingStation(v, skip_to, hops); - StationIDStack st2 = this->GetNextStoppingStation(v, advance, hops); - while (!st2.IsEmpty()) st1.Push(st2.Pop()); + std::vector st1 = this->GetNextStoppingStation(v, skip_to, hops); + std::vector st2 = this->GetNextStoppingStation(v, advance, hops); + std::copy(st2.rbegin(), st2.rend(), std::back_inserter(st1)); return st1; } ++hops; @@ -404,11 +404,11 @@ StationIDStack OrderList::GetNextStoppingStation(const Vehicle *v, VehicleOrderI if (next == INVALID_VEH_ORDER_ID || ((orders[next].IsType(OT_GOTO_STATION) || orders[next].IsType(OT_IMPLICIT)) && orders[next].GetDestination() == v->last_station_visited && (orders[next].GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) != 0)) { - return StationID::Invalid(); + return {}; } } while (orders[next].IsType(OT_GOTO_DEPOT) || orders[next].GetDestination() == v->last_station_visited); - return orders[next].GetDestination().ToStationID(); + return {orders[next].GetDestination().ToStationID()}; } /** diff --git a/src/station_base.h b/src/station_base.h index d8e62d2339..4832a0f60c 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -155,7 +155,7 @@ public: void AddFlow(StationID origin, StationID via, uint amount); void PassOnFlow(StationID origin, StationID via, uint amount); - StationIDStack DeleteFlows(StationID via); + std::vector DeleteFlows(StationID via); void RestrictFlows(StationID via); void ReleaseFlows(StationID via); void FinalizeLocalConsumption(StationID self); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 8a90e30f0e..bffab91a52 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -5200,14 +5200,14 @@ void FlowStatMap::FinalizeLocalConsumption(StationID self) * @return IDs of source stations for which the complete FlowStat, not only a * share, has been erased. */ -StationIDStack FlowStatMap::DeleteFlows(StationID via) +std::vector FlowStatMap::DeleteFlows(StationID via) { - StationIDStack ret; + std::vector ret; for (FlowStatMap::iterator f_it = this->begin(); f_it != this->end();) { FlowStat &s_flows = f_it->second; s_flows.ChangeShare(via, INT_MIN); if (s_flows.GetShares()->empty()) { - ret.Push(f_it->first); + ret.push_back(f_it->first); this->erase(f_it++); } else { ++f_it; diff --git a/src/station_type.h b/src/station_type.h index 07615dd7a1..1c4da959dd 100644 --- a/src/station_type.h +++ b/src/station_type.h @@ -11,7 +11,6 @@ #define STATION_TYPE_H #include "core/pool_type.hpp" -#include "core/smallstack_type.hpp" #include "tilearea_type.h" using StationID = PoolID; @@ -26,8 +25,6 @@ struct RoadStop; struct StationSpec; struct Waypoint; -using StationIDStack = SmallStack; - /** Station types */ enum class StationType : uint8_t { Rail, diff --git a/src/vehicle_base.h b/src/vehicle_base.h index aef3b4f246..642669ae8e 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -714,9 +714,9 @@ public: * Get the next station the vehicle will stop at. * @return ID of the next station the vehicle will stop at or StationID::Invalid(). */ - inline StationIDStack GetNextStoppingStation() const + inline std::vector GetNextStoppingStation() const { - return (this->orders == nullptr) ? StationID::Invalid() : this->orders->GetNextStoppingStation(this); + return (this->orders == nullptr) ? std::vector{} : this->orders->GetNextStoppingStation(this); } void ResetRefitCaps(); From d6eff806f0a84a0f80656a4f58d9391b9833b79b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 16 Oct 2025 21:54:43 +0100 Subject: [PATCH 138/280] Codechange: Use single vector for next station order. Pass vector to insert into to avoid handling multiple vectors. This may change the order of returned stations. --- src/aircraft_cmd.cpp | 3 ++- src/economy.cpp | 6 ++++-- src/order_base.h | 2 +- src/order_cmd.cpp | 15 +++++++-------- src/vehicle_base.h | 5 +++-- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index dce6e04f57..94d976e112 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -135,7 +135,8 @@ static StationID FindNearestHangar(const Aircraft *v) next_dest = Station::GetIfValid(v->current_order.GetDestination().ToStationID()); } else { last_dest = GetTargetAirportIfValid(v); - std::vector next_station = v->GetNextStoppingStation(); + std::vector next_station; + v->GetNextStoppingStation(next_station); if (!next_station.empty()) next_dest = Station::GetIfValid(next_station.back()); } } diff --git a/src/economy.cpp b/src/economy.cpp index 8001d3afd8..d61372de7e 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1270,7 +1270,8 @@ void PrepareUnload(Vehicle *front_v) assert(CargoPayment::CanAllocateItem()); front_v->cargo_payment = new CargoPayment(front_v); - std::vector next_station = front_v->GetNextStoppingStation(); + std::vector next_station; + front_v->GetNextStoppingStation(next_station); if (front_v->orders == nullptr || (front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { Station *st = Station::Get(front_v->last_station_visited); for (Vehicle *v = front_v; v != nullptr; v = v->Next()) { @@ -1618,7 +1619,8 @@ static void LoadUnloadVehicle(Vehicle *front) StationID last_visited = front->last_station_visited; Station *st = Station::Get(last_visited); - std::vector next_station = front->GetNextStoppingStation(); + std::vector next_station; + front->GetNextStoppingStation(next_station); bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CARGO_AUTO_REFIT; CargoArray consist_capleft{}; if (_settings_game.order.improved_load && use_autorefit ? diff --git a/src/order_base.h b/src/order_base.h index 5a2511bae0..5dac764838 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -367,7 +367,7 @@ public: */ inline VehicleOrderID GetNumManualOrders() const { return this->num_manual_orders; } - std::vector GetNextStoppingStation(const Vehicle *v, VehicleOrderID first = INVALID_VEH_ORDER_ID, uint hops = 0) const; + void GetNextStoppingStation(std::vector &next_station, const Vehicle *v, VehicleOrderID first = INVALID_VEH_ORDER_ID, uint hops = 0) const; VehicleOrderID GetNextDecisionNode(VehicleOrderID next, uint hops) const; void InsertOrderAt(Order &&order, VehicleOrderID index); diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 32df9ffd30..8754c96874 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -361,14 +361,14 @@ VehicleOrderID OrderList::GetNextDecisionNode(VehicleOrderID next, uint hops) co * @pre The vehicle is currently loading and v->last_station_visited is meaningful. * @note This function may draw a random number. Don't use it from the GUI. */ -std::vector OrderList::GetNextStoppingStation(const Vehicle *v, VehicleOrderID first, uint hops) const +void OrderList::GetNextStoppingStation(std::vector &next_station, const Vehicle *v, VehicleOrderID first, uint hops) const { VehicleOrderID next = first; if (first == INVALID_VEH_ORDER_ID) { next = v->cur_implicit_order_index; if (next >= this->GetNumOrders()) { next = this->GetFirstOrder(); - if (next == INVALID_VEH_ORDER_ID) return {}; + if (next == INVALID_VEH_ORDER_ID) return; } else { /* GetNext never returns INVALID_VEH_ORDER_ID if there is a valid station in the list. * As the given "next" is already valid and a station in the list, we @@ -392,10 +392,9 @@ std::vector OrderList::GetNextStoppingStation(const Vehicle *v, Vehic } else if (skip_to == INVALID_VEH_ORDER_ID || skip_to == first) { next = (advance == first) ? INVALID_VEH_ORDER_ID : advance; } else { - std::vector st1 = this->GetNextStoppingStation(v, skip_to, hops); - std::vector st2 = this->GetNextStoppingStation(v, advance, hops); - std::copy(st2.rbegin(), st2.rend(), std::back_inserter(st1)); - return st1; + this->GetNextStoppingStation(next_station, v, skip_to, hops); + this->GetNextStoppingStation(next_station, v, advance, hops); + return; } ++hops; } @@ -404,11 +403,11 @@ std::vector OrderList::GetNextStoppingStation(const Vehicle *v, Vehic if (next == INVALID_VEH_ORDER_ID || ((orders[next].IsType(OT_GOTO_STATION) || orders[next].IsType(OT_IMPLICIT)) && orders[next].GetDestination() == v->last_station_visited && (orders[next].GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) != 0)) { - return {}; + return; } } while (orders[next].IsType(OT_GOTO_DEPOT) || orders[next].GetDestination() == v->last_station_visited); - return {orders[next].GetDestination().ToStationID()}; + next_station.push_back(orders[next].GetDestination().ToStationID()); } /** diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 642669ae8e..6e9cc5e20f 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -714,9 +714,10 @@ public: * Get the next station the vehicle will stop at. * @return ID of the next station the vehicle will stop at or StationID::Invalid(). */ - inline std::vector GetNextStoppingStation() const + inline void GetNextStoppingStation(std::vector &next_station) const { - return (this->orders == nullptr) ? std::vector{} : this->orders->GetNextStoppingStation(this); + if (this->orders == nullptr) return; + this->orders->GetNextStoppingStation(next_station, this); } void ResetRefitCaps(); From e4b0e84a7cd22769b48f4ab09da6b1300fb1a7ee Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:19:47 +0100 Subject: [PATCH 139/280] Doc 80666a0: Fix typo in game script changelog (#14714) --- src/script/api/game_changelog.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 4a3a3111ab..50c91de6bd 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -29,7 +29,7 @@ * \li GSCargo::CC_NON_POTABLE * \li GSVehicleList_Waypoint * \li GSBaseStation::GetOwner - * \li GSError:ERR_BRIDGE_TOO_LOW + * \li GSError::ERR_BRIDGE_TOO_LOW * \li GSRail::GetAllRailTypes * * Other changes: From a19f6c02e541a61e33905a5ef96f3e199dc578bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Fri, 24 Oct 2025 21:20:41 +0200 Subject: [PATCH 140/280] Codechange: Add prefix to dependabot commits (#14691) --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d97e315781..050a4cc0bc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,3 +8,5 @@ updates: actions: patterns: - "*" + commit-message: + prefix: "Upgrade: " From 06b830dc0730c878bfffbca09b2888a46e31faf0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 24 Oct 2025 20:30:03 +0100 Subject: [PATCH 141/280] Codechange: Prefer string equality instead of comparison. (#14727) --- src/base_media_func.h | 2 +- src/fios.cpp | 2 +- src/game/game_text.cpp | 10 +++++----- src/ini_load.cpp | 3 +-- src/language.h | 12 ++++-------- src/network/network.cpp | 4 ++-- src/network/network_admin.cpp | 3 +-- src/network/network_client.cpp | 24 ++++++++++++------------ src/network/network_server.cpp | 4 ++-- src/os/windows/font_win32.cpp | 5 ++--- src/saveload/ai_sl.cpp | 4 ++-- src/saveload/game_sl.cpp | 2 +- src/saveload/saveload.cpp | 2 +- src/settings.cpp | 2 +- src/settings_table.cpp | 2 +- 15 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/base_media_func.h b/src/base_media_func.h index 8f1fac4c26..d5a96bcc93 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -79,7 +79,7 @@ bool BaseSet::FillSetDetails(const IniFile &ini, const std::string &path, con /* Add the translations of the descriptions too. */ for (const IniItem &titem : metadata->items) { - if (titem.name.compare(0, 12, "description.") != 0) continue; + if (!titem.name.starts_with("description.")) continue; this->description[titem.name.substr(12)] = titem.value.value_or(""); } diff --git a/src/fios.cpp b/src/fios.cpp index fc02d43da7..67eec48b44 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -507,7 +507,7 @@ std::tuple FiosGetHeightmapListCallback(SaveLoadOperation for (Searchpath sp : _valid_searchpaths) { std::string buf = FioGetDirectory(sp, HEIGHTMAP_DIR); - if (buf.compare(0, buf.size(), it->second.tar_filename, 0, buf.size()) == 0) { + if (it->second.tar_filename.starts_with(buf)) { match = true; break; } diff --git a/src/game/game_text.cpp b/src/game/game_text.cpp index 27e4314f5a..021d5fec57 100644 --- a/src/game/game_text.cpp +++ b/src/game/game_text.cpp @@ -225,15 +225,15 @@ static std::shared_ptr LoadTranslations() if (!tar_filename.empty() && (iter = _tar_list[GAME_DIR].find(tar_filename)) != _tar_list[GAME_DIR].end()) { /* The main script is in a tar file, so find all files that * are in the same tar and add them to the langfile scanner. */ - for (const auto &tar : _tar_filelist[GAME_DIR]) { + for (const auto &[name, entry] : _tar_filelist[GAME_DIR]) { /* Not in the same tar. */ - if (tar.second.tar_filename != iter->first) continue; + if (entry.tar_filename != iter->first) continue; /* Check the path and extension. */ - if (tar.first.size() <= ldir.size() || tar.first.compare(0, ldir.size(), ldir) != 0) continue; - if (tar.first.compare(tar.first.size() - 4, 4, ".txt") != 0) continue; + if (!name.starts_with(ldir)) continue; + if (!name.ends_with(".txt")) continue; - scanner.AddFile(tar.first, 0, tar_filename); + scanner.AddFile(name, 0, tar_filename); } } else { /* Scan filesystem */ diff --git a/src/ini_load.cpp b/src/ini_load.cpp index 7702eed8ce..f134f6502e 100644 --- a/src/ini_load.cpp +++ b/src/ini_load.cpp @@ -173,8 +173,7 @@ IniGroup &IniLoadFile::CreateGroup(std::string_view name) */ void IniLoadFile::RemoveGroup(std::string_view name) { - size_t len = name.length(); - this->groups.remove_if([&name, &len](const IniGroup &group) { return group.name.compare(0, len, name) == 0; }); + this->groups.remove_if([&name](const IniGroup &group) { return group.name.starts_with(name); }); } /** diff --git a/src/language.h b/src/language.h index 4f1a50a29d..3158154ed2 100644 --- a/src/language.h +++ b/src/language.h @@ -67,10 +67,8 @@ struct LanguagePackHeader { */ uint8_t GetGenderIndex(std::string_view gender_str) const { - for (uint8_t i = 0; i < MAX_NUM_GENDERS; i++) { - if (gender_str.compare(this->genders[i]) == 0) return i; - } - return MAX_NUM_GENDERS; + auto it = std::ranges::find(this->genders, gender_str); + return static_cast(std::distance(std::begin(this->genders), it)); } /** @@ -80,10 +78,8 @@ struct LanguagePackHeader { */ uint8_t GetCaseIndex(std::string_view case_str) const { - for (uint8_t i = 0; i < MAX_NUM_CASES; i++) { - if (case_str.compare(this->cases[i]) == 0) return i; - } - return MAX_NUM_CASES; + auto it = std::ranges::find(this->cases, case_str); + return static_cast(std::distance(std::begin(this->cases), it)); } }; /** Make sure the size is right. */ diff --git a/src/network/network.cpp b/src/network/network.cpp index 6a02b82f5a..29cbcf7acf 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -875,14 +875,14 @@ static void CheckClientAndServerName() { static const std::string fallback_client_name = "Unnamed Client"; StrTrimInPlace(_settings_client.network.client_name); - if (_settings_client.network.client_name.empty() || _settings_client.network.client_name.compare(fallback_client_name) == 0) { + if (_settings_client.network.client_name.empty() || _settings_client.network.client_name == fallback_client_name) { Debug(net, 1, "No \"client_name\" has been set, using \"{}\" instead. Please set this now using the \"name \" command", fallback_client_name); _settings_client.network.client_name = fallback_client_name; } static const std::string fallback_server_name = "Unnamed Server"; StrTrimInPlace(_settings_client.network.server_name); - if (_settings_client.network.server_name.empty() || _settings_client.network.server_name.compare(fallback_server_name) == 0) { + if (_settings_client.network.server_name.empty() || _settings_client.network.server_name == fallback_server_name) { Debug(net, 1, "No \"server_name\" has been set, using \"{}\" instead. Please set this now using the \"server_name \" command", fallback_server_name); _settings_client.network.server_name = fallback_server_name; } diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 5ede07f12b..95694636d2 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -633,8 +633,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p) std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH); - if (_settings_client.network.admin_password.empty() || - _settings_client.network.admin_password.compare(password) != 0) { + if (_settings_client.network.admin_password.empty() || _settings_client.network.admin_password != password) { /* Password is invalid */ return this->SendError(NETWORK_ERROR_WRONG_PASSWORD); } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 6dccf9e5fe..4313a9de0a 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -537,7 +537,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac ci = NetworkClientInfo::GetByClientID(client_id); if (ci != nullptr) { - if (playas == ci->client_playas && name.compare(ci->client_name) != 0) { + if (playas == ci->client_playas && name != ci->client_name) { /* Client name changed, display the change */ NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, name); } else if (playas != ci->client_playas) { @@ -1296,17 +1296,17 @@ void NetworkUpdateClientName(const std::string &client_name) if (ci == nullptr) return; /* Don't change the name if it is the same as the old name */ - if (client_name.compare(ci->client_name) != 0) { - if (!_network_server) { - MyClient::SendSetName(client_name); - } else { - /* Copy to a temporary buffer so no #n gets added after our name in the settings when there are duplicate names. */ - std::string temporary_name = client_name; - if (NetworkMakeClientNameUnique(temporary_name)) { - NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, temporary_name); - ci->client_name = std::move(temporary_name); - NetworkUpdateClientInfo(CLIENT_ID_SERVER); - } + if (client_name == ci->client_name) return; + + if (!_network_server) { + MyClient::SendSetName(client_name); + } else { + /* Copy to a temporary buffer so no #n gets added after our name in the settings when there are duplicate names. */ + std::string temporary_name = client_name; + if (NetworkMakeClientNameUnique(temporary_name)) { + NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, temporary_name); + ci->client_name = std::move(temporary_name); + NetworkUpdateClientInfo(CLIENT_ID_SERVER); } } } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 3087db360e..ff39b2b854 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1451,7 +1451,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p) /* We are allowed, nothing more to validate. */ } else if (_settings_client.network.rcon_password.empty()) { return NETWORK_RECV_STATUS_OKAY; - } else if (_settings_client.network.rcon_password.compare(password) != 0) { + } else if (_settings_client.network.rcon_password != password) { Debug(net, 1, "[rcon] Wrong password from client-id {}", this->client_id); return NETWORK_RECV_STATUS_OKAY; } @@ -1648,7 +1648,7 @@ bool NetworkServerChangeClientName(ClientID client_id, const std::string &new_na { /* Check if the name's already in use */ for (NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (ci->client_name.compare(new_name) == 0) return false; + if (ci->client_name == new_name) return false; } NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index da30507260..24100a1704 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -38,9 +38,8 @@ struct EFCParam { bool Add(const std::wstring_view &font) { - for (const auto &entry : this->fonts) { - if (font.compare(entry) == 0) return false; - } + auto it = std::ranges::find(this->fonts, font); + if (it != std::end(this->fonts)) return false; this->fonts.emplace_back(font); diff --git a/src/saveload/ai_sl.cpp b/src/saveload/ai_sl.cpp index 29f759361c..e6e52f8217 100644 --- a/src/saveload/ai_sl.cpp +++ b/src/saveload/ai_sl.cpp @@ -111,7 +111,7 @@ struct AIPLChunkHandler : ChunkHandler { * latest version of the AI instead. */ config->Change(_ai_saveload_name, -1, false); if (!config->HasScript()) { - if (_ai_saveload_name.compare("%_dummy") != 0) { + if (_ai_saveload_name != "%_dummy") { Debug(script, 0, "The savegame has an AI by the name '{}', version {} which is no longer available.", _ai_saveload_name, _ai_saveload_version); Debug(script, 0, "Configuration switched to Random AI."); } @@ -136,7 +136,7 @@ struct AIPLChunkHandler : ChunkHandler { * latest version of the AI instead. */ config->Change(_ai_saveload_name, -1, false); if (!config->HasScript()) { - if (_ai_saveload_name.compare("%_dummy") != 0) { + if (_ai_saveload_name != "%_dummy") { Debug(script, 0, "The savegame has an AI by the name '{}', version {} which is no longer available.", _ai_saveload_name, _ai_saveload_version); Debug(script, 0, "A random other AI will be loaded in its place."); } else { diff --git a/src/saveload/game_sl.cpp b/src/saveload/game_sl.cpp index d6a35ffa20..82b2c783ed 100644 --- a/src/saveload/game_sl.cpp +++ b/src/saveload/game_sl.cpp @@ -80,7 +80,7 @@ struct GSDTChunkHandler : ChunkHandler { * latest version of the GameScript instead. */ config->Change(_game_saveload_name, -1, false); if (!config->HasScript()) { - if (_game_saveload_name.compare("%_dummy") != 0) { + if (_game_saveload_name != "%_dummy") { Debug(script, 0, "The savegame has an GameScript by the name '{}', version {} which is no longer available.", _game_saveload_name, _game_saveload_version); Debug(script, 0, "This game will continue to run without GameScript."); } else { diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 9f759cc7b0..a6dd26e3cf 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2861,7 +2861,7 @@ static std::pair GetSavegameFormat(std::string_ std::string_view name = has_comp_level ? full_name.substr(0, separator) : full_name; for (const auto &slf : _saveload_formats) { - if (slf.init_write != nullptr && name.compare(slf.name) == 0) { + if (slf.init_write != nullptr && name == slf.name) { if (has_comp_level) { auto complevel = full_name.substr(separator + 1); diff --git a/src/settings.cpp b/src/settings.cpp index 9efb21a057..1b90eb6140 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1547,7 +1547,7 @@ StringList GetGRFPresetList() ConfigIniFile ini(_config_file); for (const IniGroup &group : ini.groups) { - if (group.name.compare(0, 7, "preset-") == 0) { + if (group.name.starts_with("preset-")) { list.push_back(group.name.substr(7)); } } diff --git a/src/settings_table.cpp b/src/settings_table.cpp index b75bd3afb6..1881cfd79e 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -572,7 +572,7 @@ static void MaxVehiclesChanged(int32_t) */ static bool ReplaceAsteriskWithEmptyPassword(std::string &newval) { - if (newval.compare("*") == 0) newval.clear(); + if (newval == "*") newval.clear(); return true; } From 813cde37353c3219e3f682da04398331081bb463 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 24 Oct 2025 20:30:50 +0100 Subject: [PATCH 142/280] Fix: Don't set set town index for depot tiles. (#14729) --- src/saveload/afterload.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 4a901a3b39..6f2ba03bcb 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1007,6 +1007,7 @@ bool AfterLoadGame() case MP_ROAD: t.m4() |= (t.m2() << 4); + if (GB(t.m5(), 4, 2) == ROAD_TILE_DEPOT) break; if ((GB(t.m5(), 4, 2) == ROAD_TILE_CROSSING ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) { SetTownIndex(t, CalcClosestTownFromTile(t)->index); } else { From 6fc4bef0e38ef4e2b3fe015283e4705e1600afaa Mon Sep 17 00:00:00 2001 From: Oliver Bechstein-Rumble <58312347+OllieBechstein@users.noreply.github.com> Date: Fri, 24 Oct 2025 20:33:55 +0100 Subject: [PATCH 143/280] Fix #14240: Remember previous GUI scale when toggling auto-detect (#14380) --- src/settings_gui.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index af466bf40b..7b0c9e1a15 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -415,6 +415,7 @@ struct GameOptionsWindow : Window { bool reload = false; bool gui_scale_changed = false; int gui_scale = 0; + static inline int previous_gui_scale = 0; ///< Previous GUI scale. static inline WidgetID active_tab = WID_GO_TAB_GENERAL; GameOptionsWindow(WindowDesc &desc) : Window(desc), filter_editbox(50) @@ -1076,9 +1077,12 @@ struct GameOptionsWindow : Window { case WID_GO_GUI_SCALE_AUTO: { if (_gui_scale_cfg == -1) { - _gui_scale_cfg = _gui_scale; + _gui_scale_cfg = this->previous_gui_scale; // Load the previous GUI scale this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, false); + if (AdjustGUIZoom(false)) ReInitAllWindows(true); + this->gui_scale = _gui_scale; } else { + this->previous_gui_scale = _gui_scale; // Set the previous GUI scale value as the current one _gui_scale_cfg = -1; this->SetWidgetLoweredState(WID_GO_GUI_SCALE_AUTO, true); if (AdjustGUIZoom(false)) ReInitAllWindows(true); From 2212169a8c69392d491365e997d961efb782a68c Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 24 Oct 2025 20:34:35 +0100 Subject: [PATCH 144/280] Fix: Do not pre-fill industry production history for unused production slots (#14730) --- src/industry_cmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 08dbdc4efc..565d86c374 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1835,13 +1835,13 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, if (indspec->callback_mask.Test(IndustryCallbackMask::Production256Ticks)) { IndustryProductionCallback(i, 1); for (auto &p : i->produced) { - p.history[LAST_MONTH].production = ScaleByCargoScale(p.waiting * 8, false); + if (IsValidCargoType(p.cargo)) p.history[LAST_MONTH].production = ScaleByCargoScale(p.waiting * 8, false); p.waiting = 0; } } for (auto &p : i->produced) { - p.history[LAST_MONTH].production += ScaleByCargoScale(p.rate * 8, false); + if (IsValidCargoType(p.cargo)) p.history[LAST_MONTH].production += ScaleByCargoScale(p.rate * 8, false); } UpdateValidHistory(i->valid_history, HISTORY_YEAR, TimerGameEconomy::month); From 6ebe64703fef2d7fbe91401ae5715ac2bddf2b1a Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Fri, 24 Oct 2025 22:25:16 +0200 Subject: [PATCH 145/280] Add: Game units for height. (#14615) --- src/lang/english.txt | 4 +++- src/strings.cpp | 1 + src/table/settings/locale_settings.ini | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 240fc2ac05..1733c8d0c2 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}level{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} @@ -2158,10 +2159,11 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Heights units: {STRING2} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Whenever a height is shown in the user interface, show it in the selected units -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Game units (levels) STR_CONFIG_SETTING_LOCALISATION :Localisation STR_CONFIG_SETTING_GRAPHICS :Graphics diff --git a/src/strings.cpp b/src/strings.cpp index b4050dca0c..141027f0b7 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -916,6 +916,7 @@ static const Units _units_height[] = { { { 3.0 }, STR_UNITS_HEIGHT_IMPERIAL, 0 }, // "Wrong" conversion factor for more nicer GUI values { { 1.0 }, STR_UNITS_HEIGHT_METRIC, 0 }, { { 1.0 }, STR_UNITS_HEIGHT_SI, 0 }, + { { .02 }, STR_UNITS_HEIGHT_GAMEUNITS,0 }, }; /** Unit conversions for time in calendar days or wallclock seconds */ diff --git a/src/table/settings/locale_settings.ini b/src/table/settings/locale_settings.ini index c5c0a520bf..1296f15332 100644 --- a/src/table/settings/locale_settings.ini +++ b/src/table/settings/locale_settings.ini @@ -163,7 +163,7 @@ type = SLE_UINT8 from = SLV_184 flags = SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown def = 1 -max = 2 +max = 3 full = _locale_units post_cb = [](auto) { MarkWholeScreenDirty(); } cat = SC_BASIC From 70bf84175f85817261df50d019945f6e14738bec Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Fri, 24 Oct 2025 22:27:11 +0200 Subject: [PATCH 146/280] Add: Show height difference in bridge is too low error message. (#14614) --- src/lang/english.txt | 14 +++++++------- src/station_cmd.cpp | 5 ++++- src/water_cmd.cpp | 6 ++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 1733c8d0c2..9385e9f4cb 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5271,13 +5271,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ends of bridge must both be on land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... bridge too long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is {HEIGHT} too low for station +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is {HEIGHT} too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is {HEIGHT} too low for dock +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is {HEIGHT} too low for buoy +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for rail waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is {HEIGHT} too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index bffab91a52..0b8703e53d 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -891,7 +891,10 @@ static CommandCost IsStationBridgeAboveOk(TileIndex tile, std::span::Do(DoCommandFlag::Auto, tile); } - if (GetTileMaxZ(tile) + height > bridge_height) return CommandCost{GetBridgeTooLowMessageForStationType(type)}; + if (GetTileMaxZ(tile) + height > bridge_height) { + int height_diff = (GetTileMaxZ(tile) + height - bridge_height) * TILE_HEIGHT_STEP; + return CommandCostWithParam(GetBridgeTooLowMessageForStationType(type), height_diff); + } return CommandCost{}; } diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 6533d34f22..f0a1252a75 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -365,7 +365,8 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlags for (LockPart lock_part = LOCK_PART_MIDDLE; TileIndex t : {tile, tile - delta, tile + delta}) { if (IsBridgeAbove(t) && GetBridgeHeight(GetSouthernBridgeEnd(t)) < GetTileMaxZ(t) + GetLockPartMinimalBridgeHeight(lock_part)) { - return CommandCost(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK); + int height_diff = (GetTileMaxZ(tile) + GetLockPartMinimalBridgeHeight(lock_part) - GetBridgeHeight(GetSouthernBridgeEnd(t))) * TILE_HEIGHT_STEP; + return CommandCostWithParam(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK, height_diff); } ++lock_part; } @@ -1445,7 +1446,8 @@ static CommandCost CheckBuildAbove_Water(TileIndex tile, DoCommandFlags flags, A if (IsWater(tile) || IsCoast(tile)) return CommandCost(); if (IsLock(tile)) { if (GetTileMaxZ(tile) + GetLockPartMinimalBridgeHeight(GetLockPart(tile)) <= height) return CommandCost(); - return CommandCost(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK); + int height_diff = (GetTileMaxZ(tile) + GetLockPartMinimalBridgeHeight(GetLockPart(tile)) - height) * TILE_HEIGHT_STEP; + return CommandCostWithParam(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK, height_diff); } return Command::Do(flags, tile); } From a1920fc225083a49769da70abac7df7a3f5a70e0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 24 Oct 2025 21:32:09 +0100 Subject: [PATCH 147/280] Change: Scale towns/industries by amount of land tiles. (#10063) --- src/genworld.cpp | 2 + src/genworld.h | 3 +- src/genworld_gui.cpp | 5 +- src/industry_cmd.cpp | 111 ++++++++++++++++++++++++++++--------------- src/lang/english.txt | 3 +- src/map.cpp | 16 +++++++ src/map_func.h | 13 +++++ src/town_cmd.cpp | 5 +- 8 files changed, 115 insertions(+), 43 deletions(-) diff --git a/src/genworld.cpp b/src/genworld.cpp index effa9e16e7..1e52fd9a24 100644 --- a/src/genworld.cpp +++ b/src/genworld.cpp @@ -139,11 +139,13 @@ static void _GenerateWorld() if (_game_mode != GM_MENU) FlatEmptyWorld(_settings_game.game_creation.se_flat_world_height); ConvertGroundTilesIntoWaterTiles(); + Map::CountLandTiles(); IncreaseGeneratingWorldProgress(GWP_OBJECT); _settings_game.game_creation.snow_line_height = DEF_SNOWLINE_HEIGHT; } else { GenerateClearTile(); + Map::CountLandTiles(); /* Only generate towns, tree and industries in newgame mode. */ if (_game_mode != GM_EDITOR) { diff --git a/src/genworld.h b/src/genworld.h index 0bfd8455ec..f571971260 100644 --- a/src/genworld.h +++ b/src/genworld.h @@ -64,7 +64,8 @@ enum GenWorldProgress : uint8_t { GWP_RIVER, ///< Create the rivers GWP_ROUGH_ROCKY, ///< Make rough and rocky areas GWP_TOWN, ///< Generate towns - GWP_INDUSTRY, ///< Generate industries + GWP_LAND_INDUSTRY, ///< Generate industries + GWP_WATER_INDUSTRY, ///< Generate industries GWP_OBJECT, ///< Generate objects (radio tower, light houses) GWP_TREE, ///< Generate trees GWP_GAME_INIT, ///< Initialize the game diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 8bef4e4c81..12d78035be 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -1349,7 +1349,8 @@ static const StringID _generation_class_table[] = { STR_GENERATION_RIVER_GENERATION, STR_GENERATION_CLEARING_TILES, STR_GENERATION_TOWN_GENERATION, - STR_GENERATION_INDUSTRY_GENERATION, + STR_GENERATION_LAND_INDUSTRY_GENERATION, + STR_GENERATION_WATER_INDUSTRY_GENERATION, STR_GENERATION_OBJECT_GENERATION, STR_GENERATION_TREE_GENERATION, STR_GENERATION_SETTINGUP_GAME, @@ -1456,7 +1457,7 @@ void ShowGenerateWorldProgress() static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total) { - static const int percent_table[] = {0, 5, 14, 17, 20, 40, 60, 65, 80, 85, 95, 99, 100 }; + static const int percent_table[] = {0, 5, 14, 17, 20, 40, 55, 60, 65, 80, 85, 95, 99, 100 }; static_assert(lengthof(percent_table) == GWP_CLASS_COUNT + 1); assert(cls < GWP_CLASS_COUNT); diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 565d86c374..292f379f8e 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -45,6 +45,7 @@ #include "industry_cmd.h" #include "landscape_cmd.h" #include "terraform_cmd.h" +#include "map_func.h" #include "timer/timer.h" #include "timer/timer_game_calendar.h" #include "timer/timer_game_economy.h" @@ -2290,12 +2291,15 @@ static Industry *CreateNewIndustry(TileIndex tile, IndustryType type, IndustryAv /** * Compute the appearance probability for an industry during map creation. * @param it Industry type to compute. + * @param water Whether to get probability of land-based, water-based, (or both, if std::nullopt), industry types. * @param[out] force_at_least_one Returns whether at least one instance should be forced on map creation. * @return Relative probability for the industry to appear. */ -static uint32_t GetScaledIndustryGenerationProbability(IndustryType it, bool *force_at_least_one) +static uint32_t GetScaledIndustryGenerationProbability(IndustryType it, std::optional water, bool *force_at_least_one) { const IndustrySpec *ind_spc = GetIndustrySpec(it); + if (water.has_value() && ind_spc->behaviour.Test(IndustryBehaviour::BuiltOnWater) != *water) return 0; + uint32_t chance = ind_spc->appear_creation[to_underlying(_settings_game.game_creation.landscape)]; if (!ind_spc->enabled || ind_spc->layouts.empty() || (_game_mode != GM_EDITOR && _settings_game.difficulty.industry_density == ID_FUND_ONLY) || @@ -2387,11 +2391,11 @@ static Industry *PlaceIndustry(IndustryType type, IndustryAvailabilityCallType c * @param type IndustryType of the desired industry * @param try_hard Try very hard to find a place. (Used to place at least one industry per type) */ -static void PlaceInitialIndustry(IndustryType type, bool try_hard) +static void PlaceInitialIndustry(IndustryType type, bool water, bool try_hard) { Backup cur_company(_current_company, OWNER_NONE); - IncreaseGeneratingWorldProgress(GWP_INDUSTRY); + IncreaseGeneratingWorldProgress(water ? GWP_WATER_INDUSTRY : GWP_LAND_INDUSTRY); PlaceIndustry(type, IACT_MAPGENERATION, try_hard); cur_company.Restore(); @@ -2445,6 +2449,31 @@ void IndustryBuildData::EconomyMonthlyLoop() } } +struct IndustryGenerationProbabilities { + std::array probs{}; + std::array force_one{}; + uint64_t total = 0; + uint num_forced = 0; +}; + +/** + * Get scaled industry generation probabilities. + * @param water Whether to get land or water industry probabilities. + * @returns Probability information. + */ +static IndustryGenerationProbabilities GetScaledProbabilities(bool water) +{ + IndustryGenerationProbabilities p{}; + + for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) { + p.probs[it] = GetScaledIndustryGenerationProbability(it, water, &p.force_one[it]); + p.total += p.probs[it];; + if (p.force_one[it]) p.num_forced++; + } + + return p; +} + /** * This function will create random industries during game creation. * It will scale the amount of industries by mapsize and difficulty level. @@ -2453,46 +2482,54 @@ void GenerateIndustries() { if (_game_mode != GM_EDITOR && _settings_game.difficulty.industry_density == ID_FUND_ONLY) return; // No industries in the game. - uint32_t industry_probs[NUM_INDUSTRYTYPES]; - bool force_at_least_one[NUM_INDUSTRYTYPES]; - uint32_t total_prob = 0; - uint num_forced = 0; + /* Get the probabilities for all industries. This is done first as we need the total of + * both land and water for scaling later. */ + IndustryGenerationProbabilities lprob = GetScaledProbabilities(false); + IndustryGenerationProbabilities wprob = GetScaledProbabilities(true); - for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) { - industry_probs[it] = GetScaledIndustryGenerationProbability(it, force_at_least_one + it); - total_prob += industry_probs[it]; - if (force_at_least_one[it]) num_forced++; - } + /* Run generation twice, for land and water industries in turn. */ + for (bool water = false;; water = true) { + auto &p = water ? wprob : lprob; - uint total_amount = GetNumberOfIndustries(); - if (total_prob == 0 || total_amount < num_forced) { - /* Only place the forced ones */ - total_amount = num_forced; - } + /* Total number of industries scaled by land/water proportion. */ + uint total_amount = p.total * GetNumberOfIndustries() / (lprob.total + wprob.total); - SetGeneratingWorldProgress(GWP_INDUSTRY, total_amount); + /* Scale land-based industries to the land proportion. */ + if (!water) total_amount = Map::ScaleByLandProportion(total_amount); - /* Try to build one industry per type independent of any probabilities */ - for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) { - if (force_at_least_one[it]) { - assert(total_amount > 0); - total_amount--; - PlaceInitialIndustry(it, true); + /* Ensure that forced industries are generated even if the scaled amounts are too low. */ + if (p.total == 0 || total_amount < p.num_forced) { + /* Only place the forced ones */ + total_amount = p.num_forced; } + + SetGeneratingWorldProgress(water ? GWP_WATER_INDUSTRY : GWP_LAND_INDUSTRY, total_amount); + + /* Try to build one industry per type independent of any probabilities */ + for (IndustryType it = 0; it < NUM_INDUSTRYTYPES; it++) { + if (p.force_one[it]) { + assert(total_amount > 0); + total_amount--; + PlaceInitialIndustry(it, water, true); + } + } + + /* Add the remaining industries according to their probabilities */ + for (uint i = 0; i < total_amount; i++) { + uint32_t r = RandomRange(p.total); + IndustryType it = 0; + while (r >= p.probs[it]) { + r -= p.probs[it]; + it++; + assert(it < NUM_INDUSTRYTYPES); + } + assert(p.probs[it] > 0); + PlaceInitialIndustry(it, water, false); + } + + if (water) break; } - /* Add the remaining industries according to their probabilities */ - for (uint i = 0; i < total_amount; i++) { - uint32_t r = RandomRange(total_prob); - IndustryType it = 0; - while (r >= industry_probs[it]) { - r -= industry_probs[it]; - it++; - assert(it < NUM_INDUSTRYTYPES); - } - assert(industry_probs[it] > 0); - PlaceInitialIndustry(it, false); - } _industry_builder.Reset(); } @@ -3119,7 +3156,7 @@ void CheckIndustries() if (Industry::GetIndustryTypeCount(it) > 0) continue; // Types of existing industries can be skipped. bool force_at_least_one; - uint32_t chance = GetScaledIndustryGenerationProbability(it, &force_at_least_one); + uint32_t chance = GetScaledIndustryGenerationProbability(it, std::nullopt, &force_at_least_one); if (chance == 0 || !force_at_least_one) continue; // Types that are not available can be skipped. const IndustrySpec *is = GetIndustrySpec(it); diff --git a/src/lang/english.txt b/src/lang/english.txt index 9385e9f4cb..566fc9ad01 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3473,7 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscap STR_GENERATION_RIVER_GENERATION :{BLACK}River generation STR_GENERATION_CLEARING_TILES :{BLACK}Rough and rocky area generation STR_GENERATION_TOWN_GENERATION :{BLACK}Town generation -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industry generation +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Land industry generation +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Water industry generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Object generation STR_GENERATION_TREE_GENERATION :{BLACK}Tree generation STR_GENERATION_SETTINGUP_GAME :{BLACK}Setting up game diff --git a/src/map.cpp b/src/map.cpp index efb5168cbf..a6dc2af46b 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -23,6 +23,8 @@ /* static */ uint Map::size; ///< The number of tiles on the map /* static */ uint Map::tile_mask; ///< _map_size - 1 (to mask the mapsize) +/* static */ uint Map::initial_land_count; ///< Initial number of land tiles on the map. + /* static */ std::unique_ptr Tile::base_tiles; ///< Base tiles of the map /* static */ std::unique_ptr Tile::extended_tiles; ///< Extended tiles of the map @@ -58,6 +60,20 @@ AllocateWaterRegions(); } +/* static */ void Map::CountLandTiles() +{ + /* Count number of tiles that are land. */ + Map::initial_land_count = 0; + for (const auto tile : Map::Iterate()) { + Map::initial_land_count += IsWaterTile(tile) ? 0 : 1; + } + + /* Compensate for default values being set for (or users are most familiar with) at least + * very low sea level. Dividing by 12 adds roughly 8%. */ + Map::initial_land_count += Map::initial_land_count / 12; + Map::initial_land_count = std::min(Map::initial_land_count, Map::size); +} + #ifdef _DEBUG TileIndex TileAdd(TileIndex tile, TileIndexDiff offset) diff --git a/src/map_func.h b/src/map_func.h index e1929c2f91..1854de91b3 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -239,8 +239,11 @@ private: static uint size; ///< The number of tiles on the map static uint tile_mask; ///< _map_size - 1 (to mask the mapsize) + static uint initial_land_count; ///< Initial number of land tiles on the map. + public: static void Allocate(uint size_x, uint size_y); + static void CountLandTiles(); /** * Logarithm of the map size along the X side. @@ -307,6 +310,16 @@ public: return Map::SizeY() - 1; } + /** + * Scales the given value by the number of water tiles. + * @param n the value to scale + * @return the scaled size + */ + static inline uint ScaleByLandProportion(uint n) + { + /* Use 64-bit arithmetic to avoid overflow. */ + return static_cast(static_cast(n) * Map::initial_land_count / Map::size); + } /** * 'Wraps' the given "tile" so it is within the map. diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index b3c95ba053..4ba9143c84 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -55,6 +55,7 @@ #include "road_cmd.h" #include "terraform_cmd.h" #include "tunnelbridge_cmd.h" +#include "map_func.h" #include "timer/timer.h" #include "timer/timer_game_calendar.h" #include "timer/timer_game_economy.h" @@ -2420,9 +2421,9 @@ bool GenerateTowns(TownLayout layout, std::optional number) if (number.has_value()) { total = number.value(); } else if (_settings_game.difficulty.number_towns == static_cast(CUSTOM_TOWN_NUMBER_DIFFICULTY)) { - total = GetDefaultTownsForMapSize(); + total = Map::ScaleByLandProportion(GetDefaultTownsForMapSize()); } else { - total = GetDefaultTownsForMapSize() + (Random() & 7); + total = Map::ScaleByLandProportion(GetDefaultTownsForMapSize() + (Random() & 7)); } total = std::min(TownPool::MAX_SIZE, total); From 7b703f688aa3771da0906cacead9f40bc1dfdce2 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 25 Oct 2025 04:38:31 +0000 Subject: [PATCH 148/280] Update: Translations from eints galician: 1 change by pvillaverde --- src/lang/afrikaans.txt | 2 +- src/lang/arabic_egypt.txt | 2 +- src/lang/basque.txt | 2 +- src/lang/belarusian.txt | 2 +- src/lang/brazilian_portuguese.txt | 10 +--------- src/lang/bulgarian.txt | 3 +-- src/lang/catalan.txt | 10 +--------- src/lang/chuvash.txt | 2 +- src/lang/croatian.txt | 2 +- src/lang/czech.txt | 3 +-- src/lang/danish.txt | 10 +--------- src/lang/dutch.txt | 10 +--------- src/lang/english_AU.txt | 10 +--------- src/lang/english_US.txt | 10 +--------- src/lang/esperanto.txt | 2 +- src/lang/estonian.txt | 3 +-- src/lang/faroese.txt | 2 +- src/lang/finnish.txt | 10 +--------- src/lang/french.txt | 10 +--------- src/lang/frisian.txt | 2 +- src/lang/gaelic.txt | 2 +- src/lang/galician.txt | 11 ++--------- src/lang/german.txt | 3 +-- src/lang/greek.txt | 10 +--------- src/lang/hebrew.txt | 3 +-- src/lang/hindi.txt | 2 +- src/lang/hungarian.txt | 10 +--------- src/lang/icelandic.txt | 2 +- src/lang/ido.txt | 2 +- src/lang/indonesian.txt | 2 +- src/lang/irish.txt | 2 +- src/lang/italian.txt | 4 +--- src/lang/japanese.txt | 2 +- src/lang/korean.txt | 10 +--------- src/lang/latin.txt | 2 +- src/lang/latvian.txt | 10 +--------- src/lang/lithuanian.txt | 3 +-- src/lang/luxembourgish.txt | 3 +-- src/lang/macedonian.txt | 2 +- src/lang/malay.txt | 2 +- src/lang/maltese.txt | 2 +- src/lang/maori.txt | 8 +------- src/lang/marathi.txt | 2 +- src/lang/norwegian_bokmal.txt | 10 +--------- src/lang/norwegian_nynorsk.txt | 2 +- src/lang/persian.txt | 2 +- src/lang/polish.txt | 10 +--------- src/lang/portuguese.txt | 10 +--------- src/lang/romanian.txt | 3 +-- src/lang/russian.txt | 10 +--------- src/lang/serbian.txt | 2 +- src/lang/simplified_chinese.txt | 10 +--------- src/lang/slovak.txt | 3 +-- src/lang/slovenian.txt | 2 +- src/lang/spanish.txt | 3 +-- src/lang/spanish_MX.txt | 3 +-- src/lang/swedish.txt | 10 +--------- src/lang/tamil.txt | 2 +- src/lang/thai.txt | 2 +- src/lang/traditional_chinese.txt | 10 +--------- src/lang/turkish.txt | 3 +-- src/lang/ukrainian.txt | 3 +-- src/lang/urdu.txt | 2 +- src/lang/vietnamese.txt | 10 +--------- src/lang/welsh.txt | 3 +-- 65 files changed, 66 insertions(+), 255 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 9c98637e23..fe8ec70155 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1839,7 +1839,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Hoogte eenheid: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wanneer 'n hoogte word in die gebruikerskoppelvlak, wys dit in die geselekteerde eenhede -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Empiries (vt) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metries (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 0a1b38a540..6323e068fc 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -1716,7 +1716,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE ::وحدات ج STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :إمبراطوري (lbf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :متري (كغ - قوة) -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :إمبراطوري (قدم) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :متري (م) diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 7c6f5ec08d..4267f20101 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1731,7 +1731,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Metrikoa (kgf) STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Garaiera unitateak: {STRING} -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Inperiala (oin) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrikoa (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 814bd6c575..22cd4a442d 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -2414,7 +2414,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :СІ (кН) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Сыстэма адзінак для вышыні: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Паказваць значэньні вышыні ў абранай сыстэме адзінак -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :ангельская (фут) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :мэтрычная (м) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СІ (м) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index d3b6f76991..ffe13e3f94 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Sempre que uma altura for exibida na interface do usuário, mostrar nessas unidades -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Geraçã STR_GENERATION_RIVER_GENERATION :{BLACK}Geração de rios STR_GENERATION_CLEARING_TILES :{BLACK}Geração de áreas irregulares e rochosas STR_GENERATION_TOWN_GENERATION :{BLACK}Geração de localidades -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Geração de indústrias STR_GENERATION_OBJECT_GENERATION :{BLACK}Geração de objetos STR_GENERATION_TREE_GENERATION :{BLACK}Geração de árvores STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando o jogo @@ -5270,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... os extremos da ponte devem estar sobre a terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte muito longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Ponte é muito baixa para uma estação -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Ponte é muito baixa para uma parada rodoviária -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é muito baixa para a doca -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Ponte é muito baixa para uma boia -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle ferroviário -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Ponte é muito baixa para um ponto de controle rodoviário -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é muito baixa para eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index a45f727b20..1975b3a0fa 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -2125,7 +2125,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Мерни единици за височина: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Показваните височини ще бъдат изписвани в избраните мерни единици -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Имперски (фут) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Метрични (м) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (м) @@ -3400,7 +3400,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Гене STR_GENERATION_RIVER_GENERATION :{BLACK}Генериране на реки STR_GENERATION_CLEARING_TILES :{BLACK}Генериране на твърда и скална повърност STR_GENERATION_TOWN_GENERATION :{BLACK}Генерация на град -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Генерация на индустрията STR_GENERATION_OBJECT_GENERATION :{BLACK}Генериране на обекти STR_GENERATION_TREE_GENERATION :{BLACK}Генериране на дървета STR_GENERATION_SETTINGUP_GAME :{BLACK}Настройване на играта diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 24174ac869..2835c09afd 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unitats de longitud: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quan es mostren longituds a la interfície d'usuari, presenta-les en les unitats seleccionades -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (peu) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Mètric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generaci STR_GENERATION_RIVER_GENERATION :{BLACK}Generació de rius STR_GENERATION_CLEARING_TILES :{BLACK}Generació d'una àrea escarpada i rocosa STR_GENERATION_TOWN_GENERATION :{BLACK}Generació de poblacions -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generació d'indústries STR_GENERATION_OBJECT_GENERATION :{BLACK}Generació inamovible STR_GENERATION_TREE_GENERATION :{BLACK}Generació d'arbres STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurant la partida @@ -5270,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Inici i STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... els extrems del pont han d'estar tots dos a terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... el pont és massa llarg STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}El pont acabaria fora del mapa -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}El pont està massa baix per a l'estació. -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}El pont està massa baix per a la parada. -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}El pont és massa baix per al port. -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}El pont està massa baix per a la boia. -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}El pont està massa baix per al punt de pas. -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}El pont està massa baix per al punt de pas de carretera. -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}El pont és massa baix per a la resclosa. # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Aquí no es pot construir el túnel... diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 4ba7521f99..49bc9aeb81 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -853,7 +853,7 @@ STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Питӗ хӑв ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_INTERFACE :Интерфейс STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :Лартӑм diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 2fcb9bb0b3..7bc156fb65 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1958,7 +1958,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Jedinice visine: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Uvijek kada je visina prikazana u korisničkom sučelju, prikaži je u odabranim jedinicama -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperijalni (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrički (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 06d4ae0371..fd987da743 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -2211,7 +2211,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Výškové jednotky: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kdykoliv se v uživatelském rozhraní zobrazí výška, bude ve zvolených jednotkách -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperiální (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrické (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3508,7 +3508,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generov STR_GENERATION_RIVER_GENERATION :{BLACK}Generování řek STR_GENERATION_CLEARING_TILES :{BLACK}Tvorba členitého a kamenitého území STR_GENERATION_TOWN_GENERATION :{BLACK}Generování měst -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generování průmyslu STR_GENERATION_OBJECT_GENERATION :{BLACK}Výstavba nepřesunutelných objektů STR_GENERATION_TREE_GENERATION :{BLACK}Výsadba stromů STR_GENERATION_SETTINGUP_GAME :{BLACK}Nastavování hry diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 066774cc60..c870b46988 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Højdeenheder: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Når højde er vist i brugergrænsefladen, så vis dem i de valgte enheder -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperisk (fod) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landskab STR_GENERATION_RIVER_GENERATION :{BLACK}Flod-generering STR_GENERATION_CLEARING_TILES :{BLACK}Generer råt og stenet område STR_GENERATION_TOWN_GENERATION :{BLACK}By generation -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industri generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Ikke-flytbar generering STR_GENERATION_TREE_GENERATION :{BLACK}Trægenerering STR_GENERATION_SETTINGUP_GAME :{BLACK}Klargør spil @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start- o STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... begge ender af en bro skal være på land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... broen er for lang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Broen ville slutte udenfor kortet -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Broen er for lav til en station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Broen er for lav til et vej stoppested -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er for lav til havnen -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er for lav til en bøje -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er for lav til et rutepunkt -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bro er for lav til at låse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan ikke bygge en tunnel her... diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index db922cb602..2fe998bbeb 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Hoogte-eenheden: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wanneer hoogtes worden weergegeven in het gebruikersscherm, gebruik dan de geselecteerde eenheden -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperiaal (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscha STR_GENERATION_RIVER_GENERATION :{BLACK}Rivierplaatsing STR_GENERATION_CLEARING_TILES :{BLACK}Ontwikkeling van ruig en rotsachtig gebied STR_GENERATION_TOWN_GENERATION :{BLACK}Steden genereren -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industrieën genereren STR_GENERATION_OBJECT_GENERATION :{BLACK}Ontwikkeling van onverplaatsbare objecten STR_GENERATION_TREE_GENERATION :{BLACK}Bosplaatsing STR_GENERATION_SETTINGUP_GAME :{BLACK}Spel wordt geconfigureerd @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Begin en STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... uiteinden van brug moeten beiden op land zijn STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brug te lang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Brug zou eindigen buiten de kaart -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Brug te laag voor station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Brug te laag voor halte -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}De brug is te laag voor haven -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Brug te laag voor boei -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Brug te laag voor spoorroutepunt -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Brug te laag voor wegroutepunt -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Brug te laag voor sluis # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan hier geen tunnel bouwen... diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 10cc0ac016..087a675509 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Heights units: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Whenever heights are shown in the user interface, show it in the selected units -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscap STR_GENERATION_RIVER_GENERATION :{BLACK}River generation STR_GENERATION_CLEARING_TILES :{BLACK}Rough and rocky area generation STR_GENERATION_TOWN_GENERATION :{BLACK}Town generation -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industry generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Object generation STR_GENERATION_TREE_GENERATION :{BLACK}Tree generation STR_GENERATION_SETTINGUP_GAME :{BLACK}Setting up game @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ends of bridge must both be on land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... bridge too long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 3640eda96c..3528b41f3f 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Heights units: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Whenever a height is shown in the user interface, show it in the selected units -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscap STR_GENERATION_RIVER_GENERATION :{BLACK}River generation STR_GENERATION_CLEARING_TILES :{BLACK}Rough and rocky area generation STR_GENERATION_TOWN_GENERATION :{BLACK}Town generation -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industry generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Object generation STR_GENERATION_TREE_GENERATION :{BLACK}Tree generation STR_GENERATION_SETTINGUP_GAME :{BLACK}Setting up game @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ends of bridge must both be on land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... bridge too long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is too low for station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is too low for road stop -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is too low for dock -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is too low for buoy -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is too low for rail waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is too low for road waypoint -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index f8ee39b52d..8898cf0864 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -2099,7 +2099,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI-unuoj (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Altecunuoj: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kiam ajn montriĝas alteco en la uzantinterfaco, montru ĝin en la indikitaj unuoj -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Angla-usona sistemo (futoj) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metra (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI-unuoj (m) diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 7c4f765321..24edd3e26d 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -2163,7 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI-süsteem (kN STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Kõrgusühikud: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Liideses näidatakse kõrgust valitud mõõdustikus -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Inglise mõõdustik (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Meetermõõdustik (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI-süsteem (m) @@ -3418,7 +3418,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Maastiku STR_GENERATION_RIVER_GENERATION :{BLACK}Jõgede tekitamine STR_GENERATION_CLEARING_TILES :{BLACK}Mägise ja kivise maa-ala tekitamine STR_GENERATION_TOWN_GENERATION :{BLACK}Asulate tekitamine -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Tööstuse tekitamine STR_GENERATION_OBJECT_GENERATION :{BLACK}Objekti tekitamine STR_GENERATION_TREE_GENERATION :{BLACK}Puude tekitamine STR_GENERATION_SETTINGUP_GAME :{BLACK}Mängu seadistamine diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 439b1d04dd..b2b65047ad 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1675,7 +1675,7 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Eingin ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_SOUND :Ljóð effektir STR_CONFIG_SETTING_INTERFACE :Takførisflati diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 6427a51c2a..f0de21e757 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Korkeuden yksikkö: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kun käyttöliittymässä näytetään korkeus, näytä se valittua yksikköä käyttäen -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Brittiläinen (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrinen (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Maaston STR_GENERATION_RIVER_GENERATION :{BLACK}Jokien luominen STR_GENERATION_CLEARING_TILES :{BLACK}Karun ja kivisen alueen luominen STR_GENERATION_TOWN_GENERATION :{BLACK}Kuntien luominen -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Tuotantolaitosten luominen STR_GENERATION_OBJECT_GENERATION :{BLACK}Siirtämättömän luominen STR_GENERATION_TREE_GENERATION :{BLACK}Puiden luominen STR_GENERATION_SETTINGUP_GAME :{BLACK}Valmistellaan peliä @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Alku- ja STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... sillan molempien päiden pitää sijaita maalla. STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... silta liian pitkä STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Silta päättyisi kartan ulkopuolelle -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Silta on liian matala aseman ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Silta on liian matala pysäkin ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Silta on liian matala sataman ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Silta on liian matala poijun ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Silta on liian matala rautatien reittipisteen ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Silta on liian matala tien reittipisteen ylle -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Silta on liian matala sulun ylle # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Tunnelia ei voi rakentaa... diff --git a/src/lang/french.txt b/src/lang/french.txt index d9b622afd8..235e21f98e 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unité de hauteur{NBSP}: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quand une hauteur est affichée dans l'interface utilisateur, utiliser l'unité sélectionnée -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Impérial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrique (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Généra STR_GENERATION_RIVER_GENERATION :{BLACK}Création des rivières STR_GENERATION_CLEARING_TILES :{BLACK}Création des zones rugueuses et rocheuses STR_GENERATION_TOWN_GENERATION :{BLACK}Génération des villes -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Génération des industries STR_GENERATION_OBJECT_GENERATION :{BLACK}Création des objets inamovibles STR_GENERATION_TREE_GENERATION :{BLACK}Création des arbres STR_GENERATION_SETTINGUP_GAME :{BLACK}Configuration du jeu @@ -5270,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Le débu STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... les deux extrémités du pont doivent être sur la terre ferme STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... pont trop long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Le pont finirait en dehors de la carte -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Le pont est trop bas pour les gares -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Le pont est trop bas pour les arrêts de bus -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Le pont est trop bas pour le port -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Le pont est trop bas pour les bouées -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Le pont est trop bas pour les points de contrôle de route -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Ce pont est trop bas pour le verrouillage # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Impossible de construire un tunnel ici... diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 75a2cb27ac..6b3fc822a5 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -1785,7 +1785,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Hichte-ienheid: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wannear't der hichten sichtber binne yn de interface de selektearre ienheiden brûke -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Ymperiaal (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrysk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 9f6df83f83..c747f8bc6a 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -2011,7 +2011,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Aonadan àirde: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Nuair a thèid àirde a shealltainn san eadar-aghaidh, seall i leis na h-aonadan a thagh thu -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Impireil (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Meatrach (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/galician.txt b/src/lang/galician.txt index c4ec239fcd..79258e6b87 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades para a altura (cota): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Cando as cotas se amosen na interfaz de usuario, facelo coas unidades seleccionadas -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Xeració STR_GENERATION_RIVER_GENERATION :{BLACK}Xeración de ríos STR_GENERATION_CLEARING_TILES :{BLACK}Xeración de áreas rochosas e escarpadas STR_GENERATION_TOWN_GENERATION :{BLACK}Xeración de vilas -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Xeración da industria STR_GENERATION_OBJECT_GENERATION :{BLACK}Xeración de obxectos STR_GENERATION_TREE_GENERATION :{BLACK}Xeración de árbores STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando partida @@ -3692,6 +3691,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Escribe STR_TOWN_DIRECTORY_CAPTION :{WHITE}Vilas ({COMMA} de {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Ningunha - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Nomes de vilas - pincha no nome para centrar a vista na vila. Ctrl+Clic abre unha nova fiestra na localización da vila STR_TOWN_POPULATION :{BLACK}Poboación mundial: {COMMA} @@ -5269,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}O inicio STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos extremos da ponte deben estar en terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte remataría fóra do mapa -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para a estación -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para unha estación de estrada -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é moi baixa para o porto -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para a boia -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para un punto de ruta de ferrocarril -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para un punto de ruta de estrada -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é moi baixa para a exclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Non se pode construír un túnel aí... diff --git a/src/lang/german.txt b/src/lang/german.txt index 53da600dc2..ff17c31330 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2157,7 +2157,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Höheneinheiten: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Immer wenn Höhen angezeigt werden, sie in den gewählten Einheiten anzeigen -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3467,7 +3467,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscha STR_GENERATION_RIVER_GENERATION :{BLACK}Flussgenerierung STR_GENERATION_CLEARING_TILES :{BLACK}Raue, felsige Landschaft wird erzeugt STR_GENERATION_TOWN_GENERATION :{BLACK}Stadterzeugung -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industrieerzeugung STR_GENERATION_OBJECT_GENERATION :{BLACK}Unbewegliche Objekte werden erzeugt STR_GENERATION_TREE_GENERATION :{BLACK}Bäume werden erzeugt STR_GENERATION_SETTINGUP_GAME :{BLACK}Spiel wird vorbereitet diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 5ec9e67770..6d4ebdff53 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -2251,7 +2251,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Μονάδες μέτρησης ύψους: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Όποτε εμφανίζεται ένα ύψος στη διεπαφή χρήστη, να εμφανίζεται στην επιλεγμένη μονάδα -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Αυτοκρατορικό (πόδια) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Μετρικό (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3564,7 +3564,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Δημι STR_GENERATION_RIVER_GENERATION :{BLACK}Δημιουργία ποταμού STR_GENERATION_CLEARING_TILES :{BLACK}Δημιουργία άγριας και πετρώδης περιοχής STR_GENERATION_TOWN_GENERATION :{BLACK}Δημιουργία πόλης -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Δημιουργία βιομηχανίας STR_GENERATION_OBJECT_GENERATION :{BLACK}Δημιουργία μη μετακινούμενων STR_GENERATION_TREE_GENERATION :{BLACK}Δημιουργία δέντρων STR_GENERATION_SETTINGUP_GAME :{BLACK}Ρύθμιση παιχνιδιού @@ -5370,13 +5369,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Η αρ STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... και τα δύο άκρα της γέφυρας πρέπει να είναι σε έδαφος STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... η γέφυρα είναι πολλή μακριά STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Η γέφυρα θα καταλήξει εκτός χάρτη -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σταθμό -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Η γέφυρα είναι πολύ χαμηλή για οδική στάση -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Η γέφυρα είναι πολύ χαμηλή για αποβάθρα -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σημαδούρα -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για σιδηροδρομικό σημείο αναφοράς -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Η γέφυρα είναι πολύ χαμηλή για οδικό σημείο αναφοράς -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Η γέφυρα είναι πολύ χαμηλή για κλείδωμα # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί σήραγγα εδώ... diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 2347dcba42..fe2efa775c 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1939,7 +1939,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :בינלאומ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :יחידות גובה: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :כאשר מוצגים גבהים השתמש ביחידות שנבחרו -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :בריטית (רגל) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :מטרי (מטר) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (מטר) @@ -3082,7 +3082,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}יציר STR_GENERATION_RIVER_GENERATION :{BLACK}יצירת נהרות STR_GENERATION_CLEARING_TILES :{BLACK}יצירת איזורים סלעיים STR_GENERATION_TOWN_GENERATION :{BLACK}יצירת עיירה -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}יצירת תעשייה STR_GENERATION_OBJECT_GENERATION :{BLACK}יצירת מבנים בלתי ניידים STR_GENERATION_TREE_GENERATION :{BLACK}יצירת עצים STR_GENERATION_SETTINGUP_GAME :{BLACK}קביעת הגדרות המשחק diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 7d1a61c12f..c103ddcb04 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -719,7 +719,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :अंतर् ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_INTERFACE_GENERAL :सामान्य STR_CONFIG_SETTING_COMPANY :कंपनी diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 167ffc89fb..a7269ea7e5 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -2222,7 +2222,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Hosszúság mértékegysége: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :A magassági értékek a kiválasztott mértékegységben fognak megjelenni a felhasználói felületen -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Angolszász (láb) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrikus (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3535,7 +3535,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Tájkép STR_GENERATION_RIVER_GENERATION :{BLACK}Folyó generálás STR_GENERATION_CLEARING_TILES :{BLACK}Durva és köves területek generálása STR_GENERATION_TOWN_GENERATION :{BLACK}Város generálás -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Ipar generálás STR_GENERATION_OBJECT_GENERATION :{BLACK}Mozgathatatlan létesítmények létrehozása STR_GENERATION_TREE_GENERATION :{BLACK}Fák generálása STR_GENERATION_SETTINGUP_GAME :{BLACK}Játék beállítása @@ -5333,13 +5332,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}A kezdet STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... a híd mindkét végének szárazföldön kell lennie STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... a híd túl hosszú STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A híd a térképen túl végződne -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A híd túl alacsony az állomáshoz -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A híd túl alacsony a megállóhoz -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A híd túl alacsony a kikötőhöz -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A híd túl alacsony a bójához -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A híd túl alacsony a vasúti ellenőrzőponthoz -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}BA híd túl alacsony az útponthoz -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A híd túl alacsony a zároláshoz # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nem áshatsz ide alagutat... diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index eeb4f28dd7..d76cab670b 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1700,7 +1700,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Meðalstærð b ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_SOUND :Hljóð STR_CONFIG_SETTING_INTERFACE :Viðmót diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 9ce3042cab..6a2107860f 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -822,7 +822,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora ###length 3 -###length 3 +###length 4 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index f0f0168d50..4f6fb8ee18 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -2056,7 +2056,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Satuan ketinggian: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Apabila ketinggian ditampilkan di antarmuka, nyatakan di satuan yang dipilih -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrik (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 69038bddc3..c11a13d9b3 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1913,7 +1913,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Aonaid airde: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Aon áit a thaispeántar airde sa chomhéadan úsáideora, taispeain sna haonaid roghnaithe í -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Impiriúil (tr) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Méadrach (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/italian.txt b/src/lang/italian.txt index caca858051..7ed8445e02 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -2172,7 +2172,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unità di altezza: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Seleziona le unità di misura da utilizzare per mostrare le altezze nell'interfaccia utente -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperiali (piedi) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metriche (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3469,7 +3469,6 @@ STR_GENERATION_WORLD_GENERATION :{BLACK}Generazi STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generazione paesaggio STR_GENERATION_RIVER_GENERATION :{BLACK}Generazione fiumi STR_GENERATION_CLEARING_TILES :{BLACK}Generazione aree brulle e rocciose -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generazione industrie STR_GENERATION_OBJECT_GENERATION :{BLACK}Generazione oggetti inamovibili STR_GENERATION_TREE_GENERATION :{BLACK}Generazione alberi STR_GENERATION_SETTINGUP_GAME :{BLACK}Impostazione partita @@ -5247,7 +5246,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Inizio e STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... gli estremi del ponte devono trovarsi entrambi sul terreno STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte troppo lungo STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Il ponte terminerebbe fuori dalla mappa -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Ponte troppo basso per una fermata # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Impossibile costruire il tunnel qui... diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index a3dc9d4207..61999a9fbe 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -2011,7 +2011,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :国際単位系 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :距離単位: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :ゲーム中の高度をいずれの単位系で表すか決定します -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :ヤード・ポンド法 (フィート(ft)) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :メートル法 (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :国際単位系 (m) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index e0bb797da5..6faf58f355 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :국제표준규 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :높이 단위: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :높이를 표시할 때 선택한 단위를 사용하여 나타냅니다 -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :야드파운드법 (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :미터법 (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :국제표준규격 (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}지형 STR_GENERATION_RIVER_GENERATION :{BLACK}강 제작 STR_GENERATION_CLEARING_TILES :{BLACK}거친 암석지대 만드는 중 STR_GENERATION_TOWN_GENERATION :{BLACK}도시 생성 -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}산업시설 생성 STR_GENERATION_OBJECT_GENERATION :{BLACK}움직일수 없는 객체 만드는 중 STR_GENERATION_TREE_GENERATION :{BLACK}나무 심는 중 STR_GENERATION_SETTINGUP_GAME :{BLACK}게임 설정 중 @@ -5270,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}시작 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... 다리의 양 끝은 모두 땅이어야 합니다 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... 다리가 너무 깁니다! STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}다리 끝이 지도 밖을 넘어갑니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}다리 밑에 역을 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}다리 밑에 도로 정류장을 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}다리 밑에 부표를 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}다리 밑에 철도 경유지를 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}다리 밑에 도로 경유지를 두기에는 다리 높이가 너무 낮습니다 -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 너무 낮습니다 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}여기에 터널을 지을 수 없습니다... diff --git a/src/lang/latin.txt b/src/lang/latin.txt index e9c79abb82..43c99cba60 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -2013,7 +2013,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unitates altitudinis: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quandocumque altitudo monstratur, monstrabitur his unitatibus electis -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Anglicae (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metricae (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 95111c22df..8422f4c211 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -2162,7 +2162,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI, starptautis STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Augstuma mērvienības: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kad lietotāja saskarnē rāda augstumu, uzrādīt to norādītajās mērvienībās -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :impērijas, britu (pēda) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :metriskās (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI, starptautiskās (m) @@ -3476,7 +3476,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Ainavu v STR_GENERATION_RIVER_GENERATION :{BLACK}Upes radīšana STR_GENERATION_CLEARING_TILES :{BLACK}Nelīdzena un akmeņaina apvidus radīšana STR_GENERATION_TOWN_GENERATION :{BLACK}Pilsētas veidošana -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Nozares veidošana STR_GENERATION_OBJECT_GENERATION :{BLACK}Objekta radīšana STR_GENERATION_TREE_GENERATION :{BLACK}Koka radīšana STR_GENERATION_SETTINGUP_GAME :{BLACK}Iestatīt spēli @@ -5280,13 +5279,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Sākumam STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... abiem tilta galiem jābūt uz zemes STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... tilts ir pārāk garš STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Tilts beigtos ārpus kartes -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Tilts ir pārāk zems stacijai -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Tilts ir pārāk zems, ceļa pieturai -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Tilts ir pārāk zems piestātnei -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Tilts ir pārāk zems bojai -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Tilts ir pārāk zems dzelzceļa pieturas punktam -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Tilts ir pārāk zems ceļa punktam -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Tilts ir pārāk zems slūžām # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Šeit nevar būvēt tuneli... diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 70b83009e7..c4c4d96a55 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -2274,7 +2274,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Aukščio vienetai: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Vienetai, kuriais matuojamas aukštis -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :imperiniai (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :metriniai (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3503,7 +3503,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Peizažo STR_GENERATION_RIVER_GENERATION :{BLACK}Upių generavimas STR_GENERATION_CLEARING_TILES :{BLACK}Daubų ir uolų generacija STR_GENERATION_TOWN_GENERATION :{BLACK}Miestų generavimas -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Pramonės generavimas STR_GENERATION_OBJECT_GENERATION :{BLACK}Nejudinama generacija STR_GENERATION_TREE_GENERATION :{BLACK}Medžių generacija STR_GENERATION_SETTINGUP_GAME :{BLACK}Sukurti zaidima diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 3b7b5fafa1..db4bb0e90d 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -2131,7 +2131,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Héichteneenheeten: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Emmer wann Héichten am Userinterface ugewisen ginn, weis se an den ausgewielten Eenheeten un -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Britesch (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metresch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3427,7 +3427,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscha STR_GENERATION_RIVER_GENERATION :{BLACK}Generéiren vu Flëss STR_GENERATION_CLEARING_TILES :{BLACK}Generatioun vu knubbelegem a stengege Land STR_GENERATION_TOWN_GENERATION :{BLACK}Stiedgeneratioun -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industriegeneratioun STR_GENERATION_OBJECT_GENERATION :{BLACK}Objets-Generatioun STR_GENERATION_TREE_GENERATION :{BLACK}Baam Generatioun STR_GENERATION_SETTINGUP_GAME :{BLACK}Spill gëtt opgestallt diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 18b63a7eae..24b1becdcb 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1136,7 +1136,7 @@ STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x ###length 3 -###length 3 +###length 4 diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 27ca9a0852..5da82b66f2 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1593,7 +1593,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :Unit SI (m³) ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_SOUND :Bunyi STR_CONFIG_SETTING_INTERFACE :Antaramuka (Interface) diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 597ed222da..7d41aa8c9c 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -754,7 +754,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uz ###length 3 -###length 3 +###length 4 diff --git a/src/lang/maori.txt b/src/lang/maori.txt index 69e81d94e7..c48be32287 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Waeine teitei: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Ina whakaaria he teitei i te tāhono kaiwhakamahi, whakaaria i te waeine kua tīpakona -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Ingarangi (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Ngahuru (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3468,7 +3468,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Hanga wh STR_GENERATION_RIVER_GENERATION :{BLACK}Hanga awa STR_GENERATION_CLEARING_TILES :{BLACK}Hanga rohe tuarangaranga, tokatoka hoki STR_GENERATION_TOWN_GENERATION :{BLACK}Hanga tāone -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Hanga ahumahi STR_GENERATION_OBJECT_GENERATION :{BLACK}Hanga mea STR_GENERATION_TREE_GENERATION :{BLACK}Hanga rākau STR_GENERATION_SETTINGUP_GAME :{BLACK}Whakatatū i te kēmu @@ -5263,11 +5262,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Me tōti STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... me tū ki te whenua ngā pito e rua o te arawhiti STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... he roa rawa te arawhiti STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Ka mutu te arawhiti i waho i te mahere -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}He hakahaka rawa te arawhiti mō te teihana -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}He hakahaka rawa te arawhiti mō te tūnga rori -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}He hakahaka rawa te arawhiti mō te kārewa -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}He hakahaka rawa te arawhiti mō te aratohu rerewhenua -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}He hakahaka rawa te arawhiti mō te aratohu rori # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Tē taea te hanga te anaroa i konei... diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 3e98b72c54..cb308dabb2 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -1042,7 +1042,7 @@ STR_CONFIG_SETTING_STATUSBAR_POS :स्टेट ###length 3 -###length 3 +###length 4 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index a674b766cb..6c48f2ccca 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2160,7 +2160,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Høydeenheter: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Når en høyde vises i brukergrensesnittet, vis den i de valgte enhetene -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperisk (fot) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3473,7 +3473,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landskap STR_GENERATION_RIVER_GENERATION :{BLACK}Skap elver STR_GENERATION_CLEARING_TILES :{BLACK}Generering av ulendt og steinete område STR_GENERATION_TOWN_GENERATION :{BLACK}Bygenerering -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industrigenerering STR_GENERATION_OBJECT_GENERATION :{BLACK}Objektgenerering STR_GENERATION_TREE_GENERATION :{BLACK}Tregenerering STR_GENERATION_SETTINGUP_GAME :{BLACK}Klargjør spillet @@ -5271,13 +5270,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start og STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}...{NBSP}broens ender må være på land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... broen er for lang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bro vil ende utenfor kartet -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Broen er for lav for en stasjon -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Broen er for lav for en holdeplass -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er for lav for en havn -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er for lav for en bøye -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er for lav for et veipunkt -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er for lav for et veipunkt -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Broen er for lav for en sluse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan ikke bygge tunnel her... diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index bcf128286a..290c4c01b1 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1747,7 +1747,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Eining for høgde: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Bruk vald eining for å vise høgde -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Britisk eining (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 09b8b4d198..b911136150 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -1728,7 +1728,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :متریک (kgf STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :واحدهای ارتفاع: {STRING} -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :امپریال (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :متریک (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :متر (m) diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 6785c742b8..fa73f92c9f 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2538,7 +2538,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Jednostki wysokości: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Jeśli kiedykolwiek wysokości są pokazywane w interfejsie użytkownika, pokaż je w wybranych jednostkach -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperialne (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metryczne (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3851,7 +3851,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Tworzeni STR_GENERATION_RIVER_GENERATION :{BLACK}Tworzenie rzek STR_GENERATION_CLEARING_TILES :{BLACK}Tworzenie terenów skalistych i nierówności STR_GENERATION_TOWN_GENERATION :{BLACK}Tworzenie miast -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Rozmieszczanie przedsiębiorstw STR_GENERATION_OBJECT_GENERATION :{BLACK}Rozmieszczanie obiektów STR_GENERATION_TREE_GENERATION :{BLACK}Rozmieszczanie drzew STR_GENERATION_SETTINGUP_GAME :{BLACK}Konfigurowanie rozgrywki @@ -5655,13 +5654,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Począte STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... końce mostu muszą znajdować się na lądzie STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... za długi most STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Koniec mostu poza mapą -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Most jest zbyt niski dla stacji -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Most jest zbyt niski dla przystanku -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Most jest zbyt niski dla portu -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Most jest zbyt niski dla boi -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku kolejowego -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Most jest zbyt niski dla posterunku drogowego -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Most jest zbyt niski dla śluzy # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nie można tutaj zbudować tunelu... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index bc417f32d4..710514ee7e 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2159,7 +2159,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quando as alturas são mostradas no interface de utilizador, mostrar na unidade selecionada -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft/pé) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3472,7 +3472,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}A gerar STR_GENERATION_RIVER_GENERATION :{BLACK}A gerar rios STR_GENERATION_CLEARING_TILES :{BLACK}A gerar zonas rochosas e montanhosas STR_GENERATION_TOWN_GENERATION :{BLACK}A gerar localidades -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}A gerar indústrias STR_GENERATION_OBJECT_GENERATION :{BLACK}A gerar objetos STR_GENERATION_TREE_GENERATION :{BLACK}A gerar árvores STR_GENERATION_SETTINGUP_GAME :{BLACK}A configurar jogo @@ -5270,13 +5269,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos os extremos da ponte devem estar em terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é demasiado baixa para a estação -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é demasiado baixa para a paragem rodoviária -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é demasiado baixa para a doca -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é demasiado baixa para a boia -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo ferroviário -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é demasiado baixa para o ponto de controlo rodoviário -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é demasiado baixa para a eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index b08d2f80ea..2b6f5bcea7 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -2127,7 +2127,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unitate înălțime: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Afișează înălțimile în interfață folosind unitățile selectate -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3418,7 +3418,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generare STR_GENERATION_RIVER_GENERATION :{BLACK}Generarea râurilor STR_GENERATION_CLEARING_TILES :{BLACK}Generare zonă dură și pietroasă STR_GENERATION_TOWN_GENERATION :{BLACK}Generare oraș -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generare industrie STR_GENERATION_OBJECT_GENERATION :{BLACK}Generare fixă STR_GENERATION_TREE_GENERATION :{BLACK}Generare arbori STR_GENERATION_SETTINGUP_GAME :{BLACK}Se configurează jocul diff --git a/src/lang/russian.txt b/src/lang/russian.txt index e1aefd3319..bdbcf8b558 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -2309,7 +2309,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :СИ (кН) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Система единиц для высоты: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Показывать значения высоты в выбранной системе единиц -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :английская (фут) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :метрическая (м) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СИ (м) @@ -3646,7 +3646,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Созд STR_GENERATION_RIVER_GENERATION :{BLACK}Создание рек STR_GENERATION_CLEARING_TILES :{BLACK}Расстановка декораций и камней STR_GENERATION_TOWN_GENERATION :{BLACK}Создание городов -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Создание предприятий STR_GENERATION_OBJECT_GENERATION :{BLACK}Создание объектов STR_GENERATION_TREE_GENERATION :{BLACK}Высадка лесов STR_GENERATION_SETTINGUP_GAME :{BLACK}Настройка @@ -5456,13 +5455,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Нача STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... оба конца моста должны опираться на землю STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... мост слишком длинный STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Мост выходит за пределы карты -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Высота моста недостаточна для строительства станции -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Высота моста недостаточна для строительства остановки -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Высота моста недостаточна для строительства пристани -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Высота моста недостаточна для установки буя -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Высота моста недостаточна для строительства маршрутной точки -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Высота моста недостаточна для строительства шлюза # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Здесь невозможно построить туннель... diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index e0f8b059c5..efdb5971ca 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -2250,7 +2250,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Mere visine: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kad visine budu pokazane u interfejsu, pokazi u željenoj meri -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperijalne mere (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metričke mere (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 067950f22a..d89c02dac6 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :国际单位制 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :高度单位:{STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :在界面上以所选择的单位表示高度 -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :英制(呎) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :公制(米) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :国际单位制(米) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}景观 STR_GENERATION_RIVER_GENERATION :{BLACK}生成河流 STR_GENERATION_CLEARING_TILES :{BLACK}生成岩石地貌 STR_GENERATION_TOWN_GENERATION :{BLACK}城镇生成 -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}工业生成 STR_GENERATION_OBJECT_GENERATION :{BLACK}生成固定设施 STR_GENERATION_TREE_GENERATION :{BLACK}生成树木 STR_GENERATION_SETTINGUP_GAME :{BLACK}设置游戏 @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}起止 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}……桥梁两端必须都位于地面上 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}……桥梁太长 STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}桥梁终点将越出地图 -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}桥梁过低,无法建设车站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}桥梁过低,无法建设车站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}桥梁过低,无法建设码头 -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}桥梁过低,无法放置浮标 -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}桥梁过低,无法建设路点 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}桥梁过低,无法建设路点 -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}桥梁过低,无法建设船闸 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}不能在这里开凿隧道…… diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index cbb3c6743a..fdd76be32a 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -2172,7 +2172,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Jednotky výšky: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Vždy, keď sa zobrazí výška v užívateľskom rozhraní, zobrazí sa vo vybraných jednotkách -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperialne (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrické (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3420,7 +3420,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :Generujem kraji STR_GENERATION_RIVER_GENERATION :{BLACK}Generovanie riek STR_GENERATION_CLEARING_TILES :{BLACK}Generovanie nerovností a skál STR_GENERATION_TOWN_GENERATION :Vytváranie mesta -STR_GENERATION_INDUSTRY_GENERATION :Vytváranie priemyslu STR_GENERATION_OBJECT_GENERATION :{BLACK}Generovanie objektov STR_GENERATION_TREE_GENERATION :{BLACK}Generovanie stromov STR_GENERATION_SETTINGUP_GAME :{BLACK}Nastavovanie hry diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 4f08febbaa..e6e9b9742f 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1962,7 +1962,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Višinske enote: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Ko je omogočen prikaz višin na vmesniku, bodo prikazane v izbranih enotah. -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperične (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrične (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 3c578f94a5..7627577713 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -2137,7 +2137,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidad de altura: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Cada vez que se muestre una altura en la interfaz de usuario, se empleará la unidad seleccionada -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (pies) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3440,7 +3440,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generaci STR_GENERATION_RIVER_GENERATION :{BLACK}Generación de ríos STR_GENERATION_CLEARING_TILES :{BLACK}Generación de áreas ásperas o rocosas STR_GENERATION_TOWN_GENERATION :{BLACK}Generación de municipios -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generación de industrias STR_GENERATION_OBJECT_GENERATION :{BLACK}Generación de inamovibles STR_GENERATION_TREE_GENERATION :{BLACK}Generación de árboles STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurar juego diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index f005e3ab34..4d128a76f1 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -2154,7 +2154,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Cada vez que se muestre una altura en la interfaz de usuario, se emplearán las unidades elegidas -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (pies) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3464,7 +3464,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generaci STR_GENERATION_RIVER_GENERATION :{BLACK}Generación de ríos STR_GENERATION_CLEARING_TILES :{BLACK}Generación de áreas rugosas y rocosas STR_GENERATION_TOWN_GENERATION :{BLACK}Generación de pueblos -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Generación de industrias STR_GENERATION_OBJECT_GENERATION :{BLACK}Generación de objetos STR_GENERATION_TREE_GENERATION :{BLACK}Generación de árboles STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando partida diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index a0f29b1edf..dff4404491 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Höjdenhet: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Närhelst en höjd visas i användargränssnittet, visa den i de valda enheterna -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Brittisk (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landskap STR_GENERATION_RIVER_GENERATION :{BLACK}Generera Flod STR_GENERATION_CLEARING_TILES :{BLACK}Svår och stenig markgenerering STR_GENERATION_TOWN_GENERATION :{BLACK}Stadsgenerering -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Industrigenerering STR_GENERATION_OBJECT_GENERATION :{BLACK}Generera objekt STR_GENERATION_TREE_GENERATION :{BLACK}Generera Träd STR_GENERATION_SETTINGUP_GAME :{BLACK}Ställer in spel @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start- o STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... brons båda ändar måste vara på land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... för lång bro STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bron slutar utanför kartans gränser -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bro för låg för station -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bro för låg för depå -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bron är för låg för en kaj -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bro för låg för boj -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bro för låg för järnvägsriktmärke -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bro för låg för vägriktmärke -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bro för låg för sluss # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan inte bygga tunnel här... diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 10ccf21cd3..516cfb1db3 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1916,7 +1916,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :உயரங்கள் அலகுகள்: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :பயனர் இடைமுகத்தில் ஒரு உயரம் காட்டப்படும் போதெல்லாம், தேர்ந்தெடுக்கப்பட்ட அலகுகளில் அதைக் காட்டுங்கள் -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :இம்பீரியல் (அடி) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :மெட்ரிக் (மீ) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :அனைத்துலக முறை அலகு (மீ) diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 98eec60d46..c3c517a6fe 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1829,7 +1829,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :มาตรฐ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :หน่วยวัดความสูง: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :การแสดงหน่วยวัดความสูงเมื่อกดดูรายละเอียดของวัตถุต่างๆ -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :อิมพีเรียล (ฟุต) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :เมตริก (เมตร) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :มาตรฐานสากล (เมตร) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 73cb73984e..dc2f58726d 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :國際單位( STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :高度單位:{STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :在界面上以所選擇的單位表示高度。 -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :英制(英呎) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :米制(米) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :國際單位(米) @@ -3471,7 +3471,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}景觀 STR_GENERATION_RIVER_GENERATION :{BLACK}產生河流 STR_GENERATION_CLEARING_TILES :{BLACK}產生荒地與岩石地貌 STR_GENERATION_TOWN_GENERATION :{BLACK}市鎮生成 -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}工業生成 STR_GENERATION_OBJECT_GENERATION :{BLACK}無法移動 STR_GENERATION_TREE_GENERATION :{BLACK}產生樹木 STR_GENERATION_SETTINGUP_GAME :{BLACK}設定遊戲 @@ -5269,13 +5268,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}開始 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... 橋樑的兩端應在陸地上 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}……橋樑過長 STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}橋的終點將會在地圖外 -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}橋樑過低,無法興建車站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}橋樑過低,無法興建車站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}橋樑過低,無法興建碼頭 -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}橋樑過低,無法放置浮標 -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}橋樑過低,無法興建中途站 -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}橋樑過低,無法興建水閘 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}無法在此挖掘隧道... diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 63f61b4003..35d04b5311 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2106,7 +2106,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (Uluslararas STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Yükseklik ölçü birimi: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kullanıcı arayüzünde yükseklikler görüntülendiğinde, bunları seçili ölçü biriminde göster -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (Ingiliz ölçü birimleri) (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrik (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (Uluslararası Ölçüm Sistemi) (m) @@ -3380,7 +3380,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Peyzaj o STR_GENERATION_RIVER_GENERATION :{BLACK}Nehir oluşturma STR_GENERATION_CLEARING_TILES :{BLACK}Engebeli ve kayalık alan oluştur STR_GENERATION_TOWN_GENERATION :{BLACK}Kasaba Oluşumu -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Endüstri Oluşumu STR_GENERATION_OBJECT_GENERATION :{BLACK}Nesne oluşturma STR_GENERATION_TREE_GENERATION :{BLACK}Ağaç üretimi STR_GENERATION_SETTINGUP_GAME :{BLACK}Oyun ayarlanıyor diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index c525d5020f..c96a193178 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -2273,7 +2273,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :СІ (кН) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Одиниці висоти: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Якщо висоти відображаються на інтерфейсі: показувати в обраній одиниці виміру -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Імперські (фути) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Метричні (м) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СІ (м) @@ -3579,7 +3579,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Гене STR_GENERATION_RIVER_GENERATION :{BLACK}Генерація річок STR_GENERATION_CLEARING_TILES :{BLACK}Розкидати каміння STR_GENERATION_TOWN_GENERATION :{BLACK}Генерація міст -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Генерація промисловості STR_GENERATION_OBJECT_GENERATION :{BLACK}Генерація нерухомості STR_GENERATION_TREE_GENERATION :{BLACK}Насадження дерев STR_GENERATION_SETTINGUP_GAME :{BLACK}Налаштування гри diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 4fa01ee68c..40e9f035a7 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1482,7 +1482,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :شہر کا ش ###length 3 -###length 3 +###length 4 STR_CONFIG_SETTING_INTERFACE :انٹرفیس STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :تعمیرات diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 45cadcf237..4cbf272ae3 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -2158,7 +2158,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Đơn vị độ cao: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Khi độ cao thể hiện trên giao diện, thì hiển thị nó trên đơn vị đã chọn -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Hoàng Gia (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3470,7 +3470,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Khởi t STR_GENERATION_RIVER_GENERATION :{BLACK}Khởi tạo sông suối STR_GENERATION_CLEARING_TILES :{BLACK}Sinh đá và sự gồ ghề STR_GENERATION_TOWN_GENERATION :{BLACK}Khởi tạo thị trấn -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Khởi tạo nhà máy STR_GENERATION_OBJECT_GENERATION :{BLACK}Sinh đối tượng cứng STR_GENERATION_TREE_GENERATION :{BLACK}Trồng cây STR_GENERATION_SETTINGUP_GAME :{BLACK}Thiết lập ván chơi @@ -5267,13 +5266,6 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Điểu STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... hai đầu cầu phải được gá vào đất STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... cầu quá dài STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Cầu có thể vượt quá phạm vi bản đồ -STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Cầu quá thấp cho ga -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Cầu quá thấp cho điểm dừng chân -STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Cầu quá thấp để xây dựng cảng -STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Cầu quá thấp cho phao -STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường ray -STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Cầu quá thấp cho điểm mốc đường -STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :Cầu thấp, tàu không qua được khóa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Không thể đào hầm ở đây... diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 761db4c555..271efe20fb 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -2146,7 +2146,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unedau uchder: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Pan y dangosir uchder yn y rhyngwyneb defnyddiwr, ei ddangos yn yr unedau a ddewiswyd -###length 3 +###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrig (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) @@ -3456,7 +3456,6 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Creu tir STR_GENERATION_RIVER_GENERATION :{BLACK}Cynhyrchu afonydd STR_GENERATION_CLEARING_TILES :{BLACK}Cynhyrchu ardaloedd creigiog a chnapiog STR_GENERATION_TOWN_GENERATION :{BLACK}Creu trefi -STR_GENERATION_INDUSTRY_GENERATION :{BLACK}Creu diwydiant STR_GENERATION_OBJECT_GENERATION :{BLACK}Cynhyrchu gwrthrych STR_GENERATION_TREE_GENERATION :{BLACK}Cynhyrchu coed STR_GENERATION_SETTINGUP_GAME :{BLACK}Gosod gêm yn ei le From 1522c9f661547cf52a5436f2cf09a44e471fd0ba Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 26 Oct 2025 04:38:02 +0000 Subject: [PATCH 149/280] Update: Translations from eints english (au): 11 changes by krysclarke swedish: 11 changes by robert-i chinese (traditional): 11 changes by KogentaSan greek: 11 changes by gh658804 russian: 13 changes by Ln-Wolf finnish: 15 changes by hpiirai portuguese: 44 changes by jcteotonio portuguese (brazilian): 11 changes by pasantoro, 1 change by jcteotonio polish: 10 changes by Rito13, 1 change by pAter-exe --- src/lang/brazilian_portuguese.txt | 13 +++++- src/lang/english_AU.txt | 11 +++++ src/lang/finnish.txt | 19 ++++++-- src/lang/greek.txt | 11 +++++ src/lang/polish.txt | 11 +++++ src/lang/portuguese.txt | 77 ++++++++++++++++++------------- src/lang/russian.txt | 15 +++++- src/lang/swedish.txt | 11 +++++ src/lang/traditional_chinese.txt | 11 +++++ 9 files changed, 139 insertions(+), 40 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index ffe13e3f94..42ecbac923 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}níve{P l is} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}dia{P "" s} @@ -2163,6 +2164,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Sempre que uma STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Unidades do jogo (níveis) STR_CONFIG_SETTING_LOCALISATION :Localização STR_CONFIG_SETTING_GRAPHICS :Gráficos @@ -3472,6 +3474,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Geraçã STR_GENERATION_RIVER_GENERATION :{BLACK}Geração de rios STR_GENERATION_CLEARING_TILES :{BLACK}Geração de áreas irregulares e rochosas STR_GENERATION_TOWN_GENERATION :{BLACK}Geração de localidades +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Geração de indústrias terrestres +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Geração de indústrias fluviais STR_GENERATION_OBJECT_GENERATION :{BLACK}Geração de objetos STR_GENERATION_TREE_GENERATION :{BLACK}Geração de árvores STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando o jogo @@ -5269,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... os extremos da ponte devem estar sobre a terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte muito longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a estação +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a parada rodoviária +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a doca +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a boia +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte está {HEIGHT} abaixo do necessário para o ponto de controle ferroviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte está {HEIGHT} abaixo do necessário para o ponto de controle rodoviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... @@ -5906,7 +5917,7 @@ STR_WAYPOINT_NAME :{WAYPOINT} STR_CURRENCY_SHORT_KILO :{NBSP}k STR_CURRENCY_SHORT_MEGA :{NBSP}M -STR_CURRENCY_SHORT_GIGA :{NBSP}G +STR_CURRENCY_SHORT_GIGA :{NBSP}B STR_CURRENCY_SHORT_TERA :{NBSP}T STR_JUST_CARGO :{CARGO_LONG} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 087a675509..92dc23506a 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}level{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Whenever height STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Game units (levels) STR_CONFIG_SETTING_LOCALISATION :Localisation STR_CONFIG_SETTING_GRAPHICS :Graphics @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscap STR_GENERATION_RIVER_GENERATION :{BLACK}River generation STR_GENERATION_CLEARING_TILES :{BLACK}Rough and rocky area generation STR_GENERATION_TOWN_GENERATION :{BLACK}Town generation +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Land industry generation +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Water industry generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Object generation STR_GENERATION_TREE_GENERATION :{BLACK}Tree generation STR_GENERATION_SETTINGUP_GAME :{BLACK}Setting up game @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ends of bridge must both be on land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... bridge too long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is {HEIGHT} too low for station +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is {HEIGHT} too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is {HEIGHT} too low for dock +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is {HEIGHT} too low for buoy +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for rail waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is {HEIGHT} too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index f0de21e757..f7b6d68b0d 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}taso{P "" a} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}vrk @@ -2124,8 +2125,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kun käyttölii STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Brittiläinen (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrinen (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Pelin yksiköt (ruutua/vrk) -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Pelin yksiköt (ruutua/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Pelin yksiköt (ruutuja/vrk) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Pelin yksiköt (ruutuja/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Solmut STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Kulkuneuvon tehon yksikkö: {STRING} @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Kun käyttölii STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Brittiläinen (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrinen (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Pelin yksiköt (tasoja) STR_CONFIG_SETTING_LOCALISATION :Mittayksiköt ja päivämäärät STR_CONFIG_SETTING_GRAPHICS :Grafiikka @@ -2962,8 +2964,8 @@ STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Linja-au STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Valitse linja-autoaseman suunta STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Lastauslaiturin suunta STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Valitse lastauslaiturin suunta -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Aseman suunta -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse aseman suunta +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Raitiotien matkustaja-aseman suunta +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse raitiotien matkustaja-aseman suunta STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Rahtiaseman suunta STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse rahtiaseman suunta @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Maaston STR_GENERATION_RIVER_GENERATION :{BLACK}Jokien luominen STR_GENERATION_CLEARING_TILES :{BLACK}Karun ja kivisen alueen luominen STR_GENERATION_TOWN_GENERATION :{BLACK}Kuntien luominen +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Teollisuuden luominen maalla +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Teollisuuden luominen vedessä STR_GENERATION_OBJECT_GENERATION :{BLACK}Siirtämättömän luominen STR_GENERATION_TREE_GENERATION :{BLACK}Puiden luominen STR_GENERATION_SETTINGUP_GAME :{BLACK}Valmistellaan peliä @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Alku- ja STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... sillan molempien päiden pitää sijaita maalla. STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... silta liian pitkä STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Silta päättyisi kartan ulkopuolelle +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Silta on {HEIGHT} liian matala aseman ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Silta on {HEIGHT} liian matala pysäkin ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Silta on {HEIGHT} liian matala sataman ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Silta on {HEIGHT} liian matala poijun ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Silta on {HEIGHT} liian matala rautatien reittipisteen ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Silta on {HEIGHT} liian matala tien reittipisteen ylle +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Silta on {HEIGHT} liian matala sulun ylle # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Tunnelia ei voi rakentaa... diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 6d4ebdff53..051a97e806 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -316,6 +316,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}πόδ{P "ι" "ια"} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}μ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}επίπεδ{P "ο" "α"} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}ημέρ{P 0 α ες} @@ -2255,6 +2256,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Όποτε εμ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Αυτοκρατορικό (πόδια) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Μετρικό (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Μονάδες παιχνιδιού (επίπεδα) STR_CONFIG_SETTING_LOCALISATION :Τοπικοποίηση STR_CONFIG_SETTING_GRAPHICS :Γραφικά @@ -3564,6 +3566,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Δημι STR_GENERATION_RIVER_GENERATION :{BLACK}Δημιουργία ποταμού STR_GENERATION_CLEARING_TILES :{BLACK}Δημιουργία άγριας και πετρώδης περιοχής STR_GENERATION_TOWN_GENERATION :{BLACK}Δημιουργία πόλης +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Δημιουργία βιομηχανίας γης +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Δημιουργία βιομηχανίας νερού STR_GENERATION_OBJECT_GENERATION :{BLACK}Δημιουργία μη μετακινούμενων STR_GENERATION_TREE_GENERATION :{BLACK}Δημιουργία δέντρων STR_GENERATION_SETTINGUP_GAME :{BLACK}Ρύθμιση παιχνιδιού @@ -5369,6 +5373,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Η αρ STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... και τα δύο άκρα της γέφυρας πρέπει να είναι σε έδαφος STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... η γέφυρα είναι πολλή μακριά STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Η γέφυρα θα καταλήξει εκτός χάρτη +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για σταθμό +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για οδική στάση +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για αποβάθρα +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για σημαδούρα +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για σιδηροδρομικό σημείο αναφοράς +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για οδικό σημείο αναφοράς +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Η γέφυρα είναι {HEIGHT} πολύ χαμηλή για κλείδωμα # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Δεν μπορεί να κατασκευαστεί σήραγγα εδώ... diff --git a/src/lang/polish.txt b/src/lang/polish.txt index fa73f92c9f..f26c53b4a4 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -633,6 +633,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}st{P opa opy óp} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}skok{P "" i ów} poziomu # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}d{P zień ni ni} @@ -2542,6 +2543,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Jeśli kiedykol STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperialne (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metryczne (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Jednostki gry (skoki poziomu) STR_CONFIG_SETTING_LOCALISATION :Lokalizacja STR_CONFIG_SETTING_GRAPHICS :Grafika @@ -3851,6 +3853,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Tworzeni STR_GENERATION_RIVER_GENERATION :{BLACK}Tworzenie rzek STR_GENERATION_CLEARING_TILES :{BLACK}Tworzenie terenów skalistych i nierówności STR_GENERATION_TOWN_GENERATION :{BLACK}Tworzenie miast +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Tworzenie fabryk na lądzie +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Tworzenie przemysłu na wodzie STR_GENERATION_OBJECT_GENERATION :{BLACK}Rozmieszczanie obiektów STR_GENERATION_TREE_GENERATION :{BLACK}Rozmieszczanie drzew STR_GENERATION_SETTINGUP_GAME :{BLACK}Konfigurowanie rozgrywki @@ -5654,6 +5658,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Począte STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... końce mostu muszą znajdować się na lądzie STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... za długi most STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Koniec mostu poza mapą +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Most jest o {HEIGHT} za niski dla stacji +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Most jest o {HEIGHT} za niski dla przystanku +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Most jest o {HEIGHT} za niski dla portu +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Most jest o {HEIGHT} za niski dla boi +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Most jest o {HEIGHT} za niski dla posterunku kolejowego +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Most jest o {HEIGHT} za niski dla posterunku drogowego +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Most jest o {HEIGHT} za niski dla śluzy # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nie można tutaj zbudować tunelu... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 710514ee7e..e800b2a356 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -138,7 +138,7 @@ STR_ABBREV_GOODS :BN STR_ABBREV_GRAIN :CR STR_ABBREV_WOOD :MD STR_ABBREV_IRON_ORE :FR -STR_ABBREV_STEEL :AC +STR_ABBREV_STEEL :AÇ STR_ABBREV_VALUABLES :VL STR_ABBREV_COPPER_ORE :CO STR_ABBREV_MAIZE :ML @@ -150,14 +150,14 @@ STR_ABBREV_GOLD :OU STR_ABBREV_WATER :AG STR_ABBREV_WHEAT :TR STR_ABBREV_RUBBER :BR -STR_ABBREV_SUGAR :AÇ +STR_ABBREV_SUGAR :AÚ STR_ABBREV_TOYS :BQ STR_ABBREV_SWEETS :DC STR_ABBREV_COLA :CL STR_ABBREV_CANDYFLOSS :AD STR_ABBREV_BUBBLES :BO STR_ABBREV_TOFFEE :CM -STR_ABBREV_BATTERIES :BA +STR_ABBREV_BATTERIES :PI STR_ABBREV_PLASTIC :PL STR_ABBREV_FIZZY_DRINKS :RF STR_ABBREV_ALL :TODOS @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}pé{P "" s} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}níve{P l is} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}dia{P "" s} @@ -760,7 +761,7 @@ STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Empreendedor STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Industrialista STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Capitalista STR_HIGHSCORE_PERFORMANCE_TITLE_MAGNATE :Magnata -STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Grande Magnata +STR_HIGHSCORE_PERFORMANCE_TITLE_MOGUL :Barão STR_HIGHSCORE_PERFORMANCE_TITLE_TYCOON_OF_THE_CENTURY :Magnata do Século STR_HIGHSCORE_NAME :{PRESIDENT_NAME}, {COMPANY} STR_HIGHSCORE_STATS :{BIG_FONT}"{STRING}" ({COMMA}) @@ -1057,7 +1058,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_60_MINUTES :A cada 60 minut STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_120_MINUTES :A cada 120 minutos STR_GAME_OPTIONS_LANGUAGE :Língua -STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :Selecionar a Língua da interface do jogo +STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :Selecionar a língua da interface do jogo STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM}% concluído) STR_GAME_OPTIONS_FULLSCREEN :Ecrã Inteiro @@ -1096,9 +1097,9 @@ STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :Sondagem automatizada STR_GAME_OPTIONS_PARTICIPATE_SURVEY :Participar numa sondagem automatizada -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :Quando ativo, o OpenTTD transmitirá uma sondagem ao deixar um jogo +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :Quando ativo, o OpenTTD enviará dados para sondagem ao sair de um jogo STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :Sobre sondagem e privacidade -STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :Isto abre um navegador com mais informações sobre a sondagem automatizada +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :Isto abre o navegador com mais informações sobre a sondagem automatizada STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :Pré-visualizar resultado da sondagem STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :Mostrar o resultado da sondagem do jogo atual a decorrer @@ -1159,11 +1160,11 @@ STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Definir STR_CURRENCY_SUFFIX :{LTBLUE}Sufixo: {ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Definir o sufixo para a sua moeda -STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Mudar para o Euro: {ORANGE}{NUM} -STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Mudar para o Euro: {ORANGE}Nunca +STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Mudar para o Euro em: {ORANGE}{NUM} +STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Mudar para o Euro em: {ORANGE}Nunca STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para mudar para o Euro -STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais cedo -STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais tarde +STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para o Euro mais cedo +STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para o Euro mais tarde STR_CURRENCY_PREVIEW :{LTBLUE}Pré-visualizar: {ORANGE}{CURRENCY_LONG} STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda @@ -1502,7 +1503,7 @@ STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir estaç STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite a construção de estações de passagem nas ruas pertencentes a localidades. STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :Permitir estações de passagem nas estradas detidas pelos competidores: {STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD_HELPTEXT :Permite a construção de estações de passagem nas estradas que são de outras empresas -STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Não é possível mudar quando já existem veículos. +STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Não é possível alterar esta configuração quando já existem veículos STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Manutenção de infraestruturas: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Quando ativo, as infraestruturas têm custos de manutenção. O custo cresce mais do que o proporcional com o tamanho da rede e assim afeta mais as empresas maiores do que as mais pequenas @@ -2139,14 +2140,14 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Unidades de peso: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Quando um peso é mostrado na interface de utilizador, mostrar na unidade selecionada ###length 3 -STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (short ton) +STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (short t/ton) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Métrico (t/tonelada) STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Unidades de volume: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Quando uma quantidade de volume é mostrada na interface de utilizador, mostrar na unidade selecionada ###length 3 -STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (gal) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (galões) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Métrico (l) STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :SI (m³) @@ -2160,9 +2161,10 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Unidades de altura: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quando as alturas são mostradas no interface de utilizador, mostrar na unidade selecionada ###length 4 -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft/pé) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (pés) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Unidades do jogo (níveis) STR_CONFIG_SETTING_LOCALISATION :Localização STR_CONFIG_SETTING_GRAPHICS :Gráficos @@ -2256,7 +2258,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verifica STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' STR_INTRO_BASESET :{BLACK}O conjunto de gráficos base selecionado tem {NUM} elemento{P "" s} visua{P l is} em falta. Por favor, verifique se existem atualizações para este conjunto. -STR_INTRO_TRANSLATION :{BLACK}Falta{P 0 "" m} traduzir {NUM} linha{P "" s} neste idioma. Por favor, ajude o OpenTTD em inscrever-se como tradutor. Leia readme.txt para mais detalhes. +STR_INTRO_TRANSLATION :{BLACK}Falta{P 0 "" m} traduzir {NUM} linha{P "" s} nesta língua. Por favor, ajude o OpenTTD em inscrever-se como tradutor. Leia readme.txt para mais detalhes. # Quit window STR_QUIT_CAPTION :{WHITE}Sair @@ -3023,7 +3025,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Comprar # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Seleção de Objeto -STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Pré-visualização do objecto +STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Pré-visualização do objeto STR_OBJECT_BUILD_SIZE :{BLACK}Tamanho: {GOLD}{NUM} x {NUM} mosaicos STR_OBJECT_CLASS_LTHS :Faróis @@ -3140,9 +3142,9 @@ STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Custo de STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Receitas apuradas: {LTBLUE}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_OWNER_N_A :N/D STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Proprietário: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Dono da estrada: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Dono da linha de elétrico: {LTBLUE}{STRING} -STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Dono da linha férrea: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_ROAD_OWNER :{BLACK}Proprietário da estrada: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_TRAM_OWNER :{BLACK}Proprietário da linha de elétrico: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_RAIL_OWNER :{BLACK}Proprietário da linha de comboio: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Autoridade local: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nenhuma STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Coordenadas: {LTBLUE}{NUM} x {NUM} x {NUM} @@ -3472,6 +3474,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}A gerar STR_GENERATION_RIVER_GENERATION :{BLACK}A gerar rios STR_GENERATION_CLEARING_TILES :{BLACK}A gerar zonas rochosas e montanhosas STR_GENERATION_TOWN_GENERATION :{BLACK}A gerar localidades +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}A gerar indústrias terrestres +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}A gerar indústrias fluviais STR_GENERATION_OBJECT_GENERATION :{BLACK}A gerar objetos STR_GENERATION_TREE_GENERATION :{BLACK}A gerar árvores STR_GENERATION_SETTINGUP_GAME :{BLACK}A configurar jogo @@ -3559,10 +3563,10 @@ STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Número # NewGRF inspect window STR_NEWGRF_INSPECT_CAPTION :{WHITE}Inspeccionar - {STRING} STR_NEWGRF_INSPECT_PARENT_BUTTON :{BLACK}Pai -STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspecciona o objecto do escopo pai +STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspeciona o objeto do escopo pai STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} em {HEX} -STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Objecto +STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Objeto STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Tipo de ferrovia STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :Tipo de estrada @@ -3765,7 +3769,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{Y # Goal window STR_GOALS_CAPTION :{WHITE}Objetivos de {COMPANY} STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objetivos globais -STR_GOALS_SPECTATOR :Objectivos Globais +STR_GOALS_SPECTATOR :Objetivos Globais STR_GOALS_GLOBAL_BUTTON :{BLACK}Global STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostrar objetivos globais STR_GOALS_COMPANY_BUTTON :{BLACK}Empresa @@ -4984,7 +4988,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Jogo gravado nu STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Ficheiro não é legível STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Não é possível escrever ficheiro STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :Falha ao verificar integridade de dados -STR_GAME_SAVELOAD_ERROR_PATCHPACK :Salvar o jogo é feito com uma versão modificada +STR_GAME_SAVELOAD_ERROR_PATCHPACK :Jogo foi gravado com uma versão modificada STR_GAME_SAVELOAD_NOT_AVAILABLE : STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}O jogo foi guardado numa versão sem suporte para elétricos. Todos os elétricos foram removidos. @@ -5027,7 +5031,7 @@ STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY :{WHITE}Dinheiro STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}É necessário terreno plano STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Terreno inclinado na direção incorreta STR_ERROR_CAN_T_DO_THIS :{WHITE}Não é possível fazer isto... -STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifício deve ser demolido primeiro +STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifício tem que ser demolido primeiro STR_ERROR_BUILDING_IS_PROTECTED :{WHITE}... o edifício está protegido STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Não é possível limpar esta área... STR_ERROR_SITE_UNSUITABLE :{WHITE}... sítio inadequado @@ -5055,7 +5059,7 @@ STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}A escava STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... já está ao nível do mar STR_ERROR_TOO_HIGH :{WHITE}... demasiado alto STR_ERROR_ALREADY_LEVELLED :{WHITE}... já está nivelado -STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}Ponte acima seria demasiado alta. +STR_ERROR_BRIDGE_TOO_HIGH_AFTER_LOWER_LAND :{WHITE}A ponte acima ficaria demasiado alta. # Company related errors STR_ERROR_CAN_T_CHANGE_COMPANY_NAME :{WHITE}Não é possível alterar o nome da empresa... @@ -5269,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Início STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos os extremos da ponte devem estar em terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte terminaria fora do mapa +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a estação +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a paragem rodoviária +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a doca +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a boia +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte está {HEIGHT} abaixo do necessário para o ponto de controlo ferroviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte está {HEIGHT} abaixo do necessário para o ponto de controlo rodoviário +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte está {HEIGHT} abaixo do necessário para a eclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Não é possível construir túnel aqui... @@ -5281,12 +5292,12 @@ STR_ERROR_TUNNEL_TOO_LONG :{WHITE}... tún # Object related errors STR_ERROR_TOO_MANY_OBJECTS :{WHITE}... demasiados objetos -STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Não é possível construir objecto... -STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objecto no caminho +STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Não é possível construir objeto... +STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Objeto no caminho STR_ERROR_COMPANY_HEADQUARTERS_IN :{WHITE}... sede de empresa no caminho STR_ERROR_CAN_T_PURCHASE_THIS_LAND :{WHITE}Não é possível comprar esta área de terreno... STR_ERROR_YOU_ALREADY_OWN_IT :{WHITE}... já lhe pertence! -STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... atingido o limite de construção de objeto +STR_ERROR_BUILD_OBJECT_LIMIT_REACHED :{WHITE}... foi atingido o limite de construção de objetos # Group related errors STR_ERROR_GROUP_CAN_T_CREATE :{WHITE}Não é possível criar grupo... @@ -5904,10 +5915,10 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} -STR_CURRENCY_SHORT_KILO :{NBSP}k -STR_CURRENCY_SHORT_MEGA :{NBSP}M -STR_CURRENCY_SHORT_GIGA :{NBSP}G -STR_CURRENCY_SHORT_TERA :{NBSP}T +STR_CURRENCY_SHORT_KILO :{NBSP}mil +STR_CURRENCY_SHORT_MEGA :{NBSP}milh. +STR_CURRENCY_SHORT_GIGA :{NBSP}mil milh. +STR_CURRENCY_SHORT_TERA :{NBSP}bilh. STR_JUST_CARGO :{CARGO_LONG} STR_JUST_LEFT_ARROW :{LEFT_ARROW} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index bdbcf8b558..f9ca11109c 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -380,6 +380,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}фут{P "" а ов} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}м STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}м +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}уров{P ень ня ней} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}д{P ень ня ней} @@ -2275,8 +2276,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Показыв STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :английская (миль/ч) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :метрическая (км/ч) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :СИ (м/с) -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Внутренние единицы (клеток/день) -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Внутренние единицы (клеток/сек.) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Игровые единицы (клеток/день) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Игровые единицы (клеток/сек.) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :узлы STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Система единиц для мощности: {STRING} @@ -2313,6 +2314,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Показыв STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :английская (фут) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :метрическая (м) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СИ (м) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Игровые единицы (уровни) STR_CONFIG_SETTING_LOCALISATION :Локализация STR_CONFIG_SETTING_GRAPHICS :Графика @@ -3646,6 +3648,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Созд STR_GENERATION_RIVER_GENERATION :{BLACK}Создание рек STR_GENERATION_CLEARING_TILES :{BLACK}Расстановка декораций и камней STR_GENERATION_TOWN_GENERATION :{BLACK}Создание городов +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Создание наземных предприятий +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Создание водных предприятий STR_GENERATION_OBJECT_GENERATION :{BLACK}Создание объектов STR_GENERATION_TREE_GENERATION :{BLACK}Высадка лесов STR_GENERATION_SETTINGUP_GAME :{BLACK}Настройка @@ -5455,6 +5459,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Нача STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... оба конца моста должны опираться на землю STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... мост слишком длинный STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Мост выходит за пределы карты +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Высота моста {HEIGHT} недостаточна для строительства станции +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Высота моста {HEIGHT} недостаточна для строительства остановки +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Высота моста {HEIGHT} недостаточна для строительства пристани +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Высота моста {HEIGHT} недостаточна для установки буя +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Высота моста {HEIGHT} недостаточна для строительства маршрутной точки +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Высота моста {HEIGHT} недостаточна для строительства маршрутной точки +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Высота моста {HEIGHT} недостаточна для строительства шлюза # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Здесь невозможно построить туннель... diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index dff4404491..488b609c9f 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}fot STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}nivå{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" ar} @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Närhelst en h STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Brittisk (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Spelenheter (nivåer) STR_CONFIG_SETTING_LOCALISATION :Lokalisering STR_CONFIG_SETTING_GRAPHICS :Grafik @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landskap STR_GENERATION_RIVER_GENERATION :{BLACK}Generera Flod STR_GENERATION_CLEARING_TILES :{BLACK}Svår och stenig markgenerering STR_GENERATION_TOWN_GENERATION :{BLACK}Stadsgenerering +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Generering av markindustri +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Generering av vattenindustri STR_GENERATION_OBJECT_GENERATION :{BLACK}Generera objekt STR_GENERATION_TREE_GENERATION :{BLACK}Generera Träd STR_GENERATION_SETTINGUP_GAME :{BLACK}Ställer in spel @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start- o STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... brons båda ändar måste vara på land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... för lång bro STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bron slutar utanför kartans gränser +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bron är {HEIGHT} för låg för station +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bron är {HEIGHT} för låg för depå +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bron är {HEIGHT} för låg för en kaj +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bron är {HEIGHT} för låg för boj +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bron är {HEIGHT} för låg för järnvägsriktmärke +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bron är {HEIGHT} för låg för vägriktmärke +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bron är {HEIGHT} för låg för sluss # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan inte bygga tunnel här... diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index dc2f58726d..89d7aabf11 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}英呎 STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}公尺 +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}層 # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}日 @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :在界面上以 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :英制(英呎) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :米制(米) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :國際單位(米) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :遊戲單位(層次) STR_CONFIG_SETTING_LOCALISATION :本地化 STR_CONFIG_SETTING_GRAPHICS :圖形 @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}景觀 STR_GENERATION_RIVER_GENERATION :{BLACK}產生河流 STR_GENERATION_CLEARING_TILES :{BLACK}產生荒地與岩石地貌 STR_GENERATION_TOWN_GENERATION :{BLACK}市鎮生成 +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}產生陸上工業 +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}產生水上工業 STR_GENERATION_OBJECT_GENERATION :{BLACK}無法移動 STR_GENERATION_TREE_GENERATION :{BLACK}產生樹木 STR_GENERATION_SETTINGUP_GAME :{BLACK}設定遊戲 @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}開始 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... 橋樑的兩端應在陸地上 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}……橋樑過長 STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}橋的終點將會在地圖外 +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}橋高 {HEIGHT},不足以興建車站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}橋高 {HEIGHT},不足以興建車站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}橋高 {HEIGHT},不足以興建碼頭 +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}橋高 {HEIGHT},不足以放置浮標 +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}橋高 {HEIGHT},不足以興建中途站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}橋高 {HEIGHT},不足以興建中途站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}橋高 {HEIGHT},不足以興建水閘 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}無法在此挖掘隧道... From b43cdcba01c74b3a9b4f03b8c8b4a3b49dadfffe Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 27 Oct 2025 04:41:32 +0000 Subject: [PATCH 150/280] Update: Translations from eints norwegian (bokmal): 12 changes by eriksorngard portuguese: 1 change by jcteotonio polish: 2 changes by pAter-exe, 2 changes by Rito13 --- src/lang/norwegian_bokmal.txt | 13 ++++++++++++- src/lang/polish.txt | 8 ++++---- src/lang/portuguese.txt | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 6c48f2ccca..0121c8b0fa 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -256,6 +256,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}fot STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}nivå{P "" er} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" er} @@ -2164,6 +2165,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Når en høyde STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperisk (fot) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisk (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Spillenheter (nivåer) STR_CONFIG_SETTING_LOCALISATION :Lokalisering STR_CONFIG_SETTING_GRAPHICS :Grafikk @@ -3470,9 +3472,11 @@ STR_GENERATION_PROGRESS :{WHITE}{NUM}{NB STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM} STR_GENERATION_WORLD_GENERATION :{BLACK}Generer en verden STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landskapsgenerering -STR_GENERATION_RIVER_GENERATION :{BLACK}Skap elver +STR_GENERATION_RIVER_GENERATION :{BLACK}Elvegenerering STR_GENERATION_CLEARING_TILES :{BLACK}Generering av ulendt og steinete område STR_GENERATION_TOWN_GENERATION :{BLACK}Bygenerering +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Landindustrigenerering +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Vannindustrigenerering STR_GENERATION_OBJECT_GENERATION :{BLACK}Objektgenerering STR_GENERATION_TREE_GENERATION :{BLACK}Tregenerering STR_GENERATION_SETTINGUP_GAME :{BLACK}Klargjør spillet @@ -5270,6 +5274,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start og STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}...{NBSP}broens ender må være på land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... broen er for lang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bro vil ende utenfor kartet +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Broen er {HEIGHT} for lav for en stasjon +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Broen er {HEIGHT} for lav for en holdeplass +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Broen er {HEIGHT} for lav for en havn +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Broen er {HEIGHT} for lav for en bøye +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Broen er {HEIGHT} for lav for et veipunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Broen er {HEIGHT} for lav for et veipunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Broen er {HEIGHT} for lav for en sluse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan ikke bygge tunnel her... diff --git a/src/lang/polish.txt b/src/lang/polish.txt index f26c53b4a4..5e983a32f1 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -633,7 +633,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}st{P opa opy óp} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m -STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}skok{P "" i ów} poziomu +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}poziom{P "" y ów} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}d{P zień ni ni} @@ -2543,7 +2543,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Jeśli kiedykol STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperialne (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metryczne (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Jednostki gry (skoki poziomu) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Jednostki gry (poziomy) STR_CONFIG_SETTING_LOCALISATION :Lokalizacja STR_CONFIG_SETTING_GRAPHICS :Grafika @@ -2928,7 +2928,7 @@ STR_NETWORK_ASK_RELAY_NO :{BLACK}Nie STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Tak, ten jeden raz STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Tak, nie pytaj ponownie -STR_NETWORK_ASK_SURVEY_CAPTION :Uczestniczyć w automatycznej ankiecie? +STR_NETWORK_ASK_SURVEY_CAPTION :Uczestnictwo w automatycznej ankiecie? STR_NETWORK_ASK_SURVEY_TEXT :Czy chcesz wziąć udział w automatycznej ankiecie?{}OpenTTD prześle ankietę przy opuszczaniu gry.{}Możesz to zmienić w dowolnym momencie w „Opcjach gry”. STR_NETWORK_ASK_SURVEY_PREVIEW :Podejrzyj wynik ankiety STR_NETWORK_ASK_SURVEY_LINK :O ankiecie i prywatności @@ -3853,7 +3853,7 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Tworzeni STR_GENERATION_RIVER_GENERATION :{BLACK}Tworzenie rzek STR_GENERATION_CLEARING_TILES :{BLACK}Tworzenie terenów skalistych i nierówności STR_GENERATION_TOWN_GENERATION :{BLACK}Tworzenie miast -STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Tworzenie fabryk na lądzie +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Tworzenie przemysłu na lądzie STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Tworzenie przemysłu na wodzie STR_GENERATION_OBJECT_GENERATION :{BLACK}Rozmieszczanie obiektów STR_GENERATION_TREE_GENERATION :{BLACK}Rozmieszczanie drzew diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index e800b2a356..d5b20f7f15 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -5918,7 +5918,7 @@ STR_WAYPOINT_NAME :{WAYPOINT} STR_CURRENCY_SHORT_KILO :{NBSP}mil STR_CURRENCY_SHORT_MEGA :{NBSP}milh. STR_CURRENCY_SHORT_GIGA :{NBSP}mil milh. -STR_CURRENCY_SHORT_TERA :{NBSP}bilh. +STR_CURRENCY_SHORT_TERA :{NBSP}bil. STR_JUST_CARGO :{CARGO_LONG} STR_JUST_LEFT_ARROW :{LEFT_ARROW} From d1376d0b6701a673542636e2405ba47d34aa9c1c Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 27 Oct 2025 14:18:31 -0400 Subject: [PATCH 151/280] Fix #14737: Don't scale custom town and industry counts by land area (#14738) --- src/industry_cmd.cpp | 4 ++-- src/town_cmd.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 292f379f8e..3cc143aa6b 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2494,8 +2494,8 @@ void GenerateIndustries() /* Total number of industries scaled by land/water proportion. */ uint total_amount = p.total * GetNumberOfIndustries() / (lprob.total + wprob.total); - /* Scale land-based industries to the land proportion. */ - if (!water) total_amount = Map::ScaleByLandProportion(total_amount); + /* Scale land-based industries to the land proportion, unless the player has set a custom industry count. */ + if (!water && _settings_game.difficulty.industry_density != ID_CUSTOM) total_amount = Map::ScaleByLandProportion(total_amount); /* Ensure that forced industries are generated even if the scaled amounts are too low. */ if (p.total == 0 || total_amount < p.num_forced) { diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 4ba9143c84..60cde52c29 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2421,7 +2421,7 @@ bool GenerateTowns(TownLayout layout, std::optional number) if (number.has_value()) { total = number.value(); } else if (_settings_game.difficulty.number_towns == static_cast(CUSTOM_TOWN_NUMBER_DIFFICULTY)) { - total = Map::ScaleByLandProportion(GetDefaultTownsForMapSize()); + total = GetDefaultTownsForMapSize(); } else { total = Map::ScaleByLandProportion(GetDefaultTownsForMapSize() + (Random() & 7)); } From 6295310f2584f1ac23fcde399d8faae4b02d16a2 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 28 Oct 2025 04:38:50 +0000 Subject: [PATCH 152/280] Update: Translations from eints chinese (traditional): 4 changes by KogentaSan chinese (simplified): 11 changes by WenSimEHRP catalan: 11 changes by J0anJosep --- src/lang/catalan.txt | 11 +++++++++++ src/lang/simplified_chinese.txt | 11 +++++++++++ src/lang/traditional_chinese.txt | 8 ++++---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 2835c09afd..bfcbcc843e 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{G=Masculin}{DE STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{G=Masculin}{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}nivell{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}di{P a es} @@ -2163,6 +2164,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quan es mostren STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (peu) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Mètric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Unitats de la partida (nivells) STR_CONFIG_SETTING_LOCALISATION :Localització STR_CONFIG_SETTING_GRAPHICS :Gràfics @@ -3472,6 +3474,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Generaci STR_GENERATION_RIVER_GENERATION :{BLACK}Generació de rius STR_GENERATION_CLEARING_TILES :{BLACK}Generació d'una àrea escarpada i rocosa STR_GENERATION_TOWN_GENERATION :{BLACK}Generació de poblacions +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Generació d'indústries terrestres +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Generació d'indústries a l'aigua STR_GENERATION_OBJECT_GENERATION :{BLACK}Generació inamovible STR_GENERATION_TREE_GENERATION :{BLACK}Generació d'arbres STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurant la partida @@ -5269,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Inici i STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... els extrems del pont han d'estar tots dos a terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... el pont és massa llarg STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}El pont acabaria fora del mapa +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}El pont és {HEIGHT} massa baix per a l'estació. +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}El pont és {HEIGHT} massa baix per a la parada de carretera. +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}El pont és {HEIGHT} massa baix per al moll. +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}El pont és {HEIGHT} massa baix per a la boia. +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}El pont és {HEIGHT} massa baix per al punt de pas. +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}El pont és {HEIGHT} massa baix per al punt de pas de carretera. +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}El pont és {HEIGHT} massa baix per a la resclosa. # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Aquí no es pot construir el túnel... diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index d89c02dac6..17e04752d0 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}英尺 STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}米 +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}层 # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}日 @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :在界面上以 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :英制(呎) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :公制(米) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :国际单位制(米) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :游戏单位(层) STR_CONFIG_SETTING_LOCALISATION :本地化 STR_CONFIG_SETTING_GRAPHICS :图形 @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}景观 STR_GENERATION_RIVER_GENERATION :{BLACK}生成河流 STR_GENERATION_CLEARING_TILES :{BLACK}生成岩石地貌 STR_GENERATION_TOWN_GENERATION :{BLACK}城镇生成 +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}生成陆上工业 +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}生成水上工业 STR_GENERATION_OBJECT_GENERATION :{BLACK}生成固定设施 STR_GENERATION_TREE_GENERATION :{BLACK}生成树木 STR_GENERATION_SETTINGUP_GAME :{BLACK}设置游戏 @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}起止 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}……桥梁两端必须都位于地面上 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}……桥梁太长 STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}桥梁终点将越出地图 +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设车站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设车站 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设码头 +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}桥梁过低,尚需 {HEIGHT}净空以放置浮标 +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设路点 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设路点 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}桥梁过低,尚需 {HEIGHT}净空以建设船闸 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}不能在这里开凿隧道…… diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 89d7aabf11..23c0ccb9e5 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -241,11 +241,11 @@ STR_UNITS_WEIGHT_LONG_SI :{DECIMAL}{NBSP} STR_UNITS_VOLUME_SHORT_IMPERIAL :{DECIMAL}{NBSP}加侖 STR_UNITS_VOLUME_SHORT_METRIC :{DECIMAL}{NBSP}升 -STR_UNITS_VOLUME_SHORT_SI :{DECIMAL}{NBSP}米³ +STR_UNITS_VOLUME_SHORT_SI :{DECIMAL}{NBSP}立方公尺 STR_UNITS_VOLUME_LONG_IMPERIAL :{DECIMAL}{NBSP}加侖 STR_UNITS_VOLUME_LONG_METRIC :{DECIMAL}{NBSP}公升 -STR_UNITS_VOLUME_LONG_SI :{DECIMAL}{NBSP}立方米 +STR_UNITS_VOLUME_LONG_SI :{DECIMAL}{NBSP}立方公尺 STR_UNITS_FORCE_IMPERIAL :{DECIMAL}{NBSP}磅力 STR_UNITS_FORCE_METRIC :{DECIMAL}{NBSP}公斤力 @@ -2162,8 +2162,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :在界面上以 ###length 4 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :英制(英呎) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :米制(米) -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :國際單位(米) -STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :遊戲單位(層次) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :國際單位(公尺) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :遊戲單位(層) STR_CONFIG_SETTING_LOCALISATION :本地化 STR_CONFIG_SETTING_GRAPHICS :圖形 From 534918ccb022babae0b9e48b40d21d2795ef5611 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 28 Oct 2025 22:05:23 +0000 Subject: [PATCH 153/280] Codechange: Simplify YAPF debug helpers a little. (#14741) Remove template magic to get C-array size. --- src/misc/dbg_helpers.cpp | 8 ++++---- src/misc/dbg_helpers.h | 33 ++++++++++--------------------- src/pathfinder/yapf/yapf_type.hpp | 2 +- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp index bc51801fa9..65076410f6 100644 --- a/src/misc/dbg_helpers.cpp +++ b/src/misc/dbg_helpers.cpp @@ -23,13 +23,13 @@ static const std::string_view trackdir_names[] = { /** Return name of given Trackdir. */ std::string ValueStr(Trackdir td) { - return fmt::format("{} ({})", to_underlying(td), ItemAtT(td, trackdir_names, "UNK", INVALID_TRACKDIR, "INV")); + return fmt::format("{} ({})", to_underlying(td), ItemAt(td, trackdir_names, "UNK", INVALID_TRACKDIR, "INV")); } /** Return composed name of given TrackdirBits. */ std::string ValueStr(TrackdirBits td_bits) { - return fmt::format("{} ({})", to_underlying(td_bits), ComposeNameT(td_bits, trackdir_names, "UNK", INVALID_TRACKDIR_BIT, "INV")); + return fmt::format("{} ({})", to_underlying(td_bits), ComposeName(td_bits, trackdir_names, "UNK", INVALID_TRACKDIR_BIT, "INV")); } @@ -41,7 +41,7 @@ static const std::string_view diagdir_names[] = { /** Return name of given DiagDirection. */ std::string ValueStr(DiagDirection dd) { - return fmt::format("{} ({})", to_underlying(dd), ItemAtT(dd, diagdir_names, "UNK", INVALID_DIAGDIR, "INV")); + return fmt::format("{} ({})", to_underlying(dd), ItemAt(dd, diagdir_names, "UNK", INVALID_DIAGDIR, "INV")); } @@ -53,7 +53,7 @@ static const std::string_view signal_type_names[] = { /** Return name of given SignalType. */ std::string ValueStr(SignalType t) { - return fmt::format("{} ({})", to_underlying(t), ItemAtT(t, signal_type_names, "UNK")); + return fmt::format("{} ({})", to_underlying(t), ItemAt(t, signal_type_names, "UNK")); } diff --git a/src/misc/dbg_helpers.h b/src/misc/dbg_helpers.h index 69e598fb74..6cf520e861 100644 --- a/src/misc/dbg_helpers.h +++ b/src/misc/dbg_helpers.h @@ -18,24 +18,14 @@ #include "../track_type.h" #include "../core/format.hpp" -/** Helper template class that provides C array length and item type */ -template struct ArrayT; - -/** Helper template class that provides C array length and item type */ -template struct ArrayT { - static const size_t length = N; - using Item = T; -}; - - /** * Helper template function that returns item of array at given index * or t_unk when index is out of bounds. */ -template -inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::Item t_unk) +template +inline std::string_view ItemAt(E idx, std::span t, std::string_view t_unk) { - if (static_cast(idx) >= ArrayT::length) { + if (static_cast(idx) >= std::size(t)) { return t_unk; } return t[idx]; @@ -46,16 +36,13 @@ inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::I * or t_inv when index == idx_inv * or t_unk when index is out of bounds. */ -template -inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::Item t_unk, E idx_inv, typename ArrayT::Item t_inv) +template +inline std::string_view ItemAt(E idx, std::span t, std::string_view t_unk, E idx_inv, std::string_view t_inv) { - if (static_cast(idx) < ArrayT::length) { - return t[idx]; - } if (idx == idx_inv) { return t_inv; } - return t_unk; + return ItemAt(idx, t, t_unk); } /** @@ -64,8 +51,8 @@ inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::I * or t_inv when index == idx_inv * or t_unk when index is out of bounds. */ -template -inline std::string ComposeNameT(E value, T &t, std::string_view t_unk, E val_inv, std::string_view name_inv) +template +inline std::string ComposeName(E value, std::span t, std::string_view t_unk, E val_inv, std::string_view name_inv) { std::string out; if (value == val_inv) { @@ -73,7 +60,7 @@ inline std::string ComposeNameT(E value, T &t, std::string_view t_unk, E val_inv } else if (value == 0) { out = ""; } else { - for (size_t i = 0; i < ArrayT::length; i++) { + for (size_t i = 0; i < std::size(t); i++) { if ((value & (1 << i)) == 0) continue; out += (!out.empty() ? "+" : ""); out += t[i]; @@ -93,7 +80,7 @@ inline std::string ComposeNameT(E value, T &t, std::string_view t_unk, E val_inv * or unknown_name when index is out of bounds. */ template -inline std::string ComposeNameT(E value, std::span names, std::string_view unknown_name) +inline std::string ComposeName(E value, std::span names, std::string_view unknown_name) { std::string out; if (value.base() == 0) { diff --git a/src/pathfinder/yapf/yapf_type.hpp b/src/pathfinder/yapf/yapf_type.hpp index 2a045e0785..7aeb0f80af 100644 --- a/src/pathfinder/yapf/yapf_type.hpp +++ b/src/pathfinder/yapf/yapf_type.hpp @@ -72,7 +72,7 @@ inline std::string ValueStr(EndSegmentReasons flags) "PATH_TOO_LONG", "FIRST_TWO_WAY_RED", "LOOK_AHEAD_END", "TARGET_REACHED" }; - return fmt::format("0x{:04X} ({})", flags.base(), ComposeNameT(flags, end_segment_reason_names, "UNK")); + return fmt::format("0x{:04X} ({})", flags.base(), ComposeName(flags, end_segment_reason_names, "UNK")); } #endif /* YAPF_TYPE_HPP */ From 3b0276130237da27138b0d34b7584783d7911d73 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 29 Oct 2025 04:41:13 +0000 Subject: [PATCH 154/280] Update: Translations from eints english (us): 11 changes by 2TallTyler --- src/lang/english_US.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 3528b41f3f..1a529a17b0 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}level{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}day{P "" s} @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Whenever a heig STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Game units (levels) STR_CONFIG_SETTING_LOCALISATION :Localization STR_CONFIG_SETTING_GRAPHICS :Graphics @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscap STR_GENERATION_RIVER_GENERATION :{BLACK}River generation STR_GENERATION_CLEARING_TILES :{BLACK}Rough and rocky area generation STR_GENERATION_TOWN_GENERATION :{BLACK}Town generation +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Land industry generation +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Water industry generation STR_GENERATION_OBJECT_GENERATION :{BLACK}Object generation STR_GENERATION_TREE_GENERATION :{BLACK}Tree generation STR_GENERATION_SETTINGUP_GAME :{BLACK}Setting up game @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ends of bridge must both be on land STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... bridge too long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bridge would end out of the map +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bridge is {HEIGHT} too low for station +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bridge is {HEIGHT} too low for road stop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bridge is {HEIGHT} too low for dock +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bridge is {HEIGHT} too low for buoy +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for rail waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bridge is {HEIGHT} too low for road waypoint +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bridge is {HEIGHT} too low for lock # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Can't build tunnel here... From 3ebedecb4a206006fabda84970ed8c79b810eb62 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Wed, 29 Oct 2025 20:18:00 +0000 Subject: [PATCH 155/280] Add: [Script] Auto-convert ObjectType bool to integer when setting values for items in lists via [] (#14308) --- src/script/api/script_list.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 90bc74d0b7..086a6b603d 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -854,18 +854,32 @@ SQInteger ScriptList::_get(HSQUIRRELVM vm) SQInteger ScriptList::_set(HSQUIRRELVM vm) { if (sq_gettype(vm, 2) != OT_INTEGER) return SQ_ERROR; - if (sq_gettype(vm, 3) != OT_INTEGER && sq_gettype(vm, 3) != OT_NULL) { - return sq_throwerror(vm, "you can only assign integers to this list"); - } - SQInteger idx, val; + SQInteger idx; sq_getinteger(vm, 2, &idx); - if (sq_gettype(vm, 3) == OT_NULL) { - this->RemoveItem(idx); - return 0; + + /* Retrieve the return value */ + SQInteger val; + switch (sq_gettype(vm, 3)) { + case OT_NULL: + this->RemoveItem(idx); + return 0; + + case OT_BOOL: { + SQBool v; + sq_getbool(vm, 3, &v); + val = v ? 1 : 0; + break; + } + + case OT_INTEGER: + sq_getinteger(vm, 3, &val); + break; + + default: + return sq_throwerror(vm, "you can only assign integers to this list"); } - sq_getinteger(vm, 3, &val); if (!this->HasItem(idx)) { this->AddItem(idx, val); return 0; From 3f19240bbef1db737887130cf23f612bd9e31983 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:36:43 +0000 Subject: [PATCH 156/280] Doc 313c6c4: [Script] GetAllRailTypes and GetRailType are from ScriptEngine (#14745) --- src/script/api/ai_changelog.hpp | 4 ++-- src/script/api/game_changelog.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 9d976962a1..dbb10f1df7 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -29,7 +29,7 @@ * \li AICargo::CC_NON_POTABLE * \li AIVehicleList_Waypoint * \li AIError::ERR_BRIDGE_TOO_LOW - * \li AIRail::GetAllRailTypes + * \li AIEngine::GetAllRailTypes * * Other changes: * \li AIBridge::GetBridgeID renamed to AIBridge::GetBridgeType @@ -37,7 +37,7 @@ * \li AIList instances can now be saved * \li AIVehicleList_Station accepts an optional AIVehicle::VehicleType parameter * \li AIList instances can now be cloned - * \li AIRail::GetRailType will only return the first RailType of an engine, use AIRail::GetAllRailTypes instead + * \li AIEngine::GetRailType will only return the first RailType of an engine, use AIEngine::GetAllRailTypes instead * * \b 14.0 * diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 50c91de6bd..4dbb379896 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -30,7 +30,7 @@ * \li GSVehicleList_Waypoint * \li GSBaseStation::GetOwner * \li GSError::ERR_BRIDGE_TOO_LOW - * \li GSRail::GetAllRailTypes + * \li GSEngine::GetAllRailTypes * * Other changes: * \li GSBridge::GetBridgeID renamed to GSBridge::GetBridgeType @@ -38,7 +38,7 @@ * \li GSList instances can now be saved * \li GSVehicleList_Station accepts an optional GSVehicle::VehicleType parameter * \li GSList instances can now be cloned - * \li GSRail::GetRailType will only return the first RailType of an engine, use GSRail::GetAllRailTypes instead + * \li GSEngine::GetRailType will only return the first RailType of an engine, use GSEngine::GetAllRailTypes instead * * \b 14.0 * From 038c4d2b8783919de29e4bbb6d2e56410102c5fc Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 30 Oct 2025 20:22:30 +0000 Subject: [PATCH 157/280] Codechange: Make driver probe behave the same as loading by name. (#14736) Inconsistent initialisation order when setting active driver and starting the driver. --- src/driver.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/driver.cpp b/src/driver.cpp index 70e2071524..10b0f890b4 100644 --- a/src/driver.cpp +++ b/src/driver.cpp @@ -145,11 +145,12 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t /* Keep old driver in case we need to switch back, or may still need to process an OS callback. */ auto oldd = std::move(GetActiveDriver(type)); - GetActiveDriver(type) = d->CreateInstance(); + auto newd = d->CreateInstance(); - auto err = GetActiveDriver(type)->Start({}); + auto err = newd->Start({}); if (!err) { Debug(driver, 1, "Successfully probed {} driver '{}'", GetDriverTypeName(type), d->name); + GetActiveDriver(type) = std::move(newd); return true; } From 20fd2b5014bdbafe554345f256b4688caf5b8dbc Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:38:49 +0000 Subject: [PATCH 158/280] Codefix: Add missing 'this->' in ScriptList (#14747) --- src/script/api/script_list.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 086a6b603d..fc629d39fe 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -100,7 +100,7 @@ public: this->item_next = *this->bucket_list_iter; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -139,7 +139,7 @@ public: if (this->IsEnd()) return 0; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -149,7 +149,7 @@ public: /* If we remove the 'next' item, skip to the next */ if (item == this->item_next) { - FindNext(); + this->FindNext(); return; } } @@ -194,7 +194,7 @@ public: this->item_next = *this->bucket_list_iter; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -234,7 +234,7 @@ public: if (this->IsEnd()) return 0; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -244,7 +244,7 @@ public: /* If we remove the 'next' item, skip to the next */ if (item == this->item_next) { - FindNext(); + this->FindNext(); return; } } @@ -277,7 +277,7 @@ public: this->item_next = this->item_iter->first; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -296,7 +296,7 @@ public: return; } ++this->item_iter; - if (this->item_iter != this->list->items.end()) item_next = this->item_iter->first; + if (this->item_iter != this->list->items.end()) this->item_next = this->item_iter->first; } SQInteger Next() override @@ -304,7 +304,7 @@ public: if (this->IsEnd()) return 0; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -314,7 +314,7 @@ public: /* If we remove the 'next' item, skip to the next */ if (item == this->item_next) { - FindNext(); + this->FindNext(); return; } } @@ -351,7 +351,7 @@ public: this->item_next = this->item_iter->first; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -375,7 +375,7 @@ public: } else { --this->item_iter; } - if (this->item_iter != this->list->items.end()) item_next = this->item_iter->first; + if (this->item_iter != this->list->items.end()) this->item_next = this->item_iter->first; } SQInteger Next() override @@ -383,7 +383,7 @@ public: if (this->IsEnd()) return 0; SQInteger item_current = this->item_next; - FindNext(); + this->FindNext(); return item_current; } @@ -393,7 +393,7 @@ public: /* If we remove the 'next' item, skip to the next */ if (item == this->item_next) { - FindNext(); + this->FindNext(); return; } } @@ -763,7 +763,7 @@ void ScriptList::RemoveList(ScriptList *list) this->modifications++; if (list == this) { - Clear(); + this->Clear(); } else { for (const auto &item : list->items) { this->RemoveItem(item.first); From 8ea347a811659b6105de91802fd5354a38322f1c Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:26:47 +0100 Subject: [PATCH 159/280] Remove: Rail type cost from replace vehicle window. (#14748) --- src/newgrf_badge_gui.cpp | 5 +++++ src/newgrf_badge_gui.h | 1 + src/rail_gui.cpp | 2 +- src/road_gui.cpp | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 491986c82b..0a1290fedb 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -243,6 +243,11 @@ private: using DropDownListBadgeItem = DropDownBadges, FS_SMALL, true>>; using DropDownListBadgeIconItem = DropDownBadges, FS_SMALL, true>>; +std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, std::string &&str, int value, bool masked, bool shaded) +{ + return std::make_unique(gui_classes, badges, feature, introduction_date, "", std::move(str), value, masked, shaded); +} + std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, std::string &&str, int value, bool masked, bool shaded) { return std::make_unique(gui_classes, badges, feature, introduction_date, GetString(STR_JUST_CURRENCY_SHORT, cost), std::move(str), value, masked, shaded); diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index b908cf7f55..bd47f05aaf 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -50,6 +50,7 @@ private: int DrawBadgeNameList(Rect r, std::span badges, GrfSpecFeature feature); void DrawBadgeColumn(Rect r, int column_group, const GUIBadgeClasses &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, PaletteID remap); +std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, std::string &&str, int value, bool masked = false, bool shaded = false); std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, std::string &&str, int value, bool masked = false, bool shaded = false); std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked = false, bool shaded = false); diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index a0d8688096..f577582df0 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -2065,7 +2065,7 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option) const RailTypeInfo *rti = GetRailTypeInfo(rt); if (for_replacement) { - list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, RailBuildCost(rt), GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt))); } else { std::string str = rti->max_speed > 0 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed) diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 3e37167a76..7928f9c5a5 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1805,7 +1805,7 @@ DropDownList GetRoadTypeDropDownList(RoadTramTypes rtts, bool for_replacement, b const RoadTypeInfo *rti = GetRoadTypeInfo(rt); if (for_replacement) { - list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, RoadBuildCost(rt), GetString(rti->strings.replace_text), rt, !avail_roadtypes.Test(rt))); + list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_ROADTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_roadtypes.Test(rt))); } else { std::string str = rti->max_speed > 0 ? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed / 2) From 7c855c69fa40a03530201cca3cb4784e3c326997 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 1 Nov 2025 04:37:15 +0000 Subject: [PATCH 160/280] Update: Translations from eints dutch: 11 changes by Afoklala --- src/lang/dutch.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 2fe998bbeb..ce787417e8 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}niveau{P "" s} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" en} @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Wanneer hoogtes STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperiaal (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrisch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Speleenheden (niveaus) STR_CONFIG_SETTING_LOCALISATION :Lokalisatie STR_CONFIG_SETTING_GRAPHICS :Grafische elementen @@ -3471,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscha STR_GENERATION_RIVER_GENERATION :{BLACK}Rivierplaatsing STR_GENERATION_CLEARING_TILES :{BLACK}Ontwikkeling van ruig en rotsachtig gebied STR_GENERATION_TOWN_GENERATION :{BLACK}Steden genereren +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Landindustrieontwikkeling +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Waterindustrieontwikkeling STR_GENERATION_OBJECT_GENERATION :{BLACK}Ontwikkeling van onverplaatsbare objecten STR_GENERATION_TREE_GENERATION :{BLACK}Bosplaatsing STR_GENERATION_SETTINGUP_GAME :{BLACK}Spel wordt geconfigureerd @@ -5268,6 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Begin en STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... uiteinden van brug moeten beiden op land zijn STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... brug te lang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Brug zou eindigen buiten de kaart +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Brug is {HEIGHT} te laag voor station +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Brug is {HEIGHT} te laag voor halte +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Brug is {HEIGHT} te laag voor dok +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Brug {HEIGHT} te laag voor boei +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Brug {HEIGHT} te laag voor spoorroutepunt +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Brug is {HEIGHT} te laag voor wegroutepunt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Brug is {HEIGHT} te laag voor sluis # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kan hier geen tunnel bouwen... From 34bbae05dbb8997e65271afdef65e5526968d260 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 1 Nov 2025 14:25:24 +0000 Subject: [PATCH 161/280] Codechange: Use enum/EnumBitSet for livery in use flags. (#14746) Replaces magic numbers. --- src/company_cmd.cpp | 22 +++++++++++----------- src/company_gui.cpp | 10 +++++----- src/group_cmd.cpp | 18 +++++++++--------- src/livery.h | 9 ++++++++- src/saveload/company_sl.cpp | 4 ++-- src/script/api/script_group.cpp | 4 ++-- src/vehicle.cpp | 6 +++--- 7 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 577f54b4b4..c336e4bf21 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -574,14 +574,14 @@ restart:; void ResetCompanyLivery(Company *c) { for (LiveryScheme scheme = LS_BEGIN; scheme < LS_END; scheme++) { - c->livery[scheme].in_use = 0; + c->livery[scheme].in_use.Reset(); c->livery[scheme].colour1 = c->colour; c->livery[scheme].colour2 = c->colour; } for (Group *g : Group::Iterate()) { if (g->owner == c->index) { - g->livery.in_use = 0; + g->livery.in_use.Reset(); g->livery.colour1 = c->colour; g->livery.colour2 = c->colour; } @@ -1077,8 +1077,8 @@ CommandCost CmdSetCompanyManagerFace(DoCommandFlags flags, uint style, uint32_t void UpdateCompanyLiveries(Company *c) { for (int i = 1; i < LS_END; i++) { - if (!HasBit(c->livery[i].in_use, 0)) c->livery[i].colour1 = c->livery[LS_DEFAULT].colour1; - if (!HasBit(c->livery[i].in_use, 1)) c->livery[i].colour2 = c->livery[LS_DEFAULT].colour2; + if (!c->livery[i].in_use.Test(Livery::Flag::Primary)) c->livery[i].colour1 = c->livery[LS_DEFAULT].colour1; + if (!c->livery[i].in_use.Test(Livery::Flag::Secondary)) c->livery[i].colour2 = c->livery[LS_DEFAULT].colour2; } UpdateCompanyGroupLiveries(c); } @@ -1109,7 +1109,7 @@ CommandCost CmdSetCompanyColour(DoCommandFlags flags, LiveryScheme scheme, bool if (flags.Test(DoCommandFlag::Execute)) { if (primary) { - if (scheme != LS_DEFAULT) AssignBit(c->livery[scheme].in_use, 0, colour != INVALID_COLOUR); + if (scheme != LS_DEFAULT) c->livery[scheme].in_use.Set(Livery::Flag::Primary, colour != INVALID_COLOUR); if (colour == INVALID_COLOUR) colour = c->livery[LS_DEFAULT].colour1; c->livery[scheme].colour1 = colour; @@ -1122,7 +1122,7 @@ CommandCost CmdSetCompanyColour(DoCommandFlags flags, LiveryScheme scheme, bool CompanyAdminUpdate(c); } } else { - if (scheme != LS_DEFAULT) AssignBit(c->livery[scheme].in_use, 1, colour != INVALID_COLOUR); + if (scheme != LS_DEFAULT) c->livery[scheme].in_use.Set(Livery::Flag::Secondary, colour != INVALID_COLOUR); if (colour == INVALID_COLOUR) colour = c->livery[LS_DEFAULT].colour2; c->livery[scheme].colour2 = colour; @@ -1131,16 +1131,16 @@ CommandCost CmdSetCompanyColour(DoCommandFlags flags, LiveryScheme scheme, bool } } - if (c->livery[scheme].in_use != 0) { + if (c->livery[scheme].in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary})) { /* If enabling a scheme, set the default scheme to be in use too */ - c->livery[LS_DEFAULT].in_use = 1; + c->livery[LS_DEFAULT].in_use.Set(Livery::Flag::Primary); } else { /* Else loop through all schemes to see if any are left enabled. * If not, disable the default scheme too. */ - c->livery[LS_DEFAULT].in_use = 0; + c->livery[LS_DEFAULT].in_use.Reset({Livery::Flag::Primary, Livery::Flag::Secondary}); for (scheme = LS_DEFAULT; scheme < LS_END; scheme++) { - if (c->livery[scheme].in_use != 0) { - c->livery[LS_DEFAULT].in_use = 1; + if (c->livery[scheme].in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary})) { + c->livery[LS_DEFAULT].in_use.Set(Livery::Flag::Primary); break; } } diff --git a/src/company_gui.cpp b/src/company_gui.cpp index bf336ed35a..b302f5874e 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -655,7 +655,7 @@ private: } uint8_t sel; - if (default_livery == nullptr || HasBit(livery->in_use, primary ? 0 : 1)) { + if (default_livery == nullptr || livery->in_use.Test(primary ? Livery::Flag::Primary : Livery::Flag::Secondary)) { sel = primary ? livery->colour1 : livery->colour2; } else { sel = default_col; @@ -819,7 +819,7 @@ public: } if (scheme == LS_END) scheme = LS_DEFAULT; const Livery *livery = &c->livery[scheme]; - if (scheme == LS_DEFAULT || HasBit(livery->in_use, primary ? 0 : 1)) { + if (scheme == LS_DEFAULT || livery->in_use.Test(primary ? Livery::Flag::Primary : Livery::Flag::Secondary)) { colour = STR_COLOUR_DARK_BLUE + (primary ? livery->colour1 : livery->colour2); } } @@ -827,7 +827,7 @@ public: if (this->sel != GroupID::Invalid()) { const Group *g = Group::Get(this->sel); const Livery *livery = &g->livery; - if (HasBit(livery->in_use, primary ? 0 : 1)) { + if (livery->in_use.Test(primary ? Livery::Flag::Primary : Livery::Flag::Secondary)) { colour = STR_COLOUR_DARK_BLUE + (primary ? livery->colour1 : livery->colour2); } } @@ -875,12 +875,12 @@ public: /* Text below the first dropdown. */ DrawSprite(SPR_SQUARE, GetColourPalette(livery.colour1), pri_squ.left, y + square_offs); - DrawString(pri.left, pri.right, y + text_offs, (is_default_scheme || HasBit(livery.in_use, 0)) ? STR_COLOUR_DARK_BLUE + livery.colour1 : STR_COLOUR_DEFAULT, is_selected ? TC_WHITE : TC_GOLD); + DrawString(pri.left, pri.right, y + text_offs, (is_default_scheme || livery.in_use.Test(Livery::Flag::Primary)) ? STR_COLOUR_DARK_BLUE + livery.colour1 : STR_COLOUR_DEFAULT, is_selected ? TC_WHITE : TC_GOLD); /* Text below the second dropdown. */ if (sec.right > sec.left) { // Second dropdown has non-zero size. DrawSprite(SPR_SQUARE, GetColourPalette(livery.colour2), sec_squ.left, y + square_offs); - DrawString(sec.left, sec.right, y + text_offs, (is_default_scheme || HasBit(livery.in_use, 1)) ? STR_COLOUR_DARK_BLUE + livery.colour2 : STR_COLOUR_DEFAULT, is_selected ? TC_WHITE : TC_GOLD); + DrawString(sec.left, sec.right, y + text_offs, (is_default_scheme || livery.in_use.Test(Livery::Flag::Secondary)) ? STR_COLOUR_DARK_BLUE + livery.colour2 : STR_COLOUR_DEFAULT, is_selected ? TC_WHITE : TC_GOLD); } y += this->line_height; diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index b0e4ce4ee5..2ba83c4dd8 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -306,8 +306,8 @@ static void PropagateChildLivery(const Group *g, bool reset_cache) for (const GroupID &childgroup : g->children) { Group *cg = Group::Get(childgroup); - if (!HasBit(cg->livery.in_use, 0)) cg->livery.colour1 = g->livery.colour1; - if (!HasBit(cg->livery.in_use, 1)) cg->livery.colour2 = g->livery.colour2; + if (!cg->livery.in_use.Test(Livery::Flag::Primary)) cg->livery.colour1 = g->livery.colour1; + if (!cg->livery.in_use.Test(Livery::Flag::Secondary)) cg->livery.colour2 = g->livery.colour2; PropagateChildLivery(cg, reset_cache); } } @@ -321,8 +321,8 @@ void UpdateCompanyGroupLiveries(const Company *c) { for (Group *g : Group::Iterate()) { if (g->owner == c->index && g->parent == GroupID::Invalid()) { - if (!HasBit(g->livery.in_use, 0)) g->livery.colour1 = c->livery[LS_DEFAULT].colour1; - if (!HasBit(g->livery.in_use, 1)) g->livery.colour2 = c->livery[LS_DEFAULT].colour2; + if (!g->livery.in_use.Test(Livery::Flag::Primary)) g->livery.colour1 = c->livery[LS_DEFAULT].colour1; + if (!g->livery.in_use.Test(Livery::Flag::Secondary)) g->livery.colour2 = c->livery[LS_DEFAULT].colour2; PropagateChildLivery(g, false); } } @@ -480,11 +480,11 @@ CommandCost CmdAlterGroup(DoCommandFlags flags, AlterGroupMode mode, GroupID gro GroupStatistics::UpdateAutoreplace(g->owner); - if (!HasBit(g->livery.in_use, 0) || !HasBit(g->livery.in_use, 1)) { + if (!g->livery.in_use.All({Livery::Flag::Primary, Livery::Flag::Secondary})) { /* Update livery with new parent's colours if either colour is default. */ const Livery *livery = GetParentLivery(g); - if (!HasBit(g->livery.in_use, 0)) g->livery.colour1 = livery->colour1; - if (!HasBit(g->livery.in_use, 1)) g->livery.colour2 = livery->colour2; + if (!g->livery.in_use.Test(Livery::Flag::Primary)) g->livery.colour1 = livery->colour1; + if (!g->livery.in_use.Test(Livery::Flag::Secondary)) g->livery.colour2 = livery->colour2; PropagateChildLivery(g, true); MarkWholeScreenDirty(); @@ -684,11 +684,11 @@ CommandCost CmdSetGroupLivery(DoCommandFlags flags, GroupID group_id, bool prima if (flags.Test(DoCommandFlag::Execute)) { if (primary) { - AssignBit(g->livery.in_use, 0, colour != INVALID_COLOUR); + g->livery.in_use.Set(Livery::Flag::Primary, colour != INVALID_COLOUR); if (colour == INVALID_COLOUR) colour = GetParentLivery(g)->colour1; g->livery.colour1 = colour; } else { - AssignBit(g->livery.in_use, 1, colour != INVALID_COLOUR); + g->livery.in_use.Set(Livery::Flag::Secondary, colour != INVALID_COLOUR); if (colour == INVALID_COLOUR) colour = GetParentLivery(g)->colour2; g->livery.colour2 = colour; } diff --git a/src/livery.h b/src/livery.h index 2de27555d9..31c39f7840 100644 --- a/src/livery.h +++ b/src/livery.h @@ -10,6 +10,7 @@ #ifndef LIVERY_H #define LIVERY_H +#include "core/enum_type.hpp" #include "company_type.h" #include "gfx_type.h" @@ -76,7 +77,13 @@ DECLARE_ENUM_AS_ADDABLE(LiveryClass) /** Information about a particular livery. */ struct Livery { - uint8_t in_use = 0; ///< Bit 0 set if this livery should override the default livery first colour, Bit 1 for the second colour. + enum class Flag : uint8_t { + Primary = 0, ///< Primary colour is set. + Secondary = 1, ///< Secondary colour is set. + }; + using Flags = EnumBitSet; + + Flags in_use{}; ///< Livery flags. Colours colour1 = COLOUR_BEGIN; ///< First colour, for all vehicles. Colours colour2 = COLOUR_BEGIN; ///< Second colour, for vehicles with 2CC support. }; diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 679b42bded..5ed2a63111 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -445,11 +445,11 @@ public: for (size_t i = 0; i < num_liveries; i++) { SlObject(&c->livery[i], this->GetLoadDescription()); if (update_in_use && i != LS_DEFAULT) { - if (c->livery[i].in_use == 0) { + if (!c->livery[i].in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary})) { c->livery[i].colour1 = c->livery[LS_DEFAULT].colour1; c->livery[i].colour2 = c->livery[LS_DEFAULT].colour2; } else { - c->livery[i].in_use = 3; + c->livery[i].in_use = {Livery::Flag::Primary, Livery::Flag::Secondary}; } } } diff --git a/src/script/api/script_group.cpp b/src/script/api/script_group.cpp index 486032cd70..5713fddc35 100644 --- a/src/script/api/script_group.cpp +++ b/src/script/api/script_group.cpp @@ -241,7 +241,7 @@ EnforcePrecondition(ScriptCompany::Colours::COLOUR_INVALID, IsValidGroup(group_id)); const Group *g = ::Group::Get(group_id); - if (!HasBit(g->livery.in_use, 0)) return ScriptCompany::Colours::COLOUR_INVALID; + if (!g->livery.in_use.Test(Livery::Flag::Primary)) return ScriptCompany::Colours::COLOUR_INVALID; return (ScriptCompany::Colours)g->livery.colour1; } @@ -250,6 +250,6 @@ EnforcePrecondition(ScriptCompany::Colours::COLOUR_INVALID, IsValidGroup(group_id)); const Group *g = ::Group::Get(group_id); - if (!HasBit(g->livery.in_use, 1)) return ScriptCompany::Colours::COLOUR_INVALID; + if (!g->livery.in_use.Test(Livery::Flag::Secondary)) return ScriptCompany::Colours::COLOUR_INVALID; return (ScriptCompany::Colours)g->livery.colour2; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index bb1973e56e..95764752d2 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2052,16 +2052,16 @@ const Livery *GetEngineLivery(EngineID engine_type, CompanyID company, EngineID const Group *g = Group::GetIfValid(v->First()->group_id); if (g != nullptr) { /* Traverse parents until we find a livery or reach the top */ - while (g->livery.in_use == 0 && g->parent != GroupID::Invalid()) { + while (!g->livery.in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary}) && g->parent != GroupID::Invalid()) { g = Group::Get(g->parent); } - if (g->livery.in_use != 0) return &g->livery; + if (g->livery.in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary})) return &g->livery; } } /* The default livery is always available for use, but its in_use flag determines * whether any _other_ liveries are in use. */ - if (c->livery[LS_DEFAULT].in_use != 0) { + if (c->livery[LS_DEFAULT].in_use.Any({Livery::Flag::Primary, Livery::Flag::Secondary})) { /* Determine the livery scheme to use */ scheme = GetEngineLiveryScheme(engine_type, parent_engine_type, v); } From 66b6d71e3264a8fd8d9a7b1025d7e537af6c97ec Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 1 Nov 2025 22:33:00 +0000 Subject: [PATCH 162/280] Codechange: Use std::initializer_list for NWidgetPart data. (#14749) Avoids using C/C++ arrays. --- src/ai/ai_gui.cpp | 2 +- src/airport_gui.cpp | 4 ++-- src/autoreplace_gui.cpp | 6 +++--- src/bootstrap_gui.cpp | 8 ++++---- src/bridge_gui.cpp | 2 +- src/build_vehicle_gui.cpp | 2 +- src/cheat_gui.cpp | 2 +- src/company_gui.cpp | 12 ++++++------ src/console_gui.cpp | 2 +- src/date_gui.cpp | 2 +- src/depot_gui.cpp | 2 +- src/dock_gui.cpp | 8 ++++---- src/dropdown.cpp | 2 +- src/engine_gui.cpp | 2 +- src/error_gui.cpp | 4 ++-- src/fios_gui.cpp | 8 ++++---- src/framerate_gui.cpp | 4 ++-- src/game/game_gui.cpp | 2 +- src/genworld_gui.cpp | 8 ++++---- src/goal_gui.cpp | 2 +- src/graph_gui.cpp | 20 ++++++++++---------- src/group_gui.cpp | 2 +- src/help_gui.cpp | 2 +- src/highscore_gui.cpp | 2 +- src/industry_gui.cpp | 8 ++++---- src/intro_gui.cpp | 2 +- src/league_gui.cpp | 4 ++-- src/linkgraph/linkgraph_gui.cpp | 2 +- src/main_gui.cpp | 2 +- src/misc_gui.cpp | 10 +++++----- src/music_gui.cpp | 4 ++-- src/network/network_chat_gui.cpp | 2 +- src/network/network_content_gui.cpp | 4 ++-- src/network/network_gui.cpp | 12 ++++++------ src/newgrf_debug_gui.cpp | 6 +++--- src/newgrf_gui.cpp | 14 +++++++------- src/news_gui.cpp | 12 ++++++------ src/object_gui.cpp | 2 +- src/order_gui.cpp | 6 +++--- src/osk_gui.cpp | 2 +- src/picker_gui.cpp | 4 ++-- src/rail_gui.cpp | 10 +++++----- src/road_gui.cpp | 16 ++++++++-------- src/screenshot_gui.cpp | 2 +- src/script/script_gui.cpp | 6 +++--- src/settings_gui.cpp | 8 ++++---- src/signs_gui.cpp | 4 ++-- src/smallmap_gui.cpp | 6 +++--- src/station_gui.cpp | 6 +++--- src/statusbar_gui.cpp | 2 +- src/story_gui.cpp | 2 +- src/subsidy_gui.cpp | 2 +- src/terraform_gui.cpp | 4 ++-- src/textfile_gui.cpp | 2 +- src/timetable_gui.cpp | 2 +- src/toolbar_gui.cpp | 6 +++--- src/town_gui.cpp | 12 ++++++------ src/transparency_gui.cpp | 2 +- src/tree_gui.cpp | 2 +- src/vehicle_gui.cpp | 10 +++++----- src/viewport_gui.cpp | 2 +- src/waypoint_gui.cpp | 2 +- 62 files changed, 157 insertions(+), 157 deletions(-) diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index c13e313130..4dd4a8c671 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -28,7 +28,7 @@ /** Widgets for the configure AI window. */ -static constexpr NWidgetPart _nested_ai_config_widgets[] = { +static constexpr std::initializer_list _nested_ai_config_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 51ba9ffd66..3520857915 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -197,7 +197,7 @@ struct BuildAirToolbarWindow : Window { }, AirportToolbarGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_air_toolbar_widgets[] = { +static constexpr std::initializer_list _nested_air_toolbar_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_TOOLBAR_AIRCRAFT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -580,7 +580,7 @@ public: }}; }; -static constexpr NWidgetPart _nested_build_airport_widgets[] = { +static constexpr std::initializer_list _nested_build_airport_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_AIRPORT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 67f9707769..d38708ce6b 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -698,7 +698,7 @@ public: } }; -static constexpr NWidgetPart _nested_replace_rail_vehicle_widgets[] = { +static constexpr std::initializer_list _nested_replace_rail_vehicle_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), @@ -762,7 +762,7 @@ static WindowDesc _replace_rail_vehicle_desc( _nested_replace_rail_vehicle_widgets ); -static constexpr NWidgetPart _nested_replace_road_vehicle_widgets[] = { +static constexpr std::initializer_list _nested_replace_road_vehicle_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), @@ -820,7 +820,7 @@ static WindowDesc _replace_road_vehicle_desc( _nested_replace_road_vehicle_widgets ); -static constexpr NWidgetPart _nested_replace_vehicle_widgets[] = { +static constexpr std::initializer_list _nested_replace_vehicle_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_RV_CAPTION), SetMinimalSize(433, 14), diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 1cfd582c0d..3dcdeae43a 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -33,7 +33,7 @@ #include "safeguards.h" /** Widgets for the background window to prevent smearing. */ -static constexpr NWidgetPart _background_widgets[] = { +static constexpr std::initializer_list _background_widgets = { NWidget(WWT_PANEL, COLOUR_DARK_BLUE, WID_BB_BACKGROUND), SetResize(1, 1), EndContainer(), }; @@ -66,7 +66,7 @@ public: }; /** Nested widgets for the error window. */ -static constexpr NWidgetPart _nested_bootstrap_errmsg_widgets[] = { +static constexpr std::initializer_list _nested_bootstrap_errmsg_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CAPTION, COLOUR_GREY, WID_BEM_CAPTION), SetStringTip(STR_MISSING_GRAPHICS_ERROR_TITLE), EndContainer(), @@ -123,7 +123,7 @@ public: }; /** Nested widgets for the download window. */ -static constexpr NWidgetPart _nested_bootstrap_download_status_window_widgets[] = { +static constexpr std::initializer_list _nested_bootstrap_download_status_window_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), @@ -174,7 +174,7 @@ public: }; /** The widgets for the query. It has no close box as that sprite does not exist yet. */ -static constexpr NWidgetPart _bootstrap_query_widgets[] = { +static constexpr std::initializer_list _bootstrap_query_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_MISSING_GRAPHICS_SET_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), EndContainer(), diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index c29d8bb86d..ca4cc5161c 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -309,7 +309,7 @@ const std::initializer_list BuildBridgeWind }; /** Widgets of the bridge gui. */ -static constexpr NWidgetPart _nested_build_bridge_widgets[] = { +static constexpr std::initializer_list _nested_build_bridge_widgets = { /* Header */ NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 812e9e3280..ea6efdcfc4 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -58,7 +58,7 @@ uint GetEngineListHeight(VehicleType type) return std::max(GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.matrix.Vertical(), GetVehicleImageCellSize(type, EIT_PURCHASE).height); } -static constexpr NWidgetPart _nested_build_vehicle_widgets[] = { +static constexpr std::initializer_list _nested_build_vehicle_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_BV_CAPTION), SetTextStyle(TC_WHITE), diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 5cbdb1f78f..af45b55ac7 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -219,7 +219,7 @@ static const CheatEntry _cheats_ui[] = { static_assert(CHT_NUM_CHEATS == lengthof(_cheats_ui)); /** Widget definitions of the cheat GUI. */ -static constexpr NWidgetPart _nested_cheat_widgets[] = { +static constexpr std::initializer_list _nested_cheat_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CHEATS, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/company_gui.cpp b/src/company_gui.cpp index b302f5874e..29efaf7c3d 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -286,7 +286,7 @@ static void DrawYearColumn(const Rect &r, TimerGameEconomy::Year year, const Exp DrawPrice(sum, r.left, r.right, y, TC_WHITE); } -static constexpr NWidgetPart _nested_company_finances_widgets[] = { +static constexpr std::initializer_list _nested_company_finances_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_CF_CAPTION), @@ -1062,7 +1062,7 @@ public: } }; -static constexpr NWidgetPart _nested_select_company_livery_widgets[] = { +static constexpr std::initializer_list _nested_select_company_livery_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SCL_CAPTION), @@ -1161,7 +1161,7 @@ void DrawCompanyManagerFace(const CompanyManagerFace &cmf, Colours colour, const } /** Nested widget description for the company manager face selection dialog */ -static constexpr NWidgetPart _nested_select_company_manager_face_widgets[] = { +static constexpr std::initializer_list _nested_select_company_manager_face_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SCMF_CAPTION), SetStringTip(STR_FACE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1536,7 +1536,7 @@ static void DoSelectCompanyManagerFace(Window *parent) new SelectCompanyManagerFaceWindow(_select_company_manager_face_desc, parent); } -static constexpr NWidgetPart _nested_company_infrastructure_widgets[] = { +static constexpr std::initializer_list _nested_company_infrastructure_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_CI_CAPTION), @@ -1840,7 +1840,7 @@ static void ShowCompanyInfrastructure(CompanyID company) AllocateWindowDescFront(_company_infrastructure_desc, company); } -static constexpr NWidgetPart _nested_company_widgets[] = { +static constexpr std::initializer_list _nested_company_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_C_CAPTION), @@ -2405,7 +2405,7 @@ private: Money company_value{}; ///< The value of the company for which the user can buy it. }; -static constexpr NWidgetPart _nested_buy_company_widgets[] = { +static constexpr std::initializer_list _nested_buy_company_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE, WID_BC_CAPTION), diff --git a/src/console_gui.cpp b/src/console_gui.cpp index 06db00510f..1dba122e92 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -133,7 +133,7 @@ static inline void IConsoleResetHistoryPos() static std::optional IConsoleHistoryAdd(std::string_view cmd); static void IConsoleHistoryNavigate(int direction); -static constexpr NWidgetPart _nested_console_window_widgets[] = { +static constexpr std::initializer_list _nested_console_window_widgets = { NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_BACKGROUND), SetResize(1, 1), }; diff --git a/src/date_gui.cpp b/src/date_gui.cpp index 02ab436d63..81dbbd5ffc 100644 --- a/src/date_gui.cpp +++ b/src/date_gui.cpp @@ -173,7 +173,7 @@ struct SetDateWindow : Window { }; /** Widgets for the date setting window. */ -static constexpr NWidgetPart _nested_set_date_widgets[] = { +static constexpr std::initializer_list _nested_set_date_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_DATE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 3644a31694..bfec17d9aa 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -47,7 +47,7 @@ */ /** Nested widget definition for train depots. */ -static constexpr NWidgetPart _nested_train_depot_widgets[] = { +static constexpr std::initializer_list _nested_train_depot_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_D_SHOW_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), // rename button diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index e247c01396..caad21a280 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -333,7 +333,7 @@ struct BuildDocksToolbarWindow : Window { * Nested widget parts of docks toolbar, game version. * Position of #WID_DT_RIVER widget has changed. */ -static constexpr NWidgetPart _nested_build_docks_toolbar_widgets[] = { +static constexpr std::initializer_list _nested_build_docks_toolbar_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WATERWAYS_TOOLBAR_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -378,7 +378,7 @@ Window *ShowBuildDocksToolbar() * Nested widget parts of docks toolbar, scenario editor version. * Positions of #WID_DT_DEPOT, #WID_DT_STATION, and #WID_DT_BUOY widgets have changed. */ -static constexpr NWidgetPart _nested_build_docks_scen_toolbar_widgets[] = { +static constexpr std::initializer_list _nested_build_docks_scen_toolbar_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WATERWAYS_TOOLBAR_CAPTION_SE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -478,7 +478,7 @@ public: }; /** Nested widget parts of a build dock station window. */ -static constexpr NWidgetPart _nested_build_dock_station_widgets[] = { +static constexpr std::initializer_list _nested_build_dock_station_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_DOCK_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -579,7 +579,7 @@ public: } }; -static constexpr NWidgetPart _nested_build_docks_depot_widgets[] = { +static constexpr std::initializer_list _nested_build_docks_depot_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_DEPOT_BUILD_SHIP_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/dropdown.cpp b/src/dropdown.cpp index d3df9a731a..30e56c3fb2 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -56,7 +56,7 @@ std::unique_ptr MakeDropDownListCheckedItem(bool checked, Stri return std::make_unique(indent, checked, GetString(str), value, masked, shaded); } -static constexpr NWidgetPart _nested_dropdown_menu_widgets[] = { +static constexpr std::initializer_list _nested_dropdown_menu_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_END, WID_DM_ITEMS), SetScrollbar(WID_DM_SCROLL), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_DM_SHOW_SCROLL), diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 19a4eff047..43389f9747 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -52,7 +52,7 @@ StringID GetEngineCategoryName(EngineID engine) } } -static constexpr NWidgetPart _nested_engine_preview_widgets[] = { +static constexpr std::initializer_list _nested_engine_preview_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE), SetStringTip(STR_ENGINE_PREVIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/error_gui.cpp b/src/error_gui.cpp index ed5d0b2ab1..7fe4cc6f12 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -33,7 +33,7 @@ #include "safeguards.h" -static constexpr NWidgetPart _nested_errmsg_widgets[] = { +static constexpr std::initializer_list _nested_errmsg_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_RED), NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION), SetStringTip(STR_ERROR_MESSAGE_CAPTION), @@ -50,7 +50,7 @@ static WindowDesc _errmsg_desc( _nested_errmsg_widgets ); -static constexpr NWidgetPart _nested_errmsg_face_widgets[] = { +static constexpr std::initializer_list _nested_errmsg_face_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_RED), NWidget(WWT_CAPTION, COLOUR_RED, WID_EM_CAPTION), diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 6c2dfb8b90..a4d593dbcf 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -65,7 +65,7 @@ void LoadCheckData::Clear() } /** Load game/scenario with optional content download */ -static constexpr NWidgetPart _nested_load_dialog_widgets[] = { +static constexpr std::initializer_list _nested_load_dialog_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION), @@ -128,7 +128,7 @@ static constexpr NWidgetPart _nested_load_dialog_widgets[] = { }; /** Load heightmap with content download */ -static constexpr NWidgetPart _nested_load_heightmap_dialog_widgets[] = { +static constexpr std::initializer_list _nested_load_heightmap_dialog_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION), @@ -175,7 +175,7 @@ static constexpr NWidgetPart _nested_load_heightmap_dialog_widgets[] = { }; /** Load town data */ -static constexpr NWidgetPart _nested_load_town_data_dialog_widgets[] = { +static constexpr std::initializer_list _nested_load_town_data_dialog_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION), @@ -217,7 +217,7 @@ static constexpr NWidgetPart _nested_load_town_data_dialog_widgets[] = { }; /** Save game/scenario */ -static constexpr NWidgetPart _nested_save_dialog_widgets[] = { +static constexpr std::initializer_list _nested_save_dialog_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SL_CAPTION), diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index 72c0aa2f97..df390d2822 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -377,7 +377,7 @@ static std::string_view GetAIName(int ai_index) } /** @hideinitializer */ -static constexpr NWidgetPart _framerate_window_widgets[] = { +static constexpr std::initializer_list _framerate_window_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_FRW_CAPTION), @@ -695,7 +695,7 @@ static WindowDesc _framerate_display_desc( /** @hideinitializer */ -static constexpr NWidgetPart _frametime_graph_window_widgets[] = { +static constexpr std::initializer_list _frametime_graph_window_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_FGW_CAPTION), SetTextStyle(TC_WHITE), diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index ec47cd6eb5..34e2e30342 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -33,7 +33,7 @@ /** Widgets for the configure GS window. */ -static constexpr NWidgetPart _nested_gs_config_widgets[] = { +static constexpr std::initializer_list _nested_gs_config_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_CAPTION_GAMESCRIPT, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 12d78035be..b98c34c608 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -74,7 +74,7 @@ void SetNewLandscapeType(LandscapeType landscape) } /** Widgets of GenerateLandscapeWindow when generating world */ -static constexpr NWidgetPart _nested_generate_landscape_widgets[] = { +static constexpr std::initializer_list _nested_generate_landscape_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MAPGEN_WORLD_GENERATION_CAPTION), @@ -198,7 +198,7 @@ static constexpr NWidgetPart _nested_generate_landscape_widgets[] = { }; /** Widgets of GenerateLandscapeWindow when loading heightmap */ -static constexpr NWidgetPart _nested_heightmap_load_widgets[] = { +static constexpr std::initializer_list _nested_heightmap_load_widgets = { /* Window header. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), @@ -1244,7 +1244,7 @@ struct CreateScenarioWindow : public Window } }; -static constexpr NWidgetPart _nested_create_scenario_widgets[] = { +static constexpr std::initializer_list _nested_create_scenario_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_SE_MAPGEN_CAPTION), @@ -1317,7 +1317,7 @@ void ShowCreateScenario() new CreateScenarioWindow(_create_scenario_desc, GLWM_SCENARIO); } -static constexpr NWidgetPart _nested_generate_progress_widgets[] = { +static constexpr std::initializer_list _nested_generate_progress_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp index ccf9d98b1e..e44e66644c 100644 --- a/src/goal_gui.cpp +++ b/src/goal_gui.cpp @@ -275,7 +275,7 @@ struct GoalListWindow : public Window { }; /** Widgets of the #GoalListWindow. */ -static constexpr NWidgetPart _nested_goals_list_widgets[] = { +static constexpr std::initializer_list _nested_goals_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_GOAL_CAPTION), diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 962b201405..74b916c168 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -133,7 +133,7 @@ static std::unique_ptr MakeNWidgetCompanyLines() return vert; } -static constexpr NWidgetPart _nested_graph_legend_widgets[] = { +static constexpr std::initializer_list _nested_graph_legend_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_KEY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -935,7 +935,7 @@ struct OperatingProfitGraphWindow : BaseCompanyGraphWindow { } }; -static constexpr NWidgetPart _nested_operating_profit_widgets[] = { +static constexpr std::initializer_list _nested_operating_profit_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_OPERATING_PROFIT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -988,7 +988,7 @@ struct IncomeGraphWindow : BaseCompanyGraphWindow { } }; -static constexpr NWidgetPart _nested_income_graph_widgets[] = { +static constexpr std::initializer_list _nested_income_graph_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_INCOME_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1039,7 +1039,7 @@ struct DeliveredCargoGraphWindow : BaseCompanyGraphWindow { } }; -static constexpr NWidgetPart _nested_delivered_cargo_graph_widgets[] = { +static constexpr std::initializer_list _nested_delivered_cargo_graph_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_CARGO_DELIVERED_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1096,7 +1096,7 @@ struct PerformanceHistoryGraphWindow : BaseCompanyGraphWindow { } }; -static constexpr NWidgetPart _nested_performance_history_widgets[] = { +static constexpr std::initializer_list _nested_performance_history_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1148,7 +1148,7 @@ struct CompanyValueGraphWindow : BaseCompanyGraphWindow { } }; -static constexpr NWidgetPart _nested_company_value_graph_widgets[] = { +static constexpr std::initializer_list _nested_company_value_graph_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_COMPANY_VALUES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1412,7 +1412,7 @@ struct PaymentRatesGraphWindow : BaseCargoGraphWindow { } }; -static constexpr NWidgetPart _nested_cargo_payment_rates_widgets[] = { +static constexpr std::initializer_list _nested_cargo_payment_rates_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1813,7 +1813,7 @@ struct IndustryProductionGraphWindow : BaseCargoGraphWindow { } }; -static constexpr NWidgetPart _nested_industry_production_widgets[] = { +static constexpr std::initializer_list _nested_industry_production_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_GRAPH_CAPTION), @@ -1957,7 +1957,7 @@ struct TownCargoGraphWindow : BaseCargoGraphWindow { } }; -static constexpr NWidgetPart _nested_town_cargo_graph_widgets[] = { +static constexpr std::initializer_list _nested_town_cargo_graph_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_GRAPH_CAPTION), @@ -2042,7 +2042,7 @@ std::unique_ptr MakeCompanyButtonRowsGraphGUI() return MakeCompanyButtonRows(WID_PRD_COMPANY_FIRST, WID_PRD_COMPANY_LAST, COLOUR_BROWN, 8, STR_PERFORMANCE_DETAIL_SELECT_COMPANY_TOOLTIP); } -static constexpr NWidgetPart _nested_performance_rating_detail_widgets[] = { +static constexpr std::initializer_list _nested_performance_rating_detail_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_PERFORMANCE_DETAIL, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/group_gui.cpp b/src/group_gui.cpp index aa761e7c72..af4d073c1a 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -38,7 +38,7 @@ #include "safeguards.h" -static constexpr NWidgetPart _nested_group_widgets[] = { +static constexpr std::initializer_list _nested_group_widgets = { NWidget(NWID_HORIZONTAL), // Window header NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_GL_CAPTION), diff --git a/src/help_gui.cpp b/src/help_gui.cpp index 14c18652a8..b9fa907227 100644 --- a/src/help_gui.cpp +++ b/src/help_gui.cpp @@ -175,7 +175,7 @@ private: } }; -static constexpr NWidgetPart _nested_helpwin_widgets[] = { +static constexpr std::initializer_list _nested_helpwin_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_HELP_WINDOW_CAPTION), diff --git a/src/highscore_gui.cpp b/src/highscore_gui.cpp index fde61eb60b..e5e0a3da4f 100644 --- a/src/highscore_gui.cpp +++ b/src/highscore_gui.cpp @@ -217,7 +217,7 @@ struct HighScoreWindow : EndGameHighScoreBaseWindow { } }; -static constexpr NWidgetPart _nested_highscore_widgets[] = { +static constexpr std::initializer_list _nested_highscore_widgets = { NWidget(WWT_PANEL, COLOUR_BROWN, WID_H_BACKGROUND), SetResize(1, 1), EndContainer(), }; diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index a4f94228e2..25ac005796 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -257,7 +257,7 @@ void SortIndustryTypes() std::sort(_sorted_industry_types.begin(), _sorted_industry_types.end(), IndustryTypeNameSorter); } -static constexpr NWidgetPart _nested_build_industry_widgets[] = { +static constexpr std::initializer_list _nested_build_industry_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_FUND_INDUSTRY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1204,7 +1204,7 @@ static void UpdateIndustryProduction(Industry *i) } /** Widget definition of the view industry gui */ -static constexpr NWidgetPart _nested_industry_view_widgets[] = { +static constexpr std::initializer_list _nested_industry_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_CREAM), NWidget(WWT_CAPTION, COLOUR_CREAM, WID_IV_CAPTION), @@ -1242,7 +1242,7 @@ void ShowIndustryViewWindow(IndustryID industry) } /** Widget definition of the industry directory gui */ -static constexpr NWidgetPart _nested_industry_directory_widgets[] = { +static constexpr std::initializer_list _nested_industry_directory_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_ID_CAPTION), @@ -1931,7 +1931,7 @@ void ShowIndustryDirectory() } /** Widgets of the industry cargoes window. */ -static constexpr NWidgetPart _nested_industry_cargoes_widgets[] = { +static constexpr std::initializer_list _nested_industry_cargoes_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_IC_CAPTION), diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index 642b6f9792..2d84c1ec6c 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -343,7 +343,7 @@ struct SelectGameWindow : public Window { } }; -static constexpr NWidgetPart _nested_select_game_widgets[] = { +static constexpr std::initializer_list _nested_select_game_widgets = { NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_INTRO_CAPTION), NWidget(WWT_PANEL, COLOUR_BROWN), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse), diff --git a/src/league_gui.cpp b/src/league_gui.cpp index 4278ad0ba0..9c1a6a40e4 100644 --- a/src/league_gui.cpp +++ b/src/league_gui.cpp @@ -180,7 +180,7 @@ public: } }; -static constexpr NWidgetPart _nested_performance_league_widgets[] = { +static constexpr std::initializer_list _nested_performance_league_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_COMPANY_LEAGUE_TABLE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -416,7 +416,7 @@ public: } }; -static constexpr NWidgetPart _nested_script_league_widgets[] = { +static constexpr std::initializer_list _nested_script_league_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_SLT_CAPTION), diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index 5cb9320b41..e31dd166aa 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -496,7 +496,7 @@ std::unique_ptr MakeCargoesLegendLinkGraphGUI() } -static constexpr NWidgetPart _nested_linkgraph_legend_widgets[] = { +static constexpr std::initializer_list _nested_linkgraph_legend_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_LGL_CAPTION), SetStringTip(STR_LINKGRAPH_LEGEND_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 2b7a9b9d8f..9cf5411ec0 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -177,7 +177,7 @@ void FixTitleGameZoom(int zoom_adjust) vp.virtual_height = ScaleByZoom(vp.height, vp.zoom); } -static constexpr NWidgetPart _nested_main_window_widgets[] = { +static constexpr std::initializer_list _nested_main_window_widgets = { NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_M_VIEWPORT), SetResize(1, 1), }; diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 55b2b8b867..5b9d683a55 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -47,7 +47,7 @@ enum OskActivation : uint8_t { }; -static constexpr NWidgetPart _nested_land_info_widgets[] = { +static constexpr std::initializer_list _nested_land_info_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_LAND_AREA_INFORMATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -319,7 +319,7 @@ void ShowLandInfo(TileIndex tile) new LandInfoWindow(tile); } -static constexpr NWidgetPart _nested_about_widgets[] = { +static constexpr std::initializer_list _nested_about_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_ABOUT_OPENTTD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -586,7 +586,7 @@ void HideFillingPercent(TextEffectID *te_id) *te_id = INVALID_TE_ID; } -static constexpr NWidgetPart _nested_tooltips_widgets[] = { +static constexpr std::initializer_list _nested_tooltips_widgets = { NWidget(WWT_EMPTY, INVALID_COLOUR, WID_TT_BACKGROUND), }; @@ -975,7 +975,7 @@ struct QueryStringWindow : public Window } }; -static constexpr NWidgetPart _nested_query_string_widgets[] = { +static constexpr std::initializer_list _nested_query_string_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_QS_CAPTION), SetTextStyle(TC_WHITE), @@ -1113,7 +1113,7 @@ struct QueryWindow : public Window { } }; -static constexpr NWidgetPart _nested_query_widgets[] = { +static constexpr std::initializer_list _nested_query_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_RED), NWidget(WWT_CAPTION, COLOUR_RED, WID_Q_CAPTION), diff --git a/src/music_gui.cpp b/src/music_gui.cpp index cbd30c6c40..7bdbf2dead 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -621,7 +621,7 @@ struct MusicTrackSelectionWindow : public Window { } }; -static constexpr NWidgetPart _nested_music_track_selection_widgets[] = { +static constexpr std::initializer_list _nested_music_track_selection_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_MTS_CAPTION), @@ -857,7 +857,7 @@ struct MusicWindow : public Window { } }; -static constexpr NWidgetPart _nested_music_window_widgets[] = { +static constexpr std::initializer_list _nested_music_window_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_MUSIC_JAZZ_JUKEBOX_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index 30bf187c10..865036b424 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -411,7 +411,7 @@ struct NetworkChatWindow : public Window { }; /** The widgets of the chat window. */ -static constexpr NWidgetPart _nested_chat_window_widgets[] = { +static constexpr std::initializer_list _nested_chat_window_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY, WID_NC_CLOSE), NWidget(WWT_PANEL, COLOUR_GREY, WID_NC_BACKGROUND), diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index a184511f98..76acaa217f 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -84,7 +84,7 @@ static void ShowContentTextfileWindow(Window *parent, TextfileType file_type, co } /** Nested widgets for the download window. */ -static constexpr NWidgetPart _nested_network_content_download_status_window_widgets[] = { +static constexpr std::initializer_list _nested_network_content_download_status_window_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CONTENT_DOWNLOAD_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), @@ -1025,7 +1025,7 @@ void BuildContentTypeStringList() } /** The widgets for the content list. */ -static constexpr NWidgetPart _nested_network_content_list_widgets[] = { +static constexpr std::initializer_list _nested_network_content_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE), SetStringTip(STR_CONTENT_TITLE), diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index a437f776f7..9aa146e95f 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -854,7 +854,7 @@ static std::unique_ptr MakeResizableHeader() return std::make_unique(); } -static constexpr NWidgetPart _nested_network_game_widgets[] = { +static constexpr std::initializer_list _nested_network_game_widgets = { /* TOP */ NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), @@ -1129,7 +1129,7 @@ struct NetworkStartServerWindow : public Window { } }; -static constexpr NWidgetPart _nested_network_start_server_window_widgets[] = { +static constexpr std::initializer_list _nested_network_start_server_window_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE), NWidget(WWT_CAPTION, COLOUR_LIGHT_BLUE), SetStringTip(STR_NETWORK_START_SERVER_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1217,7 +1217,7 @@ static void ShowNetworkStartServerWindow() extern void DrawCompanyIcon(CompanyID cid, int x, int y); -static constexpr NWidgetPart _nested_client_list_widgets[] = { +static constexpr std::initializer_list _nested_client_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_NETWORK_CLIENT_LIST_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -2097,7 +2097,7 @@ struct NetworkJoinStatusWindow : Window { } }; -static constexpr NWidgetPart _nested_network_join_status_window_widgets[] = { +static constexpr std::initializer_list _nested_network_join_status_window_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_NETWORK_CONNECTING_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), @@ -2198,7 +2198,7 @@ struct NetworkAskRelayWindow : public Window { } }; -static constexpr NWidgetPart _nested_network_ask_relay_widgets[] = { +static constexpr std::initializer_list _nested_network_ask_relay_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_RED), NWidget(WWT_CAPTION, COLOUR_RED, WID_NAR_CAPTION), SetStringTip(STR_NETWORK_ASK_RELAY_CAPTION), @@ -2293,7 +2293,7 @@ struct NetworkAskSurveyWindow : public Window { } }; -static constexpr NWidgetPart _nested_network_ask_survey_widgets[] = { +static constexpr std::initializer_list _nested_network_ask_survey_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_NAS_CAPTION), SetStringTip(STR_NETWORK_ASK_SURVEY_CAPTION), diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index f3780370bf..e9ba84f5c9 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -624,7 +624,7 @@ struct NewGRFInspectWindow : Window { /* static */ uint32_t NewGRFInspectWindow::var60params[GSF_FAKE_END][0x20] = { {0} }; // Use spec to have 0s in whole array -static constexpr NWidgetPart _nested_newgrf_inspect_chain_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_inspect_chain_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_NGRFI_CAPTION), SetStringTip(STR_NEWGRF_INSPECT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -648,7 +648,7 @@ static constexpr NWidgetPart _nested_newgrf_inspect_chain_widgets[] = { EndContainer(), }; -static constexpr NWidgetPart _nested_newgrf_inspect_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_inspect_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_NGRFI_CAPTION), SetStringTip(STR_NEWGRF_INSPECT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1119,7 +1119,7 @@ private: bool SpriteAlignerWindow::centre = true; bool SpriteAlignerWindow::crosshair = true; -static constexpr NWidgetPart _nested_sprite_aligner_widgets[] = { +static constexpr std::initializer_list _nested_sprite_aligner_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SA_CAPTION), diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 86a8b38e03..60d7b70f08 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -500,7 +500,7 @@ struct NewGRFParametersWindow : public Window { GRFParameterInfo NewGRFParametersWindow::dummy_parameter_info(0); -static constexpr NWidgetPart _nested_newgrf_parameter_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_parameter_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_NP_CAPTION), @@ -1743,7 +1743,7 @@ public: const uint NWidgetNewGRFDisplay::MAX_EXTRA_INFO_WIDTH = 150; const uint NWidgetNewGRFDisplay::MIN_EXTRA_FOR_3_COLUMNS = 50; -static constexpr NWidgetPart _nested_newgrf_actives_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_actives_widgets = { NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), /* Left side, presets. */ NWidget(NWID_VERTICAL), @@ -1798,7 +1798,7 @@ static constexpr NWidgetPart _nested_newgrf_actives_widgets[] = { EndContainer(), }; -static constexpr NWidgetPart _nested_newgrf_availables_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_availables_widgets = { NWidget(WWT_FRAME, COLOUR_MAUVE), SetStringTip(STR_NEWGRF_SETTINGS_INACTIVE_LIST), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), /* Left side, available grfs, filter edit box. */ NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), @@ -1831,7 +1831,7 @@ static constexpr NWidgetPart _nested_newgrf_availables_widgets[] = { EndContainer(), }; -static constexpr NWidgetPart _nested_newgrf_infopanel_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_infopanel_widgets = { NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), /* Right side, info panel. */ NWidget(WWT_PANEL, COLOUR_MAUVE), @@ -1886,7 +1886,7 @@ std::unique_ptr NewGRFDisplay() } /* Widget definition of the manage newgrfs window */ -static constexpr NWidgetPart _nested_newgrf_widgets[] = { +static constexpr std::initializer_list _nested_newgrf_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE), SetStringTip(STR_NEWGRF_SETTINGS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1970,7 +1970,7 @@ void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFC } /** Widget parts of the save preset window. */ -static constexpr NWidgetPart _nested_save_preset_widgets[] = { +static constexpr std::initializer_list _nested_save_preset_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_SAVE_PRESET_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -2123,7 +2123,7 @@ static void ShowSavePresetWindow(std::string_view initial_text) } /** Widgets for the progress window. */ -static constexpr NWidgetPart _nested_scan_progress_widgets[] = { +static constexpr std::initializer_list _nested_scan_progress_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_NEWGRF_SCAN_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.modalpopup), diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 351f559561..1e45fbd2b4 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -102,7 +102,7 @@ static TileIndex GetReferenceTile(const NewsReference &reference) } /* Normal news items. */ -static constexpr NWidgetPart _nested_normal_news_widgets[] = { +static constexpr std::initializer_list _nested_normal_news_widgets = { NWidget(WWT_PANEL, COLOUR_WHITE, WID_N_PANEL), NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.fullbevel), NWidget(NWID_LAYER, INVALID_COLOUR), @@ -134,7 +134,7 @@ static WindowDesc _normal_news_desc( ); /* New vehicles news items. */ -static constexpr NWidgetPart _nested_vehicle_news_widgets[] = { +static constexpr std::initializer_list _nested_vehicle_news_widgets = { NWidget(WWT_PANEL, COLOUR_WHITE, WID_N_PANEL), NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.fullbevel), NWidget(NWID_LAYER, INVALID_COLOUR), @@ -182,7 +182,7 @@ static WindowDesc _vehicle_news_desc( ); /* Company news items. */ -static constexpr NWidgetPart _nested_company_news_widgets[] = { +static constexpr std::initializer_list _nested_company_news_widgets = { NWidget(WWT_PANEL, COLOUR_WHITE, WID_N_PANEL), NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.fullbevel), NWidget(NWID_LAYER, INVALID_COLOUR), @@ -227,7 +227,7 @@ static WindowDesc _company_news_desc( ); /* Thin news items. */ -static constexpr NWidgetPart _nested_thin_news_widgets[] = { +static constexpr std::initializer_list _nested_thin_news_widgets = { NWidget(WWT_PANEL, COLOUR_WHITE, WID_N_PANEL), NWidget(NWID_VERTICAL), SetPadding(WidgetDimensions::unscaled.fullbevel), NWidget(NWID_LAYER, INVALID_COLOUR), @@ -261,7 +261,7 @@ static WindowDesc _thin_news_desc( ); /* Small news items. */ -static constexpr NWidgetPart _nested_small_news_widgets[] = { +static constexpr std::initializer_list _nested_small_news_widgets = { /* Caption + close box. The caption is not WWT_CAPTION as the window shall not be moveable and so on. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE, WID_N_CLOSEBOX), @@ -1275,7 +1275,7 @@ struct MessageHistoryWindow : Window { } }; -static constexpr NWidgetPart _nested_message_history[] = { +static constexpr std::initializer_list _nested_message_history = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MESSAGE_HISTORY, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 6f1207e585..76ba2f1199 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -385,7 +385,7 @@ public: }, BuildObjectGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_build_object_widgets[] = { +static constexpr std::initializer_list _nested_build_object_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_OBJECT_BUILD_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 8193b6b411..d131681252 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -1586,7 +1586,7 @@ public: }; /** Nested widget definition for "your" train orders. */ -static constexpr NWidgetPart _nested_orders_train_widgets[] = { +static constexpr std::initializer_list _nested_orders_train_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_O_CAPTION), @@ -1663,7 +1663,7 @@ static WindowDesc _orders_train_desc( ); /** Nested widget definition for "your" orders (non-train). */ -static constexpr NWidgetPart _nested_orders_widgets[] = { +static constexpr std::initializer_list _nested_orders_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_O_CAPTION), SetStringTip(STR_ORDERS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1736,7 +1736,7 @@ static WindowDesc _orders_desc( ); /** Nested widget definition for competitor orders. */ -static constexpr NWidgetPart _nested_other_orders_widgets[] = { +static constexpr std::initializer_list _nested_other_orders_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_O_CAPTION), SetStringTip(STR_ORDERS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp index 0e67c0a09e..cddf84e884 100644 --- a/src/osk_gui.cpp +++ b/src/osk_gui.cpp @@ -321,7 +321,7 @@ static std::unique_ptr MakeSpacebarKeys() } -static constexpr NWidgetPart _nested_osk_widgets[] = { +static constexpr std::initializer_list _nested_osk_widgets = { NWidget(WWT_CAPTION, COLOUR_GREY, WID_OSK_CAPTION), SetTextStyle(TC_WHITE), NWidget(WWT_PANEL, COLOUR_GREY), NWidget(WWT_EDITBOX, COLOUR_GREY, WID_OSK_TEXT), SetMinimalSize(252, 0), SetPadding(2, 2, 2, 2), diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index 2f636cf8f7..4c4bbc5ae0 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -738,7 +738,7 @@ void PickerWindow::EnsureSelectedTypeIsVisible() /** Create nested widgets for the class picker widgets. */ std::unique_ptr MakePickerClassWidgets() { - static constexpr NWidgetPart picker_class_widgets[] = { + static constexpr std::initializer_list picker_class_widgets = { NWidget(NWID_SELECTION, INVALID_COLOUR, WID_PW_CLASS_SEL), NWidget(NWID_VERTICAL), NWidget(WWT_PANEL, COLOUR_DARK_GREEN), @@ -761,7 +761,7 @@ std::unique_ptr MakePickerClassWidgets() /** Create nested widgets for the type picker widgets. */ std::unique_ptr MakePickerTypeWidgets() { - static constexpr NWidgetPart picker_type_widgets[] = { + static constexpr std::initializer_list picker_type_widgets = { NWidget(NWID_SELECTION, INVALID_COLOUR, WID_PW_TYPE_SEL), NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index f577582df0..98400d2363 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -857,7 +857,7 @@ struct BuildRailToolbarWindow : Window { }, RailToolbarGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_build_rail_widgets[] = { +static constexpr std::initializer_list _nested_build_rail_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_RAT_CAPTION), SetTextStyle(TC_WHITE), @@ -1383,7 +1383,7 @@ public: }, BuildRailStationGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_station_builder_widgets[] = { +static constexpr std::initializer_list _nested_station_builder_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_RAIL_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1625,7 +1625,7 @@ public: }; /** Nested widget definition of the build signal window */ -static constexpr NWidgetPart _nested_signal_builder_widgets[] = { +static constexpr std::initializer_list _nested_signal_builder_widgets = { /* Title bar and buttons. */ NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), @@ -1752,7 +1752,7 @@ struct BuildRailDepotWindow : public PickerWindowBase { }; /** Nested widget definition of the build rail depot window */ -static constexpr NWidgetPart _nested_build_depot_widgets[] = { +static constexpr std::initializer_list _nested_build_depot_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1877,7 +1877,7 @@ struct BuildRailWaypointWindow : public PickerWindow { }; /** Nested widget definition for the build NewGRF rail waypoint window */ -static constexpr NWidgetPart _nested_build_waypoint_widgets[] = { +static constexpr std::initializer_list _nested_build_waypoint_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WAYPOINT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 7928f9c5a5..7aac90b4b9 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -899,7 +899,7 @@ struct BuildRoadToolbarWindow : Window { }, TramToolbarGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_build_road_widgets[] = { +static constexpr std::initializer_list _nested_build_road_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetTextStyle(TC_WHITE), @@ -946,7 +946,7 @@ static WindowDesc _build_road_desc( &BuildRoadToolbarWindow::road_hotkeys ); -static constexpr NWidgetPart _nested_build_tramway_widgets[] = { +static constexpr std::initializer_list _nested_build_tramway_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetTextStyle(TC_WHITE), @@ -1009,7 +1009,7 @@ Window *ShowBuildRoadToolbar(RoadType roadtype) return AllocateWindowDescFront(RoadTypeIsRoad(_cur_roadtype) ? _build_road_desc : _build_tramway_desc, TRANSPORT_ROAD); } -static constexpr NWidgetPart _nested_build_road_scen_widgets[] = { +static constexpr std::initializer_list _nested_build_road_scen_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetTextStyle(TC_WHITE), @@ -1048,7 +1048,7 @@ static WindowDesc _build_road_scen_desc( &BuildRoadToolbarWindow::road_hotkeys ); -static constexpr NWidgetPart _nested_build_tramway_scen_widgets[] = { +static constexpr std::initializer_list _nested_build_tramway_scen_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_ROT_CAPTION), SetTextStyle(TC_WHITE), @@ -1155,7 +1155,7 @@ struct BuildRoadDepotWindow : public PickerWindowBase { } }; -static constexpr NWidgetPart _nested_build_road_depot_widgets[] = { +static constexpr std::initializer_list _nested_build_road_depot_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROD_CAPTION), SetStringTip(STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1513,7 +1513,7 @@ public: }; /** Widget definition of the build road station window */ -static constexpr NWidgetPart _nested_road_station_picker_widgets[] = { +static constexpr std::initializer_list _nested_road_station_picker_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), @@ -1575,7 +1575,7 @@ static WindowDesc _road_station_picker_desc( ); /** Widget definition of the build tram station window */ -static constexpr NWidgetPart _nested_tram_station_picker_widgets[] = { +static constexpr std::initializer_list _nested_tram_station_picker_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_BROS_CAPTION), @@ -1714,7 +1714,7 @@ struct BuildRoadWaypointWindow : public PickerWindow { }; /** Nested widget definition for the build NewGRF road waypoint window */ -static constexpr NWidgetPart _nested_build_road_waypoint_widgets[] = { +static constexpr std::initializer_list _nested_build_road_waypoint_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_WAYPOINT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/screenshot_gui.cpp b/src/screenshot_gui.cpp index 49a2d73c48..5bb532dc50 100644 --- a/src/screenshot_gui.cpp +++ b/src/screenshot_gui.cpp @@ -47,7 +47,7 @@ struct ScreenshotWindow : Window { } }; -static constexpr NWidgetPart _nested_screenshot[] = { +static constexpr std::initializer_list _nested_screenshot = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_SCREENSHOT_CAPTION), diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index ece3632c6f..74d9a11b8c 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -244,7 +244,7 @@ struct ScriptListWindow : public Window { }; /** Widgets for the AI list window. */ -static constexpr NWidgetPart _nested_script_list_widgets[] = { +static constexpr std::initializer_list _nested_script_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_SCRL_CAPTION), @@ -555,7 +555,7 @@ private: }; /** Widgets for the Script settings window. */ -static constexpr NWidgetPart _nested_script_settings_widgets[] = { +static constexpr std::initializer_list _nested_script_settings_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_CAPTION, COLOUR_MAUVE, WID_SCRS_CAPTION), @@ -1200,7 +1200,7 @@ std::unique_ptr MakeCompanyButtonRowsScriptDebug() } /** Widgets for the Script debug window. */ -static constexpr NWidgetPart _nested_script_debug_widgets[] = { +static constexpr std::initializer_list _nested_script_debug_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_AI_DEBUG, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 7b0c9e1a15..806d37b688 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -202,7 +202,7 @@ static constexpr TextColour GAME_OPTIONS_LABEL = TC_LIGHT_BLUE; /** Colour for selected text of game options. */ static constexpr TextColour GAME_OPTIONS_SELECTED = TC_WHITE; -static constexpr NWidgetPart _nested_social_plugins_widgets[] = { +static constexpr std::initializer_list _nested_social_plugins_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_FRAME, GAME_OPTIONS_BACKGROUND, WID_GO_SOCIAL_PLUGIN_TITLE), SetTextStyle(GAME_OPTIONS_FRAME), NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_normal, 0), @@ -217,7 +217,7 @@ static constexpr NWidgetPart _nested_social_plugins_widgets[] = { EndContainer(), }; -static constexpr NWidgetPart _nested_social_plugins_none_widgets[] = { +static constexpr std::initializer_list _nested_social_plugins_none_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXT, INVALID_COLOUR), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE), SetTextStyle(GAME_OPTIONS_LABEL), EndContainer(), @@ -1602,7 +1602,7 @@ struct GameOptionsWindow : Window { } }; -static constexpr NWidgetPart _nested_game_options_widgets[] = { +static constexpr std::initializer_list _nested_game_options_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, GAME_OPTIONS_BACKGROUND), NWidget(WWT_CAPTION, GAME_OPTIONS_BACKGROUND), SetStringTip(STR_GAME_OPTIONS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -2142,7 +2142,7 @@ struct CustomCurrencyWindow : Window { } }; -static constexpr NWidgetPart _nested_cust_currency_widgets[] = { +static constexpr std::initializer_list _nested_cust_currency_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CURRENCY_WINDOW, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 37b0ccebab..eb62f3e95d 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -329,7 +329,7 @@ struct SignListWindow : Window, SignList { }, SignListGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_sign_list_widgets[] = { +static constexpr std::initializer_list _nested_sign_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_SIL_CAPTION), @@ -504,7 +504,7 @@ struct SignWindow : Window, SignList { } }; -static constexpr NWidgetPart _nested_query_sign_edit_widgets[] = { +static constexpr std::initializer_list _nested_query_sign_edit_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_QES_CAPTION), SetTextStyle(TC_WHITE), diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 64a5b4c565..984083b37d 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1963,14 +1963,14 @@ public: }; /** Widget parts of the smallmap display. */ -static constexpr NWidgetPart _nested_smallmap_display[] = { +static constexpr std::initializer_list _nested_smallmap_display = { NWidget(WWT_PANEL, COLOUR_BROWN, WID_SM_MAP_BORDER), NWidget(WWT_INSET, COLOUR_BROWN, WID_SM_MAP), SetMinimalSize(346, 140), SetResize(1, 1), SetPadding(2, 2, 2, 2), EndContainer(), EndContainer(), }; /** Widget parts of the smallmap legend bar + image buttons. */ -static constexpr NWidgetPart _nested_smallmap_bar[] = { +static constexpr std::initializer_list _nested_smallmap_bar = { NWidget(WWT_PANEL, COLOUR_BROWN), NWidget(NWID_HORIZONTAL), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SM_LEGEND), SetResize(1, 1), @@ -2020,7 +2020,7 @@ static std::unique_ptr SmallMapDisplay() return map_display; } -static constexpr NWidgetPart _nested_smallmap_widgets[] = { +static constexpr std::initializer_list _nested_smallmap_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_SM_CAPTION), diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 1f88fe385b..9cb198d434 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -759,7 +759,7 @@ const std::initializer_list CompanyStation &StationRatingMinSorter }; -static constexpr NWidgetPart _nested_company_stations_widgets[] = { +static constexpr std::initializer_list _nested_company_stations_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_STL_CAPTION), @@ -811,7 +811,7 @@ void ShowCompanyStations(CompanyID company) AllocateWindowDescFront(_company_stations_desc, company); } -static constexpr NWidgetPart _nested_station_view_widgets[] = { +static constexpr std::initializer_list _nested_station_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SV_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_STATION_VIEW_RENAME_TOOLTIP), @@ -2269,7 +2269,7 @@ static void FindStationsNearby(TileArea ta, bool distant_join) } } -static constexpr NWidgetPart _nested_select_station_widgets[] = { +static constexpr std::initializer_list _nested_select_station_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN, WID_JS_CAPTION), SetStringTip(STR_JOIN_STATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index ffd5e90494..b6e6987318 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -210,7 +210,7 @@ struct StatusBarWindow : Window { }}; }; -static constexpr NWidgetPart _nested_main_status_widgets[] = { +static constexpr std::initializer_list _nested_main_status_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_GREY, WID_S_LEFT), SetMinimalSize(140, 12), EndContainer(), NWidget(WWT_PUSHBTN, COLOUR_GREY, WID_S_MIDDLE), SetMinimalSize(40, 12), SetToolTip(STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS), SetResize(1, 0), diff --git a/src/story_gui.cpp b/src/story_gui.cpp index f3c1d4feb0..1c2605e1b3 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -937,7 +937,7 @@ const std::initializer_list Story &PageElementOrderSorter, }; -static constexpr NWidgetPart _nested_story_book_widgets[] = { +static constexpr std::initializer_list _nested_story_book_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_SB_CAPTION), diff --git a/src/subsidy_gui.cpp b/src/subsidy_gui.cpp index b57bcbe35c..77c8807c7e 100644 --- a/src/subsidy_gui.cpp +++ b/src/subsidy_gui.cpp @@ -262,7 +262,7 @@ struct SubsidyListWindow : Window { } }; -static constexpr NWidgetPart _nested_subsidies_list_widgets[] = { +static constexpr std::initializer_list _nested_subsidies_list_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_SUBSIDIES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 7c0f388a60..239f347025 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -316,7 +316,7 @@ struct TerraformToolbarWindow : Window { }, TerraformToolbarGlobalHotkeys}; }; -static constexpr NWidgetPart _nested_terraform_widgets[] = { +static constexpr std::initializer_list _nested_terraform_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_LANDSCAPING_TOOLBAR, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -445,7 +445,7 @@ static const int8_t _multi_terraform_coords[][2] = { {-28, 0}, {-24, -2}, {-20, -4}, {-16, -6}, {-12, -8}, { -8,-10}, { -4,-12}, { 0,-14}, { 4,-12}, { 8,-10}, { 12, -8}, { 16, -6}, { 20, -4}, { 24, -2}, { 28, 0}, }; -static constexpr NWidgetPart _nested_scen_edit_land_gen_widgets[] = { +static constexpr std::initializer_list _nested_scen_edit_land_gen_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 4c3f31d49b..115467f397 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -40,7 +40,7 @@ #include "safeguards.h" /** Widgets for the textfile window. */ -static constexpr NWidgetPart _nested_textfile_widgets[] = { +static constexpr std::initializer_list _nested_textfile_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_MAUVE), NWidget(WWT_PUSHARROWBTN, COLOUR_MAUVE, WID_TF_NAVBACK), SetFill(0, 1), SetMinimalSize(15, 1), SetArrowWidgetTypeTip(AWV_DECREASE, STR_TEXTFILE_NAVBACK_TOOLTIP), diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 65732342b0..ea3e253e59 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -797,7 +797,7 @@ struct TimetableWindow : Window { }}; }; -static constexpr NWidgetPart _nested_timetable_widgets[] = { +static constexpr std::initializer_list _nested_timetable_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_VT_CAPTION), diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index eba265fc7b..b37ef7e837 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2207,7 +2207,7 @@ static std::unique_ptr MakeMainToolbar() return hor; } -static constexpr NWidgetPart _nested_toolbar_normal_widgets[] = { +static constexpr std::initializer_list _nested_toolbar_normal_widgets = { NWidgetFunction(MakeMainToolbar), }; @@ -2510,7 +2510,7 @@ struct ScenarioEditorToolbarWindow : Window { }}; }; -static constexpr NWidgetPart _nested_toolb_scen_inner_widgets[] = { +static constexpr std::initializer_list _nested_toolb_scen_inner_widgets = { NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_PAUSE), SetSpriteTip(SPR_IMG_PAUSE, STR_TOOLBAR_TOOLTIP_PAUSE_GAME), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_FAST_FORWARD), SetSpriteTip(SPR_IMG_FASTFORWARD, STR_TOOLBAR_TOOLTIP_FORWARD), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_TE_SETTINGS), SetSpriteTip(SPR_IMG_SETTINGS, STR_TOOLBAR_TOOLTIP_OPTIONS), @@ -2550,7 +2550,7 @@ static std::unique_ptr MakeScenarioToolbar() return MakeNWidgets(_nested_toolb_scen_inner_widgets, std::make_unique()); } -static constexpr NWidgetPart _nested_toolb_scen_widgets[] = { +static constexpr std::initializer_list _nested_toolb_scen_widgets = { NWidgetFunction(MakeScenarioToolbar), }; diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 2659adc38a..492d6e75f3 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -58,7 +58,7 @@ TownKdtree _town_local_authority_kdtree{}; typedef GUIList GUITownList; -static constexpr NWidgetPart _nested_town_authority_widgets[] = { +static constexpr std::initializer_list _nested_town_authority_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TA_CAPTION), @@ -611,7 +611,7 @@ public: }}; }; -static constexpr NWidgetPart _nested_town_game_view_widgets[] = { +static constexpr std::initializer_list _nested_town_game_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CHANGE_NAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_TOWN_VIEW_RENAME_TOOLTIP), @@ -642,7 +642,7 @@ static WindowDesc _town_game_view_desc( _nested_town_game_view_widgets ); -static constexpr NWidgetPart _nested_town_editor_view_widgets[] = { +static constexpr std::initializer_list _nested_town_editor_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_PUSHIMGBTN, COLOUR_BROWN, WID_TV_CHANGE_NAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_TOWN_VIEW_RENAME_TOOLTIP), @@ -686,7 +686,7 @@ void ShowTownViewWindow(TownID town) } } -static constexpr NWidgetPart _nested_town_directory_widgets[] = { +static constexpr std::initializer_list _nested_town_directory_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_BROWN), NWidget(WWT_CAPTION, COLOUR_BROWN, WID_TD_CAPTION), @@ -1068,7 +1068,7 @@ void CcFoundRandomTown(Commands, const CommandCost &result, Money, TownID town_i if (result.Succeeded()) ScrollMainWindowToTile(Town::Get(town_id)->xy); } -static constexpr NWidgetPart _nested_found_town_widgets[] = { +static constexpr std::initializer_list _nested_found_town_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_FOUND_TOWN_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1805,7 +1805,7 @@ struct BuildHouseWindow : public PickerWindow { }; /** Nested widget definition for the build NewGRF rail waypoint window */ -static constexpr NWidgetPart _nested_build_house_widgets[] = { +static constexpr std::initializer_list _nested_build_house_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_HOUSE_PICKER_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index 8574075b1e..ef0791168d 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -126,7 +126,7 @@ public: } }; -static constexpr NWidgetPart _nested_transparency_widgets[] = { +static constexpr std::initializer_list _nested_transparency_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_TRANSPARENCY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/tree_gui.cpp b/src/tree_gui.cpp index 8bf4d15af3..6bf2ee0281 100644 --- a/src/tree_gui.cpp +++ b/src/tree_gui.cpp @@ -285,7 +285,7 @@ static std::unique_ptr MakeTreeTypeButtons() return vstack; } -static constexpr NWidgetPart _nested_build_trees_widgets[] = { +static constexpr std::initializer_list _nested_build_trees_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_PLANT_TREE_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 251b905aa1..a9a37ecd0e 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1307,7 +1307,7 @@ struct RefitWindow : public Window { } }; -static constexpr NWidgetPart _nested_vehicle_refit_widgets[] = { +static constexpr std::initializer_list _nested_vehicle_refit_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_VR_CAPTION), @@ -1595,7 +1595,7 @@ void ChangeVehicleViewWindow(VehicleID from_index, VehicleID to_index) ChangeVehicleWindow(WC_VEHICLE_TIMETABLE, from_index, to_index); } -static constexpr NWidgetPart _nested_vehicle_list[] = { +static constexpr std::initializer_list _nested_vehicle_list = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VL_CAPTION_SELECTION), @@ -2324,7 +2324,7 @@ static_assert(WID_VD_DETAILS_CAPACITY_OF_EACH == WID_VD_DETAILS_CARGO_CARRIED + static_assert(WID_VD_DETAILS_TOTAL_CARGO == WID_VD_DETAILS_CARGO_CARRIED + TDW_TAB_TOTALS ); /** Vehicle details widgets (other than train). */ -static constexpr NWidgetPart _nested_nontrain_vehicle_details_widgets[] = { +static constexpr std::initializer_list _nested_nontrain_vehicle_details_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_VD_CAPTION), @@ -2347,7 +2347,7 @@ static constexpr NWidgetPart _nested_nontrain_vehicle_details_widgets[] = { }; /** Train details widgets. */ -static constexpr NWidgetPart _nested_train_vehicle_details_widgets[] = { +static constexpr std::initializer_list _nested_train_vehicle_details_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_VD_CAPTION), SetStringTip(STR_VEHICLE_DETAILS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -2820,7 +2820,7 @@ static void ShowVehicleDetailsWindow(const Vehicle *v) /* Unified vehicle GUI - Vehicle View Window */ /** Vehicle view widgets. */ -static constexpr NWidgetPart _nested_vehicle_view_widgets[] = { +static constexpr std::initializer_list _nested_vehicle_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME), diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 0ea8b683da..1c6b8413b5 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -23,7 +23,7 @@ #include "safeguards.h" /* Extra Viewport Window Stuff */ -static constexpr NWidgetPart _nested_extra_viewport_widgets[] = { +static constexpr std::initializer_list _nested_extra_viewport_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_EV_CAPTION), diff --git a/src/waypoint_gui.cpp b/src/waypoint_gui.cpp index d25020282f..6efd4cb29a 100644 --- a/src/waypoint_gui.cpp +++ b/src/waypoint_gui.cpp @@ -185,7 +185,7 @@ public: }; /** The widgets of the waypoint view. */ -static constexpr NWidgetPart _nested_waypoint_view_widgets[] = { +static constexpr std::initializer_list _nested_waypoint_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_W_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_BUOY_VIEW_RENAME_TOOLTIP), From 00cdf1bc562c05d0582b3e864be1397c9cb6912d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 25 Oct 2025 17:49:10 +0100 Subject: [PATCH 163/280] Codefix: Clear m6 more thoroughly when making tiles. m6 bits 6-7 were previously used to be for bridge above state, but should now be cleared. --- src/bridge_map.h | 1 + src/clear_map.h | 2 +- src/industry_map.h | 1 + src/object_map.h | 2 +- src/rail_map.h | 4 ++-- src/road_map.h | 6 +++--- src/station_map.h | 1 + src/tree_map.h | 2 +- src/tunnel_map.h | 4 ++-- src/water_map.h | 8 ++++---- 10 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/bridge_map.h b/src/bridge_map.h index 5ced7b5d2f..452e439329 100644 --- a/src/bridge_map.h +++ b/src/bridge_map.h @@ -135,6 +135,7 @@ inline void MakeBridgeRamp(Tile t, Owner o, BridgeType bridgetype, DiagDirection t.m4() = 0; t.m5() = 1 << 7 | tt << 2 | d; SB(t.m6(), 2, 4, bridgetype); + SB(t.m6(), 6, 2, 0); t.m7() = 0; t.m8() = 0; } diff --git a/src/clear_map.h b/src/clear_map.h index a1a58612ce..6f24800f99 100644 --- a/src/clear_map.h +++ b/src/clear_map.h @@ -274,7 +274,7 @@ inline void MakeField(Tile t, uint field_type, IndustryID industry) t.m3() = field_type; t.m4() = 0 << 5 | 0 << 2; SetClearGroundDensity(t, CLEAR_FIELDS, 3); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; } diff --git a/src/industry_map.h b/src/industry_map.h index 92957fa9f2..64ba712bf5 100644 --- a/src/industry_map.h +++ b/src/industry_map.h @@ -285,6 +285,7 @@ inline void MakeIndustry(Tile t, IndustryID index, IndustryGfx gfx, uint8_t rand SetIndustryGfx(t, gfx); // m5, part of m6 SetIndustryRandomTriggers(t, {}); // rest of m6 SetWaterClass(t, wc); + SB(t.m6(), 6, 2, 0); t.m7() = 0; } diff --git a/src/object_map.h b/src/object_map.h index a5280c4f8c..23b623b6fc 100644 --- a/src/object_map.h +++ b/src/object_map.h @@ -80,7 +80,7 @@ inline void MakeObject(Tile t, Owner o, ObjectID index, WaterClass wc, uint8_t r t.m3() = random; t.m4() = 0; t.m5() = index.base() >> 16; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } diff --git a/src/rail_map.h b/src/rail_map.h index 5b06a2cb57..4f1db937f4 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -524,7 +524,7 @@ inline void MakeRailNormal(Tile t, Owner o, TrackBits b, RailType r) t.m3() = 0; t.m4() = 0; t.m5() = RAIL_TILE_NORMAL << 6 | b; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = r; } @@ -557,7 +557,7 @@ inline void MakeRailDepot(Tile tile, Owner owner, DepotID depot_id, DiagDirectio tile.m3() = 0; tile.m4() = 0; tile.m5() = RAIL_TILE_DEPOT << 6 | dir; - SB(tile.m6(), 2, 4, 0); + SB(tile.m6(), 2, 6, 0); tile.m7() = 0; tile.m8() = rail_type; } diff --git a/src/road_map.h b/src/road_map.h index f8436d4258..bc617197b2 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -619,7 +619,7 @@ inline void MakeRoadNormal(Tile t, RoadBits bits, RoadType road_rt, RoadType tra t.m2() = town.base(); t.m3() = (tram_rt != INVALID_ROADTYPE ? bits : 0); t.m5() = (road_rt != INVALID_ROADTYPE ? bits : 0) | ROAD_TILE_NORMAL << 6; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; SetRoadTypes(t, road_rt, tram_rt); SetRoadOwner(t, RTT_TRAM, tram); @@ -645,7 +645,7 @@ inline void MakeRoadCrossing(Tile t, Owner road, Owner tram, Owner rail, Axis ro t.m3() = 0; t.m4() = INVALID_ROADTYPE; t.m5() = ROAD_TILE_CROSSING << 6 | roaddir; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = road.base(); t.m8() = INVALID_ROADTYPE << 6 | rat; SetRoadTypes(t, road_rt, tram_rt); @@ -679,7 +679,7 @@ inline void MakeRoadDepot(Tile tile, Owner owner, DepotID depot_id, DiagDirectio tile.m3() = 0; tile.m4() = INVALID_ROADTYPE; tile.m5() = ROAD_TILE_DEPOT << 6 | dir; - SB(tile.m6(), 2, 4, 0); + SB(tile.m6(), 2, 6, 0); tile.m7() = owner.base(); tile.m8() = INVALID_ROADTYPE << 6; SetRoadType(tile, GetRoadTramType(rt), rt); diff --git a/src/station_map.h b/src/station_map.h index fcb458dbec..d90cc8dda5 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -726,6 +726,7 @@ inline void MakeStation(Tile t, Owner o, StationID sid, StationType st, uint8_t t.m5() = section; SB(t.m6(), 2, 1, 0); SB(t.m6(), 3, 4, to_underlying(st)); + SB(t.m6(), 7, 1, 0); t.m7() = 0; t.m8() = 0; } diff --git a/src/tree_map.h b/src/tree_map.h index 9fa0969ed1..cd031eac61 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -250,7 +250,7 @@ inline void MakeTree(Tile t, TreeType type, uint count, TreeGrowthStage growth, t.m3() = type; t.m4() = 0 << 5 | 0 << 2; t.m5() = count << 6 | static_cast(growth); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } diff --git a/src/tunnel_map.h b/src/tunnel_map.h index 61965c067c..86f3027cbc 100644 --- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -55,7 +55,7 @@ inline void MakeRoadTunnel(Tile t, Owner o, DiagDirection d, RoadType road_rt, R t.m3() = 0; t.m4() = 0; t.m5() = TRANSPORT_ROAD << 2 | d; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; SetRoadOwner(t, RTT_ROAD, o); @@ -78,7 +78,7 @@ inline void MakeRailTunnel(Tile t, Owner o, DiagDirection d, RailType r) t.m3() = 0; t.m4() = 0; t.m5() = TRANSPORT_RAIL << 2 | d; - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; SetRailType(t, r); diff --git a/src/water_map.h b/src/water_map.h index 2c424d44b1..81e3e70914 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -391,7 +391,7 @@ inline void MakeShore(Tile t) t.m4() = 0; t.m5() = 0; SetWaterTileType(t, WATER_TILE_COAST); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } @@ -413,7 +413,7 @@ inline void MakeWater(Tile t, Owner o, WaterClass wc, uint8_t random_bits) t.m4() = random_bits; t.m5() = 0; SetWaterTileType(t, WATER_TILE_CLEAR); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } @@ -468,7 +468,7 @@ inline void MakeShipDepot(Tile t, Owner o, DepotID did, DepotPart part, Axis a, t.m4() = 0; t.m5() = part << WBL_DEPOT_PART | a << WBL_DEPOT_AXIS; SetWaterTileType(t, WATER_TILE_DEPOT); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } @@ -492,7 +492,7 @@ inline void MakeLockTile(Tile t, Owner o, LockPart part, DiagDirection dir, Wate t.m4() = 0; t.m5() = part << WBL_LOCK_PART_BEGIN | dir << WBL_LOCK_ORIENT_BEGIN; SetWaterTileType(t, WATER_TILE_LOCK); - SB(t.m6(), 2, 4, 0); + SB(t.m6(), 2, 6, 0); t.m7() = 0; } From 9001d4a8843ac979f400aea7587d6a64c11d2476 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 26 Oct 2025 17:53:49 +0000 Subject: [PATCH 164/280] Codefix: Clear m8 when making tiles. m8 should be cleared when tiles do not use it. --- src/industry_map.h | 1 + src/object_map.h | 1 + src/road_map.h | 1 + src/town_map.h | 1 + src/tree_map.h | 1 + src/void_map.h | 1 + src/water_map.h | 4 ++++ 7 files changed, 10 insertions(+) diff --git a/src/industry_map.h b/src/industry_map.h index 64ba712bf5..1c8acbadbc 100644 --- a/src/industry_map.h +++ b/src/industry_map.h @@ -287,6 +287,7 @@ inline void MakeIndustry(Tile t, IndustryID index, IndustryGfx gfx, uint8_t rand SetWaterClass(t, wc); SB(t.m6(), 6, 2, 0); t.m7() = 0; + t.m8() = 0; } #endif /* INDUSTRY_MAP_H */ diff --git a/src/object_map.h b/src/object_map.h index 23b623b6fc..d997b673c0 100644 --- a/src/object_map.h +++ b/src/object_map.h @@ -82,6 +82,7 @@ inline void MakeObject(Tile t, Owner o, ObjectID index, WaterClass wc, uint8_t r t.m5() = index.base() >> 16; SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } #endif /* OBJECT_MAP_H */ diff --git a/src/road_map.h b/src/road_map.h index bc617197b2..aebed25816 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -621,6 +621,7 @@ inline void MakeRoadNormal(Tile t, RoadBits bits, RoadType road_rt, RoadType tra t.m5() = (road_rt != INVALID_ROADTYPE ? bits : 0) | ROAD_TILE_NORMAL << 6; SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; SetRoadTypes(t, road_rt, tram_rt); SetRoadOwner(t, RTT_TRAM, tram); } diff --git a/src/town_map.h b/src/town_map.h index 1a982bcb82..442d33f370 100644 --- a/src/town_map.h +++ b/src/town_map.h @@ -386,6 +386,7 @@ inline void MakeHouseTile(Tile t, TownID tid, uint8_t counter, uint8_t stage, Ho SetHouseProtected(t, house_protected); SetAnimationFrame(t, 0); SetHouseProcessingTime(t, HouseSpec::Get(type)->processing_time); + SB(t.m8(), 12, 4, 0); } #endif /* TOWN_MAP_H */ diff --git a/src/tree_map.h b/src/tree_map.h index cd031eac61..0cabe6a8eb 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -252,6 +252,7 @@ inline void MakeTree(Tile t, TreeType type, uint count, TreeGrowthStage growth, t.m5() = count << 6 | static_cast(growth); SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } #endif /* TREE_MAP_H */ diff --git a/src/void_map.h b/src/void_map.h index e8e031be79..4a5976db3b 100644 --- a/src/void_map.h +++ b/src/void_map.h @@ -27,6 +27,7 @@ inline void MakeVoid(Tile t) t.m5() = 0; t.m6() = 0; t.m7() = 0; + t.m8() = 0; } #endif /* VOID_MAP_H */ diff --git a/src/water_map.h b/src/water_map.h index 81e3e70914..7f8471c00d 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -393,6 +393,7 @@ inline void MakeShore(Tile t) SetWaterTileType(t, WATER_TILE_COAST); SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } /** @@ -415,6 +416,7 @@ inline void MakeWater(Tile t, Owner o, WaterClass wc, uint8_t random_bits) SetWaterTileType(t, WATER_TILE_CLEAR); SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } /** @@ -470,6 +472,7 @@ inline void MakeShipDepot(Tile t, Owner o, DepotID did, DepotPart part, Axis a, SetWaterTileType(t, WATER_TILE_DEPOT); SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } /** @@ -494,6 +497,7 @@ inline void MakeLockTile(Tile t, Owner o, LockPart part, DiagDirection dir, Wate SetWaterTileType(t, WATER_TILE_LOCK); SB(t.m6(), 2, 6, 0); t.m7() = 0; + t.m8() = 0; } /** From f759b691d7082c58ab719fcba3b8457e15a9383b Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:25:32 +0100 Subject: [PATCH 165/280] Codechange: Use helper function for company recolour offset (#14740) --- src/company_base.h | 12 ++++++++++++ src/newgrf_industries.cpp | 4 +--- src/object_cmd.cpp | 6 ++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/company_base.h b/src/company_base.h index a1409c84ed..c77f642389 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -180,6 +180,18 @@ struct Company : CompanyProperties, CompanyPool::PoolItem<&_company_pool> { return !Company::Get(index)->is_ai; } + /** + * Get offset for recolour palette of specific company. + * @param livery_scheme Scheme to use for recolour. + * @param use_secondary Specify whether to add secondary colour offset to the result. + * @return palette offset. + */ + inline uint8_t GetCompanyRecolourOffset(LiveryScheme livery_scheme, bool use_secondary = true) const + { + const Livery &l = this->livery[livery_scheme]; + return use_secondary ? l.colour1 + l.colour2 * 16 : l.colour1; + } + static void PostDestructor(size_t index); }; diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index 4f532ff1b2..5a1fb6b80f 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -246,10 +246,8 @@ static uint32_t GetCountAndDistanceOfClosestInstance(const ResolverObject &objec const Company *c = Company::GetIfValid(this->industry->founder); if (c != nullptr) { - const Livery *l = &c->livery[LS_DEFAULT]; - is_ai = c->is_ai; - colours = l->colour1 + l->colour2 * 16; + colours = c->GetCompanyRecolourOffset(LS_DEFAULT); } return this->industry->founder.base() | (is_ai ? 0x10000 : 0) | (colours << 24); diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 6cfed66e47..2bb29628f9 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -97,8 +97,7 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u if (owner == OWNER_NONE) { o->colour = Random(); } else { - const Livery &l = Company::Get(owner)->livery[0]; - o->colour = l.colour1 + l.colour2 * 16; + o->colour = Company::Get(owner)->GetCompanyRecolourOffset(LS_DEFAULT); } /* If the object wants only one colour, then give it that colour. */ @@ -193,8 +192,7 @@ void UpdateObjectColours(const Company *c) /* Using the object colour callback, so not using company colour. */ if (spec->callback_mask.Test(ObjectCallbackMask::Colour)) continue; - const Livery &l = c->livery[0]; - obj->colour = (spec->flags.Test(ObjectFlag::Uses2CC) ? (l.colour2 * 16) : 0) + l.colour1; + obj->colour = c->GetCompanyRecolourOffset(LS_DEFAULT, spec->flags.Test(ObjectFlag::Uses2CC)); } } From 8226548e31a0c77e51f708c18a82672169aca1ca Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 3 Nov 2025 16:33:18 +0000 Subject: [PATCH 166/280] Fix fd32d1447e: Test for empty shares became inverted. (#14751) --- src/cargopacket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index f8c736c3a8..8be991034e 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -469,7 +469,7 @@ bool VehicleCargoList::Stage(bool accepted, StationID current_station, std::span FlowStat new_shares = flow_it->second; new_shares.ChangeShare(current_station, INT_MIN); for (auto station_it = next_station.rbegin(); station_it != next_station.rend(); ++station_it) { - if (!new_shares.GetShares()->empty()) break; + if (new_shares.GetShares()->empty()) break; new_shares.ChangeShare(*station_it, INT_MIN); } if (new_shares.GetShares()->empty()) { From 3befbdd52fa9273d25a0f677484be113478ea803 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 4 Nov 2025 04:38:48 +0000 Subject: [PATCH 167/280] Update: Translations from eints hungarian: 12 changes by vargaviktor --- src/lang/hungarian.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index a7269ea7e5..b87127ba49 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -317,6 +317,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}láb STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}szint # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}nap @@ -1404,7 +1405,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Nincsenek támogatások STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Építkezési költségek: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Építkezések és beszerzésk költségeinek szintje +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Építkezések és beszerzések költségeinek szintje ###length 3 STR_CONFIG_SETTING_CONSTRUCTION_COSTS_LOW :Alacsony STR_CONFIG_SETTING_CONSTRUCTION_COSTS_MEDIUM :Közepes @@ -2226,6 +2227,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :A magassági é STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Angolszász (láb) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrikus (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Játékbeli mértékegység (szint) STR_CONFIG_SETTING_LOCALISATION :Honosítás STR_CONFIG_SETTING_GRAPHICS :Megjelenés @@ -3535,6 +3537,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Tájkép STR_GENERATION_RIVER_GENERATION :{BLACK}Folyó generálás STR_GENERATION_CLEARING_TILES :{BLACK}Durva és köves területek generálása STR_GENERATION_TOWN_GENERATION :{BLACK}Város generálás +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Szárazföldi ipar generálás +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Vízi ipar generálás STR_GENERATION_OBJECT_GENERATION :{BLACK}Mozgathatatlan létesítmények létrehozása STR_GENERATION_TREE_GENERATION :{BLACK}Fák generálása STR_GENERATION_SETTINGUP_GAME :{BLACK}Játék beállítása @@ -5332,6 +5336,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}A kezdet STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... a híd mindkét végének szárazföldön kell lennie STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... a híd túl hosszú STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A híd a térképen túl végződne +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A híd {HEIGHT} magas, túl alacsony az állomáshoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A híd {HEIGHT} magas, túl alacsony a megállóhoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A híd {HEIGHT} magas, túl alacsony a kikötőhöz +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A híd {HEIGHT} magas, túl alacsony a bójához +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A híd {HEIGHT} magas, túl alacsony a vasúti ellenőrzőponthoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A híd {HEIGHT} magas, túl alacsony az útponthoz +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A híd {HEIGHT} magas, túl alacsony a zároláshoz # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nem áshatsz ide alagutat... From 06d8e039c6b01af51cdccbc7230973168796da63 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 4 Nov 2025 15:26:15 +0000 Subject: [PATCH 168/280] Codechange: Use std-find instead of for-loops in strgen. (#14754) --- src/strgen/strgen.h | 2 ++ src/strgen/strgen_base.cpp | 21 +++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/strgen/strgen.h b/src/strgen/strgen.h index 8052107aa9..f2e4b79014 100644 --- a/src/strgen/strgen.h +++ b/src/strgen/strgen.h @@ -137,6 +137,8 @@ struct CmdStruct; struct CmdPair { const CmdStruct *cmd; std::string param; + + auto operator<=>(const CmdPair &other) const = default; }; struct ParsedCommandStruct { diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index 6c733e2cd4..8184ecf597 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -313,9 +313,8 @@ void EmitGender(StringBuilder &builder, std::string_view param, char32_t) static const CmdStruct *FindCmd(std::string_view s) { - for (const auto &cs : _cmd_structs) { - if (cs.cmd == s) return &cs; - } + auto it = std::ranges::find(_cmd_structs, s, &CmdStruct::cmd); + if (it != std::end(_cmd_structs)) return &*it; return nullptr; } @@ -449,17 +448,11 @@ static bool CheckCommandsMatch(std::string_view a, std::string_view b, std::stri for (auto &templ_nc : templ.non_consuming_commands) { /* see if we find it in lang, and zero it out */ - bool found = false; - for (auto &lang_nc : lang.non_consuming_commands) { - if (templ_nc.cmd == lang_nc.cmd && templ_nc.param == lang_nc.param) { - /* it was found in both. zero it out from lang so we don't find it again */ - lang_nc.cmd = nullptr; - found = true; - break; - } - } - - if (!found) { + auto it = std::ranges::find(lang.non_consuming_commands, templ_nc); + if (it != std::end(lang.non_consuming_commands)) { + /* it was found in both. zero it out from lang so we don't find it again */ + it->cmd = nullptr; + } else { StrgenWarning("{}: command '{}' exists in template file but not in language file", name, templ_nc.cmd->cmd); result = false; } From 6d5f150b3ddfc4550a2b40d843941a65cb19af40 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 4 Nov 2025 19:23:18 +0000 Subject: [PATCH 169/280] Fix: BaseBitSet bit iteration for values which don't fit in 32 bits (#14757) --- src/core/base_bitset_type.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/base_bitset_type.hpp b/src/core/base_bitset_type.hpp index 9ce8528d31..3b50d4e033 100644 --- a/src/core/base_bitset_type.hpp +++ b/src/core/base_bitset_type.hpp @@ -254,8 +254,8 @@ public: return std::nullopt; } - auto begin() const { return SetBitIterator(this->data).begin(); } - auto end() const { return SetBitIterator(this->data).end(); } + auto begin() const { return SetBitIterator(this->data).begin(); } + auto end() const { return SetBitIterator(this->data).end(); } private: Tstorage data; ///< Bitmask of values. From 94052a6ccb32bbd8fa68095371d3c6f991d091d9 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 6 Nov 2025 04:41:15 +0000 Subject: [PATCH 170/280] Update: Translations from eints korean: 11 changes by telk5093 french: 14 changes by glx22 --- src/lang/french.txt | 17 ++++++++++++++--- src/lang/korean.txt | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/lang/french.txt b/src/lang/french.txt index 235e21f98e..d7912b7127 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}niveau{P "" x} # Time units used in string control characters STR_UNITS_DAYS :{G=m}{COMMA}{NBSP}jour{P "" s} @@ -2092,7 +2093,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Taille moyenne STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Mise à jour du graphe de distribution toutes les {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Intervalle entre les recalculs successifs du graphe de liaison. Chaque recalcul planifie un composant du graphe. Cela signifie qu'une valeur X pour ce paramètre ne signifie pas que l'ensemble du graphe sera mis à jour toutes les X secondes. Seul un composant le sera. Plus vous définissez cet intervalle court, plus le temps de processeur nécessaire pour le calcul sera important. Plus vous définissez cet intervalle long, plus il faudra de temps pour que la distribution de marchandises commence sur de nouveaux itinéraires -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Recalcul du graphe de distribution toutes les {STRING} +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Prend {STRING} pour le recalcul du graphe de distribution STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Temps pris pour chaque recalcul d'un composant du graphe de liaison. Lorsqu'un recalcul est lancé, un fil d'exécution est créé et autorisé à fonctionner pendant ce nombre de secondes. Plus vous définissez cette durée courte, plus il est probable que le fil ne soit pas terminé lorsqu'il est censé l'être. Ensuite, le jeu s'arrête jusqu'à ce qu'il le soit ("lag"). Plus vous définissez cette durée longue, plus il faut de temps pour que la distribution soit mise à jour lorsque les itinéraires changent STR_CONFIG_SETTING_DISTRIBUTION_PAX :Type de distribution pour les passagers{NBSP}: {STRING} @@ -2163,6 +2164,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Quand une haute STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Impérial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrique (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Unités de jeu (niveaux) STR_CONFIG_SETTING_LOCALISATION :Localisation STR_CONFIG_SETTING_GRAPHICS :Graphiques @@ -3472,6 +3474,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Généra STR_GENERATION_RIVER_GENERATION :{BLACK}Création des rivières STR_GENERATION_CLEARING_TILES :{BLACK}Création des zones rugueuses et rocheuses STR_GENERATION_TOWN_GENERATION :{BLACK}Génération des villes +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Génération des industries terrestres +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Génération des industries maritimes STR_GENERATION_OBJECT_GENERATION :{BLACK}Création des objets inamovibles STR_GENERATION_TREE_GENERATION :{BLACK}Création des arbres STR_GENERATION_SETTINGUP_GAME :{BLACK}Configuration du jeu @@ -4188,7 +4192,7 @@ STR_PURCHASE_INFO_ALL_BUT :Tous sauf {CARG STR_PURCHASE_INFO_MAX_TE :{BLACK}Effort de traction max.{NBSP}: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rayon d'action{NBSP}: {GOLD}{COMMA}{NBSP}cases STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Type d'aéronef{NBSP}: {GOLD}{STRING} -STR_PURCHASE_INFO_RAILTYPES :{BLACK}Types de rail : {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Types de rail{NBSP}: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Tous les types de cargaison @@ -4372,7 +4376,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Coûts d'entret STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Coûts d'entretien{NBSP}: {CURRENCY_LONG}/période STR_ENGINE_PREVIEW_CAPACITY :Capacité{NBSP}: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Capacité{NBSP}: {CARGO_LONG}, {CARGO_LONG} -STR_ENGINE_PREVIEW_RAILTYPES :Types de rail : {STRING} +STR_ENGINE_PREVIEW_RAILTYPES :Types de rail{NBSP}: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Remplacer {STRING} - {STRING} @@ -5269,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Le débu STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... les deux extrémités du pont doivent être sur la terre ferme STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... pont trop long STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Le pont finirait en dehors de la carte +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Le pont est {HEIGHT} trop bas pour les gares +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Le pont est {HEIGHT} trop bas pour les arrêts de bus +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Le pont est {HEIGHT} trop bas pour le port +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Le pont est {HEIGHT} trop bas pour les bouées +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Le pont est {HEIGHT} trop bas pour les points de contrôle +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Le pont est {HEIGHT} trop bas pour les points de contrôle de route +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Le pont est {HEIGHT} trop bas pour l'écluse # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Impossible de construire un tunnel ici... diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 6faf58f355..691a84d6b4 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}피트 STR_UNITS_HEIGHT_METRIC :{DECIMAL}m STR_UNITS_HEIGHT_SI :{DECIMAL}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}층 # Time units used in string control characters STR_UNITS_DAYS :{COMMA}일 @@ -2163,6 +2164,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :높이를 표 STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :야드파운드법 (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :미터법 (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :국제표준규격 (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :게임 단위 (층) STR_CONFIG_SETTING_LOCALISATION :단위 설정 STR_CONFIG_SETTING_GRAPHICS :그래픽 @@ -3472,6 +3474,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}지형 STR_GENERATION_RIVER_GENERATION :{BLACK}강 제작 STR_GENERATION_CLEARING_TILES :{BLACK}거친 암석지대 만드는 중 STR_GENERATION_TOWN_GENERATION :{BLACK}도시 생성 +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}지상 산업시설 생성 +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}수상 산업시설 생성 STR_GENERATION_OBJECT_GENERATION :{BLACK}움직일수 없는 객체 만드는 중 STR_GENERATION_TREE_GENERATION :{BLACK}나무 심는 중 STR_GENERATION_SETTINGUP_GAME :{BLACK}게임 설정 중 @@ -5269,6 +5273,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}시작 STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... 다리의 양 끝은 모두 땅이어야 합니다 STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... 다리가 너무 깁니다! STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}다리 끝이 지도 밖을 넘어갑니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}다리 밑에 역을 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}다리 밑에 도로 정류장을 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}다리 밑에 부표를 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}다리 밑에 철도 경유지를 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}다리 밑에 도로 경유지를 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}다리 밑에 항구를 두기에는 다리 높이가 {HEIGHT}만큼 낮습니다 # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}여기에 터널을 지을 수 없습니다... From f052ef213ea668db5b20cf4486353a6374ab34ae Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 7 Nov 2025 04:39:02 +0000 Subject: [PATCH 171/280] Update: Translations from eints luxembourgish: 54 changes by phreeze83 --- src/lang/luxembourgish.txt | 60 ++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index db4bb0e90d..886a31a717 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -621,7 +621,11 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Firmewä STR_GRAPH_LAST_24_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Lescht 24 Minuten STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Dauert 72 Minutten +STR_GRAPH_LAST_288_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Lescht 288 Minuten +STR_GRAPH_LAST_24_MONTHS :{TINY_FONT}{BLACK}2 Joer (pro Mount) +STR_GRAPH_LAST_24_QUARTERS :{TINY_FONT}{BLACK}6 Joer (véirelsjähreg) +STR_GRAPH_LAST_24_YEARS :{TINY_FONT}{BLACK}24 Joer (jährleg) STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Luedungs Bezuelraten @@ -635,8 +639,11 @@ STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Keng Wue STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Schalt d'Grafik fir de Wuerentyp em STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} +STR_GRAPH_INDUSTRY_CAPTION :{WHITE}{INDUSTRY} - Wuerenhistorie STR_GRAPH_INDUSTRY_RANGE_PRODUCED :Produzéiert STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Transportéiert +STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Geliwwert +STR_GRAPH_INDUSTRY_RANGE_WAITING :Warden STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Weis detailléiert Leeschtungsastellungen @@ -967,11 +974,14 @@ STR_GAME_OPTIONS_TAB_SOUND :Sound STR_GAME_OPTIONS_TAB_SOUND_TOOLTIP :Wiel Sound- a Musikastellungen aus STR_GAME_OPTIONS_TAB_SOCIAL :Social STR_GAME_OPTIONS_TAB_SOCIAL_TOOLTIP :Wiel Astellungen déi mat Social Media ze dinn hunn +STR_GAME_OPTIONS_TAB_ADVANCED :Erweidert +STR_GAME_OPTIONS_TAB_ADVANCED_TOOLTIP :Erweidert Astellungen änneren STR_GAME_OPTIONS_VOLUME :Volume STR_GAME_OPTIONS_SFX_VOLUME :Soundeffekter STR_GAME_OPTIONS_MUSIC_VOLUME :Musik +STR_GAME_OPTIONS_SETTING :{STRING}: {ORANGE}{STRING} STR_GAME_OPTIONS_VOLUME_MARK :{NUM}% @@ -1026,6 +1036,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Malaysesche Rin STR_GAME_OPTIONS_CURRENCY_LVL :Lettesch Lat STR_GAME_OPTIONS_CURRENCY_PTE :Portugieseschen Escudo STR_GAME_OPTIONS_CURRENCY_UAH :Ukrainesch Hryvnia +STR_GAME_OPTIONS_CURRENCY_VND :Vietnamesesch Dong STR_GAME_OPTIONS_AUTOSAVE_FRAME :Autospäicheren STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :Wiel den Intervall aus fir d'Autospäicherung @@ -1059,6 +1070,7 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :Wiel des Optiou STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :Aktuellen Driver: {STRING} +STR_GAME_OPTIONS_INTERFACE :Interface STR_GAME_OPTIONS_GUI_SCALE_FRAME :Interfacegréisst STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :De Slider zéien fir d'Gréisst vum Interface ze änneren. Ctrl+Zéien fir eng kontinuéierlech Ännerung @@ -1083,6 +1095,7 @@ STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :Dëst start e B STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :Preview op d'Emfroresultat STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :Weis d'Resultat vun der Emfro vum aktuelle Spill un +STR_GAME_OPTIONS_DISPLAY :Display STR_GAME_OPTIONS_REFRESH_RATE :Bildfrequenz STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :Wiel d'Frequenz vum Bildschirm aus @@ -1298,6 +1311,9 @@ STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Zënssaz; kontr STR_CONFIG_SETTING_RUNNING_COSTS :Betribskäschten: {STRING} STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Fixéier den Niveau vun de Betribskäschten vu Gefierer an Infrastruktur ###length 3 +STR_CONFIG_SETTING_RUNNING_COSTS_LOW :Niddreg +STR_CONFIG_SETTING_RUNNING_COSTS_MEDIUM :Mëttel +STR_CONFIG_SETTING_RUNNING_COSTS_HIGH :Héich STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Baugeschwindegkeet: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitéier d'Unzuel u Bauaktiounen fir d'KI @@ -1665,6 +1681,8 @@ STR_CONFIG_SETTING_SCROLLMODE_LMB :Kaart mat der l STR_CONFIG_SETTING_SMOOTH_SCROLLING :Glaate Scrolling: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Kontrolléiert wéi d'Haptusiicht op eng bestëmmten Positioun scrollt, wann een op déi kléng Kaart klickt oder en Befehl fir ob en spezifescht Objet ze scrollen gëtt. Wann ugeschalt, gëtt bis dohin gescrollt, wann ausgeschalt, spréngt d'Vue op den Zielobjet +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT :Traditionellt Toolbarmenuselektiounsverhalen: {STRING} +STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT_HELPTEXT :Wiel aus wéi d'Selektioun an den Toolbarmenus sech verhält. Wann ausgeschalt, bleiwen d'Menuer opgeklappt bis eng Selektioun gemet gouf. Wann ugeschalt, aktivéiren sech d'Menuer wann d'Maustast lassgelooss gëtt. STR_CONFIG_SETTING_MEASURE_TOOLTIP :Weis en Mooss-Tooltip wann verschidde Bau-Tools benotzt ginn: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Weis Felderdistanzen an Héichtenënnerscheed beim Zéien während dem Bauen un @@ -2063,7 +2081,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Ufangs-Gréisst STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Duerchschnëttsgréisst vu Stied an Proportioun zu normalen Dierfer um Spillstart STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Update de Verdeelergraph all {STRING} -STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Zäit tëschend zwou Neiberechnungen vun der Linkgrafik. All Neiberechnung berechent eng Komponent vun der Grafik. Dëst bedeit dass e Wäert X net heescht dass de ganze Graph all X Sekonne geupdate gëtt. Nëmmen eng Komponent gëtt berechent. Wat de Wäert méi kuerz gesat gëtt, wat méi CPU Leeschtung gebraucht gëtt fir alles ze berechnen. Je gréisser de Wäert gesat gëtt desto méi laang brauch et bis d'Wuereverdeelung op neie Route gestart gëtt +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Zäit tëschend zwou Neiberechnungen vun der Linkgrafik. All Neiberechnung berechent eng Komponent vun der Grafik. Dëst bedeit dass e Wäert X net heescht dass déi ganze Grafik all X Sekonne geupdate gëtt. Nëmmen eng Komponent gëtt berechent. Wat de Wäert méi kuerz gesat gëtt, wat méi CPU Leeschtung gebraucht gëtt fir alles ze berechnen. Je gréisser de Wäert gesat gëtt desto méi laang brauch et bis d'Wuereverdeelung op neie Route gestart gëtt STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Benotz {STRING} fir d'Neiberechnung vum Verdeelergraph STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Zäit déi gebrauch gëtt fir all Neiberechnung vun enger Komponent vun der Linkgrafik. Wann eng Neiberechnung gestart gëtt, gëtt e Prozess erstallt den fir des Unzuel u Sekonne lafen dierf. Wat d'Zäit méi kuerz gesat gëtt, wat d'Chance méi grouss ass dass d'Berechnung net fäerdeg gëtt. Dann stopt d'Spill bis d'Berechnung fäerdeg ass ("laggt"). Je länger d'Zäit gesat gëtt desto länger brauch et bis d'Verdeelung geupdate gëtt wann eng Route ännert @@ -2193,6 +2211,8 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... keng STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}... GPU driver huet d'Spill gecrasht. Hardwarebeschleunegung ausgeschalt # Intro window +STR_INTRO_CAPTION :{WHITE}OpenTTD +STR_INTRO_VERSION :OpenTTD {REV} STR_INTRO_NEW_GAME :{BLACK}Neit Spill STR_INTRO_LOAD_GAME :{BLACK}Spill lueden @@ -2326,16 +2346,19 @@ STR_FACE_SIMPLE_TOOLTIP :{BLACK}Einfach STR_FACE_LOAD :{BLACK}Lueden STR_FACE_LOAD_TOOLTIP :{BLACK}Favoriséiert Gesiicht lueden STR_FACE_LOAD_DONE :{WHITE}Äert favoriséiert Gesiicht ass aus der OpenTTD Konfiguratiounsdatei geluede ginn. -STR_FACE_FACECODE :{BLACK}Gesiicht N°. -STR_FACE_FACECODE_TOOLTIP :{BLACK}Kuckt an wielt d'Gesiichtsnummer vum Firmepresident -STR_FACE_FACECODE_CAPTION :{WHITE}Kuckt an wielt d'Gesiichtsnummer -STR_FACE_FACECODE_SET :{WHITE}Nei Gesiichtsnummer ass agestallt ginn -STR_FACE_FACECODE_ERR :{WHITE}Konnt d'Gesiichtsnummer net setzen - muss en numereschen Wäert tëscht 0 an 4,294,967,295 sinn! +STR_FACE_FACECODE :{BLACK}Gesiichtscode +STR_FACE_FACECODE_TOOLTIP :{BLACK}Kuckt a wielt de Gesiichtscode vum Firmepresident +STR_FACE_FACECODE_CAPTION :{WHITE}Kuckt a wielt de Gesiichtscode +STR_FACE_FACECODE_SET :{WHITE}Neit Presidentegesiicht ass agestallt ginn +STR_FACE_FACECODE_ERR :{WHITE}Konnt de Gesiichtscode net astellen - muss e gültege Label an Nummer sinn STR_FACE_SAVE :{BLACK}Späicheren STR_FACE_SAVE_TOOLTIP :{BLACK}Späichert favoriséiert Gesiicht STR_FACE_SAVE_DONE :{WHITE}Dëst Gesiicht gëtt als favoriséiert an der OpenTTD Konfiguratiounsdatei gespäichert. +STR_FACE_SETTING_TOGGLE :{STRING} {ORANGE}{STRING} +STR_FACE_SETTING_NUMERIC :{STRING} {ORANGE}{NUM} / {NUM} STR_FACE_YES :Jo STR_FACE_NO :Nee +STR_FACE_STYLE :Stil: STR_FACE_HAIR :Hoer: STR_FACE_EYEBROWS :Aperhoer: STR_FACE_EYECOLOUR :Aafaarf: @@ -2808,6 +2831,10 @@ STR_PICKER_MODE_USED_TOOLTIP :Wiesselen tësc STR_PICKER_MODE_SAVED :Gespäichert STR_PICKER_MODE_SAVED_TOOLTIP :Wiesselen tëschent gespäicherten Objeten +STR_PICKER_PREVIEW_SHRINK :- +STR_PICKER_PREVIEW_SHRINK_TOOLTIP :D'Héicht vun Virschaubiller erofsetzen. Ctrl+Klick fir op de Minimum ze setzen +STR_PICKER_PREVIEW_EXPAND :+ +STR_PICKER_PREVIEW_EXPAND_TOOLTIP :D'Héicht vun Virschaubiller eropsetzen. Ctrl+Klick fir op de Maximum ze setzen. STR_PICKER_STATION_CLASS_TOOLTIP :Wiel eng Statiounsklass fir unzeweisen STR_PICKER_STATION_TYPE_TOOLTIP :Wiel en Typ vu Statioun fir ze bauen. Ctrl+Klick fir en bei d'gespäichert Objeten dobäizesetzen oder ewechzehuelen @@ -3307,6 +3334,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Filter: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Datei iwwerschreiwen STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Bass du sécher, dass du d'existéirend Datei iwwerschreiwe wëlls? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Datei läschen +STR_SAVELOAD_DELETE_WARNING :{YELLOW}}Bass du sécher, dass du des Datei läsche wëlls? STR_SAVELOAD_DIRECTORY :{STRING} (Verzeechnis) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Een dossier zréck) @@ -3672,6 +3701,10 @@ STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Wiesselt STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Erweideren STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Stad méi grouss maachen +STR_TOWN_VIEW_EXPAND_BUILDINGS_BUTTON :{BLACK}Gebaier erweideren +STR_TOWN_VIEW_EXPAND_BUILDINGS_TOOLTIP :{BLACK}Gebaier vun der Stad vergréisseren +STR_TOWN_VIEW_EXPAND_ROADS_BUTTON :{BLACK}Stroossen erweideren +STR_TOWN_VIEW_EXPAND_ROADS_TOOLTIP :{BLACK}Stroosse vun der Stad erweideren STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Läschen STR_TOWN_VIEW_DELETE_TOOLTIP :{BLACK}Des Stad ganz läschen @@ -3997,6 +4030,8 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Produkti STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Produktioun déi läscht Minutt: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% transportéiert) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Zentréiert d'Siicht op d'Industrie. Ctrl+Klick erstellt eng nei Usiicht op d'Industrie +STR_INDUSTRY_VIEW_CARGO_GRAPH :{BLACK}Wueregrafik +STR_INDUSTRY_VIEW_CARGO_GRAPH_TOOLTIP :{BLACK}Weist d'Grafik vun der Industriewuerenhistorie un STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Produktiounslevel: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}D'Industrie annoncéiert dass se zougemaach gëtt @@ -4317,6 +4352,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Betribskäschte STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Betribskäschten: {CURRENCY_LONG}/Period STR_ENGINE_PREVIEW_CAPACITY :Kapazitéit: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kapazitéit: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Schinnentypen: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Ersetz {STRING} - {STRING} @@ -5211,6 +5247,7 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... dei zwee Enner vun der Bréck mussen u Land sinn STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... Bréck ze laang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bréck géif ausserhalb der Kaart ukommen +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bréck ass {HEIGHT} ze niddreg fir e Stroossestop # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kann den Tunnel hei net bauen... @@ -5827,6 +5864,8 @@ STR_SAVEGAME_NAME_SPECTATOR :Zuschauer, {1:S # Viewport strings STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA}) +STR_VIEWPORT_TOWN_CITY :{TOWN} {CITY_ICON} +STR_VIEWPORT_TOWN_CITY_POP :{TOWN} ({COMMA}) {CITY_ICON} STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} # Simple strings to get specific types of data @@ -5850,6 +5889,7 @@ STR_CURRENCY_SHORT_GIGA :{NBSP}mia STR_CURRENCY_SHORT_TERA :{NBSP}bn STR_JUST_CARGO :{CARGO_LONG} +STR_JUST_LEFT_ARROW :{LEFT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_CHECKMARK :{CHECKMARK} STR_JUST_COMMA :{COMMA} @@ -5889,3 +5929,11 @@ STR_SHIP :{BLACK}{SHIP} STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY}) STR_BADGE_NAME_LIST :{STRING}: {GOLD}{STRING} +STR_BADGE_CONFIG_MENU_TOOLTIP :Badgekonfiguratioun opman +STR_BADGE_CONFIG_RESET :Reset +STR_BADGE_CONFIG_ICONS :{WHITE}Badgeikoner +STR_BADGE_CONFIG_FILTERS :{WHITE}Badgefilter +STR_BADGE_CONFIG_PREVIEW :Bildvirschau +STR_BADGE_CONFIG_NAME :Numm +STR_BADGE_FILTER_ANY_LABEL :Iergendeen {STRING} +STR_BADGE_FILTER_IS_LABEL :{STRING} ass {STRING} From d48463d2be1b63b970cfe03b85d0f4effdd205ad Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 9 Nov 2025 08:21:55 +0000 Subject: [PATCH 172/280] Fix #14763: Crash if NewGRF currency separator is not valid. (#14764) Ensure separator is a valid string. --- src/newgrf/newgrf_act0_globalvar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/newgrf/newgrf_act0_globalvar.cpp b/src/newgrf/newgrf_act0_globalvar.cpp index b71fccfb9b..18aa6d67a9 100644 --- a/src/newgrf/newgrf_act0_globalvar.cpp +++ b/src/newgrf/newgrf_act0_globalvar.cpp @@ -178,6 +178,7 @@ static ChangeInfoResult GlobalVarChangeInfo(uint first, uint last, int prop, Byt if (curidx < CURRENCY_END) { _currency_specs[curidx].separator.clear(); _currency_specs[curidx].separator.push_back(GB(options, 0, 8)); + StrMakeValidInPlace(_currency_specs[curidx].separator); /* By specifying only one bit, we prevent errors, * since newgrf specs said that only 0 and 1 can be set for symbol_pos */ _currency_specs[curidx].symbol_pos = GB(options, 8, 1); From 9c338cf2122f2de688e6ec8c98c4c0db4a0325d3 Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Sun, 9 Nov 2025 17:29:44 +0100 Subject: [PATCH 173/280] Codefix 8f14894: Correct the comment for GetClassBadge function. (#14759) --- src/newgrf_badge.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/newgrf_badge.cpp b/src/newgrf_badge.cpp index 59a9a4a1ca..ba9e803ac0 100644 --- a/src/newgrf_badge.cpp +++ b/src/newgrf_badge.cpp @@ -130,9 +130,9 @@ Badge *GetBadgeByLabel(std::string_view label) } /** - * Get the badge class of a badge label. - * @param label Label to get class of. - * @returns Badge class index of label. + * Get the badge for a badge class index. + * @param class_index Index of the badge class. + * @return Class badge for the class index, or nullptr if not present. */ Badge *GetClassBadge(BadgeClassID class_index) { From b563c34ca4689750428287360f9e1b24e59cb72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Sun, 9 Nov 2025 22:31:59 +0100 Subject: [PATCH 174/280] Codefix 6d495d1: [Actions] vcpkg caching for codeql requires some permissions (#14767) --- .github/workflows/codeql.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0aaaea5e00..904ad6feed 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -21,6 +21,7 @@ jobs: actions: read contents: read security-events: write + packages: read steps: - name: Checkout From 376a39f67ac7d9f44b217d7eb8f4d7966c39aa3e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 9 Nov 2025 22:40:08 +0000 Subject: [PATCH 175/280] Change: Use proper tooltip strings for freeform edge toggles. (#14765) --- src/genworld_gui.cpp | 8 ++++---- src/lang/english.txt | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index b98c34c608..602ae8d406 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -172,14 +172,14 @@ static constexpr std::initializer_list _nested_generate_landscape_w NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NORTHWEST), SetPadding(0, WidgetDimensions::unscaled.hsep_normal, 0, 0), SetFill(1, 1), SetAlignment(SA_RIGHT | SA_VERT_CENTER), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NW), SetToolTip(STR_MAPGEN_NORTHWEST), SetFill(1, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NE), SetToolTip(STR_MAPGEN_NORTHEAST), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NW), SetToolTip(STR_MAPGEN_NORTHWEST_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NE), SetToolTip(STR_MAPGEN_NORTHEAST_TOOLTIP), SetFill(1, 1), NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NORTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1), EndContainer(), NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SOUTHWEST), SetPadding(0, WidgetDimensions::unscaled.hsep_normal, 0, 0), SetFill(1, 1), SetAlignment(SA_RIGHT | SA_VERT_CENTER), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SW), SetToolTip(STR_MAPGEN_SOUTHWEST), SetFill(1, 1), - NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SE), SetToolTip(STR_MAPGEN_SOUTHEAST), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SW), SetToolTip(STR_MAPGEN_SOUTHWEST_TOOLTIP), SetFill(1, 1), + NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SE), SetToolTip(STR_MAPGEN_SOUTHEAST_TOOLTIP), SetFill(1, 1), NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SOUTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1), EndContainer(), EndContainer(), diff --git a/src/lang/english.txt b/src/lang/english.txt index 566fc9ad01..dd2f426621 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3427,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Northwes STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast STR_MAPGEN_SOUTHWEST :{BLACK}Southwest +STR_MAPGEN_NORTHWEST_TOOLTIP :Toggle water or freeform edge on the northwest map edge +STR_MAPGEN_NORTHEAST_TOOLTIP :Toggle water or freeform edge on the northeast map edge +STR_MAPGEN_SOUTHEAST_TOOLTIP :Toggle water or freeform edge on the southeast map edge +STR_MAPGEN_SOUTHWEST_TOOLTIP :Toggle water or freeform edge on the southwest map edge STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random From 744543e46919c9e006c2b7d19918055ca08d4261 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 10 Nov 2025 04:41:07 +0000 Subject: [PATCH 176/280] Update: Translations from eints luxembourgish: 54 changes by phreeze83 --- src/lang/luxembourgish.txt | 77 ++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 886a31a717..81a43c962d 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}Niveau{P "" en} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}D{P ag eeg} @@ -267,6 +268,7 @@ STR_UNITS_YEARS :{NUM}{NBSP}Joer STR_UNITS_PERIODS :{NUM}{NBSP}Period{P "" en} STR_LIST_SEPARATOR :,{SPACE} +STR_TRUNCATION_ELLIPSIS :... # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filter: @@ -285,7 +287,7 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fënster STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Fënstertitel - hei zéien fir d'Fënster ze bewegen STR_TOOLTIP_SHADE :{BLACK}Fenster verklengeren - Weis nëmmen Titelbar STR_TOOLTIP_DEBUG :{BLACK}Weis NewGRF Debug Informatioun -STR_TOOLTIP_DEFSIZE :{BLACK}Änner d'Fënster op d'Standardgréisst. Ctrl+Klick fir déi aktuell Gréisst als Standard ze späichern +STR_TOOLTIP_DEFSIZE :{BLACK}Änner d'Fënster op d'Standardgréisst. Ctrl+Klick fir déi aktuell Gréisst als Standard ze späichern. Dubel Ctrl+Klick fir op de Standard ze resetten STR_TOOLTIP_STICKY :{BLACK}Markéier dës Fënster fir net zougemeet ze ginn vun dem "All Fënsteren zoumaachen" Knäppchen. Ctrl+Klick späichert déi Actioun als Standard STR_TOOLTIP_RESIZE :{BLACK}Klicken an zéihen fir d'Fënstergréisst ze änneren STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Wiesselt grouss/kleng Fënstergréisst @@ -627,6 +629,8 @@ STR_GRAPH_LAST_24_MONTHS :{TINY_FONT}{BLA STR_GRAPH_LAST_24_QUARTERS :{TINY_FONT}{BLACK}6 Joer (véirelsjähreg) STR_GRAPH_LAST_24_YEARS :{TINY_FONT}{BLACK}24 Joer (jährleg) +STR_GRAPH_TOGGLE_RANGE :Grafik emschalte fir des Data Range +STR_GRAPH_SELECT_SCALE :Horizontal Skala vun der Grafik änneren STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Luedungs Bezuelraten STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Deeg am Transit @@ -634,8 +638,8 @@ STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLA STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Bezuelung fir Liwwerung vun 10 Eenheeten (oder 10.000 liter) Luedungen op Distanz vun 20 Felder STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}All STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Keng -STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}All Wueren op der Wuerewäertgrafik uweisen -STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Keng Wuer op der Wuerewäertgrafik uweisen +STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}All Wueren op der Grafik uweisen +STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Keng Wuer op der Grafik uweisen STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Schalt d'Grafik fir de Wuerentyp em STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} @@ -645,6 +649,9 @@ STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED :Transportéiert STR_GRAPH_INDUSTRY_RANGE_DELIVERED :Geliwwert STR_GRAPH_INDUSTRY_RANGE_WAITING :Warden +STR_GRAPH_TOWN_CARGO_CAPTION :{WHITE}{TOWN} - Wuerenhistorie +STR_GRAPH_TOWN_RANGE_PRODUCED :Angebot +STR_GRAPH_TOWN_RANGE_TRANSPORTED :Transportéiert STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Weis detailléiert Leeschtungsastellungen @@ -1117,7 +1124,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :Méi Informatio STR_GAME_OPTIONS_ONLINE_CONTENT :Inhalt eroflueden STR_GAME_OPTIONS_ONLINE_CONTENT_TOOLTIP :Sich no neiem an geupdateten Inhalt fir erofzelueden -STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(keng Plugins déi mat Social Platforms kommunizéiren installéiert) +STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :(keng Plugins déi mat Sozial-Platforme kommunizéiren installéiert) STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{STRING} ({STRING}) STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :Plattform: @@ -1336,6 +1343,9 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Keng Subsiden STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Konstruktiounskäschten: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Bestëmm den Niveau vu Bau- a Kafkäschten ###length 3 +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_LOW :Niddreg +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_MEDIUM :Mëttel +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HIGH :Héich STR_CONFIG_SETTING_RECESSIONS :Rezessiounen: {STRING} STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Wann ugeschalt kann vun Zäit zur Zäit eng Rezessioun kommen. Während enger Rezessioun ass d'Produktioun däitlech méi niddreg (an klëmmt erëm op den alen Niveau no der Rezessioun) @@ -2044,9 +2054,9 @@ STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Ausgeschalt -STR_CONFIG_SETTING_ZOOM_MIN :Maximale Razoom Level: {STRING} +STR_CONFIG_SETTING_ZOOM_MIN :Maximale Razoomniveau: {STRING} STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Maximal Razoomstuf fir Usiichtsfënsteren. Et gëtt méi Späicher gebraucht wann d'Stufen ze grouss ginn -STR_CONFIG_SETTING_ZOOM_MAX :Maximalen Rauszoom Level: {STRING} +STR_CONFIG_SETTING_ZOOM_MAX :Maximale Rauszoomniveau: {STRING} STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Maximal Rauszoom-Stuf fir Usiichtsfënsteren. Méi grouss Rauszoom-Stufen kënnen Ruckeler verursaachen ###length 6 STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x @@ -2094,9 +2104,9 @@ STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :D'GEPANZERT Wue STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Verdeelungsmodus fir aner Wuereklassen: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"Asymmetresch" heescht dass eng beléiweg Unzuel un Wueren an béid Richtungen verschéckt ginn. "Manuell" heescht dass keng automatësch Verdeelung stattfënnt ###length 3 -STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuell -STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asymmetresch -STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :symmetresch +STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :Manuell +STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Asymmetresch +STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Symmetresch STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Verdeelungsgenauegkeet: {STRING} STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Wat de Wäert méi héich ass, wat méi CPU benotzt gëtt fir d'Linkgrafik ze zeechnen. Wann ze héich gesat, kann et zu Lags kommen. Ze niddreg gesat kann d'Verdeelung ongenau ginn an d'Wueren net sou verdeelt ginn wéi geduet @@ -2153,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Emmer wann Héi STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Britesch (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metresch (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Spilleenheeten (Niveau) STR_CONFIG_SETTING_LOCALISATION :Lokaliséirung STR_CONFIG_SETTING_GRAPHICS :Grafik @@ -3075,6 +3086,11 @@ STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Wiel d'S STR_FOUND_TOWN_CITY :{BLACK}Stad STR_FOUND_TOWN_CITY_TOOLTIP :{BLACK}Stied wuessen méi schnell wéi Dierfer{}Ofhängeg vun den Astellungen, sinn se méi grouss am Ufank +STR_FOUND_TOWN_EXPAND_MODE :{YELLOW}Stadvergéisserung: +STR_FOUND_TOWN_EXPAND_BUILDINGS :Gebaier +STR_FOUND_TOWN_EXPAND_BUILDINGS_TOOLTIP :Unzuel Gebaier vun der Stad erhéigen +STR_FOUND_TOWN_EXPAND_ROADS :Stroossen +STR_FOUND_TOWN_EXPAND_ROADS_TOOLTIP :Méi Stroossen an der Stad bauen STR_FOUND_TOWN_ROAD_LAYOUT :{YELLOW}Stroosselayout vun der Stad: STR_FOUND_TOWN_SELECT_LAYOUT_TOOLTIP :{BLACK}Stroosselayout fir des Stad wielen @@ -3416,8 +3432,9 @@ STR_MAPGEN_BORDER_WATER :{BLACK}Waasser STR_MAPGEN_BORDER_RANDOM :{BLACK}Zoufälleg ###length 3 -STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Zoufall -STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuell +STR_MAPGEN_BORDER_RANDOMIZE :Zoufall +STR_MAPGEN_BORDER_MANUAL :Manuell +STR_MAPGEN_BORDER_INFINITE_WATER :Endlos Waasser STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Héichtekaart-Rotatioun: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Héichtekaart-Numm: @@ -3456,6 +3473,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Landscha STR_GENERATION_RIVER_GENERATION :{BLACK}Generéiren vu Flëss STR_GENERATION_CLEARING_TILES :{BLACK}Generatioun vu knubbelegem a stengege Land STR_GENERATION_TOWN_GENERATION :{BLACK}Stiedgeneratioun +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Landindustriegeneratioun +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Waasserindustriegeneratioun STR_GENERATION_OBJECT_GENERATION :{BLACK}Objets-Generatioun STR_GENERATION_TREE_GENERATION :{BLACK}Baam Generatioun STR_GENERATION_SETTINGUP_GAME :{BLACK}Spill gëtt opgestallt @@ -3675,6 +3694,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Gëff en STR_TOWN_DIRECTORY_CAPTION :{WHITE}Stied ({COMMA} vu {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keng - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Stiednimm - klick op den Numm fir d'Usiicht drop ze zentréieren. Ctrl+Klick erstellt eng nei Usiicht vun der Stad STR_TOWN_POPULATION :{BLACK}Weltbevölkerung: {COMMA} @@ -3698,6 +3718,8 @@ STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Zentréi STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Gemeng STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Weist d'Informatiounen zu der Gemeng STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Wiesselt de Stadnumm +STR_TOWN_VIEW_CARGO_GRAPH :Wueregrafik +STR_TOWN_VIEW_CARGO_GRAPH_TOOLTIP :Grafik vun der Stad hierer Wuerenhistorie uweisen STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Erweideren STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Stad méi grouss maachen @@ -4032,7 +4054,7 @@ STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_ STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Zentréiert d'Siicht op d'Industrie. Ctrl+Klick erstellt eng nei Usiicht op d'Industrie STR_INDUSTRY_VIEW_CARGO_GRAPH :{BLACK}Wueregrafik STR_INDUSTRY_VIEW_CARGO_GRAPH_TOOLTIP :{BLACK}Weist d'Grafik vun der Industriewuerenhistorie un -STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Produktiounslevel: {YELLOW}{COMMA}% +STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Produktiounsniveau: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}D'Industrie annoncéiert dass se zougemaach gëtt STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}Brauch: {YELLOW}{STRING}{STRING} @@ -4046,7 +4068,7 @@ STR_INDUSTRY_VIEW_ACCEPT_CARGO_NOSUFFIX :{YELLOW}{0:STRI STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT_NOSUFFIX :{YELLOW}{0:STRING}{BLACK}: {1:CARGO_SHORT} warden STR_CONFIG_GAME_PRODUCTION :{WHITE}D'Produktioun änneren (Multipel vun 8, bis op 2040) -STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Änner de Produktiounslevel (Prozenter, bis zu 800%) +STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Änner de Produktiounsniveau (Prozenter, bis zu 800%) # Vehicle lists ###length VEHICLE_TYPES @@ -4169,6 +4191,7 @@ STR_PURCHASE_INFO_ALL_BUT :Alles ausser {C STR_PURCHASE_INFO_MAX_TE :{BLACK}Max. Zéikraaft: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Distanz: {GOLD}{COMMA} Felder STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fliger Typ: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Schinnentypen: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :All Wuerentyp @@ -4444,10 +4467,10 @@ STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Weist d' STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Weist d'Opträg vum Fliger. Ctrl+Klick weist den Zäitplang ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Weist d'Detailer vum Zuch -STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Weist Stroossegefier Detailer -STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Weis Schëffsdetailer -STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Weist d'Fligerdetailer +STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Weist d'Detailer vum Zuch. Ctrl+Klick fir d'Zuchgrupp unzeweisen +STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Weist Gefier Detailer. Ctrl+Klick fir d'Gefierergrupp unzeweisen +STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Weis Schëffsdetailer un. Ctrl+Klick fir d'Schëffsgrupp unzeweisen +STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Weist d'Fligerdetailer un. Ctrl+Klick fir d'Fligergrupp unzeweisen ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Aktuell Zuchs-Aktioun - klick fir den Zuch ze stoppen/starten @@ -4771,14 +4794,15 @@ STR_TIMETABLE_TOOLTIP :{BLACK}Zäitpla STR_TIMETABLE_NO_TRAVEL :Net ënnerwee STR_TIMETABLE_NOT_TIMETABLEABLE :Rees (automatesch; Zäitplang durch manuell Opträg) STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Ënnerwee (ouni Zäitplang) +STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Fuer maximal {VELOCITY} (ouni Zäitplang) STR_TIMETABLE_TRAVEL_FOR :Ënnerwee während {STRING} STR_TIMETABLE_TRAVEL_FOR_SPEED :Fiert während {STRING} mat maximal {VELOCITY} STR_TIMETABLE_TRAVEL_FOR_ESTIMATED :Fuer (während {STRING}, ouni Zäitplang) STR_TIMETABLE_TRAVEL_FOR_SPEED_ESTIMATED :Fuer (während {STRING}, ouni Zäitplang) mat maximal {VELOCITY} STR_TIMETABLE_STAY_FOR_ESTIMATED :{SPACE}(waard {STRING}, ouni Zäitplang) STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :{SPACE}(fuer während {STRING}, ouni Zäitplang) -STR_TIMETABLE_STAY_FOR :an bleif fir {STRING} -STR_TIMETABLE_AND_TRAVEL_FOR :an ënnerwee während {STRING} +STR_TIMETABLE_STAY_FOR :{SPACE} a bleif fir {STRING} +STR_TIMETABLE_AND_TRAVEL_FOR :{SPACE}an ënnerwee während {STRING} STR_TIMETABLE_APPROX_TIME :{BLACK}Dësen Zäitplang brauch ongeféier {STRING} fir fäerdeg ze ginn STR_TIMETABLE_TOTAL_TIME :{BLACK}Dësen Zäitplang brauch {STRING} fir fäerdeg ze ginn @@ -5007,6 +5031,7 @@ STR_ERROR_FLAT_LAND_REQUIRED :{WHITE}D'Land m STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION :{WHITE}Land ass an déi falsch Richtung geneigt STR_ERROR_CAN_T_DO_THIS :{WHITE}Kann dat net maachen... STR_ERROR_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Gebai muss fir d'éischt ofgerapt ginn +STR_ERROR_BUILDING_IS_PROTECTED :{WHITE}... Gebai ass geschützt STR_ERROR_CAN_T_CLEAR_THIS_AREA :{WHITE}Kann des Plaz net raumen... STR_ERROR_SITE_UNSUITABLE :{WHITE}... Plaz net gëeegent STR_ERROR_ALREADY_BUILT :{WHITE}... scho gebaut @@ -5094,7 +5119,7 @@ STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Kann de STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Kann d'Camionsgare net bauen... STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Kann d'Passagéier-Tramsarrêt net bauen... STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Kann d'Wueren-Tramstatioun net bauen... -STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Kann den Dock hei net bauen... +STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Kann de Quai hei net bauen... STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Kann de Fluchhafen hei net bauen... STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Grenzt un méi wéi eng Gare un @@ -5105,7 +5130,7 @@ STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Ze vill STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Ze vill Garesdeeler STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Ze vill Busarrêten STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Ze vill Camionsgaren -STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ze no un engem aaneren Hafen +STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ze no un engem aanere Quai STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ze no un engem aanere Fluchhafen STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann d'Statioun net ëmbenennen... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... d'Strooss ass am Besëtz vun der Stad @@ -5128,7 +5153,7 @@ STR_ERROR_MUST_DEMOLISH_BUS_STATION_FIRST :{WHITE}Busarrê STR_ERROR_MUST_DEMOLISH_TRUCK_STATION_FIRST :{WHITE}Muss d'Camionsgare fir d'éischt ofrappen STR_ERROR_MUST_DEMOLISH_PASSENGER_TRAM_STATION_FIRST :{WHITE}Muss d'Tramstatioun fir d'éischt ofrappen STR_ERROR_MUST_DEMOLISH_CARGO_TRAM_STATION_FIRST :{WHITE}Muss d'Tramstatioun fir d'éischt ofrappen -STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Muss den Hafen fir déischt ofrappen +STR_ERROR_MUST_DEMOLISH_DOCK_FIRST :{WHITE}Muss de Quai fir déischt ofrappen STR_ERROR_MUST_DEMOLISH_AIRPORT_FIRST :{WHITE}Muss de Fluchhafe fir d'éischt ofrappen # Waypoint related errors @@ -5247,7 +5272,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Start an STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... dei zwee Enner vun der Bréck mussen u Land sinn STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... Bréck ze laang STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Bréck géif ausserhalb der Kaart ukommen +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}Bréck ass {HEIGHT} ze niddreg fir d'Gare STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}Bréck ass {HEIGHT} ze niddreg fir e Stroossestop +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}Bréck ass {HEIGHT} ze niddreg fir de Quai +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}Bréck as {HEIGHT} ze niddreg fir d'Boje +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}Bréck ass {HEIGHT} ze niddreg fir den Zuchweepunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}Bréck ass {HEIGHT} ze niddreg fir de Stroosseweepunkt +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}Bréck ass {HEIGHT} ze niddreg fir d'Schleis # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Kann den Tunnel hei net bauen... @@ -5396,7 +5427,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... Flig STR_ERROR_NO_RAIL_STATION :{WHITE}Et gëtt keng Zuchgare/statioun STR_ERROR_NO_BUS_STATION :{WHITE}Et gëtt keen Busarrêt STR_ERROR_NO_TRUCK_STATION :{WHITE}Et gëtt keng Camionsgare -STR_ERROR_NO_DOCK :{WHITE}Et gëtt keen Dock +STR_ERROR_NO_DOCK :{WHITE}Et gëtt kee Quai STR_ERROR_NO_AIRPORT :{WHITE}Et gëtt keen Fluchhafen/Helikopterlandeplaz STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Et gëtt keen Arret mat engem kompatible Stroossentyp STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Et gëtt keen Arret mat engem kompatible Tramtyp From aa6c694c67839b0867b5336c0a18661db3dd67e3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 10 Nov 2025 21:41:02 +0000 Subject: [PATCH 177/280] Fix c2d4098afa: Unconfigured badge classes should be visible in column 0 by default. (#14766) --- src/newgrf_badge_config.h | 4 ++-- src/newgrf_badge_gui.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/newgrf_badge_config.h b/src/newgrf_badge_config.h index 1da4fa75b3..3a4069022c 100644 --- a/src/newgrf_badge_config.h +++ b/src/newgrf_badge_config.h @@ -16,8 +16,8 @@ class BadgeClassConfigItem { public: std::string label; ///< Class label. - int column = -1; ///< UI column, feature-dependent. - bool show_icon = false; ///< Set if the badge icons should be displayed for this class. + uint column = 0; ///< UI column, feature-dependent. + bool show_icon = true; ///< Set if the badge icons should be displayed for this class. bool show_filter = false; ///< Set if a drop down filter should be added for this class. }; diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 0a1290fedb..68f9311a5c 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -81,7 +81,7 @@ GUIBadgeClasses::GUIBadgeClasses(GrfSpecFeature feature) : UsedBadgeClasses(feat const auto [config, sort_order] = GetBadgeClassConfigItem(feature, class_badge->label); this->gui_classes.emplace_back(class_index, config.column, config.show_icon, sort_order, size, class_badge->label); - if (size.width != 0 && config.show_icon) max_column = std::max(max_column, config.column); + if (size.width != 0 && config.show_icon) max_column = std::max(max_column, config.column); } std::sort(std::begin(this->gui_classes), std::end(this->gui_classes)); @@ -436,7 +436,7 @@ static void BadgeClassMoveNext(GrfSpecFeature feature, Badge &class_badge, uint auto pos_cur = std::ranges::find(gui_classes.GetClasses(), class_badge.class_index, &GUIBadgeClasses::Element::class_index); if (std::next(pos_cur) == std::end(gui_classes.GetClasses())) { - if (it->column < static_cast(columns - 1)) ++it->column; + if (it->column < columns - 1) ++it->column; return; } From ca866cc0836fcac70093b66e95bc9d9efd68b023 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 10 Nov 2025 21:43:35 +0000 Subject: [PATCH 178/280] Fix 394adb654e: Incorrect spacing for badges in dropdown lists. (#14768) --- src/newgrf_badge_gui.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 68f9311a5c..ff0a1d48c9 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -193,9 +193,12 @@ public: { for (const auto &gc : gui_classes->GetClasses()) { if (gc.column_group != 0) continue; - dim.width += gc.size.width + WidgetDimensions::scaled.hsep_normal; - dim.height = std::max(dim.height, gc.size.height); + dim.width += ScaleGUITrad(gc.size.width) + WidgetDimensions::scaled.hsep_normal; + dim.height = std::max(dim.height, ScaleGUITrad(gc.size.height)); } + + /* Remove trailing `hsep_normal` spacer. */ + if (dim.width > 0) dim.width -= WidgetDimensions::scaled.hsep_normal; } uint Height() const override @@ -206,7 +209,7 @@ public: uint Width() const override { if (this->dim.width == 0) return this->TBase::Width(); - return this->dim.width + WidgetDimensions::scaled.hsep_wide + this->TBase::Width(); + return this->dim.width + WidgetDimensions::scaled.hsep_normal + this->TBase::Width(); } int OnClick(const Rect &r, const Point &pt) const override @@ -215,7 +218,7 @@ public: return this->TBase::OnClick(r, pt); } else { bool rtl = TEnd ^ (_current_text_dir == TD_RTL); - return this->TBase::OnClick(r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), pt); + return this->TBase::OnClick(r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_normal, rtl), pt); } } @@ -226,7 +229,7 @@ public: } else { bool rtl = TEnd ^ (_current_text_dir == TD_RTL); DrawBadgeColumn(r.WithWidth(this->dim.width, rtl), 0, *this->gui_classes, this->badges, this->feature, this->introduction_date, PAL_NONE); - this->TBase::Draw(full, r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_wide, rtl), sel, click_result, bg_colour); + this->TBase::Draw(full, r.Indent(this->dim.width + WidgetDimensions::scaled.hsep_normal, rtl), sel, click_result, bg_colour); } } From ae413728c1598c7c6f77ff2a7192236fb9bd7ef8 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 11 Nov 2025 04:40:42 +0000 Subject: [PATCH 179/280] Update: Translations from eints english (au): 4 changes by krysclarke english (us): 4 changes by 2TallTyler greek: 4 changes by gh658804 hungarian: 4 changes by vargaviktor russian: 4 changes by Ln-Wolf finnish: 4 changes by hpiirai portuguese: 4 changes by jcteotonio portuguese (brazilian): 4 changes by pasantoro --- src/lang/brazilian_portuguese.txt | 4 ++++ src/lang/english_AU.txt | 4 ++++ src/lang/english_US.txt | 4 ++++ src/lang/finnish.txt | 4 ++++ src/lang/greek.txt | 4 ++++ src/lang/hungarian.txt | 4 ++++ src/lang/portuguese.txt | 4 ++++ src/lang/russian.txt | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 42ecbac923..a187eae939 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3428,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Noroeste STR_MAPGEN_NORTHEAST :{BLACK}Nordeste STR_MAPGEN_SOUTHEAST :{BLACK}Sudeste STR_MAPGEN_SOUTHWEST :{BLACK}Sudoeste +STR_MAPGEN_NORTHWEST_TOOLTIP :Alternar entre água ou borda livre na borda noroeste do mapa +STR_MAPGEN_NORTHEAST_TOOLTIP :Alternar entre água ou borda livre na borda nordeste do mapa +STR_MAPGEN_SOUTHEAST_TOOLTIP :Alternar entre água ou borda livre na borda sudeste do mapa +STR_MAPGEN_SOUTHWEST_TOOLTIP :Alternar entre água ou borda livre na borda sudoeste do mapa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma livre STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 92dc23506a..55c66782b1 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3427,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Northwes STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast STR_MAPGEN_SOUTHWEST :{BLACK}Southwest +STR_MAPGEN_NORTHWEST_TOOLTIP :Toggle water or freeform edge on the northwest map edge +STR_MAPGEN_NORTHEAST_TOOLTIP :Toggle water or freeform edge on the northeast map edge +STR_MAPGEN_SOUTHEAST_TOOLTIP :Toggle water or freeform edge on the southeast map edge +STR_MAPGEN_SOUTHWEST_TOOLTIP :Toggle water or freeform edge on the southwest map edge STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 1a529a17b0..63796fbe52 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3427,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Northwes STR_MAPGEN_NORTHEAST :{BLACK}Northeast STR_MAPGEN_SOUTHEAST :{BLACK}Southeast STR_MAPGEN_SOUTHWEST :{BLACK}Southwest +STR_MAPGEN_NORTHWEST_TOOLTIP :Toggle water or freeform edge on the northwest map edge +STR_MAPGEN_NORTHEAST_TOOLTIP :Toggle water or freeform edge on the northeast map edge +STR_MAPGEN_SOUTHEAST_TOOLTIP :Toggle water or freeform edge on the southeast map edge +STR_MAPGEN_SOUTHWEST_TOOLTIP :Toggle water or freeform edge on the southwest map edge STR_MAPGEN_BORDER_FREEFORM :{BLACK}Freeform STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Random diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index f7b6d68b0d..80a1c2f87b 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3427,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Luode STR_MAPGEN_NORTHEAST :{BLACK}Koillinen STR_MAPGEN_SOUTHEAST :{BLACK}Kaakko STR_MAPGEN_SOUTHWEST :{BLACK}Lounas +STR_MAPGEN_NORTHWEST_TOOLTIP :Valitse, onko kartan luoteislaita vettä vai vapaamuotoista reunaa +STR_MAPGEN_NORTHEAST_TOOLTIP :Valitse, onko kartan koillislaita vettä vai vapaamuotoista reunaa +STR_MAPGEN_SOUTHEAST_TOOLTIP :Valitse, onko kartan kaakkoislaita vettä vai vapaamuotoista reunaa +STR_MAPGEN_SOUTHWEST_TOOLTIP :Valitse, onko kartan lounaislaita vettä vai vapaamuotoista reunaa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vapaa STR_MAPGEN_BORDER_WATER :{BLACK}Vesi STR_MAPGEN_BORDER_RANDOM :{BLACK}Sattumanvarainen diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 051a97e806..ca49e0fa51 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3520,6 +3520,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Βορε STR_MAPGEN_NORTHEAST :{BLACK}Βορειοανατολικά STR_MAPGEN_SOUTHEAST :{BLACK}Νοτιοανατολικά STR_MAPGEN_SOUTHWEST :{BLACK}Νοτιοδυτικά +STR_MAPGEN_NORTHWEST_TOOLTIP :Εναλλαγή νερού ή ελεύθερης μορφής άκρης στο βορειοδυτικό άκρο του χάρτη +STR_MAPGEN_NORTHEAST_TOOLTIP :Εναλλαγή νερού ή ελεύθερης μορφής άκρης στο βορειοανατολικό άκρο του χάρτη +STR_MAPGEN_SOUTHEAST_TOOLTIP :Εναλλαγή νερού ή ελεύθερης μορφής άκρης στο νοτιοανατολικό άκρο του χάρτη +STR_MAPGEN_SOUTHWEST_TOOLTIP :Εναλλαγή νερού ή ελεύθερης μορφής άκρης στο νοτιοδυτικό άκρο του χάρτη STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ελεύθερη μορφή STR_MAPGEN_BORDER_WATER :{BLACK}Νερό STR_MAPGEN_BORDER_RANDOM :{BLACK}Τυχαία diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index b87127ba49..0898e35329 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3491,6 +3491,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Északny STR_MAPGEN_NORTHEAST :{BLACK}Északkelet STR_MAPGEN_SOUTHEAST :{BLACK}Délkelet STR_MAPGEN_SOUTHWEST :{BLACK}Délnyugat +STR_MAPGEN_NORTHWEST_TOOLTIP :Víz vagy szabad formájú térképszél bekapcsolása a térkép északnyugati szélén +STR_MAPGEN_NORTHEAST_TOOLTIP :Víz vagy szabad formájú térképszél bekapcsolása a térkép északkeleti szélén +STR_MAPGEN_SOUTHEAST_TOOLTIP :Víz vagy szabad formájú térképszél bekapcsolása a térkép délkeleti szélén +STR_MAPGEN_SOUTHWEST_TOOLTIP :Víz vagy szabad formájú térképszél bekapcsolása a térkép délnyugati szélén STR_MAPGEN_BORDER_FREEFORM :{BLACK}Szárazföld STR_MAPGEN_BORDER_WATER :{BLACK}Víz STR_MAPGEN_BORDER_RANDOM :{BLACK}Véletlen diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index d5b20f7f15..8c7ffb13ba 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3428,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Noroeste STR_MAPGEN_NORTHEAST :{BLACK}Nordeste STR_MAPGEN_SOUTHEAST :{BLACK}Sudeste STR_MAPGEN_SOUTHWEST :{BLACK}Sudoeste +STR_MAPGEN_NORTHWEST_TOOLTIP :Alternar entre água e modo livre no limite noroeste do mapa +STR_MAPGEN_NORTHEAST_TOOLTIP :Alternar entre água e modo livre no limite nordeste do mapa +STR_MAPGEN_SOUTHEAST_TOOLTIP :Alternar entre água e modo livre no limite sudeste do mapa +STR_MAPGEN_SOUTHWEST_TOOLTIP :Alternar entre água e modo livre no limite sudoeste do mapa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Modo livre STR_MAPGEN_BORDER_WATER :{BLACK}Água STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatório diff --git a/src/lang/russian.txt b/src/lang/russian.txt index f9ca11109c..309c3a92e5 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3602,6 +3602,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Севе STR_MAPGEN_NORTHEAST :{BLACK}Северо-восток STR_MAPGEN_SOUTHEAST :{BLACK}Юго-восток STR_MAPGEN_SOUTHWEST :{BLACK}Юго-запад +STR_MAPGEN_NORTHWEST_TOOLTIP :Выбрать тип северо-западного края карты: водный или произвольной формы +STR_MAPGEN_NORTHEAST_TOOLTIP :Выбрать тип северо-восточного края карты: водный или произвольной формы +STR_MAPGEN_SOUTHEAST_TOOLTIP :Выбрать тип юго-восточного края карты: водный или произвольной формы +STR_MAPGEN_SOUTHWEST_TOOLTIP :Выбрать тип юго-западного края карты: водный или произвольной формы STR_MAPGEN_BORDER_FREEFORM :{BLACK}Свободный STR_MAPGEN_BORDER_WATER :{BLACK}Водный STR_MAPGEN_BORDER_RANDOM :{BLACK}Случайно From c4b16cb4cdb57fa6c9afe105e877f548a4c6d54f Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 12 Nov 2025 04:39:35 +0000 Subject: [PATCH 180/280] Update: Translations from eints galician: 17 changes by pvillaverde polish: 4 changes by Rito13 --- src/lang/galician.txt | 19 +++++++++++++++++-- src/lang/polish.txt | 4 ++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 79258e6b87..e5f6f2b46c 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL} pés STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}Nive{P "" is} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}día{P "" s} @@ -1544,7 +1545,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendario STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Reloxo STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minutos por ano: {STRING} -STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Selecciona o número de minutos dun ano do calendario. Por defecto son 12 minutos. Fíxao en 0 para para conxelar o calendario. Increemntar a duración do ano do calendario ralentiza a introdución de vehículos, casas e outra infraestrutura. Non afecta a velocidade dos vehículos ou a simulación económica excepto pola inflación. Este axuste só está dispoñible cando se usa o modo reloxo de cronometraxe +STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Selecciona o número de minutos dun ano do calendario. Por defecto son 12 minutos. Fíxao en 0 para para conxelar o calendario. Incrementar a duración do ano do calendario ralentiza a introdución de vehículos, casas e outra infraestrutura. Non afecta a velocidade dos vehículos ou a simulación económica excepto pola inflación. Este axuste só está dispoñible cando se usa o modo reloxo de cronometraxe STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special @@ -2163,6 +2164,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Cando as cotas STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Métrico (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Unidades de xogo (niveis) STR_CONFIG_SETTING_LOCALISATION :Localización STR_CONFIG_SETTING_GRAPHICS :Gráficos @@ -2295,7 +2297,7 @@ STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Trocar a STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar data: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Cambiar o ano actual STR_CHEAT_SETUP_PROD :{LTBLUE}Permitir a modificación dos valores de producción: {ORANGE}{STRING} -STR_CHEAT_STATION_RATING :{LTBLUE}Manter a puntuacuón das estacións ao 100%: {ORANGE}{STRING} +STR_CHEAT_STATION_RATING :{LTBLUE}Manter a puntuación das estacións ao 100%: {ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Novo esquema de cor @@ -3426,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Noroeste STR_MAPGEN_NORTHEAST :{BLACK}Nordés STR_MAPGEN_SOUTHEAST :{BLACK}Sueste STR_MAPGEN_SOUTHWEST :{BLACK}Suroeste +STR_MAPGEN_NORTHWEST_TOOLTIP :Alternar auga ou borde de forma libre na esquina noroeste do mapa +STR_MAPGEN_NORTHEAST_TOOLTIP :Alternar auga ou borde de forma libre na esquina nordeste do mapa +STR_MAPGEN_SOUTHEAST_TOOLTIP :Alternar auga ou borde de forma libre na esquina sudeste do mapa +STR_MAPGEN_SOUTHWEST_TOOLTIP :Alternar auga ou borde de forma libre na esquina sudoeste do mapa STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma libre STR_MAPGEN_BORDER_WATER :{BLACK}Auga STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatorio @@ -3472,6 +3478,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Xeració STR_GENERATION_RIVER_GENERATION :{BLACK}Xeración de ríos STR_GENERATION_CLEARING_TILES :{BLACK}Xeración de áreas rochosas e escarpadas STR_GENERATION_TOWN_GENERATION :{BLACK}Xeración de vilas +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Xeración de industria terrestre +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Xeración de industria marítima STR_GENERATION_OBJECT_GENERATION :{BLACK}Xeración de obxectos STR_GENERATION_TREE_GENERATION :{BLACK}Xeración de árbores STR_GENERATION_SETTINGUP_GAME :{BLACK}Configurando partida @@ -5269,6 +5277,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}O inicio STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... ambos extremos da ponte deben estar en terra STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... ponte demasiado longa STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}A ponte remataría fóra do mapa +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}A ponte é {HEIGHT} demasiado baixa para a estación +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}A ponte é {HEIGHT} demasiado baixa para unha estación de estrada +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}A ponte é {HEIGHT} moi baixa para o porto +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}A ponte é {HEIGHT} demasiado baixa para a boia +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}A ponte é {HEIGHT} demasiado baixa para un punto de ruta de ferrocarril +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}A ponte é {HEIGHT} demasiado baixa para un punto de ruta de estrada +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}A ponte é {HEIGHT} moi baixa para a exclusa # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Non se pode construír un túnel aí... diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 5e983a32f1..8a9fc72d45 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3807,6 +3807,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Płn.-za STR_MAPGEN_NORTHEAST :{BLACK}Płn.-wsch. STR_MAPGEN_SOUTHEAST :{BLACK}Płd.-wsch. STR_MAPGEN_SOUTHWEST :{BLACK}Płd.-zach. +STR_MAPGEN_NORTHWEST_TOOLTIP :Przełącz między wodą, a lądem na płn.-zach. krawędzi mapy +STR_MAPGEN_NORTHEAST_TOOLTIP :Przełącz między wodą, a lądem na płn.-wsch. krawędzi mapy +STR_MAPGEN_SOUTHEAST_TOOLTIP :Przełącz między wodą, a lądem na płd.-wsch. krawędzi mapy +STR_MAPGEN_SOUTHWEST_TOOLTIP :Przełącz między wodą, a lądem na płd.-zach. krawędzi mapy STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ląd STR_MAPGEN_BORDER_WATER :{BLACK}Woda STR_MAPGEN_BORDER_RANDOM :{BLACK}Losowe From 120afd29f336ea2232a54fdbff7affbaa250f374 Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:42:11 +0100 Subject: [PATCH 181/280] Codefix 394adb6: Make newgrf_badge_gui.cpp file docs compatible with the file name. (#14770) --- src/newgrf_badge_gui.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index bd47f05aaf..e603308094 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -5,7 +5,7 @@ * 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 newgrf_badge.h Functions related to NewGRF badges. */ +/** @file newgrf_badge_gui.h GUI functions related to NewGRF badges. */ #ifndef NEWGRF_BADGE_GUI_H #define NEWGRF_BADGE_GUI_H From dbe329733c801752372c7acd6e41b902b843a2cf Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 13 Nov 2025 04:40:24 +0000 Subject: [PATCH 182/280] Update: Translations from eints korean: 4 changes by telk5093 --- src/lang/korean.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 691a84d6b4..e79cf65ee7 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3428,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}북서 STR_MAPGEN_NORTHEAST :{BLACK}북동 STR_MAPGEN_SOUTHEAST :{BLACK}남동 STR_MAPGEN_SOUTHWEST :{BLACK}남서 +STR_MAPGEN_NORTHWEST_TOOLTIP :남서쪽 지도 맨 가장자리를 물로 할지 육지로 할지 고릅니다 +STR_MAPGEN_NORTHEAST_TOOLTIP :북동쪽 지도 맨 가장자리를 물로 할지 육지로 할지 고릅니다 +STR_MAPGEN_SOUTHEAST_TOOLTIP :남동쪽 지도 맨 가장자리를 물로 할지 육지로 할지 고릅니다 +STR_MAPGEN_SOUTHWEST_TOOLTIP :남서쪽 지도 맨 가장자리를 물로 할지 육지로 할지 고릅니다 STR_MAPGEN_BORDER_FREEFORM :{BLACK}변경 가능 STR_MAPGEN_BORDER_WATER :{BLACK}물 STR_MAPGEN_BORDER_RANDOM :{BLACK}임의 From c38aa9cc869cfcc1182cd5e4969859ef1168a42b Mon Sep 17 00:00:00 2001 From: Rito12 <111280526+Rito13@users.noreply.github.com> Date: Fri, 14 Nov 2025 00:24:46 +0100 Subject: [PATCH 183/280] Fix #14701: Company colour remap for sprites in badge filter dropdowns. (#14732) --- src/build_vehicle_gui.cpp | 3 ++- src/newgrf_badge_gui.cpp | 5 +++-- src/newgrf_badge_gui.h | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index ea6efdcfc4..27deb5f430 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1731,7 +1731,8 @@ struct BuildVehicleWindow : Window { default: if (IsInsideMM(widget, this->badge_filters.first, this->badge_filters.second)) { - ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(), -1, widget, 0, false); + PaletteID palette = SPR_2CCMAP_BASE + Company::Get(_local_company)->GetCompanyRecolourOffset(LS_DEFAULT); + ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(palette), -1, widget, 0, false); } break; } diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index ff0a1d48c9..93e133cf99 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -508,9 +508,10 @@ std::string NWidgetBadgeFilter::GetStringParameter(const BadgeFilterChoices &cho /** * Get the drop down list of badges for this filter. + * @param palette Palette used to remap badge sprites. * @return Drop down list for filter. */ -DropDownList NWidgetBadgeFilter::GetDropDownList() const +DropDownList NWidgetBadgeFilter::GetDropDownList(PaletteID palette) const { DropDownList list; @@ -533,7 +534,7 @@ DropDownList NWidgetBadgeFilter::GetDropDownList() const if (badge.name == STR_NULL) continue; if (!badge.features.Test(this->feature)) continue; - PalSpriteID ps = GetBadgeSprite(badge, this->feature, std::nullopt, PAL_NONE); + PalSpriteID ps = GetBadgeSprite(badge, this->feature, std::nullopt, palette); if (ps.sprite == 0) { list.push_back(MakeDropDownListStringItem(badge.name, badge.index.base())); } else { diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index e603308094..af2ed4cafc 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -65,7 +65,7 @@ public: BadgeClassID GetBadgeClassID() const { return this->badge_class; } std::string GetStringParameter(const BadgeFilterChoices &choices) const; - DropDownList GetDropDownList() const; + DropDownList GetDropDownList(PaletteID palette = PAL_NONE) const; private: GrfSpecFeature feature; ///< Feature of this dropdown. From 76621050817a15103bfc8c9ba1462870b89f3bb2 Mon Sep 17 00:00:00 2001 From: mmtunligit <156685720+mmtunligit@users.noreply.github.com> Date: Fri, 14 Nov 2025 00:25:21 +0100 Subject: [PATCH 184/280] Change: Clamp terraform toolbar to main toolbar (#14725) --- src/airport_gui.cpp | 7 ++++++- src/dock_gui.cpp | 7 ++++++- src/rail_gui.cpp | 7 ++++++- src/road_gui.cpp | 9 +++++++-- src/terraform_gui.cpp | 19 +++++++------------ src/window.cpp | 20 +++++++++++++++++++- src/window_gui.h | 1 + 7 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 3520857915..b0bdd7cbb8 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -161,6 +161,11 @@ struct BuildAirToolbarWindow : Window { VpSelectTilesWithMethod(pt.x, pt.y, select_method); } + Point OnInitialPosition(int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override + { + return AlignInitialConstructionToolbar(sm_width); + } + void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override { if (pt.x != -1 && select_proc == DDSP_DEMOLISH_AREA) { @@ -211,7 +216,7 @@ static constexpr std::initializer_list _nested_air_toolbar_widgets }; static WindowDesc _air_toolbar_desc( - WDP_ALIGN_TOOLBAR, "toolbar_air", 0, 0, + WDP_MANUAL, "toolbar_air", 0, 0, WC_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_air_toolbar_widgets, diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index caad21a280..eea54f16e3 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -250,6 +250,11 @@ struct BuildDocksToolbarWindow : Window { VpSelectTilesWithMethod(pt.x, pt.y, select_method); } + Point OnInitialPosition(int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override + { + return AlignInitialConstructionToolbar(sm_width); + } + void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override { if (pt.x != -1) { @@ -352,7 +357,7 @@ static constexpr std::initializer_list _nested_build_docks_toolbar_ }; static WindowDesc _build_docks_toolbar_desc( - WDP_ALIGN_TOOLBAR, "toolbar_water", 0, 0, + WDP_MANUAL, "toolbar_water", 0, 0, WC_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_build_docks_toolbar_widgets, diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 98400d2363..5cbb9de220 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -728,6 +728,11 @@ struct BuildRailToolbarWindow : Window { VpSelectTilesWithMethod(pt.x, pt.y, select_method); } + Point OnInitialPosition(int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override + { + return AlignInitialConstructionToolbar(sm_width); + } + void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override { if (pt.x != -1) { @@ -899,7 +904,7 @@ static constexpr std::initializer_list _nested_build_rail_widgets = }; static WindowDesc _build_rail_desc( - WDP_ALIGN_TOOLBAR, "toolbar_rail", 0, 0, + WDP_MANUAL, "toolbar_rail", 0, 0, WC_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_build_rail_widgets, diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 7aac90b4b9..aecfc9c8cd 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -724,6 +724,11 @@ struct BuildRoadToolbarWindow : Window { VpSelectTilesWithMethod(pt.x, pt.y, select_method); } + Point OnInitialPosition(int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override + { + return AlignInitialConstructionToolbar(sm_width); + } + void OnPlaceMouseUp([[maybe_unused]] ViewportPlaceMethod select_method, ViewportDragDropSelectionProcess select_proc, [[maybe_unused]] Point pt, TileIndex start_tile, TileIndex end_tile) override { if (pt.x != -1) { @@ -939,7 +944,7 @@ static constexpr std::initializer_list _nested_build_road_widgets = }; static WindowDesc _build_road_desc( - WDP_ALIGN_TOOLBAR, "toolbar_road", 0, 0, + WDP_MANUAL, "toolbar_road", 0, 0, WC_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_build_road_widgets, @@ -984,7 +989,7 @@ static constexpr std::initializer_list _nested_build_tramway_widget }; static WindowDesc _build_tramway_desc( - WDP_ALIGN_TOOLBAR, "toolbar_tramway", 0, 0, + WDP_MANUAL, "toolbar_tramway", 0, 0, WC_BUILD_TOOLBAR, WC_NONE, WindowDefaultFlag::Construction, _nested_build_tramway_widgets, diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 239f347025..14a4597e1f 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -257,7 +257,8 @@ struct TerraformToolbarWindow : Window { Point OnInitialPosition([[maybe_unused]] int16_t sm_width, [[maybe_unused]] int16_t sm_height, [[maybe_unused]] int window_number) override { Point pt = GetToolbarAlignedWindowPosition(sm_width); - pt.y += sm_height; + if (FindWindowByClass(WC_BUILD_TOOLBAR) != nullptr && !_settings_client.gui.link_terraform_toolbar) pt.y += sm_height; + return pt; } @@ -364,19 +365,13 @@ Window *ShowTerraformToolbar(Window *link) { if (!Company::IsValidID(_local_company)) return nullptr; - Window *w; - if (link == nullptr) { - w = AllocateWindowDescFront(_terraform_desc, 0); - return w; - } - /* Delete the terraform toolbar to place it again. */ CloseWindowById(WC_SCEN_LAND_GEN, 0, true); - w = AllocateWindowDescFront(_terraform_desc, 0); - /* Align the terraform toolbar under the main toolbar. */ - w->top -= w->height; - w->SetDirty(); - /* Put the linked toolbar to the left / right of it. */ + + if (link == nullptr) return AllocateWindowDescFront(_terraform_desc, 0); + + Window *w = AllocateWindowDescFront(_terraform_desc, 0); + /* Put the linked toolbar to the left / right of the main toolbar. */ link->left = w->left + (_current_text_dir == TD_RTL ? w->width : -link->width); link->top = w->top; link->SetDirty(); diff --git a/src/window.cpp b/src/window.cpp index 419612e0bf..4422cd86ed 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1677,7 +1677,7 @@ restart: /** * Computer the position of the top-left corner of a window to be opened right * under the toolbar. - * @param window_width the width of the window to get the position for + * @param window_width the width of the window to get the position for. * @return Coordinate of the top-left corner of the new window. */ Point GetToolbarAlignedWindowPosition(int window_width) @@ -1688,6 +1688,24 @@ Point GetToolbarAlignedWindowPosition(int window_width) return pt; } +/** + * Compute the position of the construction toolbars. + * + * If the terraform toolbar is open place them to the right/left of it, + * otherwise use default toolbar aligned position. + * @param window_width the width of the toolbar to get the position for. + * @return Coordinate of the top-left corner of the new toolbar. + */ +Point AlignInitialConstructionToolbar(int window_width) +{ + Point pt = GetToolbarAlignedWindowPosition(window_width); + const Window *w = FindWindowByClass(WC_SCEN_LAND_GEN); + if (w != nullptr && w->top == pt.y && !_settings_client.gui.link_terraform_toolbar) { + pt.x = w->left + (_current_text_dir == TD_RTL ? w->width : - window_width); + } + return pt; +} + /** * Compute the position of the top-left corner of a new window that is opened. * diff --git a/src/window_gui.h b/src/window_gui.h index c6f1909ef2..bf09cd1985 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -158,6 +158,7 @@ enum class WindowDefaultFlag : uint8_t { using WindowDefaultFlags = EnumBitSet; Point GetToolbarAlignedWindowPosition(int window_width); +Point AlignInitialConstructionToolbar(int window_width); struct HotkeyList; From 2693e63247ef58ab20e47640d1ac7bf340a4b93f Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 14 Nov 2025 04:39:19 +0000 Subject: [PATCH 185/280] Update: Translations from eints norwegian (bokmal): 4 changes by eriksorngard --- src/lang/norwegian_bokmal.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 0121c8b0fa..454c7c8481 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3429,6 +3429,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Nordvest STR_MAPGEN_NORTHEAST :{BLACK}Nordøst STR_MAPGEN_SOUTHEAST :{BLACK}Sørøst STR_MAPGEN_SOUTHWEST :{BLACK}Sørvest +STR_MAPGEN_NORTHWEST_TOOLTIP :Veksle mellom vann eller fri kant ved nordvestre kartkant +STR_MAPGEN_NORTHEAST_TOOLTIP :Veksle mellom vann eller fri kant ved nordøstre kartkant +STR_MAPGEN_SOUTHEAST_TOOLTIP :Veksle mellom vann eller fri kant ved sørøstre kartkant +STR_MAPGEN_SOUTHWEST_TOOLTIP :Veksle mellom vann eller fri kant ved sørvestre kartkant STR_MAPGEN_BORDER_FREEFORM :{BLACK}Frihånds STR_MAPGEN_BORDER_WATER :{BLACK}Sjø STR_MAPGEN_BORDER_RANDOM :{BLACK}Tilfeldig From 459d213f748e3359485ba495f2949b6f7abac7d9 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 15 Nov 2025 04:38:42 +0000 Subject: [PATCH 186/280] Update: Translations from eints polish: 4 changes by pAter-exe --- src/lang/polish.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 8a9fc72d45..f4c6d6274b 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3807,10 +3807,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Płn.-za STR_MAPGEN_NORTHEAST :{BLACK}Płn.-wsch. STR_MAPGEN_SOUTHEAST :{BLACK}Płd.-wsch. STR_MAPGEN_SOUTHWEST :{BLACK}Płd.-zach. -STR_MAPGEN_NORTHWEST_TOOLTIP :Przełącz między wodą, a lądem na płn.-zach. krawędzi mapy -STR_MAPGEN_NORTHEAST_TOOLTIP :Przełącz między wodą, a lądem na płn.-wsch. krawędzi mapy -STR_MAPGEN_SOUTHEAST_TOOLTIP :Przełącz między wodą, a lądem na płd.-wsch. krawędzi mapy -STR_MAPGEN_SOUTHWEST_TOOLTIP :Przełącz między wodą, a lądem na płd.-zach. krawędzi mapy +STR_MAPGEN_NORTHWEST_TOOLTIP :Przełącz między wodą a lądem na płn.-zach. krawędzi mapy +STR_MAPGEN_NORTHEAST_TOOLTIP :Przełącz między wodą a lądem na płn.-wsch. krawędzi mapy +STR_MAPGEN_SOUTHEAST_TOOLTIP :Przełącz między wodą a lądem na płd.-wsch. krawędzi mapy +STR_MAPGEN_SOUTHWEST_TOOLTIP :Przełącz między wodą a lądem na płd.-zach. krawędzi mapy STR_MAPGEN_BORDER_FREEFORM :{BLACK}Ląd STR_MAPGEN_BORDER_WATER :{BLACK}Woda STR_MAPGEN_BORDER_RANDOM :{BLACK}Losowe From 2b2444414629814fe97b35aff4c2d5ba8eec8e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Sat, 15 Nov 2025 09:19:33 +0100 Subject: [PATCH 187/280] Codechange: Detect crashes during regression (#14774) --- cmake/scripts/Regression.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmake/scripts/Regression.cmake b/cmake/scripts/Regression.cmake index a6833e2dd1..e9ce5ea6f2 100644 --- a/cmake/scripts/Regression.cmake +++ b/cmake/scripts/Regression.cmake @@ -25,6 +25,10 @@ if(EDITBIN_EXECUTABLE) execute_process(COMMAND ${EDITBIN_EXECUTABLE} /nologo /subsystem:console ${OPENTTD_EXECUTABLE}) endif() +# Remove previous crash files +file(GLOB CRASH_FILES "regression/crash*") +file(REMOVE ${CRASH_FILES}) + # Run the regression test execute_process(COMMAND ${OPENTTD_EXECUTABLE} -x @@ -40,6 +44,13 @@ execute_process(COMMAND ${OPENTTD_EXECUTABLE} OUTPUT_STRIP_TRAILING_WHITESPACE ) +# Detect any crash +file(GLOB CRASH_FILES "regression/crash*.log") +if (CRASH_FILES) + file(READ ${CRASH_FILES} CRASH_LOG) + message(FATAL_ERROR "OpenTTD crashed: ${CRASH_LOG}") +endif() + if(REGRESSION_OUTPUT) message(FATAL_ERROR "Unexpected output: ${REGRESSION_OUTPUT}") endif() From d61a21cc0bd1a4a8d6d38368daadc4a38093dfaf Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 15 Nov 2025 19:33:09 +0000 Subject: [PATCH 188/280] Codechange: Use enum class for command-related enums. (#14775) --- src/autoreplace_cmd.h | 4 ++-- src/command.cpp | 26 +++++++++++++------------- src/command_type.h | 35 ++++++++++++++++++----------------- src/company_cmd.h | 14 +++++++------- src/depot_cmd.h | 2 +- src/economy_cmd.h | 2 +- src/engine_cmd.h | 8 ++++---- src/goal_cmd.h | 16 ++++++++-------- src/group_cmd.h | 16 ++++++++-------- src/industry_cmd.h | 10 +++++----- src/landscape_cmd.h | 4 ++-- src/league_cmd.h | 10 +++++----- src/misc_cmd.h | 12 ++++++------ src/news_cmd.h | 2 +- src/object_cmd.h | 4 ++-- src/order_cmd.h | 16 ++++++++-------- src/rail_cmd.h | 20 ++++++++++---------- src/road_cmd.h | 10 +++++----- src/roadveh_cmd.h | 2 +- src/settings_cmd.h | 4 ++-- src/settings_type.h | 3 ++- src/signs_cmd.h | 4 ++-- src/station_cmd.h | 16 ++++++++-------- src/story_cmd.h | 18 +++++++++--------- src/subsidy_cmd.h | 2 +- src/terraform_cmd.h | 4 ++-- src/texteff.cpp | 2 +- src/timetable_cmd.h | 10 +++++----- src/town_cmd.h | 20 ++++++++++---------- src/train_cmd.h | 6 +++--- src/tree_cmd.h | 2 +- src/tunnelbridge_cmd.h | 4 ++-- src/vehicle_cmd.h | 22 +++++++++++----------- src/viewport_cmd.h | 2 +- src/water_cmd.h | 6 +++--- src/waypoint_cmd.h | 12 ++++++------ 36 files changed, 176 insertions(+), 174 deletions(-) diff --git a/src/autoreplace_cmd.h b/src/autoreplace_cmd.h index 5f9af672d2..df4c268255 100644 --- a/src/autoreplace_cmd.h +++ b/src/autoreplace_cmd.h @@ -18,7 +18,7 @@ CommandCost CmdAutoreplaceVehicle(DoCommandFlags flags, VehicleID veh_id); CommandCost CmdSetAutoReplace(DoCommandFlags flags, GroupID id_g, EngineID old_engine_type, EngineID new_engine_type, bool when_old); -DEF_CMD_TRAIT(CMD_AUTOREPLACE_VEHICLE, CmdAutoreplaceVehicle, {}, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_AUTOREPLACE, CmdSetAutoReplace, {}, CMDT_VEHICLE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_AUTOREPLACE_VEHICLE, CmdAutoreplaceVehicle, {}, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_SET_AUTOREPLACE, CmdSetAutoReplace, {}, CommandType::VehicleManagement) #endif /* AUTOREPLACE_CMD_H */ diff --git a/src/command.cpp b/src/command.cpp index c11289902e..2cdc9ed3ad 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -144,21 +144,21 @@ std::string_view GetCommandName(Commands cmd) bool IsCommandAllowedWhilePaused(Commands cmd) { /* Lookup table for the command types that are allowed for a given pause level setting. */ - static const int command_type_lookup[] = { - CMDPL_ALL_ACTIONS, ///< CMDT_LANDSCAPE_CONSTRUCTION - CMDPL_NO_LANDSCAPING, ///< CMDT_VEHICLE_CONSTRUCTION - CMDPL_NO_LANDSCAPING, ///< CMDT_MONEY_MANAGEMENT - CMDPL_NO_CONSTRUCTION, ///< CMDT_VEHICLE_MANAGEMENT - CMDPL_NO_CONSTRUCTION, ///< CMDT_ROUTE_MANAGEMENT - CMDPL_NO_CONSTRUCTION, ///< CMDT_OTHER_MANAGEMENT - CMDPL_NO_ACTIONS, ///< CMDT_COMPANY_SETTING - CMDPL_NO_ACTIONS, ///< CMDT_SERVER_SETTING - CMDPL_NO_ACTIONS, ///< CMDT_CHEAT + static constexpr CommandPauseLevel command_type_lookup[] = { + CommandPauseLevel::AllActions, // CommandType::LandscapeConstruction + CommandPauseLevel::NoLandscaping, // CommandType::VehicleConstruction + CommandPauseLevel::NoLandscaping, // CommandType::MoneyManagement + CommandPauseLevel::NoConstruction, // CommandType::VehicleManagement + CommandPauseLevel::NoConstruction, // CommandType::RouteManagement + CommandPauseLevel::NoConstruction, // CommandType::OtherManagement + CommandPauseLevel::NoActions, // CommandType::CompanySetting + CommandPauseLevel::NoActions, // CommandType::ServerSetting + CommandPauseLevel::NoActions, // CommandType::Cheat }; - static_assert(lengthof(command_type_lookup) == CMDT_END); + static_assert(std::size(command_type_lookup) == to_underlying(CommandType::End)); assert(IsValidCommand(cmd)); - return _game_mode == GM_EDITOR || command_type_lookup[_command_proc_table[cmd].type] <= _settings_game.construction.command_pause_level; + return _game_mode == GM_EDITOR || command_type_lookup[to_underlying(_command_proc_table[cmd].type)] <= _settings_game.construction.command_pause_level; } /** @@ -384,7 +384,7 @@ CommandCost CommandHelperBase::InternalExecuteProcessResult(Commands cmd, Comman SubtractMoneyFromCompany(res_exec); /* Record if there was a command issues during pause; ignore pause/other setting related changes. */ - if (_pause_mode.Any() && _command_proc_table[cmd].type != CMDT_SERVER_SETTING) _pause_mode.Set(PauseMode::CommandDuringPause); + if (_pause_mode.Any() && _command_proc_table[cmd].type != CommandType::ServerSetting) _pause_mode.Set(PauseMode::CommandDuringPause); /* update signals if needed */ UpdateSignalsInBuffer(); diff --git a/src/command_type.h b/src/command_type.h index 893a03d44c..babf32dd54 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -380,7 +380,7 @@ enum Commands : uint8_t { * * This enums defines some flags which can be used for the commands. */ -enum DoCommandFlag : uint8_t { +enum class DoCommandFlag : uint8_t { Execute, ///< execute the given command Auto, ///< don't allow building on structures QueryCost, ///< query cost only, don't build. @@ -417,26 +417,27 @@ enum class CommandFlag : uint8_t { using CommandFlags = EnumBitSet; /** Types of commands we have. */ -enum CommandType : uint8_t { - CMDT_LANDSCAPE_CONSTRUCTION, ///< Construction and destruction of objects on the map. - CMDT_VEHICLE_CONSTRUCTION, ///< Construction, modification (incl. refit) and destruction of vehicles. - CMDT_MONEY_MANAGEMENT, ///< Management of money, i.e. loans. - CMDT_VEHICLE_MANAGEMENT, ///< Stopping, starting, sending to depot, turning around, replace orders etc. - CMDT_ROUTE_MANAGEMENT, ///< Modifications to route management (orders, groups, etc). - CMDT_OTHER_MANAGEMENT, ///< Renaming stuff, changing company colours, placing signs, etc. - CMDT_COMPANY_SETTING, ///< Changing settings related to a company. - CMDT_SERVER_SETTING, ///< Pausing/removing companies/server settings. - CMDT_CHEAT, ///< A cheat of some sorts. +enum class CommandType : uint8_t { + LandscapeConstruction, ///< Construction and destruction of objects on the map. + VehicleConstruction, ///< Construction, modification (incl. refit) and destruction of vehicles. + MoneyManagement, ///< Management of money, i.e. loans. + VehicleManagement, ///< Stopping, starting, sending to depot, turning around, replace orders etc. + RouteManagement, ///< Modifications to route management (orders, groups, etc). + OtherManagement, ///< Renaming stuff, changing company colours, placing signs, etc. + CompanySetting, ///< Changing settings related to a company. + ServerSetting, ///< Pausing/removing companies/server settings. + Cheat, ///< A cheat of some sorts. - CMDT_END, ///< Magic end marker. + End, ///< End marker. }; /** Different command pause levels. */ -enum CommandPauseLevel : uint8_t { - CMDPL_NO_ACTIONS, ///< No user actions may be executed. - CMDPL_NO_CONSTRUCTION, ///< No construction actions may be executed. - CMDPL_NO_LANDSCAPING, ///< No landscaping actions may be executed. - CMDPL_ALL_ACTIONS, ///< All actions may be executed. + +enum class CommandPauseLevel : uint8_t { + NoActions, ///< No user actions may be executed. + NoConstruction, ///< No construction actions may be executed. + NoLandscaping, ///< No landscaping actions may be executed. + AllActions, ///< All actions may be executed. }; diff --git a/src/company_cmd.h b/src/company_cmd.h index eb30f9b361..a18af2f8cb 100644 --- a/src/company_cmd.h +++ b/src/company_cmd.h @@ -25,12 +25,12 @@ CommandCost CmdRenamePresident(DoCommandFlags flags, const std::string &text); CommandCost CmdSetCompanyManagerFace(DoCommandFlags flags, uint style, uint32_t bits); CommandCost CmdSetCompanyColour(DoCommandFlags flags, LiveryScheme scheme, bool primary, Colours colour); -DEF_CMD_TRAIT(CMD_COMPANY_CTRL, CmdCompanyCtrl, CommandFlags({CommandFlag::Spectator, CommandFlag::ClientID, CommandFlag::NoEst}), CMDT_SERVER_SETTING) -DEF_CMD_TRAIT(CMD_COMPANY_ALLOW_LIST_CTRL, CmdCompanyAllowListCtrl, CommandFlag::NoEst, CMDT_SERVER_SETTING) -DEF_CMD_TRAIT(CMD_GIVE_MONEY, CmdGiveMoney, {}, CMDT_MONEY_MANAGEMENT) -DEF_CMD_TRAIT(CMD_RENAME_COMPANY, CmdRenameCompany, {}, CMDT_COMPANY_SETTING) -DEF_CMD_TRAIT(CMD_RENAME_PRESIDENT, CmdRenamePresident, {}, CMDT_COMPANY_SETTING) -DEF_CMD_TRAIT(CMD_SET_COMPANY_MANAGER_FACE, CmdSetCompanyManagerFace, {}, CMDT_COMPANY_SETTING) -DEF_CMD_TRAIT(CMD_SET_COMPANY_COLOUR, CmdSetCompanyColour, {}, CMDT_COMPANY_SETTING) +DEF_CMD_TRAIT(CMD_COMPANY_CTRL, CmdCompanyCtrl, CommandFlags({CommandFlag::Spectator, CommandFlag::ClientID, CommandFlag::NoEst}), CommandType::ServerSetting) +DEF_CMD_TRAIT(CMD_COMPANY_ALLOW_LIST_CTRL, CmdCompanyAllowListCtrl, CommandFlag::NoEst, CommandType::ServerSetting) +DEF_CMD_TRAIT(CMD_GIVE_MONEY, CmdGiveMoney, {}, CommandType::MoneyManagement) +DEF_CMD_TRAIT(CMD_RENAME_COMPANY, CmdRenameCompany, {}, CommandType::CompanySetting) +DEF_CMD_TRAIT(CMD_RENAME_PRESIDENT, CmdRenamePresident, {}, CommandType::CompanySetting) +DEF_CMD_TRAIT(CMD_SET_COMPANY_MANAGER_FACE, CmdSetCompanyManagerFace, {}, CommandType::CompanySetting) +DEF_CMD_TRAIT(CMD_SET_COMPANY_COLOUR, CmdSetCompanyColour, {}, CommandType::CompanySetting) #endif /* COMPANY_CMD_H */ diff --git a/src/depot_cmd.h b/src/depot_cmd.h index abd3e1900e..69f558f6c5 100644 --- a/src/depot_cmd.h +++ b/src/depot_cmd.h @@ -16,7 +16,7 @@ CommandCost CmdRenameDepot(DoCommandFlags flags, DepotID depot_id, const std::string &text); -DEF_CMD_TRAIT(CMD_RENAME_DEPOT, CmdRenameDepot, {}, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_RENAME_DEPOT, CmdRenameDepot, {}, CommandType::OtherManagement) void CcCloneVehicle(Commands cmd, const CommandCost &result, VehicleID veh_id); diff --git a/src/economy_cmd.h b/src/economy_cmd.h index 15825aa7b8..37aa5eb38e 100644 --- a/src/economy_cmd.h +++ b/src/economy_cmd.h @@ -15,6 +15,6 @@ CommandCost CmdBuyCompany(DoCommandFlags flags, CompanyID target_company, bool hostile_takeover); -DEF_CMD_TRAIT(CMD_BUY_COMPANY, CmdBuyCompany, {}, CMDT_MONEY_MANAGEMENT) +DEF_CMD_TRAIT(CMD_BUY_COMPANY, CmdBuyCompany, {}, CommandType::MoneyManagement) #endif /* ECONOMY_CMD_H */ diff --git a/src/engine_cmd.h b/src/engine_cmd.h index 0f99119145..153a5055e1 100644 --- a/src/engine_cmd.h +++ b/src/engine_cmd.h @@ -17,9 +17,9 @@ CommandCost CmdEngineCtrl(DoCommandFlags flags, EngineID engine_id, CompanyID co CommandCost CmdRenameEngine(DoCommandFlags flags, EngineID engine_id, const std::string &text); CommandCost CmdSetVehicleVisibility(DoCommandFlags flags, EngineID engine_id, bool hide); -DEF_CMD_TRAIT(CMD_WANT_ENGINE_PREVIEW, CmdWantEnginePreview, {}, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_ENGINE_CTRL, CmdEngineCtrl, CommandFlag::Deity, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_RENAME_ENGINE, CmdRenameEngine, CommandFlag::Server, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_VEHICLE_VISIBILITY, CmdSetVehicleVisibility, {}, CMDT_COMPANY_SETTING) +DEF_CMD_TRAIT(CMD_WANT_ENGINE_PREVIEW, CmdWantEnginePreview, {}, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_ENGINE_CTRL, CmdEngineCtrl, CommandFlag::Deity, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_RENAME_ENGINE, CmdRenameEngine, CommandFlag::Server, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_VEHICLE_VISIBILITY, CmdSetVehicleVisibility, {}, CommandType::CompanySetting) #endif /* ENGINE_CMD_H */ diff --git a/src/goal_cmd.h b/src/goal_cmd.h index 4cb017ede9..7002bad775 100644 --- a/src/goal_cmd.h +++ b/src/goal_cmd.h @@ -22,13 +22,13 @@ CommandCost CmdSetGoalCompleted(DoCommandFlags flags, GoalID goal, bool complete CommandCost CmdGoalQuestion(DoCommandFlags flags, uint16_t uniqueid, uint32_t target, bool is_client, uint32_t button_mask, GoalQuestionType type, const EncodedString &text); CommandCost CmdGoalQuestionAnswer(DoCommandFlags flags, uint16_t uniqueid, uint8_t button); -DEF_CMD_TRAIT(CMD_CREATE_GOAL, CmdCreateGoal, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REMOVE_GOAL, CmdRemoveGoal, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GOAL_DESTINATION, CmdSetGoalDestination, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GOAL_TEXT, CmdSetGoalText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GOAL_PROGRESS, CmdSetGoalProgress, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GOAL_COMPLETED, CmdSetGoalCompleted, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_GOAL_QUESTION, CmdGoalQuestion, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_GOAL_QUESTION_ANSWER, CmdGoalQuestionAnswer, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_GOAL, CmdCreateGoal, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_REMOVE_GOAL, CmdRemoveGoal, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_GOAL_DESTINATION, CmdSetGoalDestination, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_GOAL_TEXT, CmdSetGoalText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_GOAL_PROGRESS, CmdSetGoalProgress, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_GOAL_COMPLETED, CmdSetGoalCompleted, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_GOAL_QUESTION, CmdGoalQuestion, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_GOAL_QUESTION_ANSWER, CmdGoalQuestionAnswer, CommandFlag::Deity, CommandType::OtherManagement) #endif /* GOAL_CMD_H */ diff --git a/src/group_cmd.h b/src/group_cmd.h index abef37b542..dea6d7120f 100644 --- a/src/group_cmd.h +++ b/src/group_cmd.h @@ -34,14 +34,14 @@ CommandCost CmdRemoveAllVehiclesGroup(DoCommandFlags flags, GroupID group_id); CommandCost CmdSetGroupFlag(DoCommandFlags flags, GroupID group_id, GroupFlag flag, bool value, bool recursive); CommandCost CmdSetGroupLivery(DoCommandFlags flags, GroupID group_id, bool primary, Colours colour); -DEF_CMD_TRAIT(CMD_CREATE_GROUP, CmdCreateGroup, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_DELETE_GROUP, CmdDeleteGroup, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_ALTER_GROUP, CmdAlterGroup, {}, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_ADD_VEHICLE_GROUP, CmdAddVehicleGroup, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_ADD_SHARED_VEHICLE_GROUP, CmdAddSharedVehicleGroup, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REMOVE_ALL_VEHICLES_GROUP, CmdRemoveAllVehiclesGroup, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GROUP_FLAG, CmdSetGroupFlag, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_GROUP_LIVERY, CmdSetGroupLivery, {}, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_GROUP, CmdCreateGroup, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_DELETE_GROUP, CmdDeleteGroup, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_ALTER_GROUP, CmdAlterGroup, {}, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_ADD_VEHICLE_GROUP, CmdAddVehicleGroup, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_ADD_SHARED_VEHICLE_GROUP, CmdAddSharedVehicleGroup, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_REMOVE_ALL_VEHICLES_GROUP, CmdRemoveAllVehiclesGroup, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_SET_GROUP_FLAG, CmdSetGroupFlag, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_SET_GROUP_LIVERY, CmdSetGroupLivery, {}, CommandType::RouteManagement) void CcCreateGroup(Commands cmd, const CommandCost &result, GroupID new_group, VehicleType vt, GroupID parent_group); void CcAddVehicleNewGroup(Commands cmd, const CommandCost &result, GroupID new_group, GroupID, VehicleID veh_id, bool, const VehicleListIdentifier &); diff --git a/src/industry_cmd.h b/src/industry_cmd.h index f1d8b5f4dc..78a7687cda 100644 --- a/src/industry_cmd.h +++ b/src/industry_cmd.h @@ -21,10 +21,10 @@ CommandCost CmdIndustrySetExclusivity(DoCommandFlags flags, IndustryID ind_id, O CommandCost CmdIndustrySetText(DoCommandFlags flags, IndustryID ind_id, const EncodedString &text); CommandCost CmdIndustrySetProduction(DoCommandFlags flags, IndustryID ind_id, uint8_t prod_level, bool show_news, const EncodedString &text); -DEF_CMD_TRAIT(CMD_BUILD_INDUSTRY, CmdBuildIndustry, CommandFlag::Deity, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_INDUSTRY_SET_FLAGS, CmdIndustrySetFlags, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_INDUSTRY_SET_EXCLUSIVITY, CmdIndustrySetExclusivity, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_INDUSTRY_SET_TEXT, CmdIndustrySetText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_INDUSTRY_SET_PRODUCTION, CmdIndustrySetProduction, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_BUILD_INDUSTRY, CmdBuildIndustry, CommandFlag::Deity, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_INDUSTRY_SET_FLAGS, CmdIndustrySetFlags, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_INDUSTRY_SET_EXCLUSIVITY, CmdIndustrySetExclusivity, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_INDUSTRY_SET_TEXT, CmdIndustrySetText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_INDUSTRY_SET_PRODUCTION, CmdIndustrySetProduction, CommandFlag::Deity, CommandType::OtherManagement) #endif /* INDUSTRY_CMD_H */ diff --git a/src/landscape_cmd.h b/src/landscape_cmd.h index 2062eac619..1ae5b7b1b2 100644 --- a/src/landscape_cmd.h +++ b/src/landscape_cmd.h @@ -15,7 +15,7 @@ CommandCost CmdLandscapeClear(DoCommandFlags flags, TileIndex tile); std::tuple CmdClearArea(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, bool diagonal); -DEF_CMD_TRAIT(CMD_LANDSCAPE_CLEAR, CmdLandscapeClear, CommandFlag::Deity, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_CLEAR_AREA, CmdClearArea, CommandFlag::NoTest, CMDT_LANDSCAPE_CONSTRUCTION) // destroying multi-tile houses makes town rating differ between test and execution +DEF_CMD_TRAIT(CMD_LANDSCAPE_CLEAR, CmdLandscapeClear, CommandFlag::Deity, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_CLEAR_AREA, CmdClearArea, CommandFlag::NoTest, CommandType::LandscapeConstruction) // destroying multi-tile houses makes town rating differ between test and execution #endif /* LANDSCAPE_CMD_H */ diff --git a/src/league_cmd.h b/src/league_cmd.h index 89a58915a4..83f9f3c534 100644 --- a/src/league_cmd.h +++ b/src/league_cmd.h @@ -20,10 +20,10 @@ CommandCost CmdUpdateLeagueTableElementData(DoCommandFlags flags, LeagueTableEle CommandCost CmdUpdateLeagueTableElementScore(DoCommandFlags flags, LeagueTableElementID element, int64_t rating, const EncodedString &score); CommandCost CmdRemoveLeagueTableElement(DoCommandFlags flags, LeagueTableElementID element); -DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE, CmdCreateLeagueTable, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE_ELEMENT, CmdCreateLeagueTableElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA, CmdUpdateLeagueTableElementData, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE, CmdUpdateLeagueTableElementScore, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REMOVE_LEAGUE_TABLE_ELEMENT, CmdRemoveLeagueTableElement, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE, CmdCreateLeagueTable, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_CREATE_LEAGUE_TABLE_ELEMENT, CmdCreateLeagueTableElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA, CmdUpdateLeagueTableElementData, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE, CmdUpdateLeagueTableElementScore, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_REMOVE_LEAGUE_TABLE_ELEMENT, CmdRemoveLeagueTableElement, CommandFlag::Deity, CommandType::OtherManagement) #endif /* LEAGUE_CMD_H */ diff --git a/src/misc_cmd.h b/src/misc_cmd.h index 3b60ec5625..fb5279a7f3 100644 --- a/src/misc_cmd.h +++ b/src/misc_cmd.h @@ -27,11 +27,11 @@ CommandCost CmdDecreaseLoan(DoCommandFlags flags, LoanCommand cmd, Money amount) CommandCost CmdSetCompanyMaxLoan(DoCommandFlags flags, CompanyID company, Money amount); CommandCost CmdPause(DoCommandFlags flags, PauseMode mode, bool pause); -DEF_CMD_TRAIT(CMD_MONEY_CHEAT, CmdMoneyCheat, CommandFlags({CommandFlag::Offline, CommandFlag::NoEst}), CMDT_CHEAT) -DEF_CMD_TRAIT(CMD_CHANGE_BANK_BALANCE, CmdChangeBankBalance, CommandFlag::Deity, CMDT_MONEY_MANAGEMENT) -DEF_CMD_TRAIT(CMD_INCREASE_LOAN, CmdIncreaseLoan, {}, CMDT_MONEY_MANAGEMENT) -DEF_CMD_TRAIT(CMD_DECREASE_LOAN, CmdDecreaseLoan, {}, CMDT_MONEY_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_COMPANY_MAX_LOAN, CmdSetCompanyMaxLoan, CommandFlag::Deity, CMDT_MONEY_MANAGEMENT) -DEF_CMD_TRAIT(CMD_PAUSE, CmdPause, CommandFlags({CommandFlag::Server, CommandFlag::NoEst}), CMDT_SERVER_SETTING) +DEF_CMD_TRAIT(CMD_MONEY_CHEAT, CmdMoneyCheat, CommandFlags({CommandFlag::Offline, CommandFlag::NoEst}), CommandType::Cheat) +DEF_CMD_TRAIT(CMD_CHANGE_BANK_BALANCE, CmdChangeBankBalance, CommandFlag::Deity, CommandType::MoneyManagement) +DEF_CMD_TRAIT(CMD_INCREASE_LOAN, CmdIncreaseLoan, {}, CommandType::MoneyManagement) +DEF_CMD_TRAIT(CMD_DECREASE_LOAN, CmdDecreaseLoan, {}, CommandType::MoneyManagement) +DEF_CMD_TRAIT(CMD_SET_COMPANY_MAX_LOAN, CmdSetCompanyMaxLoan, CommandFlag::Deity, CommandType::MoneyManagement) +DEF_CMD_TRAIT(CMD_PAUSE, CmdPause, CommandFlags({CommandFlag::Server, CommandFlag::NoEst}), CommandType::ServerSetting) #endif /* MISC_CMD_H */ diff --git a/src/news_cmd.h b/src/news_cmd.h index df9523c253..c84c29e141 100644 --- a/src/news_cmd.h +++ b/src/news_cmd.h @@ -16,6 +16,6 @@ CommandCost CmdCustomNewsItem(DoCommandFlags flags, NewsType type, CompanyID company, NewsReference reference, const EncodedString &text); -DEF_CMD_TRAIT(CMD_CUSTOM_NEWS_ITEM, CmdCustomNewsItem, CommandFlags({CommandFlag::StrCtrl, CommandFlag::Deity}), CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CUSTOM_NEWS_ITEM, CmdCustomNewsItem, CommandFlags({CommandFlag::StrCtrl, CommandFlag::Deity}), CommandType::OtherManagement) #endif /* NEWS_CMD_H */ diff --git a/src/object_cmd.h b/src/object_cmd.h index 0fb18d7fa8..048b3c6dfd 100644 --- a/src/object_cmd.h +++ b/src/object_cmd.h @@ -16,7 +16,7 @@ CommandCost CmdBuildObject(DoCommandFlags flags, TileIndex tile, ObjectType type, uint8_t view); CommandCost CmdBuildObjectArea(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8_t view, bool diagonal); -DEF_CMD_TRAIT(CMD_BUILD_OBJECT, CmdBuildObject, CommandFlags({CommandFlag::Deity, CommandFlag::NoWater, CommandFlag::Auto}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_OBJECT_AREA, CmdBuildObjectArea, CommandFlags({CommandFlag::Deity, CommandFlag::NoWater, CommandFlag::NoTest, CommandFlag::Auto}), CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_OBJECT, CmdBuildObject, CommandFlags({CommandFlag::Deity, CommandFlag::NoWater, CommandFlag::Auto}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_OBJECT_AREA, CmdBuildObjectArea, CommandFlags({CommandFlag::Deity, CommandFlag::NoWater, CommandFlag::NoTest, CommandFlag::Auto}), CommandType::LandscapeConstruction) #endif /* OBJECT_CMD_H */ diff --git a/src/order_cmd.h b/src/order_cmd.h index 5d1e9039d4..405a0e8c95 100644 --- a/src/order_cmd.h +++ b/src/order_cmd.h @@ -23,14 +23,14 @@ CommandCost CmdCloneOrder(DoCommandFlags flags, CloneOptions action, VehicleID v CommandCost CmdMoveOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID moving_order, VehicleOrderID target_order); CommandCost CmdClearOrderBackup(DoCommandFlags flags, TileIndex tile, ClientID user_id); -DEF_CMD_TRAIT(CMD_MODIFY_ORDER, CmdModifyOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SKIP_TO_ORDER, CmdSkipToOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_DELETE_ORDER, CmdDeleteOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_INSERT_ORDER, CmdInsertOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_ORDER_REFIT, CmdOrderRefit, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CLONE_ORDER, CmdCloneOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_MOVE_ORDER, CmdMoveOrder, CommandFlag::Location, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CLEAR_ORDER_BACKUP, CmdClearOrderBackup, CommandFlag::ClientID, CMDT_SERVER_SETTING) +DEF_CMD_TRAIT(CMD_MODIFY_ORDER, CmdModifyOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_SKIP_TO_ORDER, CmdSkipToOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_DELETE_ORDER, CmdDeleteOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_INSERT_ORDER, CmdInsertOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_ORDER_REFIT, CmdOrderRefit, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_CLONE_ORDER, CmdCloneOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_MOVE_ORDER, CmdMoveOrder, CommandFlag::Location, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_CLEAR_ORDER_BACKUP, CmdClearOrderBackup, CommandFlag::ClientID, CommandType::ServerSetting) template inline EndianBufferWriter &operator <<(EndianBufferWriter &buffer, const Order &order) diff --git a/src/rail_cmd.h b/src/rail_cmd.h index eb78df1d1c..9ee4ccf2d4 100644 --- a/src/rail_cmd.h +++ b/src/rail_cmd.h @@ -27,16 +27,16 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_ CommandCost CmdBuildSignalTrack(DoCommandFlags flags, TileIndex tile, TileIndex end_tile, Track track, SignalType sigtype, SignalVariant sigvar, bool mode, bool autofill, bool minimise_gaps, uint8_t signal_density); CommandCost CmdRemoveSignalTrack(DoCommandFlags flags, TileIndex tile, TileIndex end_tile, Track track, bool autofill); -DEF_CMD_TRAIT(CMD_BUILD_RAILROAD_TRACK, CmdBuildRailroadTrack, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_RAILROAD_TRACK, CmdRemoveRailroadTrack, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_SINGLE_RAIL, CmdBuildSingleRail, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_SINGLE_RAIL, CmdRemoveSingleRail, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_TRAIN_DEPOT, CmdBuildTrainDepot, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_SINGLE_SIGNAL, CmdBuildSingleSignal, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_SINGLE_SIGNAL, CmdRemoveSingleSignal, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_CONVERT_RAIL, CmdConvertRail, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_SIGNAL_TRACK, CmdBuildSignalTrack, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_SIGNAL_TRACK, CmdRemoveSignalTrack, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_RAILROAD_TRACK, CmdBuildRailroadTrack, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_RAILROAD_TRACK, CmdRemoveRailroadTrack, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_SINGLE_RAIL, CmdBuildSingleRail, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_SINGLE_RAIL, CmdRemoveSingleRail, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_TRAIN_DEPOT, CmdBuildTrainDepot, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_SINGLE_SIGNAL, CmdBuildSingleSignal, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_SINGLE_SIGNAL, CmdRemoveSingleSignal, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_CONVERT_RAIL, CmdConvertRail, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_SIGNAL_TRACK, CmdBuildSignalTrack, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_SIGNAL_TRACK, CmdRemoveSignalTrack, CommandFlag::Auto, CommandType::LandscapeConstruction) CommandCallback CcPlaySound_CONSTRUCTION_RAIL; CommandCallback CcStation; diff --git a/src/road_cmd.h b/src/road_cmd.h index 24b4c2b636..e309edc057 100644 --- a/src/road_cmd.h +++ b/src/road_cmd.h @@ -27,11 +27,11 @@ CommandCost CmdBuildRoad(DoCommandFlags flags, TileIndex tile, RoadBits pieces, CommandCost CmdBuildRoadDepot(DoCommandFlags flags, TileIndex tile, RoadType rt, DiagDirection dir); CommandCost CmdConvertRoad(DoCommandFlags flags, TileIndex tile, TileIndex area_start, RoadType to_type, bool diagonal); -DEF_CMD_TRAIT(CMD_BUILD_LONG_ROAD, CmdBuildLongRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater, CommandFlag::Deity}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_LONG_ROAD, CmdRemoveLongRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoTest}), CMDT_LANDSCAPE_CONSTRUCTION) // towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed. -DEF_CMD_TRAIT(CMD_BUILD_ROAD, CmdBuildRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater, CommandFlag::Deity}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_ROAD_DEPOT, CmdBuildRoadDepot, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_CONVERT_ROAD, CmdConvertRoad, {}, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_LONG_ROAD, CmdBuildLongRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater, CommandFlag::Deity}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_LONG_ROAD, CmdRemoveLongRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoTest}), CommandType::LandscapeConstruction) // towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed. +DEF_CMD_TRAIT(CMD_BUILD_ROAD, CmdBuildRoad, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater, CommandFlag::Deity}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_ROAD_DEPOT, CmdBuildRoadDepot, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_CONVERT_ROAD, CmdConvertRoad, {}, CommandType::LandscapeConstruction) CommandCallback CcPlaySound_CONSTRUCTION_OTHER; CommandCallback CcBuildRoadTunnel; diff --git a/src/roadveh_cmd.h b/src/roadveh_cmd.h index ed9a7a11c5..1fd781f8dd 100644 --- a/src/roadveh_cmd.h +++ b/src/roadveh_cmd.h @@ -22,6 +22,6 @@ CommandCost CmdBuildRoadVehicle(DoCommandFlags flags, TileIndex tile, const Engi CommandCost CmdTurnRoadVeh(DoCommandFlags flags, VehicleID veh_id); -DEF_CMD_TRAIT(CMD_TURN_ROADVEH, CmdTurnRoadVeh, CommandFlag::Location, CMDT_VEHICLE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_TURN_ROADVEH, CmdTurnRoadVeh, CommandFlag::Location, CommandType::VehicleManagement) #endif /* ROADVEH_CMD_H */ diff --git a/src/settings_cmd.h b/src/settings_cmd.h index 613fcfb42a..4210869eb9 100644 --- a/src/settings_cmd.h +++ b/src/settings_cmd.h @@ -15,7 +15,7 @@ CommandCost CmdChangeSetting(DoCommandFlags flags, const std::string &name, int32_t value); CommandCost CmdChangeCompanySetting(DoCommandFlags flags, const std::string &name, int32_t value); -DEF_CMD_TRAIT(CMD_CHANGE_SETTING, CmdChangeSetting, CommandFlags({CommandFlag::Server, CommandFlag::NoEst}), CMDT_SERVER_SETTING) -DEF_CMD_TRAIT(CMD_CHANGE_COMPANY_SETTING, CmdChangeCompanySetting, CommandFlag::NoEst, CMDT_COMPANY_SETTING) +DEF_CMD_TRAIT(CMD_CHANGE_SETTING, CmdChangeSetting, CommandFlags({CommandFlag::Server, CommandFlag::NoEst}), CommandType::ServerSetting) +DEF_CMD_TRAIT(CMD_CHANGE_COMPANY_SETTING, CmdChangeCompanySetting, CommandFlag::NoEst, CommandType::CompanySetting) #endif /* SETTINGS_CMD_H */ diff --git a/src/settings_type.h b/src/settings_type.h index ebbe874da0..25a8fd63de 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -10,6 +10,7 @@ #ifndef SETTINGS_TYPE_H #define SETTINGS_TYPE_H +#include "command_type.h" #include "timer/timer_game_calendar.h" #include "economy_type.h" #include "town_type.h" @@ -410,7 +411,7 @@ struct ConstructionSettings { uint8_t industry_platform; ///< the amount of flat land around an industry bool freeform_edges; ///< allow terraforming the tiles at the map edges uint8_t extra_tree_placement; ///< (dis)allow building extra trees in-game - uint8_t command_pause_level; ///< level/amount of commands that can't be executed while paused + CommandPauseLevel command_pause_level; ///< level/amount of commands that can't be executed while paused uint32_t terraform_per_64k_frames; ///< how many tile heights may, over a long period, be terraformed per 65536 frames? uint16_t terraform_frame_burst; ///< how many tile heights may, over a short period, be terraformed? diff --git a/src/signs_cmd.h b/src/signs_cmd.h index 53b76091de..3d8722b070 100644 --- a/src/signs_cmd.h +++ b/src/signs_cmd.h @@ -16,8 +16,8 @@ std::tuple CmdPlaceSign(DoCommandFlags flags, TileIndex tile, const std::string &text); CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::string &text); -DEF_CMD_TRAIT(CMD_PLACE_SIGN, CmdPlaceSign, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_RENAME_SIGN, CmdRenameSign, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_PLACE_SIGN, CmdPlaceSign, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_RENAME_SIGN, CmdRenameSign, CommandFlag::Deity, CommandType::OtherManagement) void CcPlaceSign(Commands cmd, const CommandCost &result, SignID new_sign); diff --git a/src/station_cmd.h b/src/station_cmd.h index cd5c69b7fa..38382cee27 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -32,13 +32,13 @@ CommandCost CmdRemoveRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t widt CommandCost CmdRenameStation(DoCommandFlags flags, StationID station_id, const std::string &text); CommandCost CmdOpenCloseAirport(DoCommandFlags flags, StationID station_id); -DEF_CMD_TRAIT(CMD_BUILD_AIRPORT, CmdBuildAirport, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_DOCK, CmdBuildDock, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_RAIL_STATION, CmdBuildRailStation, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_STATION, CmdRemoveFromRailStation, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_ROAD_STOP, CmdBuildRoadStop, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_ROAD_STOP, CmdRemoveRoadStop, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_RENAME_STATION, CmdRenameStation, {}, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_OPEN_CLOSE_AIRPORT, CmdOpenCloseAirport, {}, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_BUILD_AIRPORT, CmdBuildAirport, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_DOCK, CmdBuildDock, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_RAIL_STATION, CmdBuildRailStation, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_STATION, CmdRemoveFromRailStation, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_ROAD_STOP, CmdBuildRoadStop, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_ROAD_STOP, CmdRemoveRoadStop, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_RENAME_STATION, CmdRenameStation, {}, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_OPEN_CLOSE_AIRPORT, CmdOpenCloseAirport, {}, CommandType::RouteManagement) #endif /* STATION_CMD_H */ diff --git a/src/story_cmd.h b/src/story_cmd.h index 08075db057..c001675cbc 100644 --- a/src/story_cmd.h +++ b/src/story_cmd.h @@ -25,14 +25,14 @@ CommandCost CmdRemoveStoryPage(DoCommandFlags flags, StoryPageID page_id); CommandCost CmdRemoveStoryPageElement(DoCommandFlags flags, StoryPageElementID page_element_id); CommandCost CmdStoryPageButton(DoCommandFlags flags, TileIndex tile, StoryPageElementID page_element_id, VehicleID reference); -DEF_CMD_TRAIT(CMD_CREATE_STORY_PAGE, CmdCreateStoryPage, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CREATE_STORY_PAGE_ELEMENT, CmdCreateStoryPageElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_UPDATE_STORY_PAGE_ELEMENT, CmdUpdateStoryPageElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_STORY_PAGE_TITLE, CmdSetStoryPageTitle, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_STORY_PAGE_DATE, CmdSetStoryPageDate, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SHOW_STORY_PAGE, CmdShowStoryPage, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REMOVE_STORY_PAGE, CmdRemoveStoryPage, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REMOVE_STORY_PAGE_ELEMENT, CmdRemoveStoryPageElement, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_STORY_PAGE_BUTTON, CmdStoryPageButton, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_STORY_PAGE, CmdCreateStoryPage, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_CREATE_STORY_PAGE_ELEMENT, CmdCreateStoryPageElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_UPDATE_STORY_PAGE_ELEMENT, CmdUpdateStoryPageElement, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_STORY_PAGE_TITLE, CmdSetStoryPageTitle, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SET_STORY_PAGE_DATE, CmdSetStoryPageDate, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_SHOW_STORY_PAGE, CmdShowStoryPage, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_REMOVE_STORY_PAGE, CmdRemoveStoryPage, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_REMOVE_STORY_PAGE_ELEMENT, CmdRemoveStoryPageElement, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_STORY_PAGE_BUTTON, CmdStoryPageButton, CommandFlag::Deity, CommandType::OtherManagement) #endif /* STORY_CMD_H */ diff --git a/src/subsidy_cmd.h b/src/subsidy_cmd.h index a090774490..54eb2cfbbe 100644 --- a/src/subsidy_cmd.h +++ b/src/subsidy_cmd.h @@ -17,7 +17,7 @@ CommandCost CmdCreateSubsidy(DoCommandFlags flags, CargoType cargo_type, Source src, Source dst); -DEF_CMD_TRAIT(CMD_CREATE_SUBSIDY, CmdCreateSubsidy, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CREATE_SUBSIDY, CmdCreateSubsidy, CommandFlag::Deity, CommandType::OtherManagement) template diff --git a/src/terraform_cmd.h b/src/terraform_cmd.h index 8d4dea20d5..a4bfff5f99 100644 --- a/src/terraform_cmd.h +++ b/src/terraform_cmd.h @@ -17,8 +17,8 @@ std::tuple CmdTerraformLand(DoCommandFlags flags, TileIndex tile, Slope slope, bool dir_up); std::tuple CmdLevelLand(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, bool diagonal, LevelMode lm); -DEF_CMD_TRAIT(CMD_TERRAFORM_LAND, CmdTerraformLand, CommandFlags({CommandFlag::AllTiles, CommandFlag::Auto}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_LEVEL_LAND, CmdLevelLand, CommandFlags({CommandFlag::AllTiles, CommandFlag::Auto, CommandFlag::NoTest}), CMDT_LANDSCAPE_CONSTRUCTION) // test run might clear tiles multiple times, in execution that only happens once +DEF_CMD_TRAIT(CMD_TERRAFORM_LAND, CmdTerraformLand, CommandFlags({CommandFlag::AllTiles, CommandFlag::Auto}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_LEVEL_LAND, CmdLevelLand, CommandFlags({CommandFlag::AllTiles, CommandFlag::Auto, CommandFlag::NoTest}), CommandType::LandscapeConstruction) // test run might clear tiles multiple times, in execution that only happens once CommandCallback CcPlaySound_EXPLOSION; void CcTerraform(Commands cmd, const CommandCost &result, Money, TileIndex tile); diff --git a/src/texteff.cpp b/src/texteff.cpp index 82f832e2de..36b7a35c23 100644 --- a/src/texteff.cpp +++ b/src/texteff.cpp @@ -90,7 +90,7 @@ void RemoveTextEffect(TextEffectID te_id) /** Slowly move text effects upwards. */ const IntervalTimer move_all_text_effects_interval = {std::chrono::milliseconds(30), [](uint count) { - if (_pause_mode.Any() && _game_mode != GM_EDITOR && _settings_game.construction.command_pause_level <= CMDPL_NO_CONSTRUCTION) return; + if (_pause_mode.Any() && _game_mode != GM_EDITOR && _settings_game.construction.command_pause_level <= CommandPauseLevel::NoConstruction) return; for (TextEffect &te : _text_effects) { if (!te.IsValid()) continue; diff --git a/src/timetable_cmd.h b/src/timetable_cmd.h index 221b394174..45879234de 100644 --- a/src/timetable_cmd.h +++ b/src/timetable_cmd.h @@ -21,10 +21,10 @@ CommandCost CmdSetVehicleOnTime(DoCommandFlags flags, VehicleID veh, bool apply_ CommandCost CmdAutofillTimetable(DoCommandFlags flags, VehicleID veh, bool autofill, bool preserve_wait_time); CommandCost CmdSetTimetableStart(DoCommandFlags flags, VehicleID veh_id, bool timetable_all, TimerGameTick::TickCounter start_tick); -DEF_CMD_TRAIT(CMD_CHANGE_TIMETABLE, CmdChangeTimetable, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_BULK_CHANGE_TIMETABLE, CmdBulkChangeTimetable, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_VEHICLE_ON_TIME, CmdSetVehicleOnTime, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_AUTOFILL_TIMETABLE, CmdAutofillTimetable, {}, CMDT_ROUTE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_SET_TIMETABLE_START, CmdSetTimetableStart, {}, CMDT_ROUTE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_CHANGE_TIMETABLE, CmdChangeTimetable, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_BULK_CHANGE_TIMETABLE, CmdBulkChangeTimetable, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_SET_VEHICLE_ON_TIME, CmdSetVehicleOnTime, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_AUTOFILL_TIMETABLE, CmdAutofillTimetable, {}, CommandType::RouteManagement) +DEF_CMD_TRAIT(CMD_SET_TIMETABLE_START, CmdSetTimetableStart, {}, CommandType::RouteManagement) #endif /* TIMETABLE_CMD_H */ diff --git a/src/town_cmd.h b/src/town_cmd.h index 7d247ce7cf..2a9cce5092 100644 --- a/src/town_cmd.h +++ b/src/town_cmd.h @@ -29,16 +29,16 @@ CommandCost CmdExpandTown(DoCommandFlags flags, TownID town_id, uint32_t grow_am CommandCost CmdDeleteTown(DoCommandFlags flags, TownID town_id); CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, bool house_protected); -DEF_CMD_TRAIT(CMD_FOUND_TOWN, CmdFoundTown, CommandFlags({CommandFlag::Deity, CommandFlag::NoTest}), CMDT_LANDSCAPE_CONSTRUCTION) // founding random town can fail only in exec run -DEF_CMD_TRAIT(CMD_RENAME_TOWN, CmdRenameTown, CommandFlags({CommandFlag::Deity, CommandFlag::Server}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_DO_TOWN_ACTION, CmdDoTownAction, CommandFlags({CommandFlag::Location}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_TOWN_CARGO_GOAL, CmdTownCargoGoal, CommandFlags({CommandFlag::Deity}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_TOWN_GROWTH_RATE, CmdTownGrowthRate, CommandFlags({CommandFlag::Deity}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_TOWN_RATING, CmdTownRating, CommandFlags({CommandFlag::Deity}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_TOWN_SET_TEXT, CmdTownSetText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_EXPAND_TOWN, CmdExpandTown, CommandFlags({CommandFlag::Deity}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_DELETE_TOWN, CmdDeleteTown, CommandFlags({CommandFlag::Offline}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_PLACE_HOUSE, CmdPlaceHouse, CommandFlags({CommandFlag::Deity}), CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_FOUND_TOWN, CmdFoundTown, CommandFlags({CommandFlag::Deity, CommandFlag::NoTest}), CommandType::LandscapeConstruction) // founding random town can fail only in exec run +DEF_CMD_TRAIT(CMD_RENAME_TOWN, CmdRenameTown, CommandFlags({CommandFlag::Deity, CommandFlag::Server}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_DO_TOWN_ACTION, CmdDoTownAction, CommandFlags({CommandFlag::Location}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_TOWN_CARGO_GOAL, CmdTownCargoGoal, CommandFlags({CommandFlag::Deity}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_TOWN_GROWTH_RATE, CmdTownGrowthRate, CommandFlags({CommandFlag::Deity}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_TOWN_RATING, CmdTownRating, CommandFlags({CommandFlag::Deity}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_TOWN_SET_TEXT, CmdTownSetText, CommandFlags({CommandFlag::Deity, CommandFlag::StrCtrl}), CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_EXPAND_TOWN, CmdExpandTown, CommandFlags({CommandFlag::Deity}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_DELETE_TOWN, CmdDeleteTown, CommandFlags({CommandFlag::Offline}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_PLACE_HOUSE, CmdPlaceHouse, CommandFlags({CommandFlag::Deity}), CommandType::OtherManagement) CommandCallback CcFoundTown; void CcFoundRandomTown(Commands cmd, const CommandCost &result, Money, TownID town_id); diff --git a/src/train_cmd.h b/src/train_cmd.h index 45a7b5eff1..e3c39aa6f6 100644 --- a/src/train_cmd.h +++ b/src/train_cmd.h @@ -22,9 +22,9 @@ CommandCost CmdMoveRailVehicle(DoCommandFlags flags, VehicleID src_veh, VehicleI CommandCost CmdForceTrainProceed(DoCommandFlags flags, VehicleID veh_id); CommandCost CmdReverseTrainDirection(DoCommandFlags flags, VehicleID veh_id, bool reverse_single_veh); -DEF_CMD_TRAIT(CMD_MOVE_RAIL_VEHICLE, CmdMoveRailVehicle, CommandFlag::Location, CMDT_VEHICLE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_FORCE_TRAIN_PROCEED, CmdForceTrainProceed, CommandFlag::Location, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_REVERSE_TRAIN_DIRECTION, CmdReverseTrainDirection, CommandFlag::Location, CMDT_VEHICLE_MANAGEMENT) +DEF_CMD_TRAIT(CMD_MOVE_RAIL_VEHICLE, CmdMoveRailVehicle, CommandFlag::Location, CommandType::VehicleConstruction) +DEF_CMD_TRAIT(CMD_FORCE_TRAIN_PROCEED, CmdForceTrainProceed, CommandFlag::Location, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_REVERSE_TRAIN_DIRECTION, CmdReverseTrainDirection, CommandFlag::Location, CommandType::VehicleManagement) void CcBuildWagon(Commands cmd, const CommandCost &result, VehicleID new_veh_id, uint, uint16_t, CargoArray, TileIndex tile, EngineID, bool, CargoType, ClientID); diff --git a/src/tree_cmd.h b/src/tree_cmd.h index 116d50c5f6..65e1a310ad 100644 --- a/src/tree_cmd.h +++ b/src/tree_cmd.h @@ -14,6 +14,6 @@ CommandCost CmdPlantTree(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, uint8_t tree_to_plant, bool diagonal); -DEF_CMD_TRAIT(CMD_PLANT_TREE, CmdPlantTree, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_PLANT_TREE, CmdPlantTree, CommandFlag::Auto, CommandType::LandscapeConstruction) #endif /* TREE_CMD_H */ diff --git a/src/tunnelbridge_cmd.h b/src/tunnelbridge_cmd.h index 25bd0cc226..bf468d2262 100644 --- a/src/tunnelbridge_cmd.h +++ b/src/tunnelbridge_cmd.h @@ -17,8 +17,8 @@ CommandCost CmdBuildBridge(DoCommandFlags flags, TileIndex tile_end, TileIndex tile_start, TransportType transport_type, BridgeType bridge_type, uint8_t road_rail_type); CommandCost CmdBuildTunnel(DoCommandFlags flags, TileIndex start_tile, TransportType transport_type, uint8_t road_rail_type); -DEF_CMD_TRAIT(CMD_BUILD_BRIDGE, CmdBuildBridge, CommandFlags({CommandFlag::Deity, CommandFlag::Auto, CommandFlag::NoWater}), CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_TUNNEL, CmdBuildTunnel, CommandFlags({CommandFlag::Deity, CommandFlag::Auto}), CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_BRIDGE, CmdBuildBridge, CommandFlags({CommandFlag::Deity, CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_TUNNEL, CmdBuildTunnel, CommandFlags({CommandFlag::Deity, CommandFlag::Auto}), CommandType::LandscapeConstruction) void CcBuildBridge(Commands cmd, const CommandCost &result, TileIndex end_tile, TileIndex tile_start, TransportType transport_type, BridgeType, uint8_t); diff --git a/src/vehicle_cmd.h b/src/vehicle_cmd.h index 8f663673bc..b393a6a1f3 100644 --- a/src/vehicle_cmd.h +++ b/src/vehicle_cmd.h @@ -29,17 +29,17 @@ CommandCost CmdMassStartStopVehicle(DoCommandFlags flags, TileIndex tile, bool d CommandCost CmdDepotSellAllVehicles(DoCommandFlags flags, TileIndex tile, VehicleType vehicle_type); CommandCost CmdDepotMassAutoReplace(DoCommandFlags flags, TileIndex tile, VehicleType vehicle_type); -DEF_CMD_TRAIT(CMD_BUILD_VEHICLE, CmdBuildVehicle, CommandFlag::ClientID, CMDT_VEHICLE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_SELL_VEHICLE, CmdSellVehicle, CommandFlags({CommandFlag::ClientID, CommandFlag::Location}), CMDT_VEHICLE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REFIT_VEHICLE, CmdRefitVehicle, CommandFlag::Location, CMDT_VEHICLE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_SEND_VEHICLE_TO_DEPOT, CmdSendVehicleToDepot, {}, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CHANGE_SERVICE_INT, CmdChangeServiceInt, {}, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_RENAME_VEHICLE, CmdRenameVehicle, {}, CMDT_OTHER_MANAGEMENT) -DEF_CMD_TRAIT(CMD_CLONE_VEHICLE, CmdCloneVehicle, CommandFlag::NoTest, CMDT_VEHICLE_CONSTRUCTION) // NewGRF callbacks influence building and refitting making it impossible to correctly estimate the cost -DEF_CMD_TRAIT(CMD_START_STOP_VEHICLE, CmdStartStopVehicle, CommandFlag::Location, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_MASS_START_STOP, CmdMassStartStopVehicle, {}, CMDT_VEHICLE_MANAGEMENT) -DEF_CMD_TRAIT(CMD_DEPOT_SELL_ALL_VEHICLES, CmdDepotSellAllVehicles, {}, CMDT_VEHICLE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_DEPOT_MASS_AUTOREPLACE, CmdDepotMassAutoReplace, {}, CMDT_VEHICLE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_VEHICLE, CmdBuildVehicle, CommandFlag::ClientID, CommandType::VehicleConstruction) +DEF_CMD_TRAIT(CMD_SELL_VEHICLE, CmdSellVehicle, CommandFlags({CommandFlag::ClientID, CommandFlag::Location}), CommandType::VehicleConstruction) +DEF_CMD_TRAIT(CMD_REFIT_VEHICLE, CmdRefitVehicle, CommandFlag::Location, CommandType::VehicleConstruction) +DEF_CMD_TRAIT(CMD_SEND_VEHICLE_TO_DEPOT, CmdSendVehicleToDepot, {}, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_CHANGE_SERVICE_INT, CmdChangeServiceInt, {}, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_RENAME_VEHICLE, CmdRenameVehicle, {}, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_CLONE_VEHICLE, CmdCloneVehicle, CommandFlag::NoTest, CommandType::VehicleConstruction) // NewGRF callbacks influence building and refitting making it impossible to correctly estimate the cost +DEF_CMD_TRAIT(CMD_START_STOP_VEHICLE, CmdStartStopVehicle, CommandFlag::Location, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_MASS_START_STOP, CmdMassStartStopVehicle, {}, CommandType::VehicleManagement) +DEF_CMD_TRAIT(CMD_DEPOT_SELL_ALL_VEHICLES, CmdDepotSellAllVehicles, {}, CommandType::VehicleConstruction) +DEF_CMD_TRAIT(CMD_DEPOT_MASS_AUTOREPLACE, CmdDepotMassAutoReplace, {}, CommandType::VehicleConstruction) void CcBuildPrimaryVehicle(Commands cmd, const CommandCost &result, VehicleID new_veh_id, uint, uint16_t, CargoArray); void CcStartStopVehicle(Commands cmd, const CommandCost &result, VehicleID veh_id, bool); diff --git a/src/viewport_cmd.h b/src/viewport_cmd.h index c50f9db1a7..b8d931f561 100644 --- a/src/viewport_cmd.h +++ b/src/viewport_cmd.h @@ -15,6 +15,6 @@ CommandCost CmdScrollViewport(DoCommandFlags flags, TileIndex tile, ViewportScrollTarget target, uint32_t ref); -DEF_CMD_TRAIT(CMD_SCROLL_VIEWPORT, CmdScrollViewport, CommandFlag::Deity, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_SCROLL_VIEWPORT, CmdScrollViewport, CommandFlag::Deity, CommandType::OtherManagement) #endif /* VIEWPORT_CMD_H */ diff --git a/src/water_cmd.h b/src/water_cmd.h index 56911695b1..9193c5b1c4 100644 --- a/src/water_cmd.h +++ b/src/water_cmd.h @@ -17,8 +17,8 @@ CommandCost CmdBuildShipDepot(DoCommandFlags flags, TileIndex tile, Axis axis); CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, WaterClass wc, bool diagonal); CommandCost CmdBuildLock(DoCommandFlags flags, TileIndex tile); -DEF_CMD_TRAIT(CMD_BUILD_SHIP_DEPOT, CmdBuildShipDepot, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_CANAL, CmdBuildCanal, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_LOCK, CmdBuildLock, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) +DEF_CMD_TRAIT(CMD_BUILD_SHIP_DEPOT, CmdBuildShipDepot, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_CANAL, CmdBuildCanal, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_LOCK, CmdBuildLock, CommandFlag::Auto, CommandType::LandscapeConstruction) #endif /* WATER_CMD_H */ diff --git a/src/waypoint_cmd.h b/src/waypoint_cmd.h index e0aaf9853c..2831c5c981 100644 --- a/src/waypoint_cmd.h +++ b/src/waypoint_cmd.h @@ -23,11 +23,11 @@ CommandCost CmdRemoveFromRoadWaypoint(DoCommandFlags flags, TileIndex start, Til CommandCost CmdBuildBuoy(DoCommandFlags flags, TileIndex tile); CommandCost CmdRenameWaypoint(DoCommandFlags flags, StationID waypoint_id, const std::string &text); -DEF_CMD_TRAIT(CMD_BUILD_RAIL_WAYPOINT, CmdBuildRailWaypoint, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_WAYPOINT, CmdRemoveFromRailWaypoint, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_ROAD_WAYPOINT, CmdBuildRoadWaypoint, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_REMOVE_FROM_ROAD_WAYPOINT, CmdRemoveFromRoadWaypoint, {}, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_BUILD_BUOY, CmdBuildBuoy, CommandFlag::Auto, CMDT_LANDSCAPE_CONSTRUCTION) -DEF_CMD_TRAIT(CMD_RENAME_WAYPOINT, CmdRenameWaypoint, {}, CMDT_OTHER_MANAGEMENT) +DEF_CMD_TRAIT(CMD_BUILD_RAIL_WAYPOINT, CmdBuildRailWaypoint, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_WAYPOINT, CmdRemoveFromRailWaypoint, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_ROAD_WAYPOINT, CmdBuildRoadWaypoint, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_REMOVE_FROM_ROAD_WAYPOINT, CmdRemoveFromRoadWaypoint, {}, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_BUILD_BUOY, CmdBuildBuoy, CommandFlag::Auto, CommandType::LandscapeConstruction) +DEF_CMD_TRAIT(CMD_RENAME_WAYPOINT, CmdRenameWaypoint, {}, CommandType::OtherManagement) #endif /* WAYPOINT_CMD_H */ From 05c40a6e55c38a6426bc293b9def22677e42a52a Mon Sep 17 00:00:00 2001 From: Muxy Du Goulp Date: Sat, 15 Nov 2025 21:01:52 +0100 Subject: [PATCH 189/280] Fix #14777: authorized_key: Correctly target key type for add/remove The logic in ConNetworkAuthorizedKey for the `authorized_key` command was inverted. The check `if (StrEqualsIgnoreCase(type, name)) continue;` caused the action (add/remove) to be incorrectly executed on the first key type encountered that *did not* match the requested type, rather than the intended one. This resulted in keys specified for 'admin' being added to 'rcon', for example. This commit inverts the condition to ensure the action is performed only when the requested type matches the iterated key name. --- src/console_cmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index ffc6b13665..7b97fab118 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2167,7 +2167,7 @@ static bool ConNetworkAuthorizedKey(std::span argv) } for (auto [name, authorized_keys] : _console_cmd_authorized_keys) { - if (StrEqualsIgnoreCase(type, name)) continue; + if (!StrEqualsIgnoreCase(type, name)) continue; PerformNetworkAuthorizedKeyAction(name, authorized_keys, action, authorized_key); return true; From 06d2f448916682d9904a477ec7230c375e6ad3b4 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Sat, 15 Nov 2025 21:40:36 +0000 Subject: [PATCH 190/280] Codechange: HighScore sorting to use std::vector (#14779) Replaces the fixed-size array for company sorting with a std::vector and updates sorting to use std::ranges::sort. This removes the need for manual count management. --- src/highscore.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/highscore.cpp b/src/highscore.cpp index 943edab559..e46a445c52 100644 --- a/src/highscore.cpp +++ b/src/highscore.cpp @@ -87,20 +87,19 @@ static bool HighScoreSorter(const Company * const &a, const Company * const &b) */ int8_t SaveHighScoreValueNetwork() { - const Company *cl[MAX_COMPANIES]; - size_t count = 0; + std::vector cl; int8_t local_company_place = -1; /* Sort all active companies with the highest score first */ - for (const Company *c : Company::Iterate()) cl[count++] = c; + for (const Company *c : Company::Iterate()) cl.push_back(c); - std::sort(std::begin(cl), std::begin(cl) + count, HighScoreSorter); + std::ranges::sort(cl, HighScoreSorter); /* Clear the high scores from the previous network game. */ auto &highscores = _highscore_table[SP_MULTIPLAYER]; std::fill(highscores.begin(), highscores.end(), HighScore{}); - for (size_t i = 0; i < count && i < highscores.size(); i++) { + for (size_t i = 0; i < cl.size() && i < highscores.size(); i++) { const Company *c = cl[i]; auto &highscore = highscores[i]; highscore.name = GetString(STR_HIGHSCORE_NAME, c->index, c->index); // get manager/company name string From 21329071dfb92d5bc3db23913687f739a8fae319 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 16 Nov 2025 04:40:12 +0000 Subject: [PATCH 191/280] Update: Translations from eints portuguese: 21 changes by jcteotonio --- src/lang/portuguese.txt | 42 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 8c7ffb13ba..d1c5d94cc7 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -619,7 +619,7 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfico do Lucro Operacional STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de Rendimentos STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregues -STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Classificações do desempenho da empresa (máximo=1000) +STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Classificações do desempenho da empresa (máx. 1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico de Valor da Empresa STR_GRAPH_LAST_24_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Últimos 24 minutos @@ -636,7 +636,7 @@ STR_GRAPH_SELECT_SCALE :Alterar a escal STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Tarifas por tipo de carga STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em trânsito -STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados +STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 mosaicos STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Todos STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Nenhum STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Mostrar todas as cargas no gráfico @@ -1263,8 +1263,8 @@ STR_CONFIG_SETTING_RESTRICT_CATEGORY :Categoria: STR_CONFIG_SETTING_RESTRICT_TYPE :Tipo: STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :Restringe a lista abaixo para mostrar apenas opções modificadas STR_CONFIG_SETTING_RESTRICT_BASIC :Opções básicas (mostrar apenas definições importantes) -STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avançado (mostra grande parte das definições) -STR_CONFIG_SETTING_RESTRICT_ALL :Avançado (mostrar todas as definições, incluindo as que são estranhas) +STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avançada (mostra grande parte das definições) +STR_CONFIG_SETTING_RESTRICT_ALL :Especialista (mostrar todas as definições, incluindo as que são mais estranhas) STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Opções com um valor diferente das de origem STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Preferências com um valor diferente das preferências para novos jogos @@ -1371,7 +1371,7 @@ STR_CONFIG_SETTING_AUTOSLOPE :Permitir desní STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite alteração de terra sob edifícios e vias sem os remover STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista de áreas de abrangência: {STRING} -STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Haver diferentes áreas de cobertura para diferentes tipos de estações e aeroportos +STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Para ter diferentes áreas de cobertura para diferentes tipos de estações e aeroportos STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Estações da empresa podem servir indústrias com estações neutras anexadas: {STRING} STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Quando ativo, indústrias com estações incluídas (com as Petrolíferas) podem ser servidas por estações-da-empresa construídas nas redondezas. Quando inativo, estas indústrias só podem ser servidas pela sua própria estação. Qualquer estação da empresa não poderá servir a indústria, nem a estação incluída pode servir outra entidade senão a própria indústria @@ -1459,7 +1459,7 @@ STR_CONFIG_SETTING_AUTOSCROLL :Deslocar janela STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Quando ativo, os visualizadores começam a deslocar-se logo que o rato esteja no extremo da janela ###length 4 STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :Desativado -STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Visualizador principal, só ecrã cheio +STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :Visualizador principal, só em ecrã inteiro STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT :Visualizador principal STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Todos os visualizadores @@ -1489,7 +1489,7 @@ STR_CONFIG_SETTING_PLANE_SPEED :Fator de veloci STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Definir a velocidade relativa dos aviões em comparação com outros tipos de veículos, para reduzir o valor da receita do transporte por aeronave STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} -STR_CONFIG_SETTING_PLANE_CRASHES :Número de acidentes de aeronaves: {STRING} +STR_CONFIG_SETTING_PLANE_CRASHES :Quantidade de acidentes de aeronaves: {STRING} STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Indicar a hipótese da ocorrência de um acidente aéreo.{}* As aeronaves maiores tem um risco acrescido a despenhar quando aterram em aeroportos pequenos ###length 3 STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Nenhum* @@ -1560,7 +1560,7 @@ STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automaticamente os veículos quando estão a ficar velhos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativo, um veículo a chegar ao fim de vida é automaticamente substituído quando as condições de renovação estão reunidas -STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar automaticamente quando um veículo chega a {STRING} a idade máxima +STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar automaticamente quando um veículo chega a {STRING} da idade máxima STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Idade relativa a partir da qual um veículo deva ser indicado para a renovação automática ###length 2 STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} m{P 0 ês eses} antes @@ -1582,7 +1582,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostra populaç STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar a população das localidades na sua etiqueta no mapa STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas dos gráficos estatísticos: {STRING} -STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Largura da linha nos gráficos. Uma linha mais estreita é de leitura mais precisa, enquanto uma linha mais espessa é mais fácil de ver e as cores distinguem-se melhor. +STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Largura da linha nos gráficos estatísticos. Uma linha mais estreita é de leitura mais precisa, enquanto uma linha mais espessa é mais fácil de ver e as cores distinguem-se melhor. STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Mostrar o nome do NewGRF na janela de compra de veículos: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Adiciona uma linha à janela de compra de veículos, mostrando a qual "NewGRF" pertence o veículo selecionado @@ -1601,11 +1601,11 @@ STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Tipo de terreno: {STRING} STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Escolher a altura das colinas e montanhas da paisagem -STR_CONFIG_SETTING_INDUSTRY_DENSITY :Densidade industrial: {STRING} +STR_CONFIG_SETTING_INDUSTRY_DENSITY :Nível de densidade industrial: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Define quantas indústrias devem ser geradas e que nível deve ser mantido durante o jogo STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distância máxima entre o limite do mapa e Refinarias de Petróleo: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limite de distância entre a borda do mapa e o local de construção de refinarias e plataformas de petróleo. Em mapas de ilhas isto garante que elas fiquem perto da costa. Em mapas com mais de 256 quadrados esse valor é aumentado +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Limite de distância entre a borda do mapa e o local de construção de refinarias e plataformas de petróleo. Em mapas de ilhas isto garante que elas fiquem perto da costa. Em mapas com mais de 256 mosaicos esse valor é aumentado STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altura da linha de neve: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Escolher a que altura a neve começa na paisagem subártica. A neve também afeta a geração de indústrias e os requisitos de crescimento das localidades. Só pode ser modificado através do Editor de Cenários ou é calculado através da "cobertura de neve" @@ -1657,11 +1657,11 @@ STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :Altura com que STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Um ou mais mosaicos no canto norte não estão vazios STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Um ou mais mosaicos num dos cantos não têm água -STR_CONFIG_SETTING_STATION_SPREAD :Espalhamento das estações máximo: {STRING} -STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Área máxima pela qual uma estação pode estar distribuída. Nota que valores elevados irão abrandar o jogo +STR_CONFIG_SETTING_STATION_SPREAD :Máximo de distância de uma estação: {STRING} +STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Distância máxima pela qual uma estação pode estar distribuída. Nota que valores elevados irão abrandar o jogo STR_CONFIG_SETTING_SERVICEATHELIPAD :Manutenção automática de helicópteros em heliportos: {STRING} -STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Efetuar manutenção aos helicópteros após cada aterragem, mesmo que não haja um hangar no aeroporto +STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Efetuar manutenção aos helicópteros após cada aterragem, mesmo que não haja um hangar presente STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Ligar ferramentas de paisagem com as de construção: {STRING} STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Quando se abre a barra de construção para um tipo de transporte, abrir também a barra de terraplanagem @@ -1757,7 +1757,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31 STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Pausar automaticamente ao iniciar um novo jogo: {STRING} STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Quando ativo, o jogo ficará em pausa automaticamente num novo jogo, permitindo o estudo ao pormenor do mapa -STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Durante pausa permitir: {STRING} +STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :Durante a pausa permitir: {STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_HELPTEXT :Selecionar que ações podem ser feitas enquanto o jogo está em pausa ###length 4 STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Nenhuma ação @@ -1797,7 +1797,7 @@ STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Dar cores difer STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Deixar ferramentas de construção ativas depois de usadas: {STRING} STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Manter as ferramentas de construção de pontes, túneis, etc. abertas após uso -STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Remover automaticamente os sinais durante a construção de vias férreas: {STRING} +STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Remover automaticamente os sinais durante a construção de linhas ferroviárias: {STRING} STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Remova automaticamente os sinais durante a construção da ferrovia se os sinais estiverem no caminho. Isto pode potencialmente causar acidentes de comboio STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Limite de velocidade do avanço rápido: {STRING} @@ -1807,10 +1807,10 @@ STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% velocida STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :Sem limite (tão rápido quanto o seu computador permitir) STR_CONFIG_SETTING_SOUND_TICKER :Notícias: {STRING} -STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Reproduzir efeito sonoro para notícias resumidas +STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Reproduzir um efeito sonoro para notícias resumidas STR_CONFIG_SETTING_SOUND_NEWS :Jornal: {STRING} -STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproduzir efeito sonoro ao mostrar um jornal +STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproduzir um efeito sonoro ao mostrar o jornal ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fim do ano: {STRING} @@ -1821,7 +1821,7 @@ STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reproduz um som STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Reproduz um som no final do período e resume a performance da empresa desse período em comparação com a do período anterior STR_CONFIG_SETTING_SOUND_CONFIRM :Construção: {STRING} -STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reproduzir efeito sonoro nas construções ou outras acções bem sucedidas +STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reproduzir um efeito sonoro nas construções ou outras ações bem sucedidas STR_CONFIG_SETTING_SOUND_CLICK :Cliques de botões: {STRING} STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Reproduzir um bip quando botões são clicados @@ -2056,9 +2056,9 @@ STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Desativado STR_CONFIG_SETTING_ZOOM_MIN :Nível máximo de ampliação: {STRING} -STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :O nível máximo de zoom para visualizadores. Níveis máximos de zoom superiores aumenterão os requisitos de memória +STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :O nível máximo de ampliação para visualizadores. Níveis máximos de ampliação superiores aumentarão os requisitos de memória do jogo STR_CONFIG_SETTING_ZOOM_MAX :Nível máximo de redução da câmara: {STRING} -STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :O nível mínimo de zoom para visualizadores. Níveis mínimos de zoom superiores poderão causar lag quando utilizados +STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :O nível mínimo de ampliação para visualizadores. Níveis mínimos de ampliação superiores poderão causar atrasos na execução do jogo quando utilizados ###length 6 STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x From 7398d2e2903eeb3c5156fbb3084c0735c0347e4d Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 17 Nov 2025 04:41:35 +0000 Subject: [PATCH 192/280] Update: Translations from eints portuguese: 17 changes by jcteotonio portuguese (brazilian): 1 change by jcteotonio maori (new zealand): 21 changes by Kyle-McDangersword --- src/lang/brazilian_portuguese.txt | 2 +- src/lang/maori.txt | 21 +++++++++++++++++++ src/lang/portuguese.txt | 34 +++++++++++++++---------------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index a187eae939..8b265aca39 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1873,7 +1873,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Quando ativado, STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo padrão de manutenção para trens: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Definir o intervalo padrão de manutenção para novos veículos ferroviários, se um intervalo de manutenção não for explicitamente configurado para o veículo -STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo padrão de manutenção para veículos: {STRING} +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo padrão de manutenção para veículos rodoviários: {STRING} STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Definir o intervalo padrão de manutenção para novos veículos rodoviários, se um intervalo de manutenção não for explicitamente configurado para o veículo STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo padrão de manutenção para aeronaves: {STRING} STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Definir o intervalo padrão de manutenção para novas aeronaves, se um intervalo de manutenção não for explicitamente configurado para o veículo diff --git a/src/lang/maori.txt b/src/lang/maori.txt index c48be32287..a1b4ba38b6 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -254,6 +254,7 @@ STR_UNITS_FORCE_SI :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}ft STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}kōeke # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}rā @@ -2162,6 +2163,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Ina whakaaria h STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Ingarangi (ft) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Ngahuru (m) STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m) +STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_GAMEUNITS :Waeine kēmu (kōeke) STR_CONFIG_SETTING_LOCALISATION :Kōwhiringa ā-rohe STR_CONFIG_SETTING_GRAPHICS :Whakairoiro @@ -3348,6 +3350,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: STR_SAVELOAD_FILTER_TITLE :{BLACK}Tātari: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Whakakapia te Kōnae STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Kei te tino hiahia rānei koe ki te whakakapi i te kōnae i pupuri kētia? +STR_SAVELOAD_DELETE_TITLE :{WHITE}Mukua te kōnae +STR_SAVELOAD_DELETE_WARNING :{YELLOW}Kei te tino hiahia rānei koe ki te muku i te kōnae? STR_SAVELOAD_DIRECTORY :{STRING} (Tātai) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Tātai matua) @@ -3423,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Rakimāu STR_MAPGEN_NORTHEAST :{BLACK}Rakimārāwhiti STR_MAPGEN_SOUTHEAST :{BLACK}Tongamārāwhiti STR_MAPGEN_SOUTHWEST :{BLACK}Tongamāuru +STR_MAPGEN_NORTHWEST_TOOLTIP :Hohokona te wai, te tapa noa rānei i te tapa rakimāuru o te mahere +STR_MAPGEN_NORTHEAST_TOOLTIP :Hohokona te wai, te tapa noa rānei i te tapa rakimārāwhiti o te mahere +STR_MAPGEN_SOUTHEAST_TOOLTIP :Hohokona te wai, te tapa noa rānei i te tapa tongamārāwhiti o te mahere +STR_MAPGEN_SOUTHWEST_TOOLTIP :Hohokona te wai, te tapa noa rānei i te tapa tongamāuru o te mahere STR_MAPGEN_BORDER_FREEFORM :{BLACK}Hanga noa STR_MAPGEN_BORDER_WATER :{BLACK}Wai STR_MAPGEN_BORDER_RANDOM :{BLACK}Matapōkere @@ -3430,6 +3438,7 @@ STR_MAPGEN_BORDER_RANDOM :{BLACK}Matapōk ###length 3 STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Matapōkere STR_MAPGEN_BORDER_MANUAL :{BLACK}Ā-ringa +STR_MAPGEN_BORDER_INFINITE_WATER :Wai mutunga kore STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Hurihanga mahereteitei: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Ingoa o te mahereteitei: @@ -3468,6 +3477,8 @@ STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}Hanga wh STR_GENERATION_RIVER_GENERATION :{BLACK}Hanga awa STR_GENERATION_CLEARING_TILES :{BLACK}Hanga rohe tuarangaranga, tokatoka hoki STR_GENERATION_TOWN_GENERATION :{BLACK}Hanga tāone +STR_GENERATION_LAND_INDUSTRY_GENERATION :{BLACK}Hanga ahumahi whenua +STR_GENERATION_WATER_INDUSTRY_GENERATION :{BLACK}Hanga ahumahi wai STR_GENERATION_OBJECT_GENERATION :{BLACK}Hanga mea STR_GENERATION_TREE_GENERATION :{BLACK}Hanga rākau STR_GENERATION_SETTINGUP_GAME :{BLACK}Whakatatū i te kēmu @@ -3687,6 +3698,7 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Tāurua STR_TOWN_DIRECTORY_CAPTION :{WHITE}Tāone ({COMMA} o te {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Kore - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) +STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{BLACK} ({COMMA}) {YELLOW}{CITY_ICON} STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Ingoa o ngā tāone - pāwhiria he ingoa kia neke i te tirohanga matua ki te tāone. Pātaki+Pāwhiri kia huaki i tētahi atu tirohanga i te tauwāhi o te tāone STR_TOWN_POPULATION :{BLACK}Taupori o te ao: {COMMA} @@ -4183,6 +4195,7 @@ STR_PURCHASE_INFO_ALL_BUT :Katoa hāunga t STR_PURCHASE_INFO_MAX_TE :{BLACK}Kaha Rapa Mōrahi: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Whānui: {GOLD}{COMMA} Papariki STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Momo waka rererangi: {GOLD}{STRING} +STR_PURCHASE_INFO_RAILTYPES :{BLACK}Momo rēra: {GOLD}{STRING} ###length 3 STR_CARGO_TYPE_FILTER_ALL :Momo utanga katoa @@ -4366,6 +4379,7 @@ STR_ENGINE_PREVIEW_RUNCOST_YEAR :Utu Whakahaere: STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Utu Whakahaere: {CURRENCY_LONG}/wā STR_ENGINE_PREVIEW_CAPACITY :Kītanga: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY_2 :Kītanga: {CARGO_LONG}, {CARGO_LONG} +STR_ENGINE_PREVIEW_RAILTYPES :Momo rēra: {STRING} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Whakakapi {STRING} - {STRING} @@ -5262,6 +5276,13 @@ STR_ERROR_START_AND_END_MUST_BE_IN :{WHITE}Me tōti STR_ERROR_ENDS_OF_BRIDGE_MUST_BOTH :{WHITE}... me tū ki te whenua ngā pito e rua o te arawhiti STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... he roa rawa te arawhiti STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Ka mutu te arawhiti i waho i te mahere +STR_ERROR_BRIDGE_TOO_LOW_FOR_STATION :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te teihana +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROADSTOP :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te tūnga rori +STR_ERROR_BRIDGE_TOO_LOW_FOR_DOCK :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te tauranga +STR_ERROR_BRIDGE_TOO_LOW_FOR_BUOY :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te kārewa +STR_ERROR_BRIDGE_TOO_LOW_FOR_RAIL_WAYPOINT :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te aratohu rerewhenua +STR_ERROR_BRIDGE_TOO_LOW_FOR_ROAD_WAYPOINT :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te aratohu rori +STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK :{WHITE}{HEIGHT} e hakahaka rawa ai te arawhiti mō te matatara # Tunnel related errors STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Tē taea te hanga te anaroa i konei... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index d1c5d94cc7..c7971b4357 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1374,7 +1374,7 @@ STR_CONFIG_SETTING_CATCHMENT :Dimensionamento STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Para ter diferentes áreas de cobertura para diferentes tipos de estações e aeroportos STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES :Estações da empresa podem servir indústrias com estações neutras anexadas: {STRING} -STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Quando ativo, indústrias com estações incluídas (com as Petrolíferas) podem ser servidas por estações-da-empresa construídas nas redondezas. Quando inativo, estas indústrias só podem ser servidas pela sua própria estação. Qualquer estação da empresa não poderá servir a indústria, nem a estação incluída pode servir outra entidade senão a própria indústria +STR_CONFIG_SETTING_SERVE_NEUTRAL_INDUSTRIES_HELPTEXT :Quando ativo, indústrias com estações incluídas (com as Plataformas Petrolíferas) podem ser servidas por estações da empresa construídas nas redondezas. Quando inativo, estas indústrias só podem ser servidas pela sua própria estação. Qualquer estação da empresa não poderá servir a indústria, nem a estação incluída pode servir outra entidade senão a própria indústria STR_CONFIG_SETTING_EXTRADYNAMITE :Permitir remover mais estradas, pontes e túneis detidos pela cidade: {STRING} STR_CONFIG_SETTING_EXTRADYNAMITE_HELPTEXT :Facilitar a remoçar de edifícios e infraestruturas detidas pela localidade @@ -1390,7 +1390,7 @@ STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Modelo de acele STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de comboios. O modelo "original" penaliza as inclinações para todos os veículos. O modelo "realista" penaliza as curvas e inclinações tendo em conta várias propriedades do comboio, tais como o comprimento e o esforço de tração STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Tipo de aceleração dos veículos rodoviários: {STRING} -STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de veículos de estrada. O modelo "original" penaliza as inclinações para todos os veículos. O modelo "realista" penaliza as curvas e inclinações tendo em conta várias propriedades do motor, tais como o esforço de tração +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Escolha o modelo de física para a aceleração de veículos rodoviários. O modelo "original" penaliza as inclinações para todos os veículos. O modelo "realista" penaliza as curvas e inclinações tendo em conta várias propriedades do motor, tais como o esforço de tração STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Ângulo de inclinação para comboios: {STRING} STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Ângulo de inclinação de um mosaico para um comboio. Valores mais elevados tornam a subida mais difícil @@ -1578,7 +1578,7 @@ STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Parar o rato po ###setting-zero-is-special STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Clique com botão direito -STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostra população da localidade na identificação da mesma: {STRING} +STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar a população na etiqueta do nome da localidade: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Mostrar a população das localidades na sua etiqueta no mapa STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas dos gráficos estatísticos: {STRING} @@ -1664,7 +1664,7 @@ STR_CONFIG_SETTING_SERVICEATHELIPAD :Manutenção au STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Efetuar manutenção aos helicópteros após cada aterragem, mesmo que não haja um hangar presente STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR :Ligar ferramentas de paisagem com as de construção: {STRING} -STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Quando se abre a barra de construção para um tipo de transporte, abrir também a barra de terraplanagem +STR_CONFIG_SETTING_LINK_TERRAFORM_TOOLBAR_HELPTEXT :Quando se abre a barra de construção para um tipo de transporte, abrir também a barra de modificação de paisagem STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR :Cor do solo usada no mapa pequeno: {STRING} STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_HELPTEXT :Cor do terreno no mapa pequeno @@ -1817,8 +1817,8 @@ STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fim do ano: {ST STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Fim do período: {STRING} ###length 2 -STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reproduz um som no final do ano e resume a performance da empresa desse ano em comparação com a do ano anterior -STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Reproduz um som no final do período e resume a performance da empresa desse período em comparação com a do período anterior +STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reproduzir um efeito sonoro no resumo do desempenho anual da empresa que compara o desempenho desse ano com o ano anterior +STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Reproduzir um efeito sonoro no resumo do desempenho periódico da empresa que compara o desempenho desse período com o período anterior STR_CONFIG_SETTING_SOUND_CONFIRM :Construção: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reproduzir um efeito sonoro nas construções ou outras ações bem sucedidas @@ -1839,7 +1839,7 @@ STR_CONFIG_SETTING_MAX_TRAINS :Máximo de comb STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Número máximo de comboios que uma empresa pode ter STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Máximo de veículos rodoviários por empresa: {STRING} -STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Número máximo de veículos de estrada que uma empresa pode ter +STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Número máximo de veículos rodoviários que uma empresa pode ter STR_CONFIG_SETTING_MAX_AIRCRAFT :Máximo de aeronaves por empresa: {STRING} STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Número máximo de aeronaves que uma empresa pode ter @@ -1851,7 +1851,7 @@ STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desativar combo STR_CONFIG_SETTING_AI_BUILDS_TRAINS_HELPTEXT :Ativar esta preferência impossibilita a criação de comboios por jogadores controlados pelo computador STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :Desativar veículos rodoviários para o computador: {STRING} -STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Ativar esta preferência impossibilita a construção de veículos de estrada por um jogador controlado pelo computador +STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES_HELPTEXT :Ativar esta preferência impossibilita a construção de veículos rodoviários por um jogador controlado pelo computador STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :Desativar aeronaves para o computador: {STRING} STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT_HELPTEXT :Ativar esta preferência impossibilita a construção de aeronaves por um jogador controlado pelo computador @@ -1871,13 +1871,13 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB 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_TRAINS :Intervalo de manutenção por omissão para comboios: {STRING} +STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Definir o intervalo de manutenção por omissão para novos veículos ferroviários, se não for configurado um intervalo de manutenção explícito para o veículo +STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Intervalo de manutenção por omissão para veículos rodoviários: {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 manutenção para aeronaves por omissão: {STRING} +STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Intervalo de manutenção por omissão para aeronaves: {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 :Intervalo de manutenção por omissão para navios: {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 ###length 3 STR_CONFIG_SETTING_SERVINT_VALUE_DAYS :{COMMA}{NBSP}Dia{P 0 "" s} @@ -1915,7 +1915,7 @@ STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informações d STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Mostrar um jornal quando uma empresa nova é criada, ou quando uma empresa está à beira da falência STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Abertura de indústrias: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Mostrar um jornal quando abre uma indústria nova +STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Mostrar um jornal quando se abre uma nova indústria STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE :Fecho de indústrias: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CLOSE_HELPTEXT :Mostrar um jornal quando uma indústria fecha @@ -1926,11 +1926,11 @@ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Mostrar um jorn STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Alterações de produção nas indústrias servidas pelo jogador: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Mostrar um jornal na alteração da produção de indústrias servidas pelo jogador -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na produção das industrias servidas pelo(s) oponentes: {STRING} +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na produção das industrias servidas por oponente(s): {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Mostrar um jornal na alteração da produção de indústrias servidas por oponentes STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Alterações na produção de outras indústrias: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Mostrar um jornal na alteração da produção de indústrias servidas por ninguém +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Mostrar um jornal na alteração da produção de indústrias que não estão a ser servidas STR_CONFIG_SETTING_NEWS_ADVICE :Avisos / informações sobre os veículos da empresa: {STRING} STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Mostrar mensagens sobre veículos que requerem atenção @@ -2007,7 +2007,7 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Aleatório STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :As localidades têm permissão para construir estradas: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite às localidades a construção de estradas para crescimento. Desativar para prevenir a construção de estradas pelas autoridades locais. 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_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Ativar esta preferência permite às localidades construir passagens de nível 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" From e8d49ebfe678b56cb307ed586019cf93a496719d Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 17 Nov 2025 07:55:23 -0500 Subject: [PATCH 193/280] Fix: Two lighthouse spawn issues (#14785) * Fix: Lighthouses need sea to generate, not rivers * Fix: Don't spawn lighthouses close together --- src/object_cmd.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 2bb29628f9..ae74e5e5cf 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -769,11 +769,14 @@ static bool TryBuildLightHouse() } /* Only build lighthouses at tiles where the border is sea. */ - if (!IsTileType(tile, MP_WATER)) return false; + if (!IsTileType(tile, MP_WATER) || GetWaterClass(tile) != WATER_CLASS_SEA) return false; for (int j = 0; j < 19; j++) { int h; if (IsTileType(tile, MP_CLEAR) && IsTileFlat(tile, &h) && h <= 2 && !IsBridgeAbove(tile)) { + for (auto t : SpiralTileSequence(tile, 9)) { + if (IsObjectTypeTile(t, OBJECT_LIGHTHOUSE)) return false; + } BuildObject(OBJECT_LIGHTHOUSE, tile); assert(tile < Map::Size()); return true; From e8ba7d0a08c1f8c7536a828bd0e906c9357bbb7b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 18:12:27 +0000 Subject: [PATCH 194/280] Codefix f98b90ac2e: Use to_underlying instead of direct static_cast. (#14790) --- src/tree_cmd.cpp | 2 +- src/tree_map.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index 49901b8796..8633fe3d24 100644 --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -674,7 +674,7 @@ static void DrawTile_Trees(TileInfo *ti) uint trees = GetTreeCount(ti->tile); for (uint i = 0; i < trees; i++) { - SpriteID sprite = s[0].sprite + (i == trees - 1 ? static_cast(GetTreeGrowth(ti->tile)) : 3); + SpriteID sprite = s[0].sprite + (i == trees - 1 ? to_underlying(GetTreeGrowth(ti->tile)) : 3); PaletteID pal = s[0].pal; te[i].sprite = sprite; diff --git a/src/tree_map.h b/src/tree_map.h index 0cabe6a8eb..782656876b 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -226,7 +226,7 @@ inline void AddTreeGrowth(Tile t, int a) inline void SetTreeGrowth(Tile t, TreeGrowthStage g) { assert(IsTileType(t, MP_TREES)); // XXX incomplete - SB(t.m5(), 0, 3, static_cast(g)); + SB(t.m5(), 0, 3, to_underlying(g)); } /** @@ -249,7 +249,7 @@ inline void MakeTree(Tile t, TreeType type, uint count, TreeGrowthStage growth, t.m2() = ground << 6 | density << 4 | 0; t.m3() = type; t.m4() = 0 << 5 | 0 << 2; - t.m5() = count << 6 | static_cast(growth); + t.m5() = count << 6 | to_underlying(growth); SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; From 0f5a4290dfe9299bb01ecdbae23430999f213c2d Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 19:49:34 +0000 Subject: [PATCH 195/280] Codechange: Use enum class for RailTileType --- src/elrail.cpp | 2 +- src/rail_cmd.cpp | 22 +++++++++++----------- src/rail_gui.cpp | 4 ++-- src/rail_map.h | 32 ++++++++++++++++---------------- src/road.cpp | 2 +- src/road_cmd.cpp | 2 +- src/saveload/oldloader_sl.cpp | 10 +++++----- src/saveload/waypoint_sl.cpp | 4 ++-- src/train_cmd.cpp | 2 +- src/waypoint_cmd.cpp | 2 +- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/elrail.cpp b/src/elrail.cpp index 14b145713c..1b7f9feb9a 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -89,7 +89,7 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, DiagDirections *override case MP_RAILWAY: if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE; switch (GetRailTileType(t)) { - case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS: + case RailTileType::Normal: case RailTileType::Signals: return GetTrackBits(t); default: return TRACK_BIT_NONE; diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index e2ee0b781b..aa35ce3a23 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1636,7 +1636,7 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_ switch (tt) { case MP_RAILWAY: switch (GetRailTileType(tile)) { - case RAIL_TILE_DEPOT: + case RailTileType::Depot: if (flags.Test(DoCommandFlag::Execute)) { /* notify YAPF about the track layout change */ YapfNotifyTrackLayoutChange(tile, GetRailDepotTrack(tile)); @@ -1649,7 +1649,7 @@ CommandCost CmdConvertRail(DoCommandFlags flags, TileIndex tile, TileIndex area_ cost.AddCost(RailConvertCost(type, totype)); break; - default: // RAIL_TILE_NORMAL, RAIL_TILE_SIGNALS + default: // RailTileType::Normal, RailTileType::Signals if (flags.Test(DoCommandFlag::Execute)) { /* notify YAPF about the track layout change */ TrackBits tracks = GetTrackBits(tile); @@ -1806,8 +1806,8 @@ static CommandCost ClearTile_Track(TileIndex tile, DoCommandFlags flags) } switch (GetRailTileType(tile)) { - case RAIL_TILE_SIGNALS: - case RAIL_TILE_NORMAL: { + case RailTileType::Signals: + case RailTileType::Normal: { Slope tileh = GetTileSlope(tile); /* Is there flat water on the lower halftile that gets cleared expensively? */ bool water_ground = (GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(tileh)); @@ -1836,7 +1836,7 @@ static CommandCost ClearTile_Track(TileIndex tile, DoCommandFlags flags) return cost; } - case RAIL_TILE_DEPOT: + case RailTileType::Depot: return RemoveTrainDepot(tile, flags); default: @@ -2725,11 +2725,11 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, switch (GetRailTileType(tile)) { default: NOT_REACHED(); - case RAIL_TILE_NORMAL: + case RailTileType::Normal: trackbits = GetTrackBits(tile); break; - case RAIL_TILE_SIGNALS: { + case RailTileType::Signals: { trackbits = GetTrackBits(tile); uint8_t a = GetPresentSignals(tile); uint b = GetSignalStates(tile); @@ -2752,7 +2752,7 @@ static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, break; } - case RAIL_TILE_DEPOT: { + case RailTileType::Depot: { DiagDirection dir = GetRailDepotDirection(tile); if (side != INVALID_DIAGDIR && side != dir) break; @@ -2780,11 +2780,11 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc &td) td.railtype = rti->strings.name; td.owner[0] = GetTileOwner(tile); switch (GetRailTileType(tile)) { - case RAIL_TILE_NORMAL: + case RailTileType::Normal: td.str = STR_LAI_RAIL_DESCRIPTION_TRACK; break; - case RAIL_TILE_SIGNALS: { + case RailTileType::Signals: { static const StringID signal_type[6][6] = { { STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS, @@ -2849,7 +2849,7 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc &td) break; } - case RAIL_TILE_DEPOT: + case RailTileType::Depot: td.str = STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT; if (_settings_game.vehicle.train_acceleration_model != AM_ORIGINAL) { if (td.rail_speed > 0) { diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 5cbb9de220..30fe5bd72f 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -119,8 +119,8 @@ static void GenericPlaceRail(TileIndex tile, Track track) */ static void PlaceExtraDepotRail(TileIndex tile, DiagDirection dir, Track track) { - if (GetRailTileType(tile) == RAIL_TILE_DEPOT) return; - if (GetRailTileType(tile) == RAIL_TILE_SIGNALS && !_settings_client.gui.auto_remove_signals) return; + if (GetRailTileType(tile) == RailTileType::Depot) return; + if (GetRailTileType(tile) == RailTileType::Signals && !_settings_client.gui.auto_remove_signals) return; if ((GetTrackBits(tile) & DiagdirReachesTracks(dir)) == 0) return; Command::Post(tile, _cur_railtype, track, _settings_client.gui.auto_remove_signals); diff --git a/src/rail_map.h b/src/rail_map.h index 4f1db937f4..1b43c8a94c 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -20,10 +20,10 @@ /** Different types of Rail-related tiles */ -enum RailTileType : uint8_t { - RAIL_TILE_NORMAL = 0, ///< Normal rail tile without signals - RAIL_TILE_SIGNALS = 1, ///< Normal rail tile with signals - RAIL_TILE_DEPOT = 3, ///< Depot (one entrance) +enum class RailTileType : uint8_t { + Normal = 0, ///< Normal rail tile without signals + Signals = 1, ///< Normal rail tile with signals + Depot = 3, ///< Depot (one entrance) }; /** @@ -36,12 +36,12 @@ enum RailTileType : uint8_t { debug_inline static RailTileType GetRailTileType(Tile t) { assert(IsTileType(t, MP_RAILWAY)); - return (RailTileType)GB(t.m5(), 6, 2); + return static_cast(GB(t.m5(), 6, 2)); } /** * Returns whether this is plain rails, with or without signals. Iow, if this - * tiles RailTileType is RAIL_TILE_NORMAL or RAIL_TILE_SIGNALS. + * tiles RailTileType is RailTileType::Normal or RailTileType::Signals. * @param t the tile to get the information from * @pre IsTileType(t, MP_RAILWAY) * @return true if and only if the tile is normal rail (with or without signals) @@ -49,7 +49,7 @@ debug_inline static RailTileType GetRailTileType(Tile t) debug_inline static bool IsPlainRail(Tile t) { RailTileType rtt = GetRailTileType(t); - return rtt == RAIL_TILE_NORMAL || rtt == RAIL_TILE_SIGNALS; + return rtt == RailTileType::Normal || rtt == RailTileType::Signals; } /** @@ -71,7 +71,7 @@ debug_inline static bool IsPlainRailTile(Tile t) */ inline bool HasSignals(Tile t) { - return GetRailTileType(t) == RAIL_TILE_SIGNALS; + return GetRailTileType(t) == RailTileType::Signals; } /** @@ -83,7 +83,7 @@ inline bool HasSignals(Tile t) inline void SetHasSignals(Tile tile, bool signals) { assert(IsPlainRailTile(tile)); - AssignBit(tile.m5(), 6, signals); + SB(tile.m5(), 6, 2, to_underlying(signals ? RailTileType::Signals : RailTileType::Normal)); } /** @@ -94,7 +94,7 @@ inline void SetHasSignals(Tile tile, bool signals) */ debug_inline static bool IsRailDepot(Tile t) { - return GetRailTileType(t) == RAIL_TILE_DEPOT; + return GetRailTileType(t) == RailTileType::Depot; } /** @@ -291,14 +291,14 @@ inline bool IsPbsSignal(SignalType s) inline SignalType GetSignalType(Tile t, Track track) { - assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); + assert(GetRailTileType(t) == RailTileType::Signals); uint8_t pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; return (SignalType)GB(t.m2(), pos, 3); } inline void SetSignalType(Tile t, Track track, SignalType s) { - assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); + assert(GetRailTileType(t) == RailTileType::Signals); uint8_t pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; SB(t.m2(), pos, 3, s); if (track == INVALID_TRACK) SB(t.m2(), 4, 3, s); @@ -412,7 +412,7 @@ inline bool IsSignalPresent(Tile t, uint8_t signalbit) inline bool HasSignalOnTrack(Tile tile, Track track) { assert(IsValidTrack(track)); - return GetRailTileType(tile) == RAIL_TILE_SIGNALS && (GetPresentSignals(tile) & SignalOnTrack(track)) != 0; + return GetRailTileType(tile) == RailTileType::Signals && (GetPresentSignals(tile) & SignalOnTrack(track)) != 0; } /** @@ -425,7 +425,7 @@ inline bool HasSignalOnTrack(Tile tile, Track track) inline bool HasSignalOnTrackdir(Tile tile, Trackdir trackdir) { assert (IsValidTrackdir(trackdir)); - return GetRailTileType(tile) == RAIL_TILE_SIGNALS && GetPresentSignals(tile) & SignalAlongTrackdir(trackdir); + return GetRailTileType(tile) == RailTileType::Signals && GetPresentSignals(tile) & SignalAlongTrackdir(trackdir); } /** @@ -523,7 +523,7 @@ inline void MakeRailNormal(Tile t, Owner o, TrackBits b, RailType r) t.m2() = 0; t.m3() = 0; t.m4() = 0; - t.m5() = RAIL_TILE_NORMAL << 6 | b; + t.m5() = to_underlying(RailTileType::Normal) << 6 | b; SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = r; @@ -556,7 +556,7 @@ inline void MakeRailDepot(Tile tile, Owner owner, DepotID depot_id, DiagDirectio tile.m2() = depot_id.base(); tile.m3() = 0; tile.m4() = 0; - tile.m5() = RAIL_TILE_DEPOT << 6 | dir; + tile.m5() = to_underlying(RailTileType::Depot) << 6 | dir; SB(tile.m6(), 2, 6, 0); tile.m7() = 0; tile.m8() = rail_type; diff --git a/src/road.cpp b/src/road.cpp index 18478e9598..8b772fec76 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -45,7 +45,7 @@ RoadType RoadTypeInfo::Index() const static bool IsPossibleCrossing(const TileIndex tile, Axis ax) { return (IsTileType(tile, MP_RAILWAY) && - GetRailTileType(tile) == RAIL_TILE_NORMAL && + GetRailTileType(tile) == RailTileType::Normal && GetTrackBits(tile) == (ax == AXIS_X ? TRACK_BIT_Y : TRACK_BIT_X) && std::get<0>(GetFoundationSlope(tile)) == SLOPE_FLAT); } diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 4b5d93682d..5e1fe53327 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -721,7 +721,7 @@ CommandCost CmdBuildRoad(DoCommandFlags flags, TileIndex tile, RoadBits pieces, if (ret.Failed()) return ret; } - if (GetRailTileType(tile) != RAIL_TILE_NORMAL) goto do_clear; + if (GetRailTileType(tile) != RailTileType::Normal) goto do_clear; if (RoadNoLevelCrossing(rt)) { return CommandCost(STR_ERROR_CROSSING_DISALLOWED_ROAD); diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 8bd04801d5..40031f7a89 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -67,7 +67,7 @@ static void FixTTDMapArray() case MP_RAILWAY: /* We save presignals different from TTDPatch, convert them */ - if (GB(tile.m5(), 6, 2) == 1) { // RAIL_TILE_SIGNALS + if (GB(tile.m5(), 6, 2) == 1) { // RailTileType::Signals /* This byte is always zero in TTD for this type of tile */ if (tile.m4()) { // Convert the presignals to our own format tile.m4() = (tile.m4() >> 1) & 7; @@ -226,16 +226,16 @@ static bool FixTTOMapArray() case MP_RAILWAY: switch (GB(tile.m5(), 6, 2)) { - case 0: // RAIL_TILE_NORMAL + case 0: // RailTileType::Normal break; - case 1: // RAIL_TILE_SIGNALS + case 1: // RailTileType::Signals tile.m4() = (~tile.m5() & 1) << 2; // signal variant (present only in OTTD) SB(tile.m2(), 6, 2, GB(tile.m5(), 3, 2)); // signal status tile.m3() |= 0xC0; // both signals are present tile.m5() = HasBit(tile.m5(), 5) ? 2 : 1; // track direction (only X or Y) - tile.m5() |= 0x40; // RAIL_TILE_SIGNALS + tile.m5() |= 0x40; // RailTileType::Signals break; - case 3: // RAIL_TILE_DEPOT + case 3: // RailTileType::Depot tile.m2() = 0; break; default: diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 57edac0323..41f3d3e8be 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -100,11 +100,11 @@ void MoveWaypointsToBaseStations() TileIndex t = wp.xy; /* Sometimes waypoint (sign) locations became disconnected from their actual location in * the map array. If this is the case, try to locate the actual location in the map array */ - if (!IsTileType(t, MP_RAILWAY) || GetRailTileType(t) != 2 /* RAIL_TILE_WAYPOINT */ || Tile(t).m2() != wp.index) { + if (!IsTileType(t, MP_RAILWAY) || GetRailTileType(t) != RailTileType{2} /* RAIL_TILE_WAYPOINT */ || Tile(t).m2() != wp.index) { Debug(sl, 0, "Found waypoint tile {} with invalid position", t); t = INVALID_TILE; for (auto tile : Map::Iterate()) { - if (IsTileType(tile, MP_RAILWAY) && GetRailTileType(tile) == 2 /* RAIL_TILE_WAYPOINT */ && tile.m2() == wp.index) { + if (IsTileType(tile, MP_RAILWAY) && GetRailTileType(tile) == RailTileType{2} /* RAIL_TILE_WAYPOINT */ && tile.m2() == wp.index) { t = TileIndex(tile); Debug(sl, 0, "Found actual waypoint position at {}", TileIndex(tile)); break; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 5723eb11cf..6f143f5112 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3086,7 +3086,7 @@ static inline void AffectSpeedByZChange(Train *v, int old_z) static bool TrainMovedChangeSignals(TileIndex tile, DiagDirection dir) { if (IsTileType(tile, MP_RAILWAY) && - GetRailTileType(tile) == RAIL_TILE_SIGNALS) { + GetRailTileType(tile) == RailTileType::Signals) { TrackdirBits tracks = TrackBitsToTrackdirBits(GetTrackBits(tile)) & DiagdirReachesTrackdirs(dir); Trackdir trackdir = FindFirstTrackdir(tracks); if (UpdateSignalsOnSegment(tile, TrackdirToExitdir(trackdir), GetTileOwner(tile)) == SIGSEG_PBS && HasSignalOnTrackdir(tile, trackdir)) { diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 1a0dba435d..4d514c0567 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -104,7 +104,7 @@ Axis GetAxisForNewRailWaypoint(TileIndex tile) if (IsRailWaypointTile(tile)) return GetRailStationAxis(tile); /* Non-plain rail type, no valid axis for waypoints. */ - if (!IsTileType(tile, MP_RAILWAY) || GetRailTileType(tile) != RAIL_TILE_NORMAL) return INVALID_AXIS; + if (!IsTileType(tile, MP_RAILWAY) || GetRailTileType(tile) != RailTileType::Normal) return INVALID_AXIS; switch (GetTrackBits(tile)) { case TRACK_BIT_X: return AXIS_X; From 2851c70a59e485034be9f4683edbc23f944622c5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 19:49:36 +0000 Subject: [PATCH 196/280] Codechange: Use enum class for RailGroundType. --- src/newgrf_commons.cpp | 2 +- src/rail_cmd.cpp | 118 +++++++++++++++++----------------- src/rail_map.h | 38 +++++------ src/saveload/afterload.cpp | 2 +- src/saveload/oldloader_sl.cpp | 2 +- src/ship_cmd.cpp | 2 +- src/water_cmd.cpp | 14 ++-- 7 files changed, 89 insertions(+), 89 deletions(-) diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index 6596d41d26..84a4af404b 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -350,7 +350,7 @@ uint32_t GetTerrainType(TileIndex tile, TileContext context) /* During map generation the snowstate may not be valid yet, as the tileloop may not have run yet. */ if (_generating_world) goto genworld; // we do not care about foundations here RailGroundType ground = GetRailGroundType(tile); - has_snow = (ground == RAIL_GROUND_ICE_DESERT || (context == TCX_UPPER_HALFTILE && ground == RAIL_GROUND_HALF_SNOW)); + has_snow = (ground == RailGroundType::SnowOrDesert || (context == TCX_UPPER_HALFTILE && ground == RailGroundType::HalfTileSnow)); break; } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index aa35ce3a23..e98d5dd1a4 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -473,7 +473,7 @@ CommandCost CmdBuildSingleRail(DoCommandFlags flags, TileIndex tile, RailType ra } if (flags.Test(DoCommandFlag::Execute)) { - SetRailGroundType(tile, RAIL_GROUND_BARREN); + SetRailGroundType(tile, RailGroundType::Barren); TrackBits bits = GetTrackBits(tile); SetTrackBits(tile, bits | trackbit); /* Subtract old infrastructure count. */ @@ -582,7 +582,7 @@ CommandCost CmdBuildSingleRail(DoCommandFlags flags, TileIndex tile, RailType ra if (flags.Test(DoCommandFlag::Execute)) { MakeRailNormal(tile, _current_company, trackbit, railtype); if (water_ground) { - SetRailGroundType(tile, RAIL_GROUND_WATER); + SetRailGroundType(tile, RailGroundType::HalfTileWater); if (IsPossibleDockingTile(tile)) CheckForDockingTile(tile); } Company::Get(_current_company)->infrastructure.rail[railtype]++; @@ -704,7 +704,7 @@ CommandCost CmdRemoveSingleRail(DoCommandFlags flags, TileIndex tile, Track trac if (present == 0) { Slope tileh = GetTileSlope(tile); /* If there is flat water on the lower halftile, convert the tile to shore so the water remains */ - if (GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(tileh)) { + if (GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(tileh)) { bool docking = IsDockingTile(tile); MakeShore(tile); SetDockingTile(tile, docking); @@ -761,7 +761,7 @@ bool FloodHalftile(TileIndex t) assert(IsPlainRailTile(t)); bool flooded = false; - if (GetRailGroundType(t) == RAIL_GROUND_WATER) return flooded; + if (GetRailGroundType(t) == RailGroundType::HalfTileWater) return flooded; Slope tileh = GetTileSlope(t); TrackBits rail_bits = GetTrackBits(t); @@ -785,7 +785,7 @@ bool FloodHalftile(TileIndex t) if (IsNonContinuousFoundation(GetRailFoundation(tileh, rail_bits))) { flooded = true; - SetRailGroundType(t, RAIL_GROUND_WATER); + SetRailGroundType(t, RailGroundType::HalfTileWater); MarkTileDirtyByTile(t); } } else { @@ -793,7 +793,7 @@ bool FloodHalftile(TileIndex t) if (ApplyFoundationToSlope(GetRailFoundation(tileh, rail_bits), tileh) == 0) { if (IsSteepSlope(tileh) || IsSlopeWithThreeCornersRaised(tileh)) { flooded = true; - SetRailGroundType(t, RAIL_GROUND_WATER); + SetRailGroundType(t, RailGroundType::HalfTileWater); MarkTileDirtyByTile(t); } } @@ -1810,7 +1810,7 @@ static CommandCost ClearTile_Track(TileIndex tile, DoCommandFlags flags) case RailTileType::Normal: { Slope tileh = GetTileSlope(tile); /* Is there flat water on the lower halftile that gets cleared expensively? */ - bool water_ground = (GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(tileh)); + bool water_ground = (GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(tileh)); TrackBits tracks = GetTrackBits(tile); while (tracks != TRACK_BIT_NONE) { @@ -2006,19 +2006,19 @@ static void DrawTrackDetails(const TileInfo *ti, const RailTypeInfo *rti, Palett assert(num_sprites > 0); switch (GetRailGroundType(ti->tile)) { - case RAIL_GROUND_FENCE_NW: DrawTrackFence_NW(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_SE: DrawTrackFence_SE(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_SENW: DrawTrackFence_NW(ti, psid, num_sprites); - DrawTrackFence_SE(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_NE: DrawTrackFence_NE(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_SW: DrawTrackFence_SW(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_NESW: DrawTrackFence_NE(ti, psid, num_sprites); - DrawTrackFence_SW(ti, psid, num_sprites); break; - case RAIL_GROUND_FENCE_VERT1: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_LEFT); break; - case RAIL_GROUND_FENCE_VERT2: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_RIGHT); break; - case RAIL_GROUND_FENCE_HORIZ1: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_UPPER); break; - case RAIL_GROUND_FENCE_HORIZ2: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_LOWER); break; - case RAIL_GROUND_WATER: { + case RailGroundType::FenceNW: DrawTrackFence_NW(ti, psid, num_sprites); break; + case RailGroundType::FenceSE: DrawTrackFence_SE(ti, psid, num_sprites); break; + case RailGroundType::FenceSENW: DrawTrackFence_NW(ti, psid, num_sprites); + DrawTrackFence_SE(ti, psid, num_sprites); break; + case RailGroundType::FenceNE: DrawTrackFence_NE(ti, psid, num_sprites); break; + case RailGroundType::FenceSW: DrawTrackFence_SW(ti, psid, num_sprites); break; + case RailGroundType::FenceNESW: DrawTrackFence_NE(ti, psid, num_sprites); + DrawTrackFence_SW(ti, psid, num_sprites); break; + case RailGroundType::FenceVert1: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_LEFT); break; + case RailGroundType::FenceVert2: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_RIGHT); break; + case RailGroundType::FenceHoriz1: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_UPPER); break; + case RailGroundType::FenceHoriz2: DrawTrackFence(ti, psid, num_sprites, RFO_FLAT_LOWER); break; + case RailGroundType::HalfTileWater: { Corner track_corner; if (IsHalftileSlope(ti->tileh)) { /* Steep slope or one-corner-raised slope with halftile foundation */ @@ -2072,7 +2072,7 @@ static void DrawTrackBitsOverlay(TileInfo *ti, TrackBits track, const RailTypeIn /* DrawFoundation modifies ti */ /* Draw ground */ - if (rgt == RAIL_GROUND_WATER) { + if (rgt == RailGroundType::HalfTileWater) { if (track != TRACK_BIT_NONE || IsSteepSlope(ti->tileh)) { /* three-corner-raised slope or steep slope with track on upper part */ DrawShoreTile(ti->tileh); @@ -2084,9 +2084,9 @@ static void DrawTrackBitsOverlay(TileInfo *ti, TrackBits track, const RailTypeIn SpriteID image; switch (rgt) { - case RAIL_GROUND_BARREN: image = SPR_FLAT_BARE_LAND; break; - case RAIL_GROUND_ICE_DESERT: image = SPR_FLAT_SNOW_DESERT_TILE; break; - default: image = SPR_FLAT_GRASS_TILE; break; + case RailGroundType::Barren: image = SPR_FLAT_BARE_LAND; break; + case RailGroundType::SnowOrDesert: image = SPR_FLAT_SNOW_DESERT_TILE; break; + default: image = SPR_FLAT_GRASS_TILE; break; } image += SlopeToSpriteOffset(ti->tileh); @@ -2186,10 +2186,10 @@ static void DrawTrackBitsOverlay(TileInfo *ti, TrackBits track, const RailTypeIn SpriteID image; switch (rgt) { - case RAIL_GROUND_BARREN: image = SPR_FLAT_BARE_LAND; break; - case RAIL_GROUND_ICE_DESERT: - case RAIL_GROUND_HALF_SNOW: image = SPR_FLAT_SNOW_DESERT_TILE; break; - default: image = SPR_FLAT_GRASS_TILE; break; + case RailGroundType::Barren: image = SPR_FLAT_BARE_LAND; break; + case RailGroundType::SnowOrDesert: + case RailGroundType::HalfTileSnow: image = SPR_FLAT_SNOW_DESERT_TILE; break; + default: image = SPR_FLAT_GRASS_TILE; break; } image += SlopeToSpriteOffset(fake_slope); @@ -2251,7 +2251,7 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track) /* Select the sprite to use. */ if (track == 0) { /* Clear ground (only track on halftile foundation) */ - if (rgt == RAIL_GROUND_WATER) { + if (rgt == RailGroundType::HalfTileWater) { if (IsSteepSlope(ti->tileh)) { DrawShoreTile(ti->tileh); image = 0; @@ -2260,9 +2260,9 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track) } } else { switch (rgt) { - case RAIL_GROUND_BARREN: image = SPR_FLAT_BARE_LAND; break; - case RAIL_GROUND_ICE_DESERT: image = SPR_FLAT_SNOW_DESERT_TILE; break; - default: image = SPR_FLAT_GRASS_TILE; break; + case RailGroundType::Barren: image = SPR_FLAT_BARE_LAND; break; + case RailGroundType::SnowOrDesert: image = SPR_FLAT_SNOW_DESERT_TILE; break; + default: image = SPR_FLAT_GRASS_TILE; break; } image += SlopeToSpriteOffset(ti->tileh); } @@ -2299,9 +2299,9 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track) } switch (rgt) { - case RAIL_GROUND_BARREN: pal = PALETTE_TO_BARE_LAND; break; - case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset; break; - case RAIL_GROUND_WATER: { + case RailGroundType::Barren: pal = PALETTE_TO_BARE_LAND; break; + case RailGroundType::SnowOrDesert: image += rti->snow_offset; break; + case RailGroundType::HalfTileWater: { /* three-corner-raised slope */ DrawShoreTile(ti->tileh); Corner track_corner = OppositeCorner(GetHighestSlopeCorner(ComplementSlope(ti->tileh))); @@ -2356,9 +2356,9 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track) image = _track_sloped_sprites[fake_slope - 1] + rti->base_sprites.track_y; pal = PAL_NONE; switch (rgt) { - case RAIL_GROUND_BARREN: pal = PALETTE_TO_BARE_LAND; break; - case RAIL_GROUND_ICE_DESERT: - case RAIL_GROUND_HALF_SNOW: image += rti->snow_offset; break; // higher part has snow in this case too + case RailGroundType::Barren: pal = PALETTE_TO_BARE_LAND; break; + case RailGroundType::SnowOrDesert: + case RailGroundType::HalfTileSnow: image += rti->snow_offset; break; // higher part has snow in this case too default: break; } DrawGroundSprite(image, pal, &(_halftile_sub_sprite[halftile_corner])); @@ -2582,7 +2582,7 @@ static void TileLoop_Track(TileIndex tile) RailGroundType old_ground = GetRailGroundType(tile); RailGroundType new_ground; - if (old_ground == RAIL_GROUND_WATER) { + if (old_ground == RailGroundType::HalfTileWater) { TileLoop_Water(tile); return; } @@ -2635,9 +2635,9 @@ static void TileLoop_Track(TileIndex tile) if (z > GetSnowLine()) { if (half && z - GetSnowLine() == 1) { /* track on non-continuous foundation, lower part is not under snow */ - new_ground = RAIL_GROUND_HALF_SNOW; + new_ground = RailGroundType::HalfTileSnow; } else { - new_ground = RAIL_GROUND_ICE_DESERT; + new_ground = RailGroundType::SnowOrDesert; } goto set_ground; } @@ -2646,7 +2646,7 @@ static void TileLoop_Track(TileIndex tile) case LandscapeType::Tropic: if (GetTropicZone(tile) == TROPICZONE_DESERT) { - new_ground = RAIL_GROUND_ICE_DESERT; + new_ground = RailGroundType::SnowOrDesert; goto set_ground; } break; @@ -2655,9 +2655,9 @@ static void TileLoop_Track(TileIndex tile) break; } - new_ground = RAIL_GROUND_GRASS; + new_ground = RailGroundType::Grass; - if (IsPlainRail(tile) && old_ground != RAIL_GROUND_BARREN) { // wait until bottom is green + if (IsPlainRail(tile) && old_ground != RailGroundType::Barren) { // wait until bottom is green /* determine direction of fence */ TrackBits rail = GetTrackBits(tile); @@ -2681,16 +2681,16 @@ static void TileLoop_Track(TileIndex tile) switch (fences.base()) { case DiagDirections{}.base(): break; - case DiagDirections{DIAGDIR_NE}.base(): new_ground = RAIL_GROUND_FENCE_NE; break; - case DiagDirections{DIAGDIR_SE}.base(): new_ground = RAIL_GROUND_FENCE_SE; break; - case DiagDirections{DIAGDIR_SW}.base(): new_ground = RAIL_GROUND_FENCE_SW; break; - case DiagDirections{DIAGDIR_NW}.base(): new_ground = RAIL_GROUND_FENCE_NW; break; - case DiagDirections{DIAGDIR_NE, DIAGDIR_SW}.base(): new_ground = RAIL_GROUND_FENCE_NESW; break; - case DiagDirections{DIAGDIR_SE, DIAGDIR_NW}.base(): new_ground = RAIL_GROUND_FENCE_SENW; break; - case DiagDirections{DIAGDIR_NE, DIAGDIR_SE}.base(): new_ground = RAIL_GROUND_FENCE_VERT1; break; - case DiagDirections{DIAGDIR_NE, DIAGDIR_NW}.base(): new_ground = RAIL_GROUND_FENCE_HORIZ2; break; - case DiagDirections{DIAGDIR_SE, DIAGDIR_SW}.base(): new_ground = RAIL_GROUND_FENCE_HORIZ1; break; - case DiagDirections{DIAGDIR_SW, DIAGDIR_NW}.base(): new_ground = RAIL_GROUND_FENCE_VERT2; break; + case DiagDirections{DIAGDIR_NE}.base(): new_ground = RailGroundType::FenceNE; break; + case DiagDirections{DIAGDIR_SE}.base(): new_ground = RailGroundType::FenceSE; break; + case DiagDirections{DIAGDIR_SW}.base(): new_ground = RailGroundType::FenceSW; break; + case DiagDirections{DIAGDIR_NW}.base(): new_ground = RailGroundType::FenceNW; break; + case DiagDirections{DIAGDIR_NE, DIAGDIR_SW}.base(): new_ground = RailGroundType::FenceNESW; break; + case DiagDirections{DIAGDIR_SE, DIAGDIR_NW}.base(): new_ground = RailGroundType::FenceSENW; break; + case DiagDirections{DIAGDIR_NE, DIAGDIR_SE}.base(): new_ground = RailGroundType::FenceVert1; break; + case DiagDirections{DIAGDIR_NE, DIAGDIR_NW}.base(): new_ground = RailGroundType::FenceHoriz2; break; + case DiagDirections{DIAGDIR_SE, DIAGDIR_SW}.base(): new_ground = RailGroundType::FenceHoriz1; break; + case DiagDirections{DIAGDIR_SW, DIAGDIR_NW}.base(): new_ground = RailGroundType::FenceVert2; break; default: NOT_REACHED(); } } @@ -2706,7 +2706,7 @@ set_ground: static TrackStatus GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint, DiagDirection side) { /* Case of half tile slope with water. */ - if (mode == TRANSPORT_WATER && IsPlainRail(tile) && GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(GetTileSlope(tile))) { + if (mode == TRANSPORT_WATER && IsPlainRail(tile) && GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(GetTileSlope(tile))) { TrackBits tb = GetTrackBits(tile); switch (tb) { default: NOT_REACHED(); @@ -3019,8 +3019,8 @@ static CommandCost TestAutoslopeOnRailTile(TileIndex tile, DoCommandFlags flags, /* Make the ground dirty, if surface slope has changed */ if (tileh_old != tileh_new) { /* If there is flat water on the lower halftile add the cost for clearing it */ - if (GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(tileh_old)) cost.AddCost(_price[PR_CLEAR_WATER]); - if (flags.Test(DoCommandFlag::Execute)) SetRailGroundType(tile, RAIL_GROUND_BARREN); + if (GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(tileh_old)) cost.AddCost(_price[PR_CLEAR_WATER]); + if (flags.Test(DoCommandFlag::Execute)) SetRailGroundType(tile, RailGroundType::Barren); } return cost; } @@ -3031,7 +3031,7 @@ static CommandCost TerraformTile_Track(TileIndex tile, DoCommandFlags flags, int if (IsPlainRail(tile)) { TrackBits rail_bits = GetTrackBits(tile); /* Is there flat water on the lower halftile that must be cleared expensively? */ - bool was_water = (GetRailGroundType(tile) == RAIL_GROUND_WATER && IsSlopeWithOneCornerRaised(tileh_old)); + bool was_water = (GetRailGroundType(tile) == RailGroundType::HalfTileWater && IsSlopeWithOneCornerRaised(tileh_old)); /* Allow clearing the water only if there is no ship */ if (was_water && HasVehicleOnTile(tile, [](const Vehicle *v) { @@ -3063,7 +3063,7 @@ static CommandCost TerraformTile_Track(TileIndex tile, DoCommandFlags flags, int } /* Make the ground dirty */ - if (flags.Test(DoCommandFlag::Execute)) SetRailGroundType(tile, RAIL_GROUND_BARREN); + if (flags.Test(DoCommandFlag::Execute)) SetRailGroundType(tile, RailGroundType::Barren); /* allow terraforming */ return CommandCost(EXPENSES_CONSTRUCTION, was_water ? _price[PR_CLEAR_WATER] : (Money)0); diff --git a/src/rail_map.h b/src/rail_map.h index 1b43c8a94c..18a3894057 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -481,37 +481,37 @@ inline bool HasOnewaySignalBlockingTrackdir(Tile tile, Trackdir td) RailType GetTileRailType(Tile tile); /** The ground 'under' the rail */ -enum RailGroundType : uint8_t { - RAIL_GROUND_BARREN = 0, ///< Nothing (dirt) - RAIL_GROUND_GRASS = 1, ///< Grassy - RAIL_GROUND_FENCE_NW = 2, ///< Grass with a fence at the NW edge - RAIL_GROUND_FENCE_SE = 3, ///< Grass with a fence at the SE edge - RAIL_GROUND_FENCE_SENW = 4, ///< Grass with a fence at the NW and SE edges - RAIL_GROUND_FENCE_NE = 5, ///< Grass with a fence at the NE edge - RAIL_GROUND_FENCE_SW = 6, ///< Grass with a fence at the SW edge - RAIL_GROUND_FENCE_NESW = 7, ///< Grass with a fence at the NE and SW edges - RAIL_GROUND_FENCE_VERT1 = 8, ///< Grass with a fence at the eastern side - RAIL_GROUND_FENCE_VERT2 = 9, ///< Grass with a fence at the western side - RAIL_GROUND_FENCE_HORIZ1 = 10, ///< Grass with a fence at the southern side - RAIL_GROUND_FENCE_HORIZ2 = 11, ///< Grass with a fence at the northern side - RAIL_GROUND_ICE_DESERT = 12, ///< Icy or sandy - RAIL_GROUND_WATER = 13, ///< Grass with a fence and shore or water on the free halftile - RAIL_GROUND_HALF_SNOW = 14, ///< Snow only on higher part of slope (steep or one corner raised) +enum class RailGroundType : uint8_t { + Barren = 0, ///< Nothing (dirt) + Grass = 1, ///< Grassy + FenceNW = 2, ///< Grass with a fence at the NW edge + FenceSE = 3, ///< Grass with a fence at the SE edge + FenceSENW = 4, ///< Grass with a fence at the NW and SE edges + FenceNE = 5, ///< Grass with a fence at the NE edge + FenceSW = 6, ///< Grass with a fence at the SW edge + FenceNESW = 7, ///< Grass with a fence at the NE and SW edges + FenceVert1 = 8, ///< Grass with a fence at the eastern side + FenceVert2 = 9, ///< Grass with a fence at the western side + FenceHoriz1 = 10, ///< Grass with a fence at the southern side + FenceHoriz2 = 11, ///< Grass with a fence at the northern side + SnowOrDesert = 12, ///< Icy or sandy + HalfTileWater = 13, ///< Grass with a fence and shore or water on the free halftile + HalfTileSnow = 14, ///< Snow only on higher part of slope (steep or one corner raised) }; inline void SetRailGroundType(Tile t, RailGroundType rgt) { - SB(t.m4(), 0, 4, rgt); + SB(t.m4(), 0, 4, to_underlying(rgt)); } inline RailGroundType GetRailGroundType(Tile t) { - return (RailGroundType)GB(t.m4(), 0, 4); + return static_cast(GB(t.m4(), 0, 4)); } inline bool IsSnowRailGround(Tile t) { - return GetRailGroundType(t) == RAIL_GROUND_ICE_DESERT; + return GetRailGroundType(t) == RailGroundType::SnowOrDesert; } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 6f2ba03bcb..13a51a7c4f 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -133,7 +133,7 @@ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_cla case MP_RAILWAY: /* Shore or flooded halftile */ - has_water |= (GetRailGroundType(neighbour) == RAIL_GROUND_WATER); + has_water |= (GetRailGroundType(neighbour) == RailGroundType::HalfTileWater); break; case MP_TREES: diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 40031f7a89..669d0197b1 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -216,7 +216,7 @@ static bool FixTTOMapArray() * Instead of using bits in m3 it uses a different tile type. */ tile.m3() = 1; // rail type = monorail (in TTD) SetTileType(tile, MP_RAILWAY); - tile.m2() = 1; // set monorail ground to RAIL_GROUND_GRASS + tile.m2() = 1; // set monorail ground to RailGroundType::Grass tt = MP_RAILWAY; } diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index c976cabc0a..ec0abb12ce 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -58,7 +58,7 @@ WaterClass GetEffectiveWaterClass(TileIndex tile) return WATER_CLASS_CANAL; } if (IsTileType(tile, MP_RAILWAY)) { - assert(GetRailGroundType(tile) == RAIL_GROUND_WATER); + assert(GetRailGroundType(tile) == RailGroundType::HalfTileWater); return WATER_CLASS_SEA; } NOT_REACHED(); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index f0a1252a75..c25a120dc8 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -675,7 +675,7 @@ bool IsWateredTile(TileIndex tile, Direction from) } case MP_RAILWAY: - if (GetRailGroundType(tile) == RAIL_GROUND_WATER) { + if (GetRailGroundType(tile) == RailGroundType::HalfTileWater) { assert(IsPlainRail(tile)); switch (GetTileSlope(tile)) { case SLOPE_W: return (from == DIR_SE) || (from == DIR_E) || (from == DIR_NE); @@ -1132,7 +1132,7 @@ FloodingBehaviour GetFloodingBehaviour(TileIndex tile) return (GetWaterClass(tile) == WATER_CLASS_SEA) ? FLOOD_ACTIVE : FLOOD_NONE; case MP_RAILWAY: - if (GetRailGroundType(tile) == RAIL_GROUND_WATER) { + if (GetRailGroundType(tile) == RailGroundType::HalfTileWater) { return (IsSlopeWithOneCornerRaised(GetTileSlope(tile)) ? FLOOD_ACTIVE : FLOOD_DRYUP); } return FLOOD_NONE; @@ -1226,14 +1226,14 @@ static void DoDryUp(TileIndex tile) switch (GetTileType(tile)) { case MP_RAILWAY: assert(IsPlainRail(tile)); - assert(GetRailGroundType(tile) == RAIL_GROUND_WATER); + assert(GetRailGroundType(tile) == RailGroundType::HalfTileWater); RailGroundType new_ground; switch (GetTrackBits(tile)) { - case TRACK_BIT_UPPER: new_ground = RAIL_GROUND_FENCE_HORIZ1; break; - case TRACK_BIT_LOWER: new_ground = RAIL_GROUND_FENCE_HORIZ2; break; - case TRACK_BIT_LEFT: new_ground = RAIL_GROUND_FENCE_VERT1; break; - case TRACK_BIT_RIGHT: new_ground = RAIL_GROUND_FENCE_VERT2; break; + case TRACK_BIT_UPPER: new_ground = RailGroundType::FenceHoriz1; break; + case TRACK_BIT_LOWER: new_ground = RailGroundType::FenceHoriz2; break; + case TRACK_BIT_LEFT: new_ground = RailGroundType::FenceVert1; break; + case TRACK_BIT_RIGHT: new_ground = RailGroundType::FenceVert2; break; default: NOT_REACHED(); } SetRailGroundType(tile, new_ground); From 2cd5a241c5d95e3497f2375d019a986d753992b9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 19:49:36 +0000 Subject: [PATCH 197/280] Codechange: Use enum class for RoadTileType. --- src/road_cmd.cpp | 46 ++++++++++++++++----------------- src/road_map.cpp | 6 ++--- src/road_map.h | 22 ++++++++-------- src/saveload/afterload.cpp | 22 ++++++++-------- src/saveload/oldloader_sl.cpp | 6 ++--- src/script/api/script_order.cpp | 2 +- src/script/api/script_road.cpp | 8 +++--- src/script/api/script_tile.cpp | 2 +- 8 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 5e1fe53327..a94eea330f 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -398,7 +398,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlags flags, RoadBits pie } switch (GetRoadTileType(tile)) { - case ROAD_TILE_NORMAL: { + case RoadTileType::Normal: { Slope tileh = GetTileSlope(tile); /* Steep slopes behave the same as slopes with one corner raised. */ @@ -479,7 +479,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlags flags, RoadBits pie return cost; } - case ROAD_TILE_CROSSING: { + case RoadTileType::Crossing: { if (pieces & ComplementRoadBits(GetCrossingRoadBits(tile))) { return CMD_ERROR; } @@ -514,7 +514,7 @@ static CommandCost RemoveRoad(TileIndex tile, DoCommandFlags flags, RoadBits pie } default: - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: return CMD_ERROR; } } @@ -632,7 +632,7 @@ CommandCost CmdBuildRoad(DoCommandFlags flags, TileIndex tile, RoadBits pieces, switch (GetTileType(tile)) { case MP_ROAD: switch (GetRoadTileType(tile)) { - case ROAD_TILE_NORMAL: { + case RoadTileType::Normal: { if (HasRoadWorks(tile)) return CommandCost(STR_ERROR_ROAD_WORKS_IN_PROGRESS); other_bits = GetRoadBits(tile, OtherRoadTramType(rtt)); @@ -686,7 +686,7 @@ CommandCost CmdBuildRoad(DoCommandFlags flags, TileIndex tile, RoadBits pieces, break; } - case ROAD_TILE_CROSSING: + case RoadTileType::Crossing: if (RoadNoLevelCrossing(rt)) { return CommandCost(STR_ERROR_CROSSING_DISALLOWED_ROAD); } @@ -698,7 +698,7 @@ CommandCost CmdBuildRoad(DoCommandFlags flags, TileIndex tile, RoadBits pieces, if (HasTileRoadType(tile, rtt)) return CommandCost(STR_ERROR_ALREADY_BUILT); break; - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: if ((GetAnyRoadBits(tile, rtt) & pieces) == pieces) return CommandCost(STR_ERROR_ALREADY_BUILT); goto do_clear; @@ -873,12 +873,12 @@ do_clear:; switch (GetTileType(tile)) { case MP_ROAD: { RoadTileType rttype = GetRoadTileType(tile); - if (existing == ROAD_NONE || rttype == ROAD_TILE_CROSSING) { + if (existing == ROAD_NONE || rttype == RoadTileType::Crossing) { SetRoadType(tile, rtt, rt); SetRoadOwner(tile, rtt, company); if (rtt == RTT_ROAD) SetTownIndex(tile, town_id); } - if (rttype != ROAD_TILE_CROSSING) SetRoadBits(tile, existing | pieces, rtt); + if (rttype != RoadTileType::Crossing) SetRoadBits(tile, existing | pieces, rtt); break; } @@ -1221,7 +1221,7 @@ static CommandCost RemoveRoadDepot(TileIndex tile, DoCommandFlags flags) static CommandCost ClearTile_Road(TileIndex tile, DoCommandFlags flags) { switch (GetRoadTileType(tile)) { - case ROAD_TILE_NORMAL: { + case RoadTileType::Normal: { RoadBits b = GetAllRoadBits(tile); /* Clear the road if only one piece is on the tile OR we are not using the DoCommandFlag::Auto flag */ @@ -1239,7 +1239,7 @@ static CommandCost ClearTile_Road(TileIndex tile, DoCommandFlags flags) return CommandCost(STR_ERROR_MUST_REMOVE_ROAD_FIRST); } - case ROAD_TILE_CROSSING: { + case RoadTileType::Crossing: { CommandCost ret(EXPENSES_CONSTRUCTION); if (flags.Test(DoCommandFlag::Auto)) return CommandCost(STR_ERROR_MUST_REMOVE_ROAD_FIRST); @@ -1261,7 +1261,7 @@ static CommandCost ClearTile_Road(TileIndex tile, DoCommandFlags flags) } default: - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: if (flags.Test(DoCommandFlag::Auto)) { return CommandCost(STR_ERROR_BUILDING_MUST_BE_DEMOLISHED); } @@ -1695,7 +1695,7 @@ static void DrawTile_Road(TileInfo *ti) { BridgePillarFlags blocked_pillars{}; switch (GetRoadTileType(ti->tile)) { - case ROAD_TILE_NORMAL: + case RoadTileType::Normal: DrawRoadBits(ti); if (IsBridgeAbove(ti->tile)) { @@ -1707,7 +1707,7 @@ static void DrawTile_Road(TileInfo *ti) } break; - case ROAD_TILE_CROSSING: { + case RoadTileType::Crossing: { if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); Axis axis = GetCrossingRailAxis(ti->tile); @@ -1817,7 +1817,7 @@ static void DrawTile_Road(TileInfo *ti) } default: - case ROAD_TILE_DEPOT: { + case RoadTileType::Depot: { if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED); PaletteID palette = GetCompanyPalette(GetTileOwner(ti->tile)); @@ -2121,7 +2121,7 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u RoadTramType rtt = (RoadTramType)sub_mode; if (!HasTileRoadType(tile, rtt)) break; switch (GetRoadTileType(tile)) { - case ROAD_TILE_NORMAL: { + case RoadTileType::Normal: { const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 }; RoadBits bits = GetRoadBits(tile, rtt); @@ -2133,7 +2133,7 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u break; } - case ROAD_TILE_CROSSING: { + case RoadTileType::Crossing: { Axis axis = GetCrossingRoadAxis(tile); if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break; @@ -2155,7 +2155,7 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u } default: - case ROAD_TILE_DEPOT: { + case RoadTileType::Depot: { DiagDirection dir = GetRoadDepotDirection(tile); if (side != INVALID_DIAGDIR && side != dir) break; @@ -2205,7 +2205,7 @@ static void GetTileDesc_Road(TileIndex tile, TileDesc &td) } switch (GetRoadTileType(tile)) { - case ROAD_TILE_CROSSING: { + case RoadTileType::Crossing: { td.str = STR_LAI_ROAD_DESCRIPTION_ROAD_RAIL_LEVEL_CROSSING; rail_owner = GetTileOwner(tile); @@ -2216,7 +2216,7 @@ static void GetTileDesc_Road(TileIndex tile, TileDesc &td) break; } - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: td.str = STR_LAI_ROAD_DESCRIPTION_ROAD_VEHICLE_DEPOT; td.build_date = Depot::GetByTile(tile)->build_date; break; @@ -2260,7 +2260,7 @@ static const uint8_t _roadveh_enter_depot_dir[4] = { static VehicleEnterTileStates VehicleEnter_Road(Vehicle *v, TileIndex tile, int, int) { switch (GetRoadTileType(tile)) { - case ROAD_TILE_DEPOT: { + case RoadTileType::Depot: { if (v->type != VEH_ROAD) break; RoadVehicle *rv = RoadVehicle::From(v); @@ -2342,15 +2342,15 @@ static CommandCost TerraformTile_Road(TileIndex tile, DoCommandFlags flags, int { if (_settings_game.construction.build_on_slopes && AutoslopeEnabled()) { switch (GetRoadTileType(tile)) { - case ROAD_TILE_CROSSING: + case RoadTileType::Crossing: if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new)) && HasBit(VALID_LEVEL_CROSSING_SLOPES, tileh_new)) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]); break; - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRoadDepotDirection(tile))) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]); break; - case ROAD_TILE_NORMAL: { + case RoadTileType::Normal: { RoadBits bits = GetAllRoadBits(tile); RoadBits bits_copy = bits; /* Check if the slope-road_bits combination is valid at all, i.e. it is safe to call GetRoadFoundation(). */ diff --git a/src/road_map.cpp b/src/road_map.cpp index ec6b14d32a..c5aa6b8c0a 100644 --- a/src/road_map.cpp +++ b/src/road_map.cpp @@ -59,9 +59,9 @@ RoadBits GetAnyRoadBits(Tile tile, RoadTramType rtt, bool straight_tunnel_bridge case MP_ROAD: switch (GetRoadTileType(tile)) { default: - case ROAD_TILE_NORMAL: return GetRoadBits(tile, rtt); - case ROAD_TILE_CROSSING: return GetCrossingRoadBits(tile); - case ROAD_TILE_DEPOT: return DiagDirToRoadBits(GetRoadDepotDirection(tile)); + case RoadTileType::Normal: return GetRoadBits(tile, rtt); + case RoadTileType::Crossing: return GetCrossingRoadBits(tile); + case RoadTileType::Depot: return DiagDirToRoadBits(GetRoadDepotDirection(tile)); } case MP_STATION: diff --git a/src/road_map.h b/src/road_map.h index aebed25816..350e1c035f 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -19,10 +19,10 @@ /** The different types of road tiles. */ -enum RoadTileType : uint8_t { - ROAD_TILE_NORMAL, ///< Normal road - ROAD_TILE_CROSSING, ///< Level crossing - ROAD_TILE_DEPOT, ///< Depot (one entrance) +enum class RoadTileType : uint8_t { + Normal = 0, ///< Normal road + Crossing = 1, ///< Level crossing + Depot = 2, ///< Depot (one entrance) }; bool MayHaveRoad(Tile t); @@ -36,7 +36,7 @@ bool MayHaveRoad(Tile t); debug_inline static RoadTileType GetRoadTileType(Tile t) { assert(IsTileType(t, MP_ROAD)); - return (RoadTileType)GB(t.m5(), 6, 2); + return static_cast(GB(t.m5(), 6, 2)); } /** @@ -47,7 +47,7 @@ debug_inline static RoadTileType GetRoadTileType(Tile t) */ debug_inline static bool IsNormalRoad(Tile t) { - return GetRoadTileType(t) == ROAD_TILE_NORMAL; + return GetRoadTileType(t) == RoadTileType::Normal; } /** @@ -68,7 +68,7 @@ debug_inline static bool IsNormalRoadTile(Tile t) */ inline bool IsLevelCrossing(Tile t) { - return GetRoadTileType(t) == ROAD_TILE_CROSSING; + return GetRoadTileType(t) == RoadTileType::Crossing; } /** @@ -89,7 +89,7 @@ inline bool IsLevelCrossingTile(Tile t) */ debug_inline static bool IsRoadDepot(Tile t) { - return GetRoadTileType(t) == ROAD_TILE_DEPOT; + return GetRoadTileType(t) == RoadTileType::Depot; } /** @@ -618,7 +618,7 @@ inline void MakeRoadNormal(Tile t, RoadBits bits, RoadType road_rt, RoadType tra SetTileOwner(t, road); t.m2() = town.base(); t.m3() = (tram_rt != INVALID_ROADTYPE ? bits : 0); - t.m5() = (road_rt != INVALID_ROADTYPE ? bits : 0) | ROAD_TILE_NORMAL << 6; + t.m5() = (road_rt != INVALID_ROADTYPE ? bits : 0) | to_underlying(RoadTileType::Normal) << 6; SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; @@ -645,7 +645,7 @@ inline void MakeRoadCrossing(Tile t, Owner road, Owner tram, Owner rail, Axis ro t.m2() = town.base(); t.m3() = 0; t.m4() = INVALID_ROADTYPE; - t.m5() = ROAD_TILE_CROSSING << 6 | roaddir; + t.m5() = to_underlying(RoadTileType::Crossing) << 6 | roaddir; SB(t.m6(), 2, 6, 0); t.m7() = road.base(); t.m8() = INVALID_ROADTYPE << 6 | rat; @@ -679,7 +679,7 @@ inline void MakeRoadDepot(Tile tile, Owner owner, DepotID depot_id, DiagDirectio tile.m2() = depot_id.base(); tile.m3() = 0; tile.m4() = INVALID_ROADTYPE; - tile.m5() = ROAD_TILE_DEPOT << 6 | dir; + tile.m5() = to_underlying(RoadTileType::Depot) << 6 | dir; SB(tile.m6(), 2, 6, 0); tile.m7() = owner.base(); tile.m8() = INVALID_ROADTYPE << 6; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 13a51a7c4f..a31e58c029 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -164,7 +164,7 @@ static void ConvertTownOwner() for (auto tile : Map::Iterate()) { switch (GetTileType(tile)) { case MP_ROAD: - if (GB(tile.m5(), 4, 2) == ROAD_TILE_CROSSING && HasBit(tile.m3(), 7)) { + if (GB(tile.m5(), 4, 2) == to_underlying(RoadTileType::Crossing) && HasBit(tile.m3(), 7)) { tile.m3() = OWNER_TOWN.base(); } [[fallthrough]]; @@ -457,7 +457,7 @@ static void FixOwnerOfRailTrack(Tile t) SetTileType(t, MP_ROAD); SetTileOwner(t, road); t.m3() = (hasroad ? bits : 0); - t.m5() = (hastram ? bits : 0) | ROAD_TILE_NORMAL << 6; + t.m5() = (hastram ? bits : 0) | to_underlying(RoadTileType::Normal) << 6; SB(t.m6(), 2, 4, 0); SetRoadOwner(t, RTT_TRAM, tram); return; @@ -1007,8 +1007,8 @@ bool AfterLoadGame() case MP_ROAD: t.m4() |= (t.m2() << 4); - if (GB(t.m5(), 4, 2) == ROAD_TILE_DEPOT) break; - if ((GB(t.m5(), 4, 2) == ROAD_TILE_CROSSING ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) { + if (GB(t.m5(), 4, 2) == to_underlying(RoadTileType::Depot)) break; + if ((GB(t.m5(), 4, 2) == to_underlying(RoadTileType::Crossing) ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) { SetTownIndex(t, CalcClosestTownFromTile(t)->index); } else { SetTownIndex(t, TownID::Begin()); @@ -1090,15 +1090,15 @@ bool AfterLoadGame() SB(t.m5(), 6, 2, GB(t.m5(), 4, 2)); switch (GetRoadTileType(t)) { default: SlErrorCorrupt("Invalid road tile type"); - case ROAD_TILE_NORMAL: + case RoadTileType::Normal: SB(t.m4(), 0, 4, GB(t.m5(), 0, 4)); SB(t.m4(), 4, 4, 0); SB(t.m6(), 2, 4, 0); break; - case ROAD_TILE_CROSSING: + case RoadTileType::Crossing: SB(t.m4(), 5, 2, GB(t.m5(), 2, 2)); break; - case ROAD_TILE_DEPOT: break; + case RoadTileType::Depot: break; } SB(t.m7(), 6, 2, 1); // Set pre-NRT road type bits for conversion later. break; @@ -1131,7 +1131,7 @@ bool AfterLoadGame() SB(t.m7(), 5, 1, GB(t.m3(), 7, 1)); // snow/desert switch (GetRoadTileType(t)) { default: SlErrorCorrupt("Invalid road tile type"); - case ROAD_TILE_NORMAL: + case RoadTileType::Normal: SB(t.m7(), 0, 4, GB(t.m3(), 0, 4)); // road works SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground SB(t.m3(), 0, 4, GB(t.m4(), 4, 4)); // tram bits @@ -1139,7 +1139,7 @@ bool AfterLoadGame() SB(t.m5(), 0, 4, GB(t.m4(), 0, 4)); // road bits break; - case ROAD_TILE_CROSSING: + case RoadTileType::Crossing: SB(t.m7(), 0, 5, GB(t.m4(), 0, 5)); // road owner SB(t.m6(), 3, 3, GB(t.m3(), 4, 3)); // ground SB(t.m3(), 4, 4, GB(t.m5(), 0, 4)); // tram owner @@ -1147,7 +1147,7 @@ bool AfterLoadGame() SB(t.m5(), 5, 1, GB(t.m4(), 5, 1)); // crossing state break; - case ROAD_TILE_DEPOT: + case RoadTileType::Depot: break; } if (!IsRoadDepot(t) && !HasTownOwnedRoad(t)) { @@ -1241,7 +1241,7 @@ bool AfterLoadGame() SetTileType(t, MP_ROAD); t.m2() = town.base(); t.m3() = 0; - t.m5() = (axis == AXIS_X ? ROAD_Y : ROAD_X) | ROAD_TILE_NORMAL << 6; + t.m5() = (axis == AXIS_X ? ROAD_Y : ROAD_X) | to_underlying(RoadTileType::Normal) << 6; SB(t.m6(), 2, 4, 0); t.m7() = 1 << 6; SetRoadOwner(t, RTT_TRAM, OWNER_NONE); diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 669d0197b1..10725cf4b7 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -245,13 +245,13 @@ static bool FixTTOMapArray() case MP_ROAD: // road (depot) or level crossing switch (GB(tile.m5(), 4, 4)) { - case 0: // ROAD_TILE_NORMAL + case 0: // RoadTileType::Normal if (tile.m2() == 4) tile.m2() = 5; // 'small trees' -> ROADSIDE_TREES break; - case 1: // ROAD_TILE_CROSSING (there aren't monorail crossings in TTO) + case 1: // RoadTileType::Crossing (there aren't monorail crossings in TTO) tile.m3() = tile.m1(); // set owner of road = owner of rail break; - case 2: // ROAD_TILE_DEPOT + case 2: // RoadTileType::Depot break; default: return false; diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index f43b5305cb..fbd98e2189 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -40,7 +40,7 @@ static OrderType GetOrderTypeByTile(TileIndex t) return OT_GOTO_STATION; case MP_WATER: if (::IsShipDepot(t)) return OT_GOTO_DEPOT; break; - case MP_ROAD: if (::GetRoadTileType(t) == ROAD_TILE_DEPOT) return OT_GOTO_DEPOT; break; + case MP_ROAD: if (::GetRoadTileType(t) == RoadTileType::Depot) return OT_GOTO_DEPOT; break; case MP_RAILWAY: if (IsRailDepot(t)) return OT_GOTO_DEPOT; break; diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index 1a689f8647..c29e8dedd7 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -37,7 +37,7 @@ { if (!::IsValidTile(tile)) return false; - return (::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) != ROAD_TILE_DEPOT) || + return (::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) != RoadTileType::Depot) || IsDriveThroughRoadStationTile(tile); } @@ -46,7 +46,7 @@ if (!::IsValidTile(tile)) return false; if (!IsRoadTypeAvailable(GetCurrentRoadType())) return false; - return ::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) == ROAD_TILE_DEPOT && + return ::IsTileType(tile, MP_ROAD) && ::GetRoadTileType(tile) == RoadTileType::Depot && ::GetPresentRoadTypes(tile).Test(::RoadType(GetCurrentRoadType())); } @@ -465,7 +465,7 @@ static bool NeighbourHasReachableRoad(::RoadType rt, TileIndex start_tile, DiagD switch (::GetTileType(neighbour_tile)) { case MP_ROAD: - return (::GetRoadTileType(neighbour_tile) != ROAD_TILE_DEPOT); + return (::GetRoadTileType(neighbour_tile) != RoadTileType::Depot); case MP_STATION: if (::IsDriveThroughStopTile(neighbour_tile)) { @@ -623,7 +623,7 @@ static bool NeighbourHasReachableRoad(::RoadType rt, TileIndex start_tile, DiagD EnforceCompanyModeValid(false); EnforcePrecondition(false, ::IsValidTile(tile)); EnforcePrecondition(false, IsTileType(tile, MP_ROAD)) - EnforcePrecondition(false, GetRoadTileType(tile) == ROAD_TILE_DEPOT); + EnforcePrecondition(false, GetRoadTileType(tile) == RoadTileType::Depot); return ScriptObject::Command::Do(tile); } diff --git a/src/script/api/script_tile.cpp b/src/script/api/script_tile.cpp index 57ba12ca78..e837472f7d 100644 --- a/src/script/api/script_tile.cpp +++ b/src/script/api/script_tile.cpp @@ -37,7 +37,7 @@ /* Tram bits aren't considered buildable */ if (::GetRoadTypeTram(tile) != INVALID_ROADTYPE) return false; /* Depots and crossings aren't considered buildable */ - if (::GetRoadTileType(tile) != ROAD_TILE_NORMAL) return false; + if (::GetRoadTileType(tile) != RoadTileType::Normal) return false; if (!HasExactlyOneBit(::GetRoadBits(tile, RTT_ROAD))) return false; if (::IsRoadOwner(tile, RTT_ROAD, OWNER_TOWN)) return true; if (::IsRoadOwner(tile, RTT_ROAD, ScriptObject::GetCompany())) return true; From 30955da3cef38331593d3b39c589de5ec1972929 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 19:49:37 +0000 Subject: [PATCH 198/280] Codechange: Use enum class for Roadside. --- src/road_cmd.cpp | 98 ++++++++++++++++++++++------------- src/road_func.h | 2 +- src/road_map.h | 35 +++++++------ src/saveload/oldloader_sl.cpp | 2 +- src/station_cmd.cpp | 4 +- src/station_map.h | 4 +- src/tunnelbridge_cmd.cpp | 4 +- 7 files changed, 90 insertions(+), 59 deletions(-) diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index a94eea330f..f891556740 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1354,7 +1354,7 @@ static bool DrawRoadAsSnowOrDesert(bool snow_or_desert, Roadside roadside) { return (snow_or_desert && !(_settings_game.game_creation.landscape == LandscapeType::Tropic && HasGrfMiscBit(GrfMiscBit::DesertPavedRoads) && - roadside != ROADSIDE_BARREN && roadside != ROADSIDE_GRASS && roadside != ROADSIDE_GRASS_ROAD_WORKS)); + roadside != Roadside::Barren && roadside != Roadside::Grass && roadside != Roadside::GrassRoadWorks)); } /** @@ -1558,11 +1558,16 @@ static SpriteID GetRoadGroundSprite(const TileInfo *ti, Roadside roadside, const } switch (roadside) { - case ROADSIDE_BARREN: *pal = PALETTE_TO_BARE_LAND; - return SPR_FLAT_GRASS_TILE + SlopeToSpriteOffset(ti->tileh); - case ROADSIDE_GRASS: - case ROADSIDE_GRASS_ROAD_WORKS: return SPR_FLAT_GRASS_TILE + SlopeToSpriteOffset(ti->tileh); - default: break; // Paved + case Roadside::Barren: + *pal = PALETTE_TO_BARE_LAND; + return SPR_FLAT_GRASS_TILE + SlopeToSpriteOffset(ti->tileh); + + case Roadside::Grass: + case Roadside::GrassRoadWorks: + return SPR_FLAT_GRASS_TILE + SlopeToSpriteOffset(ti->tileh); + + default: + break; // Paved } } @@ -1572,10 +1577,17 @@ static SpriteID GetRoadGroundSprite(const TileInfo *ti, Roadside roadside, const image += 19; } else { switch (roadside) { - case ROADSIDE_BARREN: *pal = PALETTE_TO_BARE_LAND; break; - case ROADSIDE_GRASS: break; - case ROADSIDE_GRASS_ROAD_WORKS: break; - default: image -= 19; break; // Paved + case Roadside::Barren: + *pal = PALETTE_TO_BARE_LAND; + break; + + case Roadside::Grass: + case Roadside::GrassRoadWorks: + break; + + default: + image -= 19; + break; // Paved } } @@ -1659,11 +1671,11 @@ static void DrawRoadBits(TileInfo *ti) /* Do not draw details (street lights, trees) under low bridge */ Roadside roadside = GetRoadside(ti->tile); - if (IsBridgeAbove(ti->tile) && (roadside == ROADSIDE_TREES || roadside == ROADSIDE_STREET_LIGHTS)) { + if (IsBridgeAbove(ti->tile) && (roadside == Roadside::Trees || roadside == Roadside::StreetLights)) { int height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile)); int minz = GetTileMaxZ(ti->tile) + 2; - if (roadside == ROADSIDE_TREES) minz++; + if (roadside == Roadside::Trees) minz++; if (height < minz) return; } @@ -1672,20 +1684,20 @@ static void DrawRoadBits(TileInfo *ti) if (HasAtMostOneBit(road)) return; /* Do not draw details when invisible. */ - if (roadside == ROADSIDE_TREES && IsInvisibilitySet(TO_TREES)) return; - if (roadside == ROADSIDE_STREET_LIGHTS && IsInvisibilitySet(TO_HOUSES)) return; + if (roadside == Roadside::Trees && IsInvisibilitySet(TO_TREES)) return; + if (roadside == Roadside::StreetLights && IsInvisibilitySet(TO_HOUSES)) return; /* Check whether details should be transparent. */ bool is_transparent = false; - if (roadside == ROADSIDE_TREES && IsTransparencySet(TO_TREES)) { + if (roadside == Roadside::Trees && IsTransparencySet(TO_TREES)) { is_transparent = true; } - if (roadside == ROADSIDE_STREET_LIGHTS && IsTransparencySet(TO_HOUSES)) { + if (roadside == Roadside::StreetLights && IsTransparencySet(TO_HOUSES)) { is_transparent = true; } /* Draw extra details. */ - for (const DrawRoadTileStruct *drts = _road_display_table[roadside][road | tram]; drts->image != 0; drts++) { + for (const DrawRoadTileStruct *drts = _road_display_table[to_underlying(roadside)][road | tram]; drts->image != 0; drts++) { DrawRoadDetail(drts->image, ti, drts->subcoord_x, drts->subcoord_y, 0x10, is_transparent); } } @@ -1730,9 +1742,16 @@ static void DrawTile_Road(TileInfo *ti) image += 19; } else { switch (roadside) { - case ROADSIDE_BARREN: pal = PALETTE_TO_BARE_LAND; break; - case ROADSIDE_GRASS: break; - default: image -= 19; break; // Paved + case Roadside::Barren: + pal = PALETTE_TO_BARE_LAND; + break; + + case Roadside::Grass: + break; + + default: + image -= 19; + break; // Paved } } @@ -1746,9 +1765,16 @@ static void DrawTile_Road(TileInfo *ti) image += 8; } else { switch (roadside) { - case ROADSIDE_BARREN: pal = PALETTE_TO_BARE_LAND; break; - case ROADSIDE_GRASS: break; - default: image += 4; break; // Paved + case Roadside::Barren: + pal = PALETTE_TO_BARE_LAND; + break; + + case Roadside::Grass: + break; + + default: + image += 4; + break; // Paved } } @@ -1956,21 +1982,21 @@ static Foundation GetFoundation_Road(TileIndex tile, Slope tileh) } static const Roadside _town_road_types[][2] = { - { ROADSIDE_GRASS, ROADSIDE_GRASS }, - { ROADSIDE_PAVED, ROADSIDE_PAVED }, - { ROADSIDE_PAVED, ROADSIDE_PAVED }, - { ROADSIDE_TREES, ROADSIDE_TREES }, - { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED } + { Roadside::Grass, Roadside::Grass }, + { Roadside::Paved, Roadside::Paved }, + { Roadside::Paved, Roadside::Paved }, + { Roadside::Trees, Roadside::Trees }, + { Roadside::StreetLights, Roadside::Paved } }; static_assert(lengthof(_town_road_types) == NUM_HOUSE_ZONES); static const Roadside _town_road_types_2[][2] = { - { ROADSIDE_GRASS, ROADSIDE_GRASS }, - { ROADSIDE_PAVED, ROADSIDE_PAVED }, - { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED }, - { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED }, - { ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED } + { Roadside::Grass, Roadside::Grass }, + { Roadside::Paved, Roadside::Paved }, + { Roadside::StreetLights, Roadside::Paved }, + { Roadside::StreetLights, Roadside::Paved }, + { Roadside::StreetLights, Roadside::Paved } }; static_assert(lengthof(_town_road_types_2) == NUM_HOUSE_ZONES); @@ -2040,11 +2066,11 @@ static void TileLoop_Road(TileIndex tile) if (cur_rs == new_rs[1]) { cur_rs = new_rs[0]; /* We have barren land, install the pre-type */ - } else if (cur_rs == ROADSIDE_BARREN) { + } else if (cur_rs == Roadside::Barren) { cur_rs = new_rs[1]; /* We're totally off limits, remove any installation and make barren land */ } else { - cur_rs = ROADSIDE_BARREN; + cur_rs = Roadside::Barren; } SetRoadside(tile, cur_rs); MarkTileDirtyByTile(tile); @@ -2222,7 +2248,7 @@ static void GetTileDesc_Road(TileIndex tile, TileDesc &td) break; default: { - td.str = (road_rt != INVALID_ROADTYPE ? _road_tile_strings[GetRoadside(tile)] : STR_LAI_ROAD_DESCRIPTION_TRAMWAY); + td.str = (road_rt != INVALID_ROADTYPE ? _road_tile_strings[to_underlying(GetRoadside(tile))] : STR_LAI_ROAD_DESCRIPTION_TRAMWAY); break; } } diff --git a/src/road_func.h b/src/road_func.h index 8f7727af56..9382246f05 100644 --- a/src/road_func.h +++ b/src/road_func.h @@ -159,7 +159,7 @@ void UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(TileIndex tile, Axis void UpdateCompanyRoadInfrastructure(RoadType rt, Owner o, int count); struct TileInfo; -enum Roadside : uint8_t; +enum class Roadside : uint8_t; void DrawRoadOverlays(const TileInfo *ti, PaletteID pal, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rit, uint road_offset, uint tram_offset, bool draw_underlay = true); void DrawRoadGroundSprites(const TileInfo *ti, RoadBits road, RoadBits tram, const RoadTypeInfo *road_rti, const RoadTypeInfo *tram_rti, Roadside roadside, bool snow_or_desert); diff --git a/src/road_map.h b/src/road_map.h index 350e1c035f..992961189c 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -454,15 +454,15 @@ inline void ToggleSnowOrDesert(Tile t) /** The possible road side decorations. */ -enum Roadside : uint8_t { - ROADSIDE_BARREN = 0, ///< Road on barren land - ROADSIDE_GRASS = 1, ///< Road on grass - ROADSIDE_PAVED = 2, ///< Road with paved sidewalks - ROADSIDE_STREET_LIGHTS = 3, ///< Road with street lights on paved sidewalks +enum class Roadside : uint8_t { + Barren = 0, ///< Road on barren land + Grass = 1, ///< Road on grass + Paved = 2, ///< Road with paved sidewalks + StreetLights = 3, ///< Road with street lights on paved sidewalks /* 4 is unused for historical reasons */ - ROADSIDE_TREES = 5, ///< Road with trees on paved sidewalks - ROADSIDE_GRASS_ROAD_WORKS = 6, ///< Road on grass with road works - ROADSIDE_PAVED_ROAD_WORKS = 7, ///< Road with sidewalks and road works + Trees = 5, ///< Road with trees on paved sidewalks + GrassRoadWorks = 6, ///< Road on grass with road works + PavedRoadWorks = 7, ///< Road with sidewalks and road works }; /** @@ -472,7 +472,7 @@ enum Roadside : uint8_t { */ inline Roadside GetRoadside(Tile tile) { - return (Roadside)GB(tile.m6(), 3, 3); + return static_cast(GB(tile.m6(), 3, 3)); } /** @@ -482,7 +482,7 @@ inline Roadside GetRoadside(Tile tile) */ inline void SetRoadside(Tile tile, Roadside s) { - SB(tile.m6(), 3, 3, s); + SB(tile.m6(), 3, 3, to_underlying(s)); } /** @@ -492,7 +492,7 @@ inline void SetRoadside(Tile tile, Roadside s) */ inline bool HasRoadWorks(Tile t) { - return GetRoadside(t) >= ROADSIDE_GRASS_ROAD_WORKS; + return GetRoadside(t) >= Roadside::GrassRoadWorks; } /** @@ -517,9 +517,14 @@ inline void StartRoadWorks(Tile t) assert(!HasRoadWorks(t)); /* Remove any trees or lamps in case or roadwork */ switch (GetRoadside(t)) { - case ROADSIDE_BARREN: - case ROADSIDE_GRASS: SetRoadside(t, ROADSIDE_GRASS_ROAD_WORKS); break; - default: SetRoadside(t, ROADSIDE_PAVED_ROAD_WORKS); break; + case Roadside::Barren: + case Roadside::Grass: + SetRoadside(t, Roadside::GrassRoadWorks); + break; + + default: + SetRoadside(t, Roadside::PavedRoadWorks); + break; } } @@ -531,7 +536,7 @@ inline void StartRoadWorks(Tile t) inline void TerminateRoadWorks(Tile t) { assert(HasRoadWorks(t)); - SetRoadside(t, (Roadside)(GetRoadside(t) - ROADSIDE_GRASS_ROAD_WORKS + ROADSIDE_GRASS)); + SetRoadside(t, GetRoadside(t) == Roadside::GrassRoadWorks ? Roadside::Grass : Roadside::Paved); /* Stop the counter */ SB(t.m7(), 0, 4, 0); } diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 10725cf4b7..d051190046 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -246,7 +246,7 @@ static bool FixTTOMapArray() case MP_ROAD: // road (depot) or level crossing switch (GB(tile.m5(), 4, 4)) { case 0: // RoadTileType::Normal - if (tile.m2() == 4) tile.m2() = 5; // 'small trees' -> ROADSIDE_TREES + if (tile.m2() == 4) tile.m2() = 5; // 'small trees' -> Roadside::Trees break; case 1: // RoadTileType::Crossing (there aren't monorail crossings in TTO) tile.m3() = tile.m1(); // set owner of road = owner of rail diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 0b8703e53d..7d0c62e238 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3768,11 +3768,11 @@ static void TileLoop_Station(TileIndex tile) } /* Adjust road ground type depending on 'new_zone' */ - Roadside new_rs = new_zone != HouseZone::TownEdge ? ROADSIDE_PAVED : ROADSIDE_GRASS; + Roadside new_rs = new_zone != HouseZone::TownEdge ? Roadside::Paved : Roadside::Grass; Roadside cur_rs = GetRoadWaypointRoadside(tile); if (new_rs != cur_rs) { - SetRoadWaypointRoadside(tile, cur_rs == ROADSIDE_BARREN ? new_rs : ROADSIDE_BARREN); + SetRoadWaypointRoadside(tile, cur_rs == Roadside::Barren ? new_rs : Roadside::Barren); MarkTileDirtyByTile(tile); } diff --git a/src/station_map.h b/src/station_map.h index d90cc8dda5..19dc53b8e8 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -288,7 +288,7 @@ StationGfx GetTranslatedAirportTileID(StationGfx gfx); static inline Roadside GetRoadWaypointRoadside(Tile tile) { assert(IsRoadWaypointTile(tile)); - return (Roadside)GB(tile.m3(), 2, 2); + return static_cast(GB(tile.m3(), 2, 2)); } /** @@ -299,7 +299,7 @@ static inline Roadside GetRoadWaypointRoadside(Tile tile) static inline void SetRoadWaypointRoadside(Tile tile, Roadside s) { assert(IsRoadWaypointTile(tile)); - SB(tile.m3(), 2, 2, s); + SB(tile.m3(), 2, 2, to_underlying(s)); } /** diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 00138c1957..42173d39b5 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1002,9 +1002,9 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlags flags) for (TileIndex c = tile + delta; c != endtile; c += delta) { /* do not let trees appear from 'nowhere' after removing bridge */ - if (IsNormalRoadTile(c) && GetRoadside(c) == ROADSIDE_TREES) { + if (IsNormalRoadTile(c) && GetRoadside(c) == Roadside::Trees) { int minz = GetTileMaxZ(c) + 3; - if (height < minz) SetRoadside(c, ROADSIDE_PAVED); + if (height < minz) SetRoadside(c, Roadside::Paved); } ClearBridgeMiddle(c); MarkTileDirtyByTile(c, height - TileHeight(c)); From 73660bfaf23e091ac8347bb0e07026d86dc3e76e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 22:02:57 +0000 Subject: [PATCH 199/280] Codechange: Replace favorite with favourite. --- src/company_cmd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index c336e4bf21..dd744314e8 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -623,8 +623,8 @@ Company *DoStartupNewCompany(bool is_ai, CompanyID company = CompanyID::Invalid( c->inaugurated_year = TimerGameEconomy::year; c->inaugurated_year_calendar = TimerGameCalendar::year; - /* If starting a player company in singleplayer and a favorite company manager face is selected, choose it. Otherwise, use a random face. - * In a network game, we'll choose the favorite face later in CmdCompanyCtrl to sync it to all clients. */ + /* If starting a player company in singleplayer and a favourite company manager face is selected, choose it. Otherwise, use a random face. + * In a network game, we'll choose the favourite face later in CmdCompanyCtrl to sync it to all clients. */ bool randomise_face = true; if (!_company_manager_face.empty() && !is_ai && !_networking) { auto cmf = ParseCompanyManagerFaceCode(_company_manager_face); @@ -917,7 +917,7 @@ CommandCost CmdCompanyCtrl(DoCommandFlags flags, CompanyCtrlAction cca, CompanyI SetLocalCompany(c->index); /* - * If a favorite company manager face is selected, choose it. Otherwise, use a random face. + * If a favourite company manager face is selected, choose it. Otherwise, use a random face. * Because this needs to be synchronised over the network, only the client knows * its configuration and we are currently in the execution of a command, we have * to circumvent the normal ::Post logic for commands and just send the command. From c3451b5d9725eef0e1c01fb39636d99f51e97364 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 17 Nov 2025 22:07:59 +0000 Subject: [PATCH 200/280] Codechange: Replace color with colour. --- src/blitter/40bpp_anim.cpp | 8 ++++---- src/company_gui.cpp | 2 +- src/gfx_layout.cpp | 2 +- src/league_base.h | 2 +- src/league_cmd.cpp | 4 ++-- src/openttd.cpp | 2 +- src/os/macosx/string_osx.cpp | 6 +++--- src/script/api/script_league.hpp | 4 ++-- src/settings_type.h | 4 ++-- src/table/sprites.h | 2 +- src/video/cocoa/cocoa_v.h | 4 ++-- src/video/cocoa/cocoa_v.mm | 18 +++++++++--------- src/video/cocoa/cocoa_wnd.mm | 4 ++-- src/video/sdl2_default_v.cpp | 16 ++++++++-------- 14 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index 6e6d1233fa..48f09c8c4d 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -240,9 +240,9 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel if (src_px->a == 255) { src_px += n; do { - /* If the anim buffer contains a color value, the image composition will + /* If the anim buffer contains a colour value, the image composition will * only look at the RGB brightness value. As such, we can simply darken the - * RGB value to darken the anim color. */ + * RGB value to darken the anim colour. */ Colour b = *anim != 0 ? Colour(GetColourBrightness(*dst), 0, 0) : *dst; *dst = this->MakeTransparent(b, 3, 4); anim++; @@ -360,9 +360,9 @@ void Blitter_40bppAnim::DrawColourMappingRect(void *dst, int width, int height, uint8_t *anim = VideoDriver::GetInstance()->GetAnimBuffer() + ((uint32_t *)dst - (uint32_t *)_screen.dst_ptr); if (pal == PALETTE_TO_TRANSPARENT) { - /* If the anim buffer contains a color value, the image composition will + /* If the anim buffer contains a colour value, the image composition will * only look at the RGB brightness value. As such, we can simply darken the - * RGB value to darken the anim color. */ + * RGB value to darken the anim colour. */ do { for (int i = 0; i != width; i++) { Colour b = *anim != 0 ? Colour(GetColourBrightness(*udst), 0, 0) : *udst; diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 29efaf7c3d..957d17e298 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -1095,7 +1095,7 @@ static constexpr std::initializer_list _nested_select_company_liver }; static WindowDesc _select_company_livery_desc( - WDP_AUTO, "company_color_scheme", 0, 0, + WDP_AUTO, "company_colour_scheme", 0, 0, WC_COMPANY_COLOUR, WC_NONE, {}, _nested_select_company_livery_widgets diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 8c43f7b2c0..32f0f7bd46 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -58,7 +58,7 @@ Font::Font(FontSize size, TextColour colour) : * @note In case no ParagraphLayouter could be constructed, line.layout will be nullptr. * @param line The cache item to store our layouter in. * @param str The string to create a layouter for. - * @param state The state of the font and color. + * @param state The state of the font and colour. * @tparam T The type of layouter we want. */ template diff --git a/src/league_base.h b/src/league_base.h index 61ef32a83c..8bf48ac0e5 100644 --- a/src/league_base.h +++ b/src/league_base.h @@ -32,7 +32,7 @@ extern LeagueTablePool _league_table_pool; struct LeagueTableElement : LeagueTableElementPool::PoolItem<&_league_table_element_pool> { LeagueTableID table = LeagueTableID::Invalid(); ///< Id of the table which this element belongs to int64_t rating = 0; ///< Value that determines ordering of elements in the table (higher=better) - CompanyID company = CompanyID::Invalid(); ///< Company Id to show the color blob for or CompanyID::Invalid() + CompanyID company = CompanyID::Invalid(); ///< Company Id to show the colour blob for or CompanyID::Invalid() EncodedString text{}; ///< Text of the element EncodedString score{}; ///< String representation of the score associated with the element Link link{}; ///< What opens when element is clicked diff --git a/src/league_cmd.cpp b/src/league_cmd.cpp index 4fbfc0918d..1dd7687d47 100644 --- a/src/league_cmd.cpp +++ b/src/league_cmd.cpp @@ -73,7 +73,7 @@ std::tuple CmdCreateLeagueTable(DoCommandFlags flags * @param flags type of operation * @param table Id of the league table this element belongs to * @param rating Value that elements are ordered by - * @param company Company to show the color blob for or CompanyID::Invalid() + * @param company Company to show the colour blob for or CompanyID::Invalid() * @param text Text of the element * @param score String representation of the score associated with the element * @param link_type Type of the referenced object @@ -100,7 +100,7 @@ std::tuple CmdCreateLeagueTableElement(DoComm * Update the attributes of a league table element. * @param flags type of operation * @param element Id of the element to update - * @param company Company to show the color blob for or CompanyID::Invalid() + * @param company Company to show the colour blob for or CompanyID::Invalid() * @param text Text of the element * @param link_type Type of the referenced object * @param link_target Id of the referenced object diff --git a/src/openttd.cpp b/src/openttd.cpp index 4317b99e64..1a3cd0c4c7 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -874,7 +874,7 @@ static void MakeNewGameDone() Company *c = Company::Get(CompanyID::Begin()); c->settings = _settings_client.company; - /* Overwrite color from settings if needed + /* Overwrite colour from settings if needed * COLOUR_END corresponds to Random colour */ if (_settings_client.gui.starting_colour != COLOUR_END) { diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index 957b801a1e..f142fb48b0 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -190,9 +190,9 @@ static const CTRunDelegateCallbacks _sprite_font_callback = { } CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTFontAttributeName, font_handle); - CGColorRef color = CGColorCreateGenericGray((uint8_t)font->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different. - CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTForegroundColorAttributeName, color); - CGColorRelease(color); + CGColorRef colour = CGColorCreateGenericGray((uint8_t)font->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different. + CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTForegroundColorAttributeName, colour); + CGColorRelease(colour); /* Install a size callback for our special private-use sprite glyphs in case the font does not provide them. */ for (ssize_t c = last; c < position; c++) { diff --git a/src/script/api/script_league.hpp b/src/script/api/script_league.hpp index aa335d6af9..d6181e0774 100644 --- a/src/script/api/script_league.hpp +++ b/src/script/api/script_league.hpp @@ -70,7 +70,7 @@ public: * Create a new league table element. * @param table Id of the league table this element belongs to. * @param rating Value that elements are ordered by. - * @param company Company to show the color blob for or COMPANY_INVALID. + * @param company Company to show the colour blob for or COMPANY_INVALID. * @param text Text of the element (can be either a raw string, or ScriptText object). * @param score String representation of the score associated with the element (can be either a raw string, or ScriptText object). * @param link_type Type of the referenced object. @@ -87,7 +87,7 @@ public: /** * Update the attributes of a league table element. * @param element Id of the element to update - * @param company Company to show the color blob for or COMPANY_INVALID. + * @param company Company to show the colour blob for or COMPANY_INVALID. * @param text Text of the element (can be either a raw string, or ScriptText object). * @param link_type Type of the referenced object. * @param link_target Id of the referenced object. diff --git a/src/settings_type.h b/src/settings_type.h index 25a8fd63de..6babceeaab 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -217,8 +217,8 @@ struct GUISettings { uint8_t missing_strings_threshold; ///< the number of missing strings before showing the warning uint8_t graph_line_thickness; ///< the thickness of the lines in the various graph guis uint8_t osk_activation; ///< Mouse gesture to trigger the OSK. - Colours starting_colour; ///< default color scheme for the company to start a new game with - Colours starting_colour_secondary; ///< default secondary color scheme for the company to start a new game with + Colours starting_colour; ///< default colour scheme for the company to start a new game with + Colours starting_colour_secondary; ///< default secondary colour scheme for the company to start a new game with bool show_newgrf_name; ///< Show the name of the NewGRF in the build vehicle window bool show_cargo_in_vehicle_lists; ///< Show the cargoes the vehicles can carry in the list windows bool auto_remove_signals; ///< automatically remove signals when in the way during rail construction diff --git a/src/table/sprites.h b/src/table/sprites.h index caef133af7..0564fc6b18 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -1622,6 +1622,6 @@ static const PaletteID PALETTE_CRASH = 804; ///< Recolour sprite static const PaletteID PALETTE_CHURCH_RED = 1438; ///< Recolour sprite for reddish churches static const PaletteID PALETTE_CHURCH_CREAM = 1439; ///< Recolour sprite for white churches -static const PaletteID PALETTE_ALL_BLACK = SPR_PALETTE_BASE; ///< Exchange any color by black, needed for painting fictive tiles outside map +static const PaletteID PALETTE_ALL_BLACK = SPR_PALETTE_BASE; ///< Exchange any colour by black, needed for painting fictive tiles outside map #endif /* SPRITES_H */ diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 738a796805..a8d18057f4 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -30,7 +30,7 @@ public: OTTD_CocoaWindow *window; ///< Pointer to window object OTTD_CocoaView *cocoaview; ///< Pointer to view object - CGColorSpaceRef color_space; ///< Window color space + CGColorSpaceRef colour_space; ///< Window colour space OTTD_CocoaWindowDelegate *delegate; //!< Window delegate object @@ -101,7 +101,7 @@ private: uint32_t palette[256]; ///< Colour Palette void BlitIndexedToView32(int left, int top, int right, int bottom); - void UpdatePalette(uint first_color, uint num_colors); + void UpdatePalette(uint first_colour, uint num_colours); public: CGContextRef cgcontext; ///< Context reference for Quartz subdriver diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 31f390fe09..860b31eacf 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -99,7 +99,7 @@ VideoDriver_Cocoa::VideoDriver_Cocoa(bool uses_hardware_acceleration) this->cocoaview = nil; this->delegate = nil; - this->color_space = nullptr; + this->colour_space = nullptr; this->dirty_rect = {}; } @@ -116,7 +116,7 @@ void VideoDriver_Cocoa::Stop() [ this->cocoaview release ]; [ this->delegate release ]; - CGColorSpaceRelease(this->color_space); + CGColorSpaceRelease(this->colour_space); _cocoa_video_started = false; } @@ -432,10 +432,10 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height) [ draw_view release ]; [ this->window setColorSpace:[ NSColorSpace sRGBColorSpace ] ]; - CGColorSpaceRelease(this->color_space); - this->color_space = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); - if (this->color_space == nullptr) this->color_space = CGColorSpaceCreateDeviceRGB(); - if (this->color_space == nullptr) FatalError("Could not get a valid colour space for drawing."); + CGColorSpaceRelease(this->colour_space); + this->colour_space = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); + if (this->colour_space == nullptr) this->colour_space = CGColorSpaceCreateDeviceRGB(); + if (this->colour_space == nullptr) FatalError("Could not get a valid colour space for drawing."); this->setup = false; @@ -654,7 +654,7 @@ void VideoDriver_CocoaQuartz::AllocateBackingStore(bool) this->window_height, // height 8, // bits per component this->window_pitch * 4, // bytes per row - this->color_space, // color space + this->colour_space, // colour space kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host ); @@ -704,11 +704,11 @@ void VideoDriver_CocoaQuartz::BlitIndexedToView32(int left, int top, int right, } /** Update the palette */ -void VideoDriver_CocoaQuartz::UpdatePalette(uint first_color, uint num_colors) +void VideoDriver_CocoaQuartz::UpdatePalette(uint first_colour, uint num_colours) { if (this->buffer_depth != 8) return; - for (uint i = first_color; i < first_color + num_colors; i++) { + for (uint i = first_colour; i < first_colour + num_colours; i++) { uint32_t clr = 0xff000000; clr |= (uint32_t)_local_palette.palette[i].r << 16; clr |= (uint32_t)_local_palette.palette[i].g << 8; diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index 43f8ee266b..dcc7873185 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -177,8 +177,8 @@ static NSImage *NSImageFromSprite(SpriteID sprite_id, ZoomLevel zoom) if (!data) return nullptr; CGBitmapInfo info = kCGImageAlphaFirst | kCGBitmapByteOrder32Host; - CFAutoRelease color_space(CGColorSpaceCreateWithName(kCGColorSpaceSRGB)); - CFAutoRelease bitmap(CGImageCreate(dim.width, dim.height, 8, 32, dim.width * 4, color_space.get(), info, data.get(), nullptr, false, kCGRenderingIntentDefault)); + CFAutoRelease colour_space(CGColorSpaceCreateWithName(kCGColorSpaceSRGB)); + CFAutoRelease bitmap(CGImageCreate(dim.width, dim.height, 8, 32, dim.width * 4, colour_space.get(), info, data.get(), nullptr, false, kCGRenderingIntentDefault)); if (!bitmap) return nullptr; return [ [ [ NSImage alloc ] initWithCGImage:bitmap.get() size:NSZeroSize ] autorelease ]; diff --git a/src/video/sdl2_default_v.cpp b/src/video/sdl2_default_v.cpp index b7e94dae48..6ad0ad42eb 100644 --- a/src/video/sdl2_default_v.cpp +++ b/src/video/sdl2_default_v.cpp @@ -67,22 +67,22 @@ void VideoDriver_SDL_Default::MakePalette() if (_sdl_surface != _sdl_real_surface) { /* When using a shadow surface, also set our palette on the real screen. This lets SDL - * allocate as many colors (or approximations) as + * allocate as many colours (or approximations) as * possible, instead of using only the default SDL - * palette. This allows us to get more colors exactly + * palette. This allows us to get more colours exactly * right and might allow using better approximations for - * other colors. + * other colours. * - * Note that colors allocations are tried in-order, so - * this favors colors further up into the palette. Also - * note that if two colors from the same animation - * sequence are approximated using the same color, that + * Note that colours allocations are tried in-order, so + * this favors colours further up into the palette. Also + * note that if two colours from the same animation + * sequence are approximated using the same colour, that * animation will stop working. * * Since changing the system palette causes the colours * to change right away, and allocations might * drastically change, we can't use this for animation, - * since that could cause weird coloring between the + * since that could cause weird colouring between the * palette change and the blitting below, so we only set * the real palette during initialisation. */ From a8b000f982a971f5473ea33ec70f2e1284413e39 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 18 Nov 2025 04:39:55 +0000 Subject: [PATCH 201/280] Update: Translations from eints swedish: 4 changes by joeax910 portuguese: 1 change by jcteotonio --- src/lang/portuguese.txt | 2 +- src/lang/swedish.txt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index c7971b4357..88ecc10bd2 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -3388,7 +3388,7 @@ STR_MAPGEN_SEA_LEVEL :{BLACK}Nível d STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Selecione o nível do mar STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rios: STR_MAPGEN_SMOOTHNESS :{BLACK}Suavidade: -STR_MAPGEN_VARIETY :{BLACK}Variedade da distribuição: +STR_MAPGEN_VARIETY :{BLACK}Distribuição de variedade: STR_MAPGEN_GENERATE :{WHITE}Gerar STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Criar o mapa e jogar OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 488b609c9f..abddddf73e 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3427,6 +3427,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Nordväs STR_MAPGEN_NORTHEAST :{BLACK}Nordost STR_MAPGEN_SOUTHEAST :{BLACK}Sydost STR_MAPGEN_SOUTHWEST :{BLACK}Sydväst +STR_MAPGEN_NORTHWEST_TOOLTIP :Växla mellan vatten- eller friformskant vid den nordvästra kartkanten +STR_MAPGEN_NORTHEAST_TOOLTIP :Växla mellan vatten- eller friformskant vid den nordöstra kartkanten +STR_MAPGEN_SOUTHEAST_TOOLTIP :Växla mellan vatten- eller friformskant vid den sydöstra kartkanten +STR_MAPGEN_SOUTHWEST_TOOLTIP :Växla mellan vatten- eller friformskant vid den sydvästra kartkanten STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fri form STR_MAPGEN_BORDER_WATER :{BLACK}Vatten STR_MAPGEN_BORDER_RANDOM :{BLACK}På måfå From 509cbedf0bdbf0f9ff60e134d6d9441108b0892f Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 18 Nov 2025 07:38:55 -0500 Subject: [PATCH 202/280] Feature: Rivers can end in wetlands if unable to reach sea (#14784) --- src/landscape.cpp | 143 +++++++++++++++++++++++++++++++++----------- src/settings_type.h | 11 ++++ src/tree_cmd.cpp | 17 ++---- src/tree_cmd.h | 2 + 4 files changed, 127 insertions(+), 46 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index 983c3e4f56..b12059bef4 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -29,6 +29,7 @@ #include "animated_tile_func.h" #include "core/random_func.hpp" #include "object_base.h" +#include "tree_cmd.h" #include "company_func.h" #include "company_gui.h" #include "saveload/saveload.h" @@ -1045,24 +1046,117 @@ static bool FindSpring(TileIndex tile) } /** - * Make a connected lake; fill all tiles in the circular tile search that are connected. - * @param tile The tile to consider for lake making. + * Is this a valid tile for the water feature at the end of a river? + * @param tile The tile to check. + * @param height The height of the rest of the water feature, which must match. + * @return True iff this is a valid tile to be part of the river terminus. + */ +static bool IsValidRiverTerminusTile(TileIndex tile, uint height) +{ + if (!IsValidTile(tile) || TileHeight(tile) != height || !IsTileFlat(tile)) return false; + if (_settings_game.game_creation.landscape == LandscapeType::Tropic && GetTropicZone(tile) == TROPICZONE_DESERT) return false; + + return true; +} + +/** + * Make a lake centred on the given tile, of a random diameter. + * @param lake_centre The middle tile of the lake. * @param height_lake The height of the lake. */ -static void MakeLake(TileIndex tile, uint height_lake) +static void MakeLake(TileIndex lake_centre, uint height_lake) { - if (!IsValidTile(tile) || TileHeight(tile) != height_lake || !IsTileFlat(tile)) return; - if (_settings_game.game_creation.landscape == LandscapeType::Tropic && GetTropicZone(tile) == TROPICZONE_DESERT) return; + MakeRiverAndModifyDesertZoneAround(lake_centre); + uint diameter = RandomRange(8) + 3; - for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { - TileIndex t = tile + TileOffsByDiagDir(d); - if (IsWaterTile(t)) { - MakeRiverAndModifyDesertZoneAround(tile); - return; + /* Run the loop twice, so artefacts from going circular in one direction get (mostly) hidden. */ + for (uint loops = 0; loops < 2; ++loops) { + for (TileIndex tile : SpiralTileSequence(lake_centre, diameter)) { + if (!IsValidRiverTerminusTile(tile, height_lake)) continue; + for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { + TileIndex t = tile + TileOffsByDiagDir(d); + if (IsWaterTile(t)) { + MakeRiverAndModifyDesertZoneAround(tile); + return; + } + } } } } +/** + * Make wetlands around the given tile. + * @param centre The starting tile. + * @param height The height of the wetlands. + * @param river_length The length of the river. + */ +static void MakeWetlands(TileIndex centre, uint height, uint river_length) +{ + MakeRiverAndModifyDesertZoneAround(centre); + + uint diameter = std::max((river_length), 16u); + + /* Some wetlands have trees planted among the water tiles. */ + bool has_trees = Chance16(1, 2); + + /* Create the main wetland area. */ + for (TileIndex tile : SpiralTileSequence(centre, diameter)) { + if (!IsValidRiverTerminusTile(tile, height)) continue; + + /* Don't make a perfect square, but a circle with a noisy border. */ + uint radius = diameter / 2; + if ((DistanceSquare(tile, centre) > radius * radius) && Chance16(3, 4)) continue; + + if (Chance16(1, 3)) { + /* This tile is water. */ + MakeRiverAndModifyDesertZoneAround(tile); + } else if (IsTileType(tile, MP_CLEAR)) { + /* This tile is ground, which we always make rough. */ + SetClearGroundDensity(tile, CLEAR_ROUGH, 3); + /* Maybe place trees? */ + if (has_trees && _settings_game.game_creation.tree_placer != TP_NONE) { + PlaceTree(tile, Random(), true); + } + } + } +} + +/** + * Try to end a river at a tile which is not the sea. + * @param tile The tile to try ending the river at. + * @param begin The starting tile of the river. + * @return Whether we succesfully ended the river on the given tile. + */ +static bool TryMakeRiverTerminus(TileIndex tile, TileIndex begin) +{ + if (!IsValidTile(tile)) return false; + + /* We don't want to end the river at the entry of the valley. */ + if (tile == begin) return false; + + /* We don't want the river to end in the desert. */ + if (_settings_game.game_creation.landscape == LandscapeType::Tropic && GetTropicZone(tile) == TROPICZONE_DESERT) return false; + + /* Only end on flat slopes. */ + int height_lake; + if (!IsTileFlat(tile, &height_lake)) return false; + + /* Only build at the height of the river. */ + int height_begin = TileHeight(begin); + if (height_lake != height_begin) return false; + + /* Checks successful, time to build. + * Chance of water feature is split evenly between a lake, a wetland with trees, and a wetland with grass. */ + if (Chance16(1, 3)) { + MakeLake(tile, height_lake); + } else { + MakeWetlands(tile, height_lake, DistanceManhattan(tile, begin)); + } + + /* This is the new end of the river. */ + return true; +} + /** * Widen a river by expanding into adjacent tiles via circular tile search. * @param tile The tile to try expanding the river into. @@ -1284,31 +1378,12 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint } else if (queue.size() > 32) { /* Maybe we can make a lake. Find the Nth of the considered tiles. */ TileIndex lake_centre = queue[RandomRange(static_cast(queue.size()))]; - int height_lake; - - if (IsValidTile(lake_centre) && - /* We don't want the lake at the entry of the valley. */ - lake_centre != begin && - /* We don't want lakes in the desert. */ - (_settings_game.game_creation.landscape != LandscapeType::Tropic || GetTropicZone(lake_centre) != TROPICZONE_DESERT) && - /* A river, or lake, can only be built on flat slopes. */ - IsTileFlat(lake_centre, &height_lake) && - /* We want the lake to be built at the height of the river. */ - height_lake == height_begin && - /* We only want a lake if the river is long enough. */ - DistanceManhattan(spring, lake_centre) > min_river_length) { - end = lake_centre; - MakeRiverAndModifyDesertZoneAround(lake_centre); - uint diameter = RandomRange(8) + 3; - - /* Run the loop twice, so artefacts from going circular in one direction get (mostly) hidden. */ - for (uint loops = 0; loops < 2; ++loops) { - for (auto tile : SpiralTileSequence(lake_centre, diameter)) { - MakeLake(tile, height_lake); - } + if (DistanceManhattan(spring, lake_centre) > min_river_length) { + if (TryMakeRiverTerminus(lake_centre, begin)) { + /* If successful, this becomes the new end of the river. */ + end = lake_centre; + found = true; } - - found = true; } } diff --git a/src/settings_type.h b/src/settings_type.h index 6babceeaab..eeef3aac22 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -99,6 +99,17 @@ enum RightClickClose : uint8_t { RCC_YES_EXCEPT_STICKY, }; +/** + * List of tree placer algorithm. + * + * This enumeration defines all possible tree placer algorithm in the game. + */ +enum TreePlacer : uint8_t { + TP_NONE, ///< No tree placer algorithm + TP_ORIGINAL, ///< The original algorithm + TP_IMPROVED, ///< A 'improved' algorithm +}; + /** Possible values for "place_houses" setting. */ enum PlaceHouses : uint8_t { PH_FORBIDDEN = 0, diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index 8633fe3d24..a5187011de 100644 --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -33,17 +33,6 @@ #include "safeguards.h" -/** - * List of tree placer algorithm. - * - * This enumeration defines all possible tree placer algorithm in the game. - */ -enum TreePlacer : uint8_t { - TP_NONE, ///< No tree placer algorithm - TP_ORIGINAL, ///< The original algorithm - TP_IMPROVED, ///< A 'improved' algorithm -}; - /** Where to place trees while in-game? */ enum ExtraTreePlacement : uint8_t { ETP_NO_SPREAD, ///< Grow trees on tiles that have them but don't spread to new ones @@ -167,8 +156,9 @@ static TreeType GetRandomTreeType(TileIndex tile, uint seed) * * @param tile The tile to make a tree-tile from * @param r The randomness value from a Random() value + * @param keep_density Whether to keep the existing ground density of the tile. */ -static void PlaceTree(TileIndex tile, uint32_t r) +void PlaceTree(TileIndex tile, uint32_t r, bool keep_density) { TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8)); @@ -176,6 +166,9 @@ static void PlaceTree(TileIndex tile, uint32_t r) PlantTreesOnTile(tile, tree, GB(r, 22, 2), static_cast(std::min(GB(r, 16, 3), 6))); MarkTileDirtyByTile(tile); + /* Maybe keep the existing ground density.*/ + if (keep_density) return; + /* Rerandomize ground, if neither snow nor shore */ TreeGround ground = GetTreeGround(tile); if (ground != TREE_GROUND_SNOW_DESERT && ground != TREE_GROUND_ROUGH_SNOW && ground != TREE_GROUND_SHORE) { diff --git a/src/tree_cmd.h b/src/tree_cmd.h index 65e1a310ad..8a78683f87 100644 --- a/src/tree_cmd.h +++ b/src/tree_cmd.h @@ -12,6 +12,8 @@ #include "command_type.h" +void PlaceTree(TileIndex tile, uint32_t r, bool keep_density = false); + CommandCost CmdPlantTree(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, uint8_t tree_to_plant, bool diagonal); DEF_CMD_TRAIT(CMD_PLANT_TREE, CmdPlantTree, CommandFlag::Auto, CommandType::LandscapeConstruction) From a321509d908a87106034cc478050ea0f54e26469 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 17 Nov 2025 17:12:16 +0000 Subject: [PATCH 203/280] Fix 2b244441: [CMake] Regression tests failed if no previous crashes present On CMake 3.x --- cmake/scripts/Regression.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/scripts/Regression.cmake b/cmake/scripts/Regression.cmake index e9ce5ea6f2..d6204db45e 100644 --- a/cmake/scripts/Regression.cmake +++ b/cmake/scripts/Regression.cmake @@ -27,7 +27,9 @@ endif() # Remove previous crash files file(GLOB CRASH_FILES "regression/crash*") -file(REMOVE ${CRASH_FILES}) +if(CRASH_FILES) + file(REMOVE ${CRASH_FILES}) +endif() # Run the regression test execute_process(COMMAND ${OPENTTD_EXECUTABLE} From f0f964577d6010417db0abe046aaa4ca1fe57530 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 17 Nov 2025 17:10:51 +0000 Subject: [PATCH 204/280] Fix 98481ecc: Incorrect parsing of var 6x parameter in NewGRF debug window --- src/newgrf_debug_gui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index e9ba84f5c9..f7b7b37ff9 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -594,7 +594,7 @@ struct NewGRFInspectWindow : Window { { if (!str.has_value()) return; - auto val = ParseInteger(*str, 10, true); + auto val = ParseInteger(*str, 16, true); if (!val.has_value()) return; NewGRFInspectWindow::var60params[GetFeatureNum(this->window_number)][this->current_edit_param - 0x60] = *val; this->SetDirty(); From 62e568ce657c27c443e404aeeb71b0608f903ef4 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Tue, 30 Sep 2025 16:34:02 +0200 Subject: [PATCH 205/280] Codefix: shadowing variable, grouping loop increments --- src/waypoint_cmd.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 4d514c0567..f76d9bd1f7 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -233,16 +233,14 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi const StationSpec *spec = StationClass::Get(spec_class)->GetSpec(spec_index); RailStationTileLayout stl{spec, count, 1}; - auto it = stl.begin(); /* Check whether the tiles we're building on are valid rail or not. */ TileIndexDiff offset = TileOffsByAxis(OtherAxis(axis)); - for (int i = 0; i < count; i++) { - TileIndex tile = start_tile + i * offset; + for (auto [i, it, tile] = std::make_tuple(0, stl.begin(), start_tile); i < count; ++i, ++it, tile += offset) { CommandCost ret = IsValidTileForWaypoint(tile, axis, &est); if (ret.Failed()) return ret; - ret = IsRailStationBridgeAboveOk(tile, spec, StationType::RailWaypoint, *it++ + axis); + ret = IsRailStationBridgeAboveOk(tile, spec, StationType::RailWaypoint, *it + axis); if (ret.Failed()) return ret; } @@ -297,17 +295,14 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi wp->UpdateVirtCoord(); - auto it = stl.begin(); - Company *c = Company::Get(wp->owner); - for (int i = 0; i < count; i++) { - TileIndex tile = start_tile + i * offset; + for (auto [i, it, tile] = std::make_tuple(0, stl.begin(), start_tile); i < count; ++i, ++it, tile += offset) { uint8_t old_specindex = HasStationTileRail(tile) ? GetCustomStationSpecIndex(tile) : 0; if (!HasStationTileRail(tile)) c->infrastructure.station++; bool reserved = IsTileType(tile, MP_RAILWAY) ? HasBit(GetRailReservationTrackBits(tile), AxisToTrack(axis)) : HasStationReservation(tile); - MakeRailWaypoint(tile, wp->owner, wp->index, axis, *it++, GetRailType(tile)); + MakeRailWaypoint(tile, wp->owner, wp->index, axis, *it, GetRailType(tile)); SetCustomStationSpecIndex(tile, *specindex); SetRailStationTileFlags(tile, spec); From 98700eee43bbb236cd8834c33e11b6c5e2ce23d0 Mon Sep 17 00:00:00 2001 From: kos Date: Sun, 16 Nov 2025 02:43:26 +0100 Subject: [PATCH 206/280] Fix #14755: Remove clicked type selection when not visible --- src/picker_gui.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index 4c4bbc5ae0..d4799b3fb8 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -693,6 +693,7 @@ void PickerWindow::BuildPickerTypeList() if (!this->has_type_picker) return; this->GetWidget(WID_PW_TYPE_MATRIX)->SetCount(static_cast(this->types.size())); + this->EnsureSelectedTypeIsVisible(); } void PickerWindow::EnsureSelectedTypeIsValid() @@ -729,9 +730,11 @@ void PickerWindow::EnsureSelectedTypeIsVisible() int index = this->callbacks.GetSelectedType(); auto it = std::ranges::find_if(this->types, [class_index, index](const auto &item) { return item.class_index == class_index && item.index == index; }); - if (it == std::end(this->types)) return; + int pos = -1; + if (it != std::end(this->types)) { + pos = static_cast(std::distance(std::begin(this->types), it)); + } - int pos = static_cast(std::distance(std::begin(this->types), it)); this->GetWidget(WID_PW_TYPE_MATRIX)->SetClicked(pos); } From 4e24c205d64fbfb958e780fc59bcc24b1a4ab6a3 Mon Sep 17 00:00:00 2001 From: davidxn Date: Tue, 18 Nov 2025 15:18:02 -0500 Subject: [PATCH 207/280] Fix 741c431: Miscalculated cargo penalty for poor station rating (#14712) --- src/station_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 7d0c62e238..80bd441074 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -4073,7 +4073,7 @@ static void UpdateStationRating(Station *st) uint32_t r = Random(); if (rating <= (int)GB(r, 0, 7)) { /* Need to have int, otherwise it will just overflow etc. */ - waiting = std::max((int)waiting - (int)((GB(r, 8, 2) - 1) * num_dests), 0); + waiting = std::max((int)waiting - (int)((GB(r, 8, 2) + 1) * num_dests), 0); waiting_changed = true; } } From 98275ee5d3266dc28fd9b746b598d813166f52a4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 19 Nov 2025 20:35:11 +0000 Subject: [PATCH 208/280] Codechange: Use enum class for water-related enums. (#14804) --- src/clear_cmd.cpp | 2 +- src/dock_gui.cpp | 10 +-- src/industry_cmd.cpp | 2 +- src/landscape.cpp | 4 +- src/newgrf_canal.cpp | 2 +- src/newgrf_commons.cpp | 2 +- src/newgrf_generic.cpp | 2 +- src/object_cmd.cpp | 8 +- src/pathfinder/yapf/yapf_ship.cpp | 4 +- src/saveload/afterload.cpp | 52 +++++------ src/saveload/company_sl.cpp | 6 +- src/saveload/oldloader_sl.cpp | 2 +- src/script/api/script_marine.cpp | 6 +- src/ship_cmd.cpp | 8 +- src/station_cmd.cpp | 10 +-- src/station_map.h | 2 +- src/table/water_land.h | 16 ++-- src/tree_map.h | 4 +- src/tunnelbridge_cmd.cpp | 2 +- src/water_cmd.cpp | 138 +++++++++++++++--------------- src/water_map.h | 98 ++++++++++----------- 21 files changed, 190 insertions(+), 190 deletions(-) diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index a9dc5c567f..89ec6a34cc 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -226,7 +226,7 @@ static inline bool NeighbourIsNormal(TileIndex tile) TileIndex t = tile + TileOffsByDiagDir(dir); if (!IsValidTile(t)) continue; if (GetTropicZone(t) != TROPICZONE_DESERT) return true; - if (HasTileWaterClass(t) && GetWaterClass(t) == WATER_CLASS_SEA) return true; + if (HasTileWaterClass(t) && GetWaterClass(t) == WaterClass::Sea) return true; } return false; } diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index eea54f16e3..01c72e6255 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -264,13 +264,13 @@ struct BuildDocksToolbarWindow : Window { break; case DDSP_CREATE_WATER: if (_game_mode == GM_EDITOR) { - Command::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, _ctrl_pressed ? WATER_CLASS_SEA : WATER_CLASS_CANAL, false); + Command::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, _ctrl_pressed ? WaterClass::Sea : WaterClass::Canal, false); } else { - Command::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_CANAL, _ctrl_pressed); + Command::Post(STR_ERROR_CAN_T_BUILD_CANALS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WaterClass::Canal, _ctrl_pressed); } break; case DDSP_CREATE_RIVER: - Command::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WATER_CLASS_RIVER, _ctrl_pressed); + Command::Post(STR_ERROR_CAN_T_PLACE_RIVERS, CcPlaySound_CONSTRUCTION_WATER, end_tile, start_tile, WaterClass::River, _ctrl_pressed); break; default: break; @@ -560,8 +560,8 @@ public: int y = (ir.Height() - ScaleSpriteTrad(64)) / 2; int x1 = ScaleSpriteTrad(63); int x2 = ScaleSpriteTrad(31); - DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH); - DrawShipDepotSprite(x + (axis == AXIS_X ? x2 : x1), y + ScaleSpriteTrad(33), axis, DEPOT_PART_SOUTH); + DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DepotPart::North); + DrawShipDepotSprite(x + (axis == AXIS_X ? x2 : x1), y + ScaleSpriteTrad(33), axis, DepotPart::South); } break; } diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 3cc143aa6b..5467332793 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1938,7 +1938,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, if (it.gfx != GFX_WATERTILE_SPECIALCHECK) { i->location.Add(cur_tile); - WaterClass wc = (IsWaterTile(cur_tile) ? GetWaterClass(cur_tile) : WATER_CLASS_INVALID); + WaterClass wc = (IsWaterTile(cur_tile) ? GetWaterClass(cur_tile) : WaterClass::Invalid); Command::Do({DoCommandFlag::Execute, DoCommandFlag::NoTestTownRating, DoCommandFlag::NoModifyTownRating}, cur_tile); diff --git a/src/landscape.cpp b/src/landscape.cpp index b12059bef4..4c645faba5 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -681,9 +681,9 @@ CommandCost CmdLandscapeClear(DoCommandFlags flags, TileIndex tile) bool do_clear = false; /* Test for stuff which results in water when cleared. Then add the cost to also clear the water. */ if (flags.Test(DoCommandFlag::ForceClearTile) && HasTileWaterClass(tile) && IsTileOnWater(tile) && !IsWaterTile(tile) && !IsCoastTile(tile)) { - if (flags.Test(DoCommandFlag::Auto) && GetWaterClass(tile) == WATER_CLASS_CANAL) return CommandCost(STR_ERROR_MUST_DEMOLISH_CANAL_FIRST); + if (flags.Test(DoCommandFlag::Auto) && GetWaterClass(tile) == WaterClass::Canal) return CommandCost(STR_ERROR_MUST_DEMOLISH_CANAL_FIRST); do_clear = true; - cost.AddCost(GetWaterClass(tile) == WATER_CLASS_CANAL ? _price[PR_CLEAR_CANAL] : _price[PR_CLEAR_WATER]); + cost.AddCost(GetWaterClass(tile) == WaterClass::Canal ? _price[PR_CLEAR_CANAL] : _price[PR_CLEAR_WATER]); } Company *c = flags.Any({DoCommandFlag::Auto, DoCommandFlag::Bankrupt}) ? nullptr : Company::GetIfValid(_current_company); diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp index 0e593ba749..dd7656164f 100644 --- a/src/newgrf_canal.cpp +++ b/src/newgrf_canal.cpp @@ -65,7 +65,7 @@ struct CanalResolverObject : public ResolverObject { case 0x80: { int z = GetTileZ(this->tile); /* Return consistent height within locks */ - if (IsTileType(this->tile, MP_WATER) && IsLock(this->tile) && GetLockPart(this->tile) == LOCK_PART_UPPER) z--; + if (IsTileType(this->tile, MP_WATER) && IsLock(this->tile) && GetLockPart(this->tile) == LockPart::Upper) z--; return z; } diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index 84a4af404b..c25d13fefe 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -443,7 +443,7 @@ uint32_t GetNearbyTileInformation(TileIndex tile, bool grf_version8) auto [tileh, z] = GetTilePixelSlope(tile); /* Return 0 if the tile is a land tile */ - uint8_t terrain_type = (HasTileWaterClass(tile) ? (GetWaterClass(tile) + 1) & 3 : 0) << 5 | GetTerrainType(tile) << 2 | (tile_type == MP_WATER ? 1 : 0) << 1; + uint8_t terrain_type = (HasTileWaterClass(tile) ? (to_underlying(GetWaterClass(tile)) + 1) & 3 : 0) << 5 | GetTerrainType(tile) << 2 | (tile_type == MP_WATER ? 1 : 0) << 1; if (grf_version8) z /= TILE_HEIGHT; return tile_type << 24 | ClampTo(z) << 16 | terrain_type << 8 | tileh; } diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp index d070119db1..aa90b313e2 100644 --- a/src/newgrf_generic.cpp +++ b/src/newgrf_generic.cpp @@ -248,7 +248,7 @@ void AmbientSoundEffectCallback(TileIndex tile) object.generic_scope.feature = GSF_SOUNDFX; uint32_t param1_v7 = GetTileType(tile) << 28 | Clamp(TileHeight(tile), 0, 15) << 24 | GB(r, 16, 8) << 16 | GetTerrainType(tile); - uint32_t param1_v8 = GetTileType(tile) << 24 | GetTileZ(tile) << 16 | GB(r, 16, 8) << 8 | (HasTileWaterClass(tile) ? GetWaterClass(tile) : 0) << 3 | GetTerrainType(tile); + uint32_t param1_v8 = GetTileType(tile) << 24 | GetTileZ(tile) << 16 | GB(r, 16, 8) << 8 | (HasTileWaterClass(tile) ? to_underlying(GetWaterClass(tile)) : 0) << 3 | GetTerrainType(tile); /* Run callback. */ auto callback = GetGenericCallbackResult(GSF_SOUNDFX, object, param1_v7, param1_v8); diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index ae74e5e5cf..a70b44cbe0 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -116,9 +116,9 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u for (TileIndex t : ta) { if (IsWaterTile(t)) ClearNeighbourNonFloodingStates(t); if (HasTileWaterGround(t)) InvalidateWaterRegion(t); - WaterClass wc = (IsWaterTile(t) ? GetWaterClass(t) : WATER_CLASS_INVALID); + WaterClass wc = (IsWaterTile(t) ? GetWaterClass(t) : WaterClass::Invalid); /* Update company infrastructure counts for objects build on canals owned by nobody. */ - if (wc == WATER_CLASS_CANAL && owner != OWNER_NONE && (IsTileOwner(t, OWNER_NONE) || IsTileOwner(t, OWNER_WATER))) { + if (wc == WaterClass::Canal && owner != OWNER_NONE && (IsTileOwner(t, OWNER_NONE) || IsTileOwner(t, OWNER_WATER))) { Company::Get(owner)->infrastructure.water++; DirtyCompanyInfrastructureWindows(owner); } @@ -769,7 +769,7 @@ static bool TryBuildLightHouse() } /* Only build lighthouses at tiles where the border is sea. */ - if (!IsTileType(tile, MP_WATER) || GetWaterClass(tile) != WATER_CLASS_SEA) return false; + if (!IsTileType(tile, MP_WATER) || GetWaterClass(tile) != WaterClass::Sea) return false; for (int j = 0; j < 19; j++) { int h; @@ -873,7 +873,7 @@ static void ChangeTileOwner_Object(TileIndex tile, Owner old_owner, Owner new_ow ObjectType type = GetObjectType(tile); if ((type == OBJECT_OWNED_LAND || type >= NEW_OBJECT_OFFSET) && new_owner != INVALID_OWNER) { SetTileOwner(tile, new_owner); - if (GetWaterClass(tile) == WATER_CLASS_CANAL) { + if (GetWaterClass(tile) == WaterClass::Canal) { Company::Get(old_owner)->infrastructure.water--; Company::Get(new_owner)->infrastructure.water++; } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index bec4068a57..17fc7ff6f4 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -385,11 +385,11 @@ public: /* Ocean/canal speed penalty. */ const ShipVehicleInfo *svi = ShipVehInfo(Yapf().GetVehicle()->engine_type); - uint8_t speed_frac = (GetEffectiveWaterClass(n.GetTile()) == WATER_CLASS_SEA) ? svi->ocean_speed_frac : svi->canal_speed_frac; + uint8_t speed_frac = (GetEffectiveWaterClass(n.GetTile()) == WaterClass::Sea) ? svi->ocean_speed_frac : svi->canal_speed_frac; if (speed_frac > 0) c += YAPF_TILE_LENGTH * (1 + follower->tiles_skipped) * speed_frac / (256 - speed_frac); /* Lock penalty. */ - if (IsTileType(n.GetTile(), MP_WATER) && IsLock(n.GetTile()) && GetLockPart(n.GetTile()) == LOCK_PART_MIDDLE) { + if (IsTileType(n.GetTile(), MP_WATER) && IsLock(n.GetTile()) && GetLockPart(n.GetTile()) == LockPart::Middle) { const uint canal_speed = svi->ApplyWaterClassSpeedFrac(svi->max_speed, false); /* Cost is proportional to the vehicle's speed as the vehicle stops in the lock. */ c += (TILE_HEIGHT * YAPF_TILE_LENGTH * canal_speed) / 128; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index a31e58c029..388b30f564 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -86,7 +86,7 @@ extern void ClearOldOrders(); * This as for example docks and shipdepots do not store * whether the tile used to be canal or 'normal' water. * @param t the tile to change. - * @param include_invalid_water_class Also consider WATER_CLASS_INVALID, i.e. industry tiles on land + * @param include_invalid_water_class Also consider WaterClass::Invalid, i.e. industry tiles on land */ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_class) { @@ -94,7 +94,7 @@ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_cla * Note: Wrt. autosloping under industry tiles this is the most fool-proof behaviour. */ if (!IsTileFlat(t)) { if (include_invalid_water_class) { - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); return; } else { SlErrorCorrupt("Invalid water class for dry tile"); @@ -105,8 +105,8 @@ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_cla MarkTileDirtyByTile(t); if (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1) { - /* tiles at map borders are always WATER_CLASS_SEA */ - SetWaterClass(t, WATER_CLASS_SEA); + /* tiles at map borders are always WaterClass::Sea */ + SetWaterClass(t, WaterClass::Sea); return; } @@ -123,9 +123,9 @@ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_cla has_water = true; } else if (!IsLock(neighbour)) { switch (GetWaterClass(neighbour)) { - case WATER_CLASS_SEA: has_water = true; break; - case WATER_CLASS_CANAL: has_canal = true; break; - case WATER_CLASS_RIVER: has_river = true; break; + case WaterClass::Sea: has_water = true; break; + case WaterClass::Canal: has_canal = true; break; + case WaterClass::River: has_river = true; break; default: SlErrorCorrupt("Invalid water class for tile"); } } @@ -146,16 +146,16 @@ void SetWaterClassDependingOnSurroundings(Tile t, bool include_invalid_water_cla } if (!has_water && !has_canal && !has_river && include_invalid_water_class) { - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); return; } if (has_river && !has_canal) { - SetWaterClass(t, WATER_CLASS_RIVER); + SetWaterClass(t, WaterClass::River); } else if (has_canal || !has_water) { - SetWaterClass(t, WATER_CLASS_CANAL); + SetWaterClass(t, WaterClass::Canal); } else { - SetWaterClass(t, WATER_CLASS_SEA); + SetWaterClass(t, WaterClass::Sea); } } @@ -853,12 +853,12 @@ bool AfterLoadGame() switch (GB(t.m5(), 4, 4)) { case 0x0: /* Previously WBL_TYPE_NORMAL, Clear water or coast. */ - SetWaterTileType(t, HasBit(t.m5(), WBL_COAST_FLAG) ? WATER_TILE_COAST : WATER_TILE_CLEAR); + SetWaterTileType(t, HasBit(t.m5(), WBL_COAST_FLAG) ? WaterTileType::Coast : WaterTileType::Clear); break; - case 0x1: SetWaterTileType(t, WATER_TILE_LOCK); break; /* Previously WBL_TYPE_LOCK */ - case 0x8: SetWaterTileType(t, WATER_TILE_DEPOT); break; /* Previously WBL_TYPE_DEPOT */ - default: SetWaterTileType(t, WATER_TILE_CLEAR); break; /* Shouldn't happen... */ + case 0x1: SetWaterTileType(t, WaterTileType::Lock); break; /* Previously WBL_TYPE_LOCK */ + case 0x8: SetWaterTileType(t, WaterTileType::Depot); break; /* Previously WBL_TYPE_DEPOT */ + default: SetWaterTileType(t, WaterTileType::Clear); break; /* Shouldn't happen... */ } } } @@ -870,7 +870,7 @@ bool AfterLoadGame() default: break; case MP_WATER: - if (GetWaterTileType(t) == WATER_TILE_LOCK && GetTileOwner(t) == OWNER_WATER) SetTileOwner(t, OWNER_NONE); + if (GetWaterTileType(t) == WaterTileType::Lock && GetTileOwner(t) == OWNER_WATER) SetTileOwner(t, OWNER_NONE); break; case MP_STATION: { @@ -1740,7 +1740,7 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(SLV_82)) { for (const auto t : Map::Iterate()) { if (IsTileType(t, MP_WATER) && - GetWaterTileType(t) == WATER_TILE_CLEAR && + GetWaterTileType(t) == WaterTileType::Clear && GetTileOwner(t) == OWNER_WATER && TileHeight(t) != 0) { SetTileOwner(t, OWNER_NONE); @@ -1872,7 +1872,7 @@ bool AfterLoadGame() break; default: - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); break; } break; @@ -1883,7 +1883,7 @@ bool AfterLoadGame() break; case MP_OBJECT: - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); break; default: @@ -1897,7 +1897,7 @@ bool AfterLoadGame() for (auto t : Map::Iterate()) { /* Move river flag and update canals to use water class */ if (IsTileType(t, MP_WATER)) { - if (GetWaterClass(t) != WATER_CLASS_RIVER) { + if (GetWaterClass(t) != WaterClass::River) { if (IsWater(t)) { Owner o = GetTileOwner(t); if (o == OWNER_WATER) { @@ -1907,7 +1907,7 @@ bool AfterLoadGame() } } else if (IsShipDepot(t)) { Owner o = (Owner)t.m4(); // Original water owner - SetWaterClass(t, o == OWNER_WATER ? WATER_CLASS_SEA : WATER_CLASS_CANAL); + SetWaterClass(t, o == OWNER_WATER ? WaterClass::Sea : WaterClass::Canal); } } } @@ -1931,7 +1931,7 @@ bool AfterLoadGame() (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == Map::MaxX() - 1 || TileY(t) == Map::MaxY() - 1)) { /* Some version 86 savegames have wrong water class at map borders (under buoy, or after removing buoy). * This conversion has to be done before buoys with invalid owner are removed. */ - SetWaterClass(t, WATER_CLASS_SEA); + SetWaterClass(t, WaterClass::Sea); } if (IsBuoyTile(t) || IsDriveThroughStopTile(t) || IsTileType(t, MP_WATER)) { @@ -2003,7 +2003,7 @@ bool AfterLoadGame() if (GetIndustrySpec(GetIndustryType(t))->behaviour.Test(IndustryBehaviour::BuiltOnWater)) { SetWaterClassDependingOnSurroundings(t, true); } else { - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); } } @@ -2594,7 +2594,7 @@ bool AfterLoadGame() for (const auto t : Map::Iterate()) { if (!IsTileType(t, MP_STATION)) continue; if (!IsBuoy(t) && !IsOilRig(t) && !(IsDock(t) && IsTileFlat(t))) { - SetWaterClass(t, WATER_CLASS_INVALID); + SetWaterClass(t, WaterClass::Invalid); } } @@ -3149,7 +3149,7 @@ bool AfterLoadGame() /* Move ships from lock slope to upper or lower position. */ for (Ship *s : Ship::Iterate()) { /* Suitable tile? */ - if (!IsTileType(s->tile, MP_WATER) || !IsLock(s->tile) || GetLockPart(s->tile) != LOCK_PART_MIDDLE) continue; + if (!IsTileType(s->tile, MP_WATER) || !IsLock(s->tile) || GetLockPart(s->tile) != LockPart::Middle) continue; /* We don't need to adjust position when at the tile centre */ int x = s->x_pos & 0xF; @@ -3205,7 +3205,7 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(SLV_TREES_WATER_CLASS)) { /* Update water class for trees. */ for (const auto t : Map::Iterate()) { - if (IsTileType(t, MP_TREES)) SetWaterClass(t, GetTreeGround(t) == TREE_GROUND_SHORE ? WATER_CLASS_SEA : WATER_CLASS_INVALID); + if (IsTileType(t, MP_TREES)) SetWaterClass(t, GetTreeGround(t) == TREE_GROUND_SHORE ? WaterClass::Sea : WaterClass::Invalid); } } diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 5ed2a63111..83119a6d2e 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -195,7 +195,7 @@ void AfterLoadCompanyStats() case StationType::Dock: case StationType::Buoy: - if (GetWaterClass(tile) == WATER_CLASS_CANAL) { + if (GetWaterClass(tile) == WaterClass::Canal) { if (c != nullptr) c->infrastructure.water++; } break; @@ -210,7 +210,7 @@ void AfterLoadCompanyStats() c = Company::GetIfValid(GetTileOwner(tile)); if (c != nullptr) { if (IsShipDepot(tile)) c->infrastructure.water += LOCK_DEPOT_TILE_FACTOR; - if (IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE) { + if (IsLock(tile) && GetLockPart(tile) == LockPart::Middle) { /* The middle tile specifies the owner of the lock. */ c->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // the middle tile specifies the owner of the break; // do not count the middle tile as canal @@ -220,7 +220,7 @@ void AfterLoadCompanyStats() [[fallthrough]]; case MP_OBJECT: - if (GetWaterClass(tile) == WATER_CLASS_CANAL) { + if (GetWaterClass(tile) == WaterClass::Canal) { c = Company::GetIfValid(GetTileOwner(tile)); if (c != nullptr) c->infrastructure.water++; } diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index d051190046..7f0fa5b589 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -84,7 +84,7 @@ static void FixTTDMapArray() SetTileType(tile, MP_WATER); SetTileOwner(tile, OWNER_WATER); tile.m2() = 0; - tile.m3() = 2; // WATER_CLASS_RIVER + tile.m3() = 2; // WaterClass::River tile.m4() = Random(); tile.m5() = 0; } diff --git a/src/script/api/script_marine.cpp b/src/script/api/script_marine.cpp index e7525d1368..641007447b 100644 --- a/src/script/api/script_marine.cpp +++ b/src/script/api/script_marine.cpp @@ -25,7 +25,7 @@ { if (!::IsValidTile(tile)) return false; - return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WATER_TILE_DEPOT; + return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WaterTileType::Depot; } /* static */ bool ScriptMarine::IsDockTile(TileIndex tile) @@ -46,7 +46,7 @@ { if (!::IsValidTile(tile)) return false; - return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WATER_TILE_LOCK; + return ::IsTileType(tile, MP_WATER) && ::GetWaterTileType(tile) == WaterTileType::Lock; } /* static */ bool ScriptMarine::IsCanalTile(TileIndex tile) @@ -116,7 +116,7 @@ EnforceCompanyModeValid(false); EnforcePrecondition(false, ::IsValidTile(tile)); - return ScriptObject::Command::Do(tile, tile, WATER_CLASS_CANAL, false); + return ScriptObject::Command::Do(tile, tile, WaterClass::Canal, false); } /* static */ bool ScriptMarine::RemoveWaterDepot(TileIndex tile) diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index ec0abb12ce..8300b03c15 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -55,11 +55,11 @@ WaterClass GetEffectiveWaterClass(TileIndex tile) if (HasTileWaterClass(tile)) return GetWaterClass(tile); if (IsTileType(tile, MP_TUNNELBRIDGE)) { assert(GetTunnelBridgeTransportType(tile) == TRANSPORT_WATER); - return WATER_CLASS_CANAL; + return WaterClass::Canal; } if (IsTileType(tile, MP_RAILWAY)) { assert(GetRailGroundType(tile) == RailGroundType::HalfTileWater); - return WATER_CLASS_SEA; + return WaterClass::Sea; } NOT_REACHED(); } @@ -233,7 +233,7 @@ void Ship::UpdateCache() const ShipVehicleInfo *svi = ShipVehInfo(this->engine_type); /* Get speed fraction for the current water type. Aqueducts are always canals. */ - bool is_ocean = GetEffectiveWaterClass(this->tile) == WATER_CLASS_SEA; + bool is_ocean = GetEffectiveWaterClass(this->tile) == WaterClass::Sea; uint raw_speed = GetVehicleProperty(this, PROP_SHIP_SPEED, svi->max_speed); this->vcache.cached_max_speed = svi->ApplyWaterClassSpeedFrac(raw_speed, is_ocean); @@ -566,7 +566,7 @@ static const ShipSubcoordData _ship_subcoord[DIAGDIR_END][TRACK_END] = { static int ShipTestUpDownOnLock(const Ship *v) { /* Suitable tile? */ - if (!IsTileType(v->tile, MP_WATER) || !IsLock(v->tile) || GetLockPart(v->tile) != LOCK_PART_MIDDLE) return 0; + if (!IsTileType(v->tile, MP_WATER) || !IsLock(v->tile) || GetLockPart(v->tile) != LockPart::Middle) return 0; /* Must be at the centre of the lock */ if ((v->x_pos & 0xF) != 8 || (v->y_pos & 0xF) != 8) return 0; diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 80bd441074..c77f4c0440 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2702,7 +2702,7 @@ CommandCost CmdBuildAirport(DoCommandFlags flags, TileIndex tile, uint8_t airpor for (AirportTileTableIterator iter(as->layouts[layout].tiles, tile); iter != INVALID_TILE; ++iter) { Tile t(iter); - MakeAirport(t, st->owner, st->index, iter.GetStationGfx(), WATER_CLASS_INVALID); + MakeAirport(t, st->owner, st->index, iter.GetStationGfx(), WaterClass::Invalid); SetStationTileRandomBits(t, GB(Random(), 0, 4)); st->airport.Add(iter); @@ -2946,7 +2946,7 @@ CommandCost CmdBuildDock(DoCommandFlags flags, TileIndex tile, StationID station * This is needed as we've cleared that tile before. * Clearing object tiles may result in water tiles which are already accounted for in the water infrastructure total. * See: MakeWaterKeepingClass() */ - if (wc == WATER_CLASS_CANAL && !(HasTileWaterClass(flat_tile) && GetWaterClass(flat_tile) == WATER_CLASS_CANAL && IsTileOwner(flat_tile, _current_company))) { + if (wc == WaterClass::Canal && !(HasTileWaterClass(flat_tile) && GetWaterClass(flat_tile) == WaterClass::Canal && IsTileOwner(flat_tile, _current_company))) { Company::Get(st->owner)->infrastructure.water++; } Company::Get(st->owner)->infrastructure.station += 2; @@ -3357,8 +3357,8 @@ static void DrawTile_Station(TileInfo *ti) } else { assert(IsDock(ti->tile)); TileIndex water_tile = ti->tile + TileOffsByDiagDir(GetDockDirection(ti->tile)); - WaterClass wc = HasTileWaterClass(water_tile) ? GetWaterClass(water_tile) : WATER_CLASS_INVALID; - if (wc == WATER_CLASS_SEA) { + WaterClass wc = HasTileWaterClass(water_tile) ? GetWaterClass(water_tile) : WaterClass::Invalid; + if (wc == WaterClass::Sea) { DrawShoreTile(ti->tileh); } else { DrawClearLandTile(ti, 3); @@ -4748,7 +4748,7 @@ static void ChangeTileOwner_Station(TileIndex tile, Owner old_owner, Owner new_o case StationType::Buoy: case StationType::Dock: - if (GetWaterClass(tile) == WATER_CLASS_CANAL) { + if (GetWaterClass(tile) == WaterClass::Canal) { old_company->infrastructure.water--; new_company->infrastructure.water++; } diff --git a/src/station_map.h b/src/station_map.h index 19dc53b8e8..e1d67d952a 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -714,7 +714,7 @@ inline uint8_t GetStationTileRandomBits(Tile t) * @param section the StationGfx to be used for this tile * @param wc The water class of the station */ -inline void MakeStation(Tile t, Owner o, StationID sid, StationType st, uint8_t section, WaterClass wc = WATER_CLASS_INVALID) +inline void MakeStation(Tile t, Owner o, StationID sid, StationType st, uint8_t section, WaterClass wc = WaterClass::Invalid) { SetTileType(t, MP_STATION); SetTileOwner(t, o); diff --git a/src/table/water_land.h b/src/table/water_land.h index 2c32b972c6..014a4ea370 100644 --- a/src/table/water_land.h +++ b/src/table/water_land.h @@ -44,14 +44,14 @@ static const DrawTileSeqStruct _shipdepot_display_se_seq[] = { TILE_SEQ_LINE( 15, 0, 0, 1, 16, 0x14, 0xFE7 | (1 << PALETTE_MODIFIER_COLOUR)) }; -static const DrawTileSpriteSpan _shipdepot_display_data[][DEPOT_PART_END] = { +static const DrawTileSpriteSpan _shipdepot_display_data[][to_underlying(DepotPart::End)] = { { // AXIS_X - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_ne_seq) // DEPOT_PART_NORTH - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_sw_seq) // DEPOT_PART_SOUTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_ne_seq) // DepotPart::North + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_sw_seq) // DepotPart::South }, { // AXIS_Y - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_nw_seq) // DEPOT_PART_NORTH - TILE_SPRITE_LINE(0xFDD, _shipdepot_display_se_seq) // DEPOT_PART_SOUTH + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_nw_seq) // DepotPart::North + TILE_SPRITE_LINE(0xFDD, _shipdepot_display_se_seq) // DepotPart::South }, }; @@ -123,21 +123,21 @@ static const DrawTileSeqStruct _lock_display_upper_nw_seq[] = { }; static const DrawTileSpriteSpan _lock_display_data[][DIAGDIR_END] = { - { // LOCK_PART_MIDDLE + { // LockPart::Middle TILE_SPRITE_LINE(1, _lock_display_middle_ne_seq) // NE TILE_SPRITE_LINE(0, _lock_display_middle_se_seq) // SE TILE_SPRITE_LINE(2, _lock_display_middle_sw_seq) // SW TILE_SPRITE_LINE(3, _lock_display_middle_nw_seq) // NW }, - { // LOCK_PART_LOWER + { // LockPart::Lower TILE_SPRITE_LINE(0xFDD, _lock_display_lower_ne_seq) // NE TILE_SPRITE_LINE(0xFDD, _lock_display_lower_se_seq) // SE TILE_SPRITE_LINE(0xFDD, _lock_display_lower_sw_seq) // SW TILE_SPRITE_LINE(0xFDD, _lock_display_lower_nw_seq) // NW }, - { // LOCK_PART_UPPER + { // LockPart::Upper TILE_SPRITE_LINE(0xFDD, _lock_display_upper_ne_seq) // NE TILE_SPRITE_LINE(0xFDD, _lock_display_upper_se_seq) // SE TILE_SPRITE_LINE(0xFDD, _lock_display_upper_sw_seq) // SW diff --git a/src/tree_map.h b/src/tree_map.h index 782656876b..232ad7bd8f 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -146,7 +146,7 @@ inline void SetTreeGroundDensity(Tile t, TreeGround g, uint d) assert(IsTileType(t, MP_TREES)); // XXX incomplete SB(t.m2(), 4, 2, d); SB(t.m2(), 6, 3, g); - SetWaterClass(t, g == TREE_GROUND_SHORE ? WATER_CLASS_SEA : WATER_CLASS_INVALID); + SetWaterClass(t, g == TREE_GROUND_SHORE ? WaterClass::Sea : WaterClass::Invalid); } /** @@ -245,7 +245,7 @@ inline void MakeTree(Tile t, TreeType type, uint count, TreeGrowthStage growth, { SetTileType(t, MP_TREES); SetTileOwner(t, OWNER_NONE); - SetWaterClass(t, ground == TREE_GROUND_SHORE ? WATER_CLASS_SEA : WATER_CLASS_INVALID); + SetWaterClass(t, ground == TREE_GROUND_SHORE ? WaterClass::Sea : WaterClass::Invalid); t.m2() = ground << 6 | density << 4 | 0; t.m3() = type; t.m4() = 0 << 5 | 0 << 2; diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 42173d39b5..e4fed0a0c4 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1462,7 +1462,7 @@ static void DrawTile_TunnelBridge(TileInfo *ti) if (!HasTunnelBridgeSnowOrDesert(ti->tile)) { TileIndex next = ti->tile + TileOffsByDiagDir(tunnelbridge_direction); - if (ti->tileh != SLOPE_FLAT && ti->z == 0 && HasTileWaterClass(next) && GetWaterClass(next) == WATER_CLASS_SEA) { + if (ti->tileh != SLOPE_FLAT && ti->z == 0 && HasTileWaterClass(next) && GetWaterClass(next) == WaterClass::Sea) { DrawShoreTile(ti->tileh); } else { DrawClearLandTile(ti, 3); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index c25a120dc8..0068082155 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -151,14 +151,14 @@ CommandCost CmdBuildShipDepot(DoCommandFlags flags, TileIndex tile, Axis axis) /* Update infrastructure counts after the tile clears earlier. * Clearing object tiles may result in water tiles which are already accounted for in the water infrastructure total. * See: MakeWaterKeepingClass() */ - if (wc1 == WATER_CLASS_CANAL && !(HasTileWaterClass(tile) && GetWaterClass(tile) == WATER_CLASS_CANAL && IsTileOwner(tile, _current_company))) new_water_infra++; - if (wc2 == WATER_CLASS_CANAL && !(HasTileWaterClass(tile2) && GetWaterClass(tile2) == WATER_CLASS_CANAL && IsTileOwner(tile2, _current_company))) new_water_infra++; + if (wc1 == WaterClass::Canal && !(HasTileWaterClass(tile) && GetWaterClass(tile) == WaterClass::Canal && IsTileOwner(tile, _current_company))) new_water_infra++; + if (wc2 == WaterClass::Canal && !(HasTileWaterClass(tile2) && GetWaterClass(tile2) == WaterClass::Canal && IsTileOwner(tile2, _current_company))) new_water_infra++; Company::Get(_current_company)->infrastructure.water += new_water_infra; DirtyCompanyInfrastructureWindows(_current_company); - MakeShipDepot(tile, _current_company, depot->index, DEPOT_PART_NORTH, axis, wc1); - MakeShipDepot(tile2, _current_company, depot->index, DEPOT_PART_SOUTH, axis, wc2); + MakeShipDepot(tile, _current_company, depot->index, DepotPart::North, axis, wc1); + MakeShipDepot(tile2, _current_company, depot->index, DepotPart::South, axis, wc2); CheckForDockingTile(tile); CheckForDockingTile(tile2); MarkTileDirtyByTile(tile); @@ -174,7 +174,7 @@ bool IsPossibleDockingTile(Tile t) assert(IsValidTile(t)); switch (GetTileType(t)) { case MP_WATER: - if (IsLock(t) && GetLockPart(t) == LOCK_PART_MIDDLE) return false; + if (IsLock(t) && GetLockPart(t) == LockPart::Middle) return false; [[fallthrough]]; case MP_RAILWAY: case MP_STATION: @@ -223,7 +223,7 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o) auto [slope, z] = GetTileSlopeZ(tile); if (slope != SLOPE_FLAT) { - if (wc == WATER_CLASS_CANAL) { + if (wc == WaterClass::Canal) { /* If we clear the canal, we have to remove it from the infrastructure count as well. */ Company *c = Company::GetIfValid(o); if (c != nullptr) { @@ -231,16 +231,16 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o) DirtyCompanyInfrastructureWindows(c->index); } /* Sloped canals are locks and no natural water remains whatever the slope direction */ - wc = WATER_CLASS_INVALID; + wc = WaterClass::Invalid; } /* Only river water should be restored on appropriate slopes. Other water would be invalid on slopes */ - if (wc != WATER_CLASS_RIVER || GetInclinedSlopeDirection(slope) == INVALID_DIAGDIR) { - wc = WATER_CLASS_INVALID; + if (wc != WaterClass::River || GetInclinedSlopeDirection(slope) == INVALID_DIAGDIR) { + wc = WaterClass::Invalid; } } - if (wc == WATER_CLASS_SEA && z > 0) { + if (wc == WaterClass::Sea && z > 0) { /* Update company infrastructure count. */ Company *c = Company::GetIfValid(o); if (c != nullptr) { @@ -248,7 +248,7 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o) DirtyCompanyInfrastructureWindows(c->index); } - wc = WATER_CLASS_CANAL; + wc = WaterClass::Canal; } /* Zero map array and terminate animation */ @@ -256,13 +256,13 @@ void MakeWaterKeepingClass(TileIndex tile, Owner o) /* Maybe change to water */ switch (wc) { - case WATER_CLASS_SEA: MakeSea(tile); break; - case WATER_CLASS_CANAL: MakeCanal(tile, o, Random()); break; - case WATER_CLASS_RIVER: MakeRiver(tile, Random()); break; + case WaterClass::Sea: MakeSea(tile); break; + case WaterClass::Canal: MakeCanal(tile, o, Random()); break; + case WaterClass::River: MakeRiver(tile, Random()); break; default: break; } - if (wc != WATER_CLASS_INVALID) CheckForDockingTile(tile); + if (wc != WaterClass::Invalid) CheckForDockingTile(tile); MarkTileDirtyByTile(tile); } @@ -290,7 +290,7 @@ static CommandCost RemoveShipDepot(TileIndex tile, DoCommandFlags flags) Company *c = Company::GetIfValid(GetTileOwner(tile)); if (c != nullptr) { c->infrastructure.water -= 2 * LOCK_DEPOT_TILE_FACTOR; - if (do_clear && GetWaterClass(tile) == WATER_CLASS_CANAL) c->infrastructure.water--; + if (do_clear && GetWaterClass(tile) == WaterClass::Canal) c->infrastructure.water--; DirtyCompanyInfrastructureWindows(c->index); } @@ -308,10 +308,10 @@ static CommandCost RemoveShipDepot(TileIndex tile, DoCommandFlags flags) */ static uint8_t GetLockPartMinimalBridgeHeight(LockPart lock_part) { - static constexpr uint8_t MINIMAL_BRIDGE_HEIGHT[LOCK_PART_END] = { - 2, // LOCK_PART_MIDDLE - 3, // LOCK_PART_LOWER - 2, // LOCK_PART_UPPER + static constexpr uint8_t MINIMAL_BRIDGE_HEIGHT[to_underlying(LockPart::End)] = { + 2, // LockPart::Middle + 3, // LockPart::Lower + 2, // LockPart::Upper }; return MINIMAL_BRIDGE_HEIGHT[to_underlying(lock_part)]; } @@ -334,7 +334,7 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlags if (ret.Failed()) return ret; /* middle tile */ - WaterClass wc_middle = HasTileWaterGround(tile) ? GetWaterClass(tile) : WATER_CLASS_CANAL; + WaterClass wc_middle = HasTileWaterGround(tile) ? GetWaterClass(tile) : WaterClass::Canal; ret = Command::Do(flags, tile); if (ret.Failed()) return ret; cost.AddCost(ret.GetCost()); @@ -349,7 +349,7 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlags if (!IsTileFlat(tile - delta)) { return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); } - WaterClass wc_lower = IsWaterTile(tile - delta) ? GetWaterClass(tile - delta) : WATER_CLASS_CANAL; + WaterClass wc_lower = IsWaterTile(tile - delta) ? GetWaterClass(tile - delta) : WaterClass::Canal; /* upper tile */ if (!IsWaterTile(tile + delta)) { @@ -361,9 +361,9 @@ static CommandCost DoBuildLock(TileIndex tile, DiagDirection dir, DoCommandFlags if (!IsTileFlat(tile + delta)) { return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); } - WaterClass wc_upper = IsWaterTile(tile + delta) ? GetWaterClass(tile + delta) : WATER_CLASS_CANAL; + WaterClass wc_upper = IsWaterTile(tile + delta) ? GetWaterClass(tile + delta) : WaterClass::Canal; - for (LockPart lock_part = LOCK_PART_MIDDLE; TileIndex t : {tile, tile - delta, tile + delta}) { + for (LockPart lock_part = LockPart::Middle; TileIndex t : {tile, tile - delta, tile + delta}) { if (IsBridgeAbove(t) && GetBridgeHeight(GetSouthernBridgeEnd(t)) < GetTileMaxZ(t) + GetLockPartMinimalBridgeHeight(lock_part)) { int height_diff = (GetTileMaxZ(tile) + GetLockPartMinimalBridgeHeight(lock_part) - GetBridgeHeight(GetSouthernBridgeEnd(t))) * TILE_HEIGHT_STEP; return CommandCostWithParam(STR_ERROR_BRIDGE_TOO_LOW_FOR_LOCK, height_diff); @@ -428,7 +428,7 @@ static CommandCost RemoveLock(TileIndex tile, DoCommandFlags flags) DirtyCompanyInfrastructureWindows(c->index); } - if (GetWaterClass(tile) == WATER_CLASS_RIVER) { + if (GetWaterClass(tile) == WaterClass::River) { MakeRiver(tile, Random()); } else { DoClearSquare(tile); @@ -494,7 +494,7 @@ CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_ if (start_tile >= Map::Size() || !IsValidWaterClass(wc)) return CMD_ERROR; /* Outside of the editor you can only build canals, not oceans */ - if (wc != WATER_CLASS_CANAL && _game_mode != GM_EDITOR) return CMD_ERROR; + if (wc != WaterClass::Canal && _game_mode != GM_EDITOR) return CMD_ERROR; CommandCost cost(EXPENSES_CONSTRUCTION); @@ -504,7 +504,7 @@ CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_ CommandCost ret; Slope slope = GetTileSlope(current_tile); - if (slope != SLOPE_FLAT && (wc != WATER_CLASS_RIVER || !IsInclinedSlope(slope))) { + if (slope != SLOPE_FLAT && (wc != WaterClass::River || !IsInclinedSlope(slope))) { return CommandCost(STR_ERROR_FLAT_LAND_REQUIRED); } @@ -528,7 +528,7 @@ CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_ } switch (wc) { - case WATER_CLASS_RIVER: + case WaterClass::River: MakeRiver(current_tile, Random()); if (_game_mode == GM_EDITOR) { /* Remove desert directly around the river tile. */ @@ -538,7 +538,7 @@ CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_ } break; - case WATER_CLASS_SEA: + case WaterClass::Sea: if (TileHeight(current_tile) == 0) { MakeSea(current_tile); break; @@ -572,7 +572,7 @@ CommandCost CmdBuildCanal(DoCommandFlags flags, TileIndex tile, TileIndex start_ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlags flags) { switch (GetWaterTileType(tile)) { - case WATER_TILE_CLEAR: { + case WaterTileType::Clear: { if (flags.Test(DoCommandFlag::NoWater)) return CommandCost(STR_ERROR_CAN_T_BUILD_ON_WATER); Money base_cost = IsCanal(tile) ? _price[PR_CLEAR_CANAL] : _price[PR_CLEAR_WATER]; @@ -605,7 +605,7 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlags flags) return CommandCost(EXPENSES_CONSTRUCTION, base_cost); } - case WATER_TILE_COAST: { + case WaterTileType::Coast: { Slope slope = GetTileSlope(tile); /* Make sure no vehicle is on the tile */ @@ -624,21 +624,21 @@ static CommandCost ClearTile_Water(TileIndex tile, DoCommandFlags flags) } } - case WATER_TILE_LOCK: { - static const TileIndexDiffC _lock_tomiddle_offs[][DIAGDIR_END] = { + case WaterTileType::Lock: { + static const TileIndexDiffC _lock_tomiddle_offs[to_underlying(LockPart::End)][DIAGDIR_END] = { /* NE SE SW NW */ - { { 0, 0}, {0, 0}, { 0, 0}, {0, 0} }, // LOCK_PART_MIDDLE - { {-1, 0}, {0, 1}, { 1, 0}, {0, -1} }, // LOCK_PART_LOWER - { { 1, 0}, {0, -1}, {-1, 0}, {0, 1} }, // LOCK_PART_UPPER + { { 0, 0}, {0, 0}, { 0, 0}, {0, 0} }, // LockPart::Middle + { {-1, 0}, {0, 1}, { 1, 0}, {0, -1} }, // LockPart::Lower + { { 1, 0}, {0, -1}, {-1, 0}, {0, 1} }, // LockPart::Upper }; if (flags.Test(DoCommandFlag::Auto)) return CommandCost(STR_ERROR_BUILDING_MUST_BE_DEMOLISHED); if (_current_company == OWNER_WATER) return CMD_ERROR; /* move to the middle tile.. */ - return RemoveLock(tile + ToTileIndexDiff(_lock_tomiddle_offs[GetLockPart(tile)][GetLockDirection(tile)]), flags); + return RemoveLock(tile + ToTileIndexDiff(_lock_tomiddle_offs[to_underlying(GetLockPart(tile))][GetLockDirection(tile)]), flags); } - case WATER_TILE_DEPOT: + case WaterTileType::Depot: if (flags.Test(DoCommandFlag::Auto)) return CommandCost(STR_ERROR_BUILDING_MUST_BE_DEMOLISHED); return RemoveShipDepot(tile, flags); @@ -661,10 +661,10 @@ bool IsWateredTile(TileIndex tile, Direction from) case MP_WATER: switch (GetWaterTileType(tile)) { default: NOT_REACHED(); - case WATER_TILE_DEPOT: case WATER_TILE_CLEAR: return true; - case WATER_TILE_LOCK: return DiagDirToAxis(GetLockDirection(tile)) == DiagDirToAxis(DirToDiagDir(from)); + case WaterTileType::Depot: case WaterTileType::Clear: return true; + case WaterTileType::Lock: return DiagDirToAxis(GetLockDirection(tile)) == DiagDirToAxis(DirToDiagDir(from)); - case WATER_TILE_COAST: + case WaterTileType::Coast: switch (GetTileSlope(tile)) { case SLOPE_W: return (from == DIR_SE) || (from == DIR_E) || (from == DIR_NE); case SLOPE_S: return (from == DIR_NE) || (from == DIR_N) || (from == DIR_NW); @@ -839,8 +839,8 @@ static void DrawWaterTileStruct(const TileInfo *ti, std::spantile); - const DrawTileSprites &dts = _lock_display_data[part][GetLockDirection(ti->tile)]; + LockPart part = GetLockPart(ti->tile); + const DrawTileSprites &dts = _lock_display_data[to_underlying(part)][GetLockDirection(ti->tile)]; /* Draw ground sprite. */ SpriteID image = dts.ground.sprite; @@ -868,7 +868,7 @@ static void DrawWaterLock(const TileInfo *ti) if (base == 0) { /* If no custom graphics, use defaults. */ base = SPR_LOCK_BASE; - uint8_t z_threshold = part == LOCK_PART_UPPER ? 8 : 0; + uint8_t z_threshold = part == LockPart::Upper ? 8 : 0; zoffs = ti->z > z_threshold ? 24 : 0; } @@ -879,7 +879,7 @@ static void DrawWaterLock(const TileInfo *ti) static void DrawWaterDepot(const TileInfo *ti) { DrawWaterClassGround(ti); - DrawWaterTileStruct(ti, _shipdepot_display_data[GetShipDepotAxis(ti->tile)][GetShipDepotPart(ti->tile)].seq, 0, 0, GetCompanyPalette(GetTileOwner(ti->tile)), CF_END); + DrawWaterTileStruct(ti, _shipdepot_display_data[GetShipDepotAxis(ti->tile)][to_underlying(GetShipDepotPart(ti->tile))].seq, 0, 0, GetCompanyPalette(GetTileOwner(ti->tile)), CF_END); } static void DrawRiverWater(const TileInfo *ti) @@ -940,9 +940,9 @@ void DrawShoreTile(Slope tileh) void DrawWaterClassGround(const TileInfo *ti) { switch (GetWaterClass(ti->tile)) { - case WATER_CLASS_SEA: DrawSeaWater(ti->tile); break; - case WATER_CLASS_CANAL: DrawCanalWater(ti->tile); break; - case WATER_CLASS_RIVER: DrawRiverWater(ti); break; + case WaterClass::Sea: DrawSeaWater(ti->tile); break; + case WaterClass::Canal: DrawCanalWater(ti->tile); break; + case WaterClass::River: DrawRiverWater(ti); break; default: NOT_REACHED(); } } @@ -950,27 +950,27 @@ void DrawWaterClassGround(const TileInfo *ti) static void DrawTile_Water(TileInfo *ti) { switch (GetWaterTileType(ti->tile)) { - case WATER_TILE_CLEAR: + case WaterTileType::Clear: DrawWaterClassGround(ti); /* A plain water tile can be traversed in any direction, so setting blocked pillars here would mean all bridges * with edges would have no pillars above water. Instead prefer current behaviour of ships passing through. */ DrawBridgeMiddle(ti, {}); break; - case WATER_TILE_COAST: { + case WaterTileType::Coast: { DrawShoreTile(ti->tileh); DrawBridgeMiddle(ti, {}); break; } - case WATER_TILE_LOCK: + case WaterTileType::Lock: DrawWaterLock(ti); DrawBridgeMiddle(ti, DiagDirToAxis(GetLockDirection(ti->tile)) == AXIS_X ? BridgePillarFlags{BridgePillarFlag::EdgeNE, BridgePillarFlag::EdgeSW} : BridgePillarFlags{BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}); break; - case WATER_TILE_DEPOT: + case WaterTileType::Depot: DrawWaterDepot(ti); break; } @@ -978,7 +978,7 @@ static void DrawTile_Water(TileInfo *ti) void DrawShipDepotSprite(int x, int y, Axis axis, DepotPart part) { - const DrawTileSprites &dts = _shipdepot_display_data[axis][part]; + const DrawTileSprites &dts = _shipdepot_display_data[axis][to_underlying(part)]; DrawSprite(dts.ground.sprite, dts.ground.pal, x, y); DrawOrigTileSeqInGUI(x, y, &dts, GetCompanyPalette(_local_company)); @@ -1000,17 +1000,17 @@ static Foundation GetFoundation_Water(TileIndex, Slope) static void GetTileDesc_Water(TileIndex tile, TileDesc &td) { switch (GetWaterTileType(tile)) { - case WATER_TILE_CLEAR: + case WaterTileType::Clear: switch (GetWaterClass(tile)) { - case WATER_CLASS_SEA: td.str = STR_LAI_WATER_DESCRIPTION_WATER; break; - case WATER_CLASS_CANAL: td.str = STR_LAI_WATER_DESCRIPTION_CANAL; break; - case WATER_CLASS_RIVER: td.str = STR_LAI_WATER_DESCRIPTION_RIVER; break; + case WaterClass::Sea: td.str = STR_LAI_WATER_DESCRIPTION_WATER; break; + case WaterClass::Canal: td.str = STR_LAI_WATER_DESCRIPTION_CANAL; break; + case WaterClass::River: td.str = STR_LAI_WATER_DESCRIPTION_RIVER; break; default: NOT_REACHED(); } break; - case WATER_TILE_COAST: td.str = STR_LAI_WATER_DESCRIPTION_COAST_OR_RIVERBANK; break; - case WATER_TILE_LOCK : td.str = STR_LAI_WATER_DESCRIPTION_LOCK; break; - case WATER_TILE_DEPOT: + case WaterTileType::Coast: td.str = STR_LAI_WATER_DESCRIPTION_COAST_OR_RIVERBANK; break; + case WaterTileType::Lock : td.str = STR_LAI_WATER_DESCRIPTION_LOCK; break; + case WaterTileType::Depot: td.str = STR_LAI_WATER_DESCRIPTION_SHIP_DEPOT; td.build_date = Depot::GetByTile(tile)->build_date; break; @@ -1129,7 +1129,7 @@ FloodingBehaviour GetFloodingBehaviour(TileIndex tile) case MP_STATION: case MP_INDUSTRY: case MP_OBJECT: - return (GetWaterClass(tile) == WATER_CLASS_SEA) ? FLOOD_ACTIVE : FLOOD_NONE; + return (GetWaterClass(tile) == WaterClass::Sea) ? FLOOD_ACTIVE : FLOOD_NONE; case MP_RAILWAY: if (GetRailGroundType(tile) == RailGroundType::HalfTileWater) { @@ -1366,10 +1366,10 @@ static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, if (mode != TRANSPORT_WATER) return 0; switch (GetWaterTileType(tile)) { - case WATER_TILE_CLEAR: ts = IsTileFlat(tile) ? TRACK_BIT_ALL : TRACK_BIT_NONE; break; - case WATER_TILE_COAST: ts = coast_tracks[GetTileSlope(tile) & 0xF]; break; - case WATER_TILE_LOCK: ts = DiagDirToDiagTrackBits(GetLockDirection(tile)); break; - case WATER_TILE_DEPOT: ts = AxisToTrackBits(GetShipDepotAxis(tile)); break; + case WaterTileType::Clear: ts = IsTileFlat(tile) ? TRACK_BIT_ALL : TRACK_BIT_NONE; break; + case WaterTileType::Coast: ts = coast_tracks[GetTileSlope(tile) & 0xF]; break; + case WaterTileType::Lock: ts = DiagDirToDiagTrackBits(GetLockDirection(tile)); break; + case WaterTileType::Depot: ts = AxisToTrackBits(GetShipDepotAxis(tile)); break; default: return 0; } if (TileX(tile) == 0) { @@ -1385,7 +1385,7 @@ static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, static bool ClickTile_Water(TileIndex tile) { - if (GetWaterTileType(tile) == WATER_TILE_DEPOT) { + if (GetWaterTileType(tile) == WaterTileType::Depot) { ShowDepotWindow(GetShipDepotNorthTile(tile), VEH_SHIP); return true; } @@ -1396,7 +1396,7 @@ static void ChangeTileOwner_Water(TileIndex tile, Owner old_owner, Owner new_own { if (!IsTileOwner(tile, old_owner)) return; - bool is_lock_middle = IsLock(tile) && GetLockPart(tile) == LOCK_PART_MIDDLE; + bool is_lock_middle = IsLock(tile) && GetLockPart(tile) == LockPart::Middle; /* No need to dirty company windows here, we'll redraw the whole screen anyway. */ if (is_lock_middle) Company::Get(old_owner)->infrastructure.water -= 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts. @@ -1404,7 +1404,7 @@ static void ChangeTileOwner_Water(TileIndex tile, Owner old_owner, Owner new_own if (is_lock_middle) Company::Get(new_owner)->infrastructure.water += 3 * LOCK_DEPOT_TILE_FACTOR; // Lock has three parts. /* Only subtract from the old owner here if the new owner is valid, * otherwise we clear ship depots and canal water below. */ - if (GetWaterClass(tile) == WATER_CLASS_CANAL && !is_lock_middle) { + if (GetWaterClass(tile) == WaterClass::Canal && !is_lock_middle) { Company::Get(old_owner)->infrastructure.water--; Company::Get(new_owner)->infrastructure.water++; } @@ -1423,7 +1423,7 @@ static void ChangeTileOwner_Water(TileIndex tile, Owner old_owner, Owner new_own /* Set owner of canals and locks ... and also canal under dock there was before. * Check if the new owner after removing depot isn't OWNER_WATER. */ if (IsTileOwner(tile, old_owner)) { - if (GetWaterClass(tile) == WATER_CLASS_CANAL && !is_lock_middle) Company::Get(old_owner)->infrastructure.water--; + if (GetWaterClass(tile) == WaterClass::Canal && !is_lock_middle) Company::Get(old_owner)->infrastructure.water--; SetTileOwner(tile, OWNER_NONE); } } diff --git a/src/water_map.h b/src/water_map.h index 7f8471c00d..2dd6192ce1 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -28,19 +28,19 @@ static constexpr uint8_t WBL_DEPOT_PART = 0; ///< Depot part flag. static constexpr uint8_t WBL_DEPOT_AXIS = 1; ///< Depot axis flag. /** Available water tile types. */ -enum WaterTileType : uint8_t { - WATER_TILE_CLEAR, ///< Plain water. - WATER_TILE_COAST, ///< Coast. - WATER_TILE_LOCK, ///< Water lock. - WATER_TILE_DEPOT, ///< Water Depot. +enum class WaterTileType : uint8_t { + Clear = 0, ///< Plain water. + Coast = 1, ///< Coast. + Lock = 2, ///< Water lock. + Depot = 3, ///< Water Depot. }; -/** classes of water (for #WATER_TILE_CLEAR water tile type). */ -enum WaterClass : uint8_t { - WATER_CLASS_SEA, ///< Sea. - WATER_CLASS_CANAL, ///< Canal. - WATER_CLASS_RIVER, ///< River. - WATER_CLASS_INVALID, ///< Used for industry tiles on land (also for oilrig if newgrf says so). +/** classes of water (for #WaterTileType::Clear water tile type). */ +enum class WaterClass : uint8_t { + Sea = 0, ///< Sea. + Canal = 1, ///< Canal. + River = 2, ///< River. + Invalid = 3, ///< Used for industry tiles on land (also for oilrig if newgrf says so). }; /** @@ -51,22 +51,22 @@ enum WaterClass : uint8_t { */ inline bool IsValidWaterClass(WaterClass wc) { - return wc < WATER_CLASS_INVALID; + return wc < WaterClass::Invalid; } /** Sections of the water depot. */ -enum DepotPart : uint8_t { - DEPOT_PART_NORTH = 0, ///< Northern part of a depot. - DEPOT_PART_SOUTH = 1, ///< Southern part of a depot. - DEPOT_PART_END +enum class DepotPart : uint8_t { + North = 0, ///< Northern part of a depot. + South = 1, ///< Southern part of a depot. + End, }; /** Sections of the water lock. */ -enum LockPart : uint8_t { - LOCK_PART_MIDDLE = 0, ///< Middle part of a lock. - LOCK_PART_LOWER = 1, ///< Lower part of a lock. - LOCK_PART_UPPER = 2, ///< Upper part of a lock. - LOCK_PART_END, +enum class LockPart : uint8_t { + Middle = 0, ///< Middle part of a lock. + Lower = 1, ///< Lower part of a lock. + Upper = 2, ///< Upper part of a lock. + End, }; DECLARE_INCREMENT_DECREMENT_OPERATORS(LockPart); @@ -114,7 +114,7 @@ inline bool HasTileWaterClass(Tile t) inline WaterClass GetWaterClass(Tile t) { assert(HasTileWaterClass(t)); - return (WaterClass)GB(t.m1(), 5, 2); + return static_cast(GB(t.m1(), 5, 2)); } /** @@ -126,7 +126,7 @@ inline WaterClass GetWaterClass(Tile t) inline void SetWaterClass(Tile t, WaterClass wc) { assert(HasTileWaterClass(t)); - SB(t.m1(), 5, 2, wc); + SB(t.m1(), 5, 2, to_underlying(wc)); } /** @@ -137,7 +137,7 @@ inline void SetWaterClass(Tile t, WaterClass wc) */ inline bool IsTileOnWater(Tile t) { - return (GetWaterClass(t) != WATER_CLASS_INVALID); + return (GetWaterClass(t) != WaterClass::Invalid); } /** @@ -148,7 +148,7 @@ inline bool IsTileOnWater(Tile t) */ inline bool IsWater(Tile t) { - return GetWaterTileType(t) == WATER_TILE_CLEAR; + return GetWaterTileType(t) == WaterTileType::Clear; } /** @@ -159,7 +159,7 @@ inline bool IsWater(Tile t) */ inline bool IsSea(Tile t) { - return IsWater(t) && GetWaterClass(t) == WATER_CLASS_SEA; + return IsWater(t) && GetWaterClass(t) == WaterClass::Sea; } /** @@ -170,7 +170,7 @@ inline bool IsSea(Tile t) */ inline bool IsCanal(Tile t) { - return IsWater(t) && GetWaterClass(t) == WATER_CLASS_CANAL; + return IsWater(t) && GetWaterClass(t) == WaterClass::Canal; } /** @@ -181,7 +181,7 @@ inline bool IsCanal(Tile t) */ inline bool IsRiver(Tile t) { - return IsWater(t) && GetWaterClass(t) == WATER_CLASS_RIVER; + return IsWater(t) && GetWaterClass(t) == WaterClass::River; } /** @@ -202,7 +202,7 @@ inline bool IsWaterTile(Tile t) */ inline bool IsCoast(Tile t) { - return GetWaterTileType(t) == WATER_TILE_COAST; + return GetWaterTileType(t) == WaterTileType::Coast; } /** @@ -212,7 +212,7 @@ inline bool IsCoast(Tile t) */ inline bool IsCoastTile(Tile t) { - return (IsTileType(t, MP_WATER) && IsCoast(t)) || (IsTileType(t, MP_TREES) && GetWaterClass(t) != WATER_CLASS_INVALID); + return (IsTileType(t, MP_WATER) && IsCoast(t)) || (IsTileType(t, MP_TREES) && GetWaterClass(t) != WaterClass::Invalid); } /** @@ -223,7 +223,7 @@ inline bool IsCoastTile(Tile t) */ inline bool IsShipDepot(Tile t) { - return GetWaterTileType(t) == WATER_TILE_DEPOT; + return GetWaterTileType(t) == WaterTileType::Depot; } /** @@ -257,7 +257,7 @@ inline Axis GetShipDepotAxis(Tile t) inline DepotPart GetShipDepotPart(Tile t) { assert(IsShipDepotTile(t)); - return (DepotPart)GB(t.m5(), WBL_DEPOT_PART, 1); + return static_cast(GB(t.m5(), WBL_DEPOT_PART, 1)); } /** @@ -268,7 +268,7 @@ inline DepotPart GetShipDepotPart(Tile t) */ inline DiagDirection GetShipDepotDirection(Tile t) { - return XYNSToDiagDir(GetShipDepotAxis(t), GetShipDepotPart(t)); + return XYNSToDiagDir(GetShipDepotAxis(t), to_underlying(GetShipDepotPart(t))); } /** @@ -279,7 +279,7 @@ inline DiagDirection GetShipDepotDirection(Tile t) */ inline TileIndex GetOtherShipDepotTile(Tile t) { - return TileIndex(t) + (GetShipDepotPart(t) != DEPOT_PART_NORTH ? -1 : 1) * TileOffsByAxis(GetShipDepotAxis(t)); + return TileIndex(t) + (GetShipDepotPart(t) != DepotPart::North ? -1 : 1) * TileOffsByAxis(GetShipDepotAxis(t)); } /** @@ -304,7 +304,7 @@ inline TileIndex GetShipDepotNorthTile(Tile t) */ inline bool IsLock(Tile t) { - return GetWaterTileType(t) == WATER_TILE_LOCK; + return GetWaterTileType(t) == WaterTileType::Lock; } /** @@ -384,13 +384,13 @@ inline void MakeShore(Tile t) { SetTileType(t, MP_WATER); SetTileOwner(t, OWNER_WATER); - SetWaterClass(t, WATER_CLASS_SEA); + SetWaterClass(t, WaterClass::Sea); SetDockingTile(t, false); t.m2() = 0; t.m3() = 0; t.m4() = 0; t.m5() = 0; - SetWaterTileType(t, WATER_TILE_COAST); + SetWaterTileType(t, WaterTileType::Coast); SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; @@ -413,7 +413,7 @@ inline void MakeWater(Tile t, Owner o, WaterClass wc, uint8_t random_bits) t.m3() = 0; t.m4() = random_bits; t.m5() = 0; - SetWaterTileType(t, WATER_TILE_CLEAR); + SetWaterTileType(t, WaterTileType::Clear); SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; @@ -425,7 +425,7 @@ inline void MakeWater(Tile t, Owner o, WaterClass wc, uint8_t random_bits) */ inline void MakeSea(Tile t) { - MakeWater(t, OWNER_WATER, WATER_CLASS_SEA, 0); + MakeWater(t, OWNER_WATER, WaterClass::Sea, 0); } /** @@ -435,7 +435,7 @@ inline void MakeSea(Tile t) */ inline void MakeRiver(Tile t, uint8_t random_bits) { - MakeWater(t, OWNER_WATER, WATER_CLASS_RIVER, random_bits); + MakeWater(t, OWNER_WATER, WaterClass::River, random_bits); } /** @@ -447,7 +447,7 @@ inline void MakeRiver(Tile t, uint8_t random_bits) inline void MakeCanal(Tile t, Owner o, uint8_t random_bits) { assert(o != OWNER_WATER); - MakeWater(t, o, WATER_CLASS_CANAL, random_bits); + MakeWater(t, o, WaterClass::Canal, random_bits); } /** @@ -455,7 +455,7 @@ inline void MakeCanal(Tile t, Owner o, uint8_t random_bits) * @param t Tile to place the ship depot section. * @param o Owner of the depot. * @param did Depot ID. - * @param part Depot part (either #DEPOT_PART_NORTH or #DEPOT_PART_SOUTH). + * @param part Depot part (either #DepotPart::North or #DepotPart::South). * @param a Axis of the depot. * @param original_water_class Original water class. */ @@ -468,8 +468,8 @@ inline void MakeShipDepot(Tile t, Owner o, DepotID did, DepotPart part, Axis a, t.m2() = did.base(); t.m3() = 0; t.m4() = 0; - t.m5() = part << WBL_DEPOT_PART | a << WBL_DEPOT_AXIS; - SetWaterTileType(t, WATER_TILE_DEPOT); + t.m5() = to_underlying(part) << WBL_DEPOT_PART | a << WBL_DEPOT_AXIS; + SetWaterTileType(t, WaterTileType::Depot); SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; @@ -493,8 +493,8 @@ inline void MakeLockTile(Tile t, Owner o, LockPart part, DiagDirection dir, Wate t.m2() = 0; t.m3() = 0; t.m4() = 0; - t.m5() = part << WBL_LOCK_PART_BEGIN | dir << WBL_LOCK_ORIENT_BEGIN; - SetWaterTileType(t, WATER_TILE_LOCK); + t.m5() = to_underlying(part) << WBL_LOCK_PART_BEGIN | dir << WBL_LOCK_ORIENT_BEGIN; + SetWaterTileType(t, WaterTileType::Lock); SB(t.m6(), 2, 6, 0); t.m7() = 0; t.m8() = 0; @@ -517,9 +517,9 @@ inline void MakeLock(Tile t, Owner o, DiagDirection d, WaterClass wc_lower, Wate /* Keep the current waterclass and owner for the tiles. * It allows to restore them after the lock is deleted */ - MakeLockTile(t, o, LOCK_PART_MIDDLE, d, wc_middle); - MakeLockTile(lower_tile, IsWaterTile(lower_tile) ? GetTileOwner(lower_tile) : o, LOCK_PART_LOWER, d, wc_lower); - MakeLockTile(upper_tile, IsWaterTile(upper_tile) ? GetTileOwner(upper_tile) : o, LOCK_PART_UPPER, d, wc_upper); + MakeLockTile(t, o, LockPart::Middle, d, wc_middle); + MakeLockTile(lower_tile, IsWaterTile(lower_tile) ? GetTileOwner(lower_tile) : o, LockPart::Lower, d, wc_lower); + MakeLockTile(upper_tile, IsWaterTile(upper_tile) ? GetTileOwner(upper_tile) : o, LockPart::Upper, d, wc_upper); } /** From 9237685f4cbf7960e33eed4faf54ad83c1711096 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 20 Nov 2025 22:12:10 +0000 Subject: [PATCH 209/280] Fix #14794: Default railtype missing for some NewGRF rail vehicles. (#14795) --- src/engine_type.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine_type.h b/src/engine_type.h index 640a99b73f..2db0b9d23e 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -75,8 +75,8 @@ struct RailVehicleInfo { uint8_t image_index = 0; RailVehicleTypes railveh_type = RAILVEH_WAGON; uint8_t cost_factor = 0; ///< Purchase cost factor; For multiheaded engines the sum of both engine prices. - RailTypes railtypes{}; ///< Railtypes, mangled if elrail is disabled. - RailTypes intended_railtypes{}; ///< Intended railtypes, regardless of elrail being enabled or disabled. + RailTypes railtypes{RAILTYPE_RAIL}; ///< Railtypes, mangled if elrail is disabled. + RailTypes intended_railtypes{RAILTYPE_RAIL}; ///< Intended railtypes, regardless of elrail being enabled or disabled. uint8_t ai_passenger_only = 0; ///< Bit value to tell AI that this engine is for passenger use only uint16_t max_speed = 0; ///< Maximum speed (1 unit = 1/1.6 mph = 1 km-ish/h) uint16_t power = 0; ///< Power of engine (hp); For multiheaded engines the sum of both engine powers. From 821a496495d4d59346390a92bd65dea52fd6a102 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 21 Nov 2025 17:26:12 +0000 Subject: [PATCH 210/280] Codefix 0455627d16: Don't make temporary copies of order when converting old orders. (#14808) --- src/saveload/order_sl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 2e1ecaea76..da1c0983e1 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -191,7 +191,7 @@ struct ORDRChunkHandler : ChunkHandler { /* Update all the next pointer. The orders were built like this: * While the order is valid, the previous order will get its next pointer set */ - for (uint32_t num = 1; OldOrderSaveLoadItem item : _old_order_saveload_pool) { + for (uint32_t num = 1; const OldOrderSaveLoadItem &item : _old_order_saveload_pool) { if (!item.order.IsType(OT_NOTHING) && num > 1) { OldOrderSaveLoadItem *prev = GetOldOrder(num - 1); if (prev != nullptr) prev->next = num; From f3b24d51c388db04d0348bb9ab5ef30fdad54917 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 22 Nov 2025 12:15:14 +0000 Subject: [PATCH 211/280] Fix ed67aedabf: Saved default houses had incorrect class and index information. (#14812) Saved default houses would not appear properly in the 'Saved' tab after restarting the game. --- src/picker_gui.h | 4 ++-- src/town_gui.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/picker_gui.h b/src/picker_gui.h index 74489c8494..7d11f51637 100644 --- a/src/picker_gui.h +++ b/src/picker_gui.h @@ -136,9 +136,9 @@ public: for (const auto &item : src) { const auto *spec = T::GetByGrf(item.grfid, item.local_id); if (spec == nullptr) { - dst.insert({item.grfid, item.local_id, -1, -1}); + dst.emplace(item.grfid, item.local_id, -1, -1); } else { - dst.insert(GetPickerItem(spec)); + dst.emplace(GetPickerItem(spec)); } } return dst; diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 492d6e75f3..ea953c974b 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1588,16 +1588,19 @@ public: std::set dst; for (const auto &item : src) { if (item.grfid == 0) { - dst.insert(item); + const HouseSpec *hs = HouseSpec::Get(item.local_id); + if (hs == nullptr) continue; + int class_index = GetClassIdFromHouseZone(hs->building_availability); + dst.emplace(item.grfid, item.local_id, class_index, item.local_id); } else { /* Search for spec by grfid and local index. */ auto it = std::ranges::find_if(specs, [&item](const HouseSpec &spec) { return spec.grf_prop.grfid == item.grfid && spec.grf_prop.local_id == item.local_id; }); if (it == specs.end()) { /* Not preset, hide from UI. */ - dst.insert({item.grfid, item.local_id, -1, -1}); + dst.emplace(item.grfid, item.local_id, -1, -1); } else { int class_index = GetClassIdFromHouseZone(it->building_availability); - dst.insert( {item.grfid, item.local_id, class_index, it->Index()}); + dst.emplace(item.grfid, item.local_id, class_index, it->Index()); } } } From e8dbd3aad297a18670c70560628f1d5c74670a28 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 22 Nov 2025 12:31:08 +0000 Subject: [PATCH 212/280] Change: Add debug messages for errors encountered reading sounds. (#14810) --- src/soundloader_opus.cpp | 17 ++++++++++++++--- src/soundloader_wav.cpp | 23 ++++++++++++++++++----- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/soundloader_opus.cpp b/src/soundloader_opus.cpp index 79252641cf..9e1860f3be 100644 --- a/src/soundloader_opus.cpp +++ b/src/soundloader_opus.cpp @@ -9,6 +9,7 @@ #include "stdafx.h" +#include "debug.h" #include "misc/autorelease.hpp" #include "random_access_file_type.h" #include "sound_type.h" @@ -54,7 +55,10 @@ public: int error = 0; auto of = AutoRelease(op_open_memory(tmp.data(), tmp.size(), &error)); - if (error != 0) return false; + if (error != 0) { + Debug(grf, 0, "SoundLoader_Opus: Unable to open stream."); + return false; + } size_t datapos = 0; for (;;) { @@ -64,8 +68,15 @@ public: int read = op_read(of.get(), reinterpret_cast(&data[datapos]), DECODE_BUFFER_BYTES, &link_index); if (read == 0) break; - if (read < 0 || op_channel_count(of.get(), link_index) != 1) { - /* Error reading, or incorrect channel count. */ + if (read < 0) { + Debug(grf, 0, "SoundLoader_Opus: Unexpected end of stream."); + data.clear(); + return false; + } + + int channels = op_channel_count(of.get(), link_index); + if (channels != 1) { + Debug(grf, 0, "SoundLoader_Opus: Unsupported channels {}, expected 1.", channels); data.clear(); return false; } diff --git a/src/soundloader_wav.cpp b/src/soundloader_wav.cpp index 72dbf0a056..77db237034 100644 --- a/src/soundloader_wav.cpp +++ b/src/soundloader_wav.cpp @@ -8,8 +8,8 @@ /** @file soundloader_wav.cpp Loading of wav sounds. */ #include "stdafx.h" -#include "core/bitmath_func.hpp" #include "core/math_func.hpp" +#include "debug.h" #include "random_access_file_type.h" #include "sound_type.h" #include "soundloader_type.h" @@ -39,10 +39,16 @@ public: if (tag == std::byteswap('fmt ')) { uint16_t format = file.ReadWord(); - if (format != 1) return false; // File must be uncompressed PCM + if (format != 1) { + Debug(grf, 0, "SoundLoader_Wav: Unsupported format {}, expected 1 (uncompressed PCM).", format); + return false; + } sound.channels = file.ReadWord(); - if (sound.channels != 1) return false; // File must be mono. + if (sound.channels != 1) { + Debug(grf, 0, "SoundLoader_Wav: Unsupported channels {}, expected 1.", sound.channels); + return false; + } sound.rate = file.ReadDword(); if (!new_format) sound.rate = DEFAULT_SAMPLE_RATE; // All old samples should be played at 11025 Hz. @@ -51,13 +57,20 @@ public: file.ReadWord(); // alignment sound.bits_per_sample = file.ReadWord(); - if (sound.bits_per_sample != 8 && sound.bits_per_sample != 16) return false; // File must be 8 or 16 BPS. + if (sound.bits_per_sample != 8 && sound.bits_per_sample != 16) { + Debug(grf, 0, "SoundLoader_Wav: Unsupported bits_per_sample {}, expected 8 or 16.", sound.bits_per_sample); + return false; + } /* We've read 16 bytes of this chunk, we can skip anything extra. */ size -= 16; } else if (tag == std::byteswap('data')) { uint align = sound.channels * sound.bits_per_sample / 8; - if (Align(size, align) != size) return false; // Ensure length is aligned correctly for channels and BPS. + if (Align(size, align) != size) { + /* Ensure length is aligned correctly for channels and BPS. */ + Debug(grf, 0, "SoundLoader_Wav: Unexpected end of stream."); + return false; + } if (size == 0) return true; // No need to continue. From 7ffd3b2c480ea07ac2a2b8cb8accc4f027030e5f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 23 Nov 2025 04:43:07 +0000 Subject: [PATCH 213/280] Update: Translations from eints catalan: 4 changes by J0anJosep portuguese: 6 changes by jcteotonio --- src/lang/catalan.txt | 4 ++++ src/lang/portuguese.txt | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index bfcbcc843e..269d2e2aa4 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3428,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Nord-oes STR_MAPGEN_NORTHEAST :{BLACK}Nord-est STR_MAPGEN_SOUTHEAST :{BLACK}Sud-est STR_MAPGEN_SOUTHWEST :{BLACK}Sud-oest +STR_MAPGEN_NORTHWEST_TOOLTIP :Commuta entre vora amb aigua o amb forma lliure a la vora nord-oest del mapa. +STR_MAPGEN_NORTHEAST_TOOLTIP :Commuta entre vora amb aigua o amb forma lliure a la vora nord-est del mapa. +STR_MAPGEN_SOUTHEAST_TOOLTIP :Commuta entre vora amb aigua o amb forma lliure a la vora sud-est del mapa. +STR_MAPGEN_SOUTHWEST_TOOLTIP :Commuta entre vora amb aigua o amb forma lliure a la vora sud-oest del mapa. STR_MAPGEN_BORDER_FREEFORM :{BLACK}Forma lliure STR_MAPGEN_BORDER_WATER :{BLACK}Aigua STR_MAPGEN_BORDER_RANDOM :{BLACK}Aleatori diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 88ecc10bd2..9ba5d711b3 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1324,7 +1324,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS_MEDIUM :Médios STR_CONFIG_SETTING_RUNNING_COSTS_HIGH :Altos STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Velocidade de construção: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitar o número de acções de construção para IAs +STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitar o número de ações de construção por jogadores controlados pelo computador STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Avarias de veículos: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controla quão frequentemente veículos inadequadamento mantidos podem avariar @@ -1545,7 +1545,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendário STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Relógio de parede STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minutos por ano: {STRING} -STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Escolher o número de minutos por cada ano do calendário. O padrão é 12 minutos. Defina como 0 (zero) para impedir que a hora do calendário seja alterada. O aumento da duração do ano civil retarda a introdução de veículos, casas e outras infra-estruturas. Não afeta a velocidade do veículo nem a simulação económica, exceto a inflação. Esta configuração só está disponível ao usar o relógio de parede +STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Escolher o número de minutos por cada ano do calendário. O padrão é 12 minutos. Defina como 0 (zero) para impedir que o tempo do calendário avance. O aumento da duração do ano civil atrasa a introdução de veículos, casas e outras infraestruturas. Não afeta a velocidade dos veículos nem a simulação económica, exceto a inflação. Esta configuração só está disponível ao usar o "relógio de parede" como unidade de cronometragem STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special @@ -1769,7 +1769,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar a lista av STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativar a utilização de listas avançadas de veículos para o agrupamento de veículos STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} -STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Selecionar se os indicadores de carga são mostrados acima de veículos em carga ou descarga +STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Selecionar se os indicadores de carga são mostrados acima de veículos durante o carregamento e durante a descarga STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para horários: {STRING} STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nos horários dos veículos @@ -1860,7 +1860,7 @@ STR_CONFIG_SETTING_AI_BUILDS_SHIPS :Desativar navio STR_CONFIG_SETTING_AI_BUILDS_SHIPS_HELPTEXT :Ativar esta preferência impossibilita a construção de navios por um jogador controlado pelo computador STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Permite IAs em multi-jogador: {STRING} -STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permite a jogadores controlados pelo computador a participação em jogos multi-jogador +STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Permite a jogadores controlados pelo computador a participarem em jogos multi-jogador STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes antes de os scripts serem suspensos: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Número máximo de passos computacionais que um script pode executar num turno @@ -2097,7 +2097,7 @@ STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Usar {STRING} p STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto para cada recalculo de um componente de gráfico de ligação. Quando um recalculo é iniciado, um encadeamento é gerado e pode ser executado nesse número de segundos. Quanto mais curto você definir, mais provável será que o encadeamento não seja concluído quando deveria. Então o jogo para até que possa continuar. Quanto mais tempo você definir, mais tempo levará para a distribuição ser atualizada quando as rotas mudarem STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para os passageiros: {STRING} -STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo numero de passageiros irá de uma estação A para uma estação B e de B para A. "Assimétrico" significa que um numero arbitrário de passageiros poderá seguir em qualquer direção. "Manual" significa que nenhuma distribuição automática terá lugar para passageiros +STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo número de passageiros irá de uma estação A para uma estação B e de B para A. "Assimétrico" significa que um número arbitrário de passageiros poderá seguir em qualquer direção. "Manual" significa que nenhuma distribuição automática terá lugar para passageiros STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para o correio: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correio será enviada de uma estação A para a estação B assim como de B para A. "Assimétrico" significa que uma quantidade arbitrária de correio poderá ser enviada em qualquer direção. "Manual" significa que nenhuma distribuição automática terá lugar para o correio STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para a classe de carga BLINDADA: {STRING} @@ -2110,7 +2110,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :Assimétrico STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :Simétrico STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão de distribuição: {STRING} -STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto o definir, mais tempo o CPU demorará a calcular o gráfico de ligações. Se demorar muito poderá notar-se algum lag. Se no entanto for definido um valor reduzido a distribuição será imprecisa, e poderá verificar cargas não serem entregues onde seriam esperadas +STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto o definir, mais tempo o CPU demorará a calcular o gráfico de ligações. Se demorar muito poderá atrasar a execução do jogo. Se no entanto for definido um valor reduzido a distribuição será imprecisa, e poderá verificar cargas não serem entregues onde seriam esperadas STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito de distância nos pedidos: {STRING} STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se definir para um valor maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga transportada de A para B. Quanto maior a distância de B para A, menos carga será enviada. Quanto maior o valor definido, menos carga será transportada para estações distantes, e mais carga será levada para estações próximas From c9b73247e02a46e334f173cbc44e81ca7887bc3e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 23 Nov 2025 21:37:43 +0000 Subject: [PATCH 214/280] Codefix: Remove this-> from static call to CleaningPool. (#14817) Don't call unnecessarily. --- src/economy.cpp | 2 +- src/roadstop.cpp | 2 -- src/story.cpp | 8 ++++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index d61372de7e..67d9873c28 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1181,7 +1181,7 @@ CargoPayment::CargoPayment(Vehicle *front) : CargoPayment::~CargoPayment() { - if (this->CleaningPool()) return; + if (CleaningPool()) return; this->front->cargo_payment = nullptr; diff --git a/src/roadstop.cpp b/src/roadstop.cpp index cd9a3b1152..fa89cd4ce9 100644 --- a/src/roadstop.cpp +++ b/src/roadstop.cpp @@ -30,8 +30,6 @@ RoadStop::~RoadStop() if (this->status.Test(RoadStopStatusFlag::BaseEntry)) { delete this->entries; } - - if (CleaningPool()) return; } /** diff --git a/src/story.cpp b/src/story.cpp index 89a2474811..18af96767e 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -39,10 +39,10 @@ INSTANTIATE_POOL_METHODS(StoryPage) StoryPage::~StoryPage() { - if (!this->CleaningPool()) { - for (StoryPageElement *spe : StoryPageElement::Iterate()) { - if (spe->page == this->index) delete spe; - } + if (CleaningPool()) return; + + for (StoryPageElement *spe : StoryPageElement::Iterate()) { + if (spe->page == this->index) delete spe; } } From 74cb4dcefcc1a111efa0bcf5c74079c12b3fdea6 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 24 Nov 2025 04:43:59 +0000 Subject: [PATCH 215/280] Update: Translations from eints portuguese: 11 changes by jcteotonio --- src/lang/portuguese.txt | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 9ba5d711b3..24a9599b30 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -278,7 +278,7 @@ STR_LIST_FILTER_TOOLTIP :{BLACK}Insira u STR_TOOLTIP_GROUP_ORDER :{BLACK}Selecionar ordem de agrupamento STR_TOOLTIP_SORT_ORDER :{BLACK}Selecione a direção de ordenação (descendente/ascendente) -STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecione critério de ordenação +STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecione o critério de ordenação STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecione o critério de filtragem/procura STR_BUTTON_SORT_BY :{BLACK}Ordenar por STR_BUTTON_CATCHMENT :{BLACK}Cobertura @@ -289,7 +289,7 @@ STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}O títul STR_TOOLTIP_SHADE :{BLACK}Encolher janela - apenas mostra a barra de título STR_TOOLTIP_DEBUG :{BLACK}Mostrar informação de depuração de NewGRF STR_TOOLTIP_DEFSIZE :{BLACK}Redimensionar a janela para o tamanho padrão. Ctrl+Clique para guardar o tamanho atual como padrão. Duplo Ctrl+Clique para redefinir o padrão armazenado -STR_TOOLTIP_STICKY :{BLACK}Marcar esta janela como não-encerrável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique também guarda o estado como padrão. +STR_TOOLTIP_STICKY :{BLACK}Afixar esta janela como não-encerrável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique também guarda o estado como padrão. STR_TOOLTIP_RESIZE :{BLACK}Clique e arraste para reajustar janela STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Alternar entre janela grande/pequena STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de deslize - desloca a lista para cima/baixo @@ -705,7 +705,7 @@ STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Dinheiro STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unidades de carga entregues nos últimos 4 trimestres. STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Tipos de carga entregues no último trimestre. STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Quantia de dinheiro que esta empresa tem no banco -STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Tem um empréstimo muito elevado? +STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}O montante que esta empresa está a contrair em empréstimos STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Total de pontos sobre o máximo de pontos # Music window @@ -772,7 +772,7 @@ STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHIT STR_SMALLMAP_CAPTION :{WHITE}Mapa - {STRING} ###length 7 -STR_SMALLMAP_TYPE_CONTOURS :Contornos +STR_SMALLMAP_TYPE_CONTOURS :Isolinhas STR_SMALLMAP_TYPE_VEHICLES :Veículos STR_SMALLMAP_TYPE_INDUSTRIES :Indústrias STR_SMALLMAP_TYPE_ROUTEMAP :Fluxo de Carga @@ -780,7 +780,7 @@ STR_SMALLMAP_TYPE_ROUTES :Rotas STR_SMALLMAP_TYPE_VEGETATION :Vegetação STR_SMALLMAP_TYPE_OWNERS :Proprietários -STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar contornos do terreno no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar isolinhas do terreno no mapa STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar veículos no mapa STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar indústrias no mapa STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar fluxo de carga no mapa @@ -3006,7 +3006,7 @@ STR_AIRPORT_INTERNATIONAL :Internacional STR_AIRPORT_COMMUTER :Transbordo STR_AIRPORT_INTERCONTINENTAL :Intercontinental STR_AIRPORT_HELIPORT :Heliporto -STR_AIRPORT_HELIDEPOT :Heli Hangar +STR_AIRPORT_HELIDEPOT :Heli-Hangar STR_AIRPORT_HELISTATION :Heliponto STR_AIRPORT_CLASS_SMALL :Aeroportos pequenos @@ -3966,7 +3966,7 @@ STR_FINANCES_MAX_LOAN :{WHITE}Emprést STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG} STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENCY_LONG} STR_FINANCES_BORROW_BUTTON :{BLACK}Pedir empréstimo de {CURRENCY_LONG} -STR_FINANCES_BORROW_TOOLTIP :{BLACK}Aumentar tamanho do empréstimo. Ctrl+Clique para pedir emprestado o máximo possível +STR_FINANCES_BORROW_TOOLTIP :{BLACK}Aumentar o valor do empréstimo. Ctrl+Clique para pedir emprestado o máximo possível STR_FINANCES_REPAY_BUTTON :{BLACK}Pagar empréstimo de {CURRENCY_LONG} STR_FINANCES_REPAY_TOOLTIP :{BLACK}Pagar uma parte do empréstimo. Ctrl+Clique para pagar o máximo de empréstimo possível STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infraestrutura @@ -3998,7 +3998,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construi STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da empresa STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede -STR_COMPANY_VIEW_RELOCATE_HQ_TOOLTIP :{BLACK}Reconstruir sede da empresa noutro sítio por 1% do valor da empresa. Pressione também Shift para apenas mostrar o custo estimado +STR_COMPANY_VIEW_RELOCATE_HQ_TOOLTIP :{BLACK}Reconstruir a sede da empresa noutro local por 1% do valor da empresa. Pressione também Shift para apenas mostrar o custo estimado STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver contagens de infraestrutura detalhadas STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Dar dinheiro @@ -4111,7 +4111,7 @@ STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Enviar para han STR_VEHICLE_LIST_MASS_STOP_LIST_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para imobilizar todos os veículos na lista STR_VEHICLE_LIST_MASS_START_LIST_TOOLTIP :{BLACK}Pressione botão esquerdo do rato para iniciar todos os veículos na lista -STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Ver lista de modelos disponíveis de locomotivas para este tipo de veículo. +STR_VEHICLE_LIST_AVAILABLE_ENGINES_TOOLTIP :{BLACK}Ver lista de modelos disponíveis para este tipo de veículo. STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION :{WHITE}Ordens partilhadas de {COMMA} veículo{P "" s} @@ -4134,7 +4134,7 @@ STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grupos - STR_GROUP_CREATE_TOOLTIP :{BLACK}Clique para criar um grupo STR_GROUP_DELETE_TOOLTIP :{BLACK}Remover o grupo selecionado STR_GROUP_RENAME_TOOLTIP :{BLACK}Mudar o nome do grupo selecionado -STR_GROUP_LIVERY_TOOLTIP :{BLACK}Alterar a imagem do grupo selecionado +STR_GROUP_LIVERY_TOOLTIP :{BLACK}Alterar a cor do grupo selecionado STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clique para proteger este grupo da auto-substituição global. Ctrl+Clique para proteger também sub-grupos STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Apagar Grupo @@ -4479,7 +4479,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Mostrar ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Ação do comboio atual - clique para parar / iniciar o comboio -STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Ação do veículo atual - Clique para parar/iniciar o veículo +STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Ação do veículo atual - Clique para parar / iniciar o veículo STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}Ação do navio atual - Clique para parar / iniciar o navio STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação atual da aeronave - clique para parar / iniciar a aeronave From 84eb3fb0e01fc8ac4faa546143a76c630463741d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 24 Nov 2025 11:22:58 +0000 Subject: [PATCH 216/280] Fix #14800: Incorrect register processing in GetCustomStationRelocation (#14801) ProcessRegisters must be called even if the sprite resolve result is not valid. A zero-length ResultSpriteGroup is valid because the output value is an offset, not a sprite ID within the ResultSpriteGroup. --- src/newgrf_station.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index 358f6505d5..b5b5997dba 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -614,7 +614,9 @@ SpriteID GetCustomStationRelocation(const StationSpec *statspec, BaseStation *st { StationResolverObject object(statspec, st, tile, CBID_NO_CALLBACK, var10); const auto *group = object.Resolve(); - if (group == nullptr || group->num_sprites == 0) return 0; + + /* A zero-length ResultSpriteGroup is valid because the output value is an offset, not a sprite ID within the ResultSpriteGroup. */ + if (group == nullptr) return 0; return group->sprite - SPR_RAIL_PLATFORM_Y_FRONT; } @@ -624,8 +626,12 @@ void GetCustomStationRelocation(SpriteLayoutProcessor &processor, const StationS for (uint8_t var10 : processor.Var10Values()) { object.callback_param1 = var10; const auto *group = object.Resolve(); - if (group == nullptr || group->num_sprites == 0) continue; - processor.ProcessRegisters(object, var10, group->sprite - SPR_RAIL_PLATFORM_Y_FRONT); + + /* ProcessRegisters must be called no matter the type of the sprite resolve result or whether it is valid. + * The sprite offset is only used for layouts with the SPRITE_MODIFIER_CUSTOM_SPRITE flag, however other aspects of layouts + * such as register operations must still be processed even if this flag is not set and the sprite offset is never used. + * A zero-length ResultSpriteGroup is valid because the output value is an offset, not a sprite ID within the ResultSpriteGroup. */ + processor.ProcessRegisters(object, var10, group != nullptr ? group->sprite - SPR_RAIL_PLATFORM_Y_FRONT : 0); } } From f128d0de1d6a337a8fb824dc4c88eee14dae7123 Mon Sep 17 00:00:00 2001 From: Richard Wheeler <2762690+zephyris@users.noreply.github.com> Date: Mon, 24 Nov 2025 19:43:12 +0000 Subject: [PATCH 217/280] Fix: Bridge deck sprites were not toyland aware (#14821) --- media/baseset/openttd.grf | Bin 641653 -> 650822 bytes media/baseset/openttd.grf.hash | 2 +- media/baseset/openttd/CMakeLists.txt | 1 + media/baseset/openttd/bridge_decks.nfo | 34 ++++++++++++++++++ .../baseset/openttd/bridge_decks_toyland.png | Bin 0 -> 21885 bytes 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 media/baseset/openttd/bridge_decks_toyland.png diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index 4464c415f3a7cfa8e124513b97ec6b079eda21fa..ed897ecd4ee4e9ae67723c6efd8ef914eb7e7909 100644 GIT binary patch delta 9250 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 delta 311 zcmX?hNB!#*bx{Te_aL_>UM?vv+e}6V1{MYehW|c|qFY57gE9n}K|EGz36SVtGj0Zk z=~Wqw=i6f$SlVr~Sley0*xGHg*xPNhIJVnnaY|V;nr)9*%E`$% zJ$xx=^z=Q;IM*{;Y|mNFxrLF@a=PM5&a;eG)8DV;JjrOiedj99+l;I>+zbp?rtdkx z8NB_?8qO9*M%(R$>o~77GTLqT+`#F~#Av_0cN6ClMn;G2Mq4NADjFHiEd;KBKGmMO0+kK93Dl##8Z_hghGSFxHrQ@7gjEuh9ZBKG) JF@ZvX0RU-pV=Djv diff --git a/media/baseset/openttd.grf.hash b/media/baseset/openttd.grf.hash index f940ca5d62..9c734c87a4 100644 --- a/media/baseset/openttd.grf.hash +++ b/media/baseset/openttd.grf.hash @@ -1 +1 @@ -b779126d7cd1567eb09a0a7871f70a71 +c56aad31380c077d619e124bd87c8270 diff --git a/media/baseset/openttd/CMakeLists.txt b/media/baseset/openttd/CMakeLists.txt index a7d768326e..5a37b35148 100644 --- a/media/baseset/openttd/CMakeLists.txt +++ b/media/baseset/openttd/CMakeLists.txt @@ -33,6 +33,7 @@ if(GRFCODEC_FOUND) ${CMAKE_CURRENT_SOURCE_DIR}/aqueduct.png ${CMAKE_CURRENT_SOURCE_DIR}/autorail.png ${CMAKE_CURRENT_SOURCE_DIR}/bridge_decks.png + ${CMAKE_CURRENT_SOURCE_DIR}/bridge_decks_toyland.png ${CMAKE_CURRENT_SOURCE_DIR}/canals.png ${CMAKE_CURRENT_SOURCE_DIR}/canal_locks.png ${CMAKE_CURRENT_SOURCE_DIR}/chars.png diff --git a/media/baseset/openttd/bridge_decks.nfo b/media/baseset/openttd/bridge_decks.nfo index beced3f59f..b7edf0f143 100644 --- a/media/baseset/openttd/bridge_decks.nfo +++ b/media/baseset/openttd/bridge_decks.nfo @@ -4,6 +4,7 @@ // 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 . // -1 * 0 0C "Bridge decks" + -1 * 0 07 83 01 \7= 03 19 -1 * 3 05 1B 18 -1 sprites/bridge_decks.png 8bpp 96 16 64 31 -31 0 normal @@ -34,3 +35,36 @@ -1 sprites/bridge_decks.png 8bpp 256 181 64 23 -31 0 normal -1 sprites/bridge_decks.png 8bpp 336 181 64 23 -31 0 normal -1 sprites/bridge_decks.png 8bpp 416 181 64 39 -31 -8 normal + +// Toyland bridge decks, skip if not toyland. + -1 * 0 07 83 01 \7! 03 19 + -1 * 3 05 1B 18 + + -1 sprites/bridge_decks_toyland.png 8bpp 96 16 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 16 16 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 176 16 64 39 -31 -8 normal + -1 sprites/bridge_decks_toyland.png 8bpp 256 16 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 336 16 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 416 16 64 39 -31 -8 normal + + -1 sprites/bridge_decks_toyland.png 8bpp 96 71 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 16 71 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 176 71 64 39 -31 -8 normal + -1 sprites/bridge_decks_toyland.png 8bpp 256 71 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 336 71 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 416 71 64 39 -31 -8 normal + + -1 sprites/bridge_decks_toyland.png 8bpp 96 126 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 16 126 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 176 126 64 39 -31 -8 normal + -1 sprites/bridge_decks_toyland.png 8bpp 256 126 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 336 126 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 416 126 64 39 -31 -8 normal + +// X and Y axis are swapped for road surface. + -1 sprites/bridge_decks_toyland.png 8bpp 16 181 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 96 181 64 31 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 176 181 64 39 -31 -8 normal + -1 sprites/bridge_decks_toyland.png 8bpp 256 181 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 336 181 64 23 -31 0 normal + -1 sprites/bridge_decks_toyland.png 8bpp 416 181 64 39 -31 -8 normal diff --git a/media/baseset/openttd/bridge_decks_toyland.png b/media/baseset/openttd/bridge_decks_toyland.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1495d766c539b307674b84d3ed10a5ea2bb060 GIT binary patch literal 21885 zcmeAS@N?(olHy`uVBq!ia0y~yVEn+q!0?8HnSp^}k046}1B13~RY*ihP-3}4K~a8M zW=^U?No7H*LTW{38UsVct)+7^r^)WTnDRea^u7>-#j&ReHp|N|oPM9(k>VM;$ZKuh zrwNvO#T!2yymRKENBO_+|98Es|M$GUsb6vDlx*$2BIoB{3GQ$9pY{J=&-eNdFaQ4k zcPD;+t9||bxnDmoJF&f||6A?NQ{N5${Q7rZx~`U|`TQsQ*cE?cG|t%nU$A`s>+Snv zUOabOChBT;(_Z|Qz4)dde--}3B-Hdj_0In~Up{f(`^V>h+Z%s4|8jrny{)xBcHWNP z?ubUL>3i~uxbN<=oEBE|H2#^;*S~N7wo9pFIXR>$Z}KYdi(kPhNo`mIM2KMe-BT8 z%kShXe|Y}9ejoq;#QHY&&1=?(yp$-bn?A$x4>RW*%UczR&mK>2UifZ4cY;#h+(@38 z6Pe2FoBnyciOr+GbETkqqa@vt-J zsMfxhW(8qhGk>gHDd?;m?PvLXQg+_X=YeaMO!C&;$|2&ubym#TtyiL=-Q~BZDLGEKS3UB!s?~Y8HoBPdD?BV81r&h1ob?a63 zn;p5$^1I*cy8W(tP65Z#$$oZEuUz)Ce=L-B{f@8s{i4^o+wXsDzg~Cemwx?!?)9zm z>yJLy+`Hl5L(_fHuh)CC9Q2%az96DR^T9_gae)hgcAs^Zh&;9YdFH!E*pm}Vn`^c; z+qAJ?<}|$j;dHrPo!r#t|MvfRmi24${YU>-Kc5rxJ-+H){NHcZ>vN|r{A%+pbz#q| z-Zzg;mA4g2Z{56hOJvx|D`F4*HT{;p`4*f0cGr0mBc(GJugC126Zd`R@-vdZ{AxB& z@0C1nr|fqvbwTvw#{fLUwx!@``mjgr`0i4H#-ewKXZUZJ|AWrE9X<(ZFS;$$LBh! zyxFx|Uh}ujm>IBf$&mv>b+conB6I!qp8w79X!)SwesNRP9P2aH->y{g3yMX?9_9a4 z^>t3!L#N#**R7p<^NjWDiOXmGI8qb4ea;cC(|6Jf=dLk-w&B={!lx}8%hg`K+BEZN z`w`o0@9MSBj_qSjQIM?AO`I9Wk*?DaUKY8sYK`}!4|5g=c&6U${Jit}x$W%&$CM`B zef4A6dj_Q`Mn#;7kMmz0l31PkBcWl_SF@9|vj6eyF1%Bf_xQDU=eax694z%7Mk#1s z_w!m;#&J&ck=D&)G2IMGwxUjzJau-B0=FX_Pxj|!p3kyf^YYTqMJxKwZ|L@4Gijpr zr!8j372S>>;6A0$6Zzm^0Pk*{|5~bH%FmjkO$DMKKZ{AvseEh^)G|XuU44<(-YEw@ z%vkAuFf-0JbdFKb?8#@ie}_rG3z;Op=Jx6@agB)|o(niGaQYg!QsB?M&8@MXyBQ~L zy!$DjrA_V1hGWK2F-<8*{MCVr53lW6r1q#=YqP9__mat-S5C8Tl(yk3 zIBNCk*mG0C4Vwd#Lb}}6C~OxyQgn=Q_UU)3GX(9Ve|C$4ntvFUiPDY3RoOodAzPHmavub2a7 zdP@|JFFWAX%DjHc#zS*1pWDR}{-SNQMkn{Vu&I+z-8|~cA=S0!k6$8u(B9S zvaD&y+*`5m(TzIm&SS;t0halD#QoJ5ozzLN7f7nu%;;>m-uUiPH^v*>kApNE-a6_% zcN0+?L^WL$oN&b%lLgyXhK9#a% z-M%otyBlJc?pf`$%Hrfsh4*bt5%FDnViFjtemKZ9JV>r;)w^0F_^G$bsZ=J;M!H9# zXaQI8+xae!Y;CR`=ue3~UpXP=ZR-7lf|i@}BpKXH-5J@{c5J(Iuex$h|LP_cxr=w> zOP|Fn7Fk99W$Jk39O3?oCA8wS#1oh5sriQtWz-gjd`sPbNauPzm+>KkRnH4O7qEZs zI`nmFC8N~QjCx0prJ;BIE-g_97d`0K^jJPEuXmE|>nMRP zRztghsl2D38YfIE@Yx~dC!N^Ca_Q+Lv#4)Xnm2ar>C$`op3%A7Z&3)3bIKZbqe7F1 zUHhgkd~jd_*ABUO2m6hRsSaQJ<>#hrN0=S4_H%bKV@O$R$sm%$`?G=9*>@#Z@YcLf zCam$L8j(Iqez~6oH*v00DcSr;&El!d4$ro;^Jj6Fv#wLBpKkL&`b(Vr$LpU}cIxD5 znso#-CVIW{o;dB0Pr$Yz*#p{pa({U6N@cV$ z6|FXPo7OmGWBTiamu>YiC#)p;dXtuJ+0^9tYr@?Y5r=M5|6`}_OmB(g>j=DchdKP^ zl&|);!{)C2u5fZe(-USE;tza>sn9|=BJ;eWsp9oOT?Jhjp(^kZzV^IzE{o-5PC-yd1$v3TKxqvvf?3O$yH zCwlA)k`TMPky)&ZF+=r}pp38KWYrs-U!BfPl4D?B(y(J%#p)T4cT`N=y@%V-#CDI9 znM#V0L|b=-i_+59(J@W=e-8VFNEPt!Rp6fcKyI?sQ`gs0_a{4>D%30S)xB`7VLov~ zU!WuX3{&wUhRH5BRQE3^eX#1y4biP16jx-dN@3S;?=lJC`?@@XQTDs)<%R}}3GbgL zOjf$lzJF=moFvvoXO8wJ+~#Ci_~MM9(x!E;Urs(+RQ!R@!cI_7r&~m64o7i^^*)uG z+7oL9rMM3|^UmoNL&z zEKB9q<->l_EIXVNk6ze1K`QXvQnmuk$g0V^x!vY_E^_-3IC*7s>Jpwd@x>PouKl^g z&0<20PO`xP5d)RPUk^{W>s|c%`zp)5-sXcTGc-PR{61vZbxYz7C!533eF+~-SF|k> zu4QkQJukr_qou2Vr)#F7oRWtk_d~e{NII|*oX;uHKX)851i-y0QnI!4DXycg{-}~h!dj)k2)QYWpR6cbc2s{ zNG?B((fN$ix;Il6V@(xZE^LH>T(75q$)86qY5zt>%>h0SqCH; zIwhAFx)(0L6FG_qhjiW175dUYNXi-dNJDVHT$((fD1? zRrKig>n^zp23EHiQX9n6eAWn+M&6!{|R!>=$&IwthHPRin6biL654 zZLNts?+s7X^j>v3FBp5@p4tCQc&x%?s97j7AWbwx&z&nBK_jPecn;I_)+fd7Oa zT~Fd&jCn*abRJ=Ii`2{Oknqr$$=Z5@)%ai&bNJ#XU6Wl;Og}W|)v3}SJo6_MGiq($ z@FsWet9ddv_bF})5%UtwyuDcTh!LCncc=XY7hB%{JI*%scWyh^m5|(xOq(7*4Py)S z-NRs8t}ub?;*=GWG#9Y5?MdBP-*P2hx$A)Okt;79q-%^evj|*RHY?QQig>Z3>``6c z_gCsYR@!uY5~-dl$mQ98grPE&(OhFD=gpsX9*3AFURF?F7pZV5r1!TR4%cWn zyZEmBx>D`3QKsY6!WHKvZ2CnOq?o@ybC@yuiF2@Xqt6!`!Rsc4@3|aUjwYCXys-b_ z<5xyIBcl#6Nq+nP#A3R;|Ncdh;)`@Yn7rETXn&>fP~I#3m9K;fr!@DNGu-F8xamo< z<4nn4;UZ_Q#Lb-Sq%9(F^WoGGO_Apwucn?9?_9K-JD?;!G2&{YXXbqM>opzUUq>kl z8P5ow^6rA~k>?ft1+GcGksFA#XX)nRMH<8Md8 zJ?_&b2r-ho&C$yJ!-R0iHSCP zmn>~l{LRS|zfjCkTBg9mLu_JqRLiw#EqSw+n3M{f4(6G#Ao^kKpB@$k&$Z{$7^VDE z&K`Rle3kpme0k@LiF~yaB3`e0|9)u(*H6B*nm5W$$q^z;UUspUtDHU7xi!GdGpGJ; zVxfZlF?N})Q@LJV)zxZR=Xw1(kNd|RvQLz73xa$U0; z<`nHY`(1M$@A*j9YijEyn@j_IS1yt8JULDL8(VbIgWZhFHf+h;!lYHzFPh9K%b##4 zO5Mfwz}q{z7GL&?m4q-dJzp8h@mx`8?LDXZg|c4_ezWFiOz@B~IS{I~(sQF_!>8O( zN1aujEZR^D=m%jZq>zF?8$Du_Y9IR#vy{9q{bDp)Gl;${-(e732 zjy=0FX0R3Utu!z7lU~5grhBO>yShi4>GnTGtxJ2YYCb${zO_k3+vNSu5{4U#R@9gEl-m>mE|Tcce@D!K9>)to7^ob_qo>e>}3ILnX^+aa~%@s(Z6< z-Ld(1w{Y8yE%RGLa~Ut6ym_Io!HPTN-!&smrqJGu%gWUU9@_olQD9f;nJ?i)(adT7wu#3 zzt(Mb$0H_`Z%@~@?-SZ14vU!zdzp0Zf4JPkK4Fjj#e=3EtR?x+RA)D+T#;J2R&Jl7 z*T-{qw{EtSR7}nJaZk*?HFm*FW2?9YTtUs5okjkZY`4$&y6Tlm{yF)o^}~t+k0-gm zLgyZ6K9?)7rYmfZI@gwkBAOpnm#NqVP7utM_^j~a^wX&V)i16)cAoghpq?t}_CZRA zVP%xmi5Pyb%yFD(xTDOkp`mR@hGXL)gnA8=%xWCH7>|l}BLYwEy*T(xe%?wPq zFkQWUg^jd?XT*12tD2$N`qm?Mrf!nWr;c3DX1H8u_PlWN^>1_AC#;lA^fwcD(h**M#Z`Iord=yvL5j@h)xKFK~}c&1^J|00p-R)O6DISxG`5&@FB3l3W@ z^i#=H;knw}@xb0lp&+v4Ki96C7865ETV)>FpWuE|w6)QubL9!?y^RGC?X7p0@d*dMRDV`B`Htt%2)mR^u@;Fp(3xN1=AIkIp6YD zG|ULk(K)o=CT-gz&7BVqBrV-^)q}5dRnV6CTTH@4UcXuOQvJQ2?kWE)=Cg+B<9N8P(XYv1mPfUChM9pxE;1>(Zzz3YXulpWPU9^`GYUW>1#4&oibQ9AxM) ze^OlfL@X{hp!iVSVUDkoKjKRBzpTiT_Akvi5TRxNB+@KrTUc-T(Vj2M`c^J>y|np( zN#qB%P2X=%mSpu%QBev_RGpl+H$VT)+o&Vkt;Js7mQ{9m?svtMg|%*XlIU}<8IQM# z%qqL9;CN$87Du8dqjq>gitIj?C|NG+*UY)U`1-8FJY$8rqoxJE__c<&m;2wp$M4H; z&)If+i@5p2!Uc5;?<@`ss)>2Ie%s0ooCP9XJ(WIBwq0>e*&ya##nkAwD%+*;6VGdB z)$ju5d0Vc&Tyene{i2wX8J~@>xoL+V72cSnwd%U-+tbRkYqNwqT$&X#RCh@`UI>d` z#qgo}ZRP*D=6AQJXa%*#S1(G*vX{zavR~kod+M_b+hd2)wcAhVT`?2B=CD2S%I%;< zZB|?36^)p$aHO#(#;cy_%zc=p#9}Nszw-y@ij|e_Vlj$BFIYFLoL})?a{Wp}$Bixv zRwY;NDE-=H*?DHQ;OvmCj%|w-Z}^^ZJ6!XjytLk$TP@;~XivZ*eba|$)je8Fc={)Z zt(0FMzpC3s!lWYb#HJOu<|>LyrJQhOW?x`cwboN(Dof6xrp6srSGKWFUvGA^vL`0_ zy55uG7t)Lk6(22}jTd&7%G5lPTHnH*ye{eNk%tSrylmcXT9kOA^jhV?$YDd0?)I#c-SIsRgYg4YiWNk8>u{T{nY2jkkR7Bc#-Qa=*GzE(x4%(l+BIBBUw?$ep9GRnJpB^r^GIjYT5sR=`Pv7YvV*@7t-C6rGGyl|AYZCg|Hdfg^aX zZ`S^qY|}V)t=#L|**3Sp^t}Jk*5@miZ@=0W)f;ovDC4S6;LUGpSF1#nm>Kx2?rnYA z>+(=>;i-g1rnWb)E{F53-nLy>?BPBM&TAaqE`eD*D>Ihy1r>EUx}~@O-W#hHmpn;e z!>6h(@`8`0iytX&Yx`nz#AZ@K%gX+cy0G7y4^CKEC$=jsm1+8=H^MseS(@jpxa;+; z^3c-|->d-L$tM^Ls;>wg$>rF&GIGMMY04EXPPZJE#Vl4RcM+I$T<~!4YJ;i2Hm!fc z_EuP6=>$%v+*O*=%eNiiOr2q$=$JU`O8NrseY6qhxzijU~DD4|7duhSRo39(RpDbzNYVCRQDROf-=SPnPJXxLF_5~)!EE7MzYe$x* z@2#IKEKC~Qmaz}BtK{c=+QOu?Y$314>d3Vdm#E!8C&Bd6tCjK3!YR$OE=-jOTJsNZ0B^{gCZs&q(*#aIfZga+Cwhk*NE!@!{JBces zM7Pr^r)%-cEj|KrkMA%SMAmNhyv6@fD%OiZ`+wQH2dA%Y>pAv*AE))hlj>PbrR|?X zW~fMMdd)gwlL| zpz!7Wg4b9lh(1aV&bzwwqJ3^$Hn;QSysLsOe_d9FhJ9UOvEyTi_LSnkkGghNE?PEW zd1vdyl^)!v-{!?)vJ?B7C-8D>05m7p4#~< z+iqO5o9BDs+`KIv&7p~<>0XjR{MOQEn)?oj$pmecocrBV zz6r~N%L-?inaepGq>XnVGN(#2!U0{_e2ItQ;%eWmF5u^_Ow zWtB;|{3M3i9R4P2*pDqg#(T2;z~+Fz>u1bNThwwS`tMba=7SO*+;i(6+TTq$R6S=I zTSw)O6;|!D3^d&WkC_Nax=L%?X!r#cJiBU|wf5i?kEx1UTg{C>{I)r_`ozPXuDq_V zG94I_%_d8%xB8SQtyZ(=Q+?)Pv6i{F0)-O8jnsX8oNp}Tp4V_#)iFn4VvkCCsfNdo z3mgw`pWu1GdY)m%;moa-tKv@iB}ueA50l?it|X=vbiZcaE{|D-iWw{9ZPMK$*9$HX z29d%)f@%QShJ1XW~5w_W4lILdPd#LHdk(m#=n*Fn4cowSZ zs;rE7-F2X*MUW|Q)^)BcX+jmeUiy&>DtFj%h^;Dqf3|vEMxU2MVE%~>tJr^->mJs# z)0nRJf=i`&>J_)jX(yKb`#mN0>N>4mf+n>xi-hNL$mGVfxKGrqT+rcUk{u%#vFOSH zp9Dqo@Y1h_(Pr-JT9nS@|JeGQ!PN0hcZEik)rQIcnbm(RTNcwA~_8ze*bdI=JomK@@k6zWh7+Tnz?LNVd!b7S`uvRGV9~ZDTi(y*P1Yy zVF`!gq6no(%a!qW?ptqMw&HHlsi#wHqn!426-;E?nX*rUD{m5C->tX2GuWE&i78vdEl_>*5~sf#{z%-uv=k~JW^QxSu#|kdxUg7BaP_@gHOLIC~ zZO4^uo>6l{PThZTsA{t{n?=K_fV4U9*+7v*4iS+co^2U%jY>{G-7SwXO7dC>rQGtbOis*qd3ayq z%lx;Rc5Yt%fqmb$bp2lIx^>Yv>*d1tSJwSwU9x~7|4fI<`@GE4p=&?BKU)9#(R|Ub z?AB|;Jipn-Y+9KtZg9mw#bRmY_I}>W>AuYe?H7hmofEt!?Ms;3|GSH9wY8+T zu+I<7PRwah5cRpcX`P*ORq~dOlz_dN42y%L8UrE@*Bxe=^^qmT#Kgkn!kk%YQZlPJ zzjVHuckgqdipyfHhE9Q?tx4Acp59{boa205S>+U4)s_1!+k$d6#b22E?mS-RB%tAF zdc5b#hqcWLW~LwR^kvq}mj1=%5LfzF({H!B9FMiQ;gxQV=W9bmkBaz=xp^(Z#>&Qd|ts)o8L{ZysK_?+){D%aJ)2;VbA092LE%*{yn@W|9qGH`%~N3==gqR z^kDZ{X8EtBzs^``>$!|V)_X?NQhn!2Yiu|%m`4*&`_@7d@3QrNL zI)UU?c^TVNYYdir&ffYttaqB; zYYo4TRS*8@IPuN9JK?s?x+RGhrb#iexhz@N-81LgvO7ka>y+o+y6q{jSu$bp8ELnj#(~|4|Y7ebF1L!Bnhu-+H6&y>I)sueN1%X88?Ot{`8b zmDxe>r*2xR>Ayg-#PJbNFK?ED4oYK2i$pdpu^}cGrl#I)U%Jy;RJX08ufk zpev#4XIgbmsakEd`9*0Gmqy5Qe~V4;u5d1Wd-Qy&^29IwX}+eGCD*i8EX#HZu-1!g z-@fhF$-Q!=*E!a;{Bh^_nesq1Xra2itRdSU-PDE4tQpf9cs{*TbaSnq|H>)w#}2ba za&ZefwJNw+s>JpDW1)BDKd&&b>jeD9eEZMN(mz;uPp22cs-(`uffBgE@-NW{|Bq@$F`l_IQ zZ0>fg)gLPMH0i7qoT^#yJ>P9r`SQ6jQ{?*BElzsn6~NKv5whx+usPTDE$1}@T4!oV>`% zkJZfd_}kL7+u6U}WOYlbuFjcxE=ssI_LjWHg*YaYC7FMMbpp>YdadTF(Fhk#o?kTk zx`4ow0A)2-;q`Z(SwCESchC0K|Cjd&OwdsDXkT~Me8KgJUmR@TaV%>Toxq)IcYo(C z&g~AnxmG6bqON>)2MHd-%ya`m>Gxp1#3TdzR%R_ph(Eu;@{7_R2aaPu^|I&1d=-&q%QZ>27q zr;wpo>dUZv@xddKp0{??^&7S?o2hZ&a%qXr)kbk8*XYyEPqebWMW?SWRqDU)8`nI2 z5uZ$VUq**Wz$=j@3mDCJv`P!~uYKJ3dDXesB^T$Pul?&YGwZznySG-R_rKkj`EZU! zBxC!Z?C8|D<|$umq#PMOGbFS}Y;o&ddE{Zhy4*1NiLtC4<#Egf*=n}xp-<;t?vT2B zkL$~?zJ>rFMv)b3wy7KsV%N}TUh87A!}#Zhn2F39%YECKpO@#&`5>q|!`#a=z`pI= zjNDJLRr6xZ&${w{QQqjwrO42AIqygIe$n0&K0FFhBCEFDSAM$AU(x@m;f5ur?pz2f zzwX%;z$s9&dDrfniGNom-1B&@_3-AW{)!(idzOp+)%lvf@R8pApvDQSJ7uR$o%@SL zqBei)J-s(VY{i?duRos=zF+F$|4(anOt!0eZkT@MnwHS#xoS??PJd0^J<`mT+AmEO z%sSC&{*I5EQ}L|kzRObmFH63N=SjSA40CE%m({g>e)iI;rK>I*+;LpH9nO z>xTQ+r))j(@Cnz)GpiRIcJAjrsw~~m>RZFS*Hv0?gMwV({;8Zgm;0`THh-QQ^=5z1 z>$)|+lW*5Ye2Z^#u>Sn1ZgRT$RafP5uc*!*p*vcN+YAr)<{QP|mMAzDP{{B|YS$Xc z3CkyRnjg%$%*gvfc~u49mOb(cADcEPhxshutyyvRkB8K8=Y#__UvHQHQ`4#9iL$+7 z9@pPA)B)g4=^@Z&&6mI6zuTJ>w2j&s!q zJ~xUI%eCQdB?9l;JxL`b@}yn4hMI} zXKYiIN=$Bj=KJdW_e*3|Y}@_XE6*ISy;l-Y{}5g*@#@!gTazhWA2vlCIJ|b|?;?}S zOM0t1-adYFrH(VbE4V0RdaX^{mCVie?4oXc`fFtvvgw1dPF1Pa*35k0$Jz5|^}en- zmT`~utIlC-1IFp@m3v(lRK1>VyJGSEIzPGpRsYwQo6FbTn%nlR^=en)XZa9q*0Z}Z z9%s4sntD0~1@f-)5>?(&QrCYf$zA!}1&_HV4JHb6ew8rn@-we<&f+fnwp~s2Q}-c3 zu34(Lw>U2o{=I$ID(0uZUz8tRB568tx=*vXx3!p!&x-i}Qf8}eCUbl#Z;~teTsPD2 zTID6rZ`lvT91m|#(zJK~^zYf(S7Dxv^%EW~e_3(+;5$DSy_F?SMgMYMIS9^K=smAy z;YCxeaKl^Nyl>yPF*jaF+!->b&9$k`zhuh=@BBSKGr}@zna}@PtL*-9>HVl;Q_=P% zzwDW|hk3ly6+Xhiz}S-M>>S|f>lgG~JQ4P%M*N9gYYOf?S`(JFrquu6A&0nV&*HhyG#*7b zF?n`O2y~Vdjp(?rYGRU->u*E;{~eG0CwZ%dOZLccuW)L8^5fwD2j$z-601)6avf=S zCw}{%1anncW7^$q`}=cuS2F#W->ALz?Rv9@oBo$x=jzt5@Z>U!U(fZu$E;W0aAC5Z z#Kluip(ycYjGBQk$T~Eb*uPDz?&;LI!^Xqr! zjSWQy(&F>W7#MgZGD9LtB7A+UlJj%*5>xV%QuQiw3m8Da#=fE;F*!T6L?J0PJu}Z% z>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1c3d_URu#Dgxv3?I3Kh9I zdBs*0wn|`gt@4VkK*IV;3ScEA*|tg%z5xo(`9-M;CVD1%2D+{lnPo;wc3cWJMJZ`k zK`w4kBZ^YeY?U%fN(!v>^~=l4^~#O)@{7{-4J|D#^$m>ljf`}QQqpvbEAvVcD|GXU zl|e>8%y3C9PAq!~70b3=ShJm;B^Xkn=oUY?VOvTczYDXQo(znI;wnrlzS$iMnZNCI-4DmT5-1 ziHT;Wy5{C)iHXMMCMISksYph7<`tJD<|U_sjH<{j(96tBu}U;gOiDE{Fw-?PGPcw; zNl8uAO*Ak{)=e?AuuL(vOfoSuu|P7yzbG?3GcPd**;OE;QZiGl%*+jw6H|>%bW>A} zjde|uQ<8KoO_GdslZ=xMQ_PHw4HM0c!A7MdTe;;I)%-GVx!otkR($c`( z(hQ*}EVZaOGd~Yxs-c0NF~nq0#8~+kWv1qpB!W_^t&$;FM@4Rdm2**QVo82cNPd2f ztrEyl3PyT{2H*s)U;~L3kIdqd{Gv)baGD0^oZ!?#2oI78ax%eE3JTzaYn7M`v7|V$ zEHwpekpfIAIU_MIJvGHv37Vu};+a^Y%gEd$%`(;4NY}{1(nQxJE!A8XEkDFjGTJes;jgNvjPAW89P>Y`e3aUr@psd*{3O65xS zb`vgj=`%1eGX(gAxH2&O7Z4CoP*5;1FmP~i2nYyBNl7UwDQRhGnKEU{iWMt%?AUSQ z#EBa>ZoGK$;?JKyCN>@}J~0sq1vw=xEj=^lELgK)$B{D^?ilE>IN0z6_=qIL$W&A~ zOqr6hVMEKAGb=oFSR!mhG6HmJGCXFq#Ozp5ab?exFLyRLFt9|h2owk?bSRiCu<+Rv zl5-}b=1$9mH*=Q!*>m8}1%^K_Z2tUd@X=sMu;D0)km)F~n9~ukVNTAGEgdcr3<)|c z4K5sW5(IWsNL-nt@M4F+pDPT1el+~~b3lQG!9j#0L`EP-N2b9-V~U5xiWr|AIT1%1 za;{8i;4onja9~gfU@=HwaVX#kX%WeoBGa%!N5(`#$3?*=!XO~SCZoouVM@%54LMuR z)CibJD0t{tBzX9gL?m?NR4nP3abU%cJ0}z*7%XHMJTzD$On5RJBx*u*dU6~VG(`Al z2qc(Dl(=Yggjg&|aM)20aHb*Q%9Mf!D;nPHnGztwlA<9}VWH9EanM1_lQ95>H=O_LtleJZ56q2F0ft7$l56T^vIyZoQowS@zg$^Kn<92P(P> z&+GD+%x(WRMZ8e|W?TEeZ&!>|D_g&Zi8^#mv0zXr?ROQQG`UPYQ1C$i|5*&X!~dUt z?A|My&&d4z;DJhm0y&;J>^PX|4{Yi*K3qL=@Y}wfw)XQBR#PZ&p`}7K&KiBKHQh@h(43{{%@#@(~k50j^=^8{{G=8yR$dSxH@r0 z+c}#yd4-p?HR?~Uv-s_}?-^Vq*2?_;y7?ycoHv@sHYEMfaO|Hfxb*g!{waGEZ~Wl! zy`NQARc6Gyeqq7FJwK1X|G)3hbm>an2Sv@%AMW3mKefL54L8 z#K(HG+Vy;1rhWzY;vX?D3vVqinf&wRjM`;6Kg8cpud8)==Pv&lkT0}x#{bEhqbqEG%sCnLVI`S z53_l@BeniK{;pjR_U^FGwA+kX$MPz=BKH3KH)Bb`5!vpxOZD}8cHVSe%KUhT?B$29 z8QQfc;`VP+ez>JRUw;3?+?AdAmp;baTFEC~wAt?Hr^F{_4IJD1?!N97DQ@BDxVd5X zdaJ_X?dD5Lf~z}QH|g56U9#BYWF&R|u8g$4)4J=WI{s}*J72aXz43c>gZJ7|9m~dy zlsq?~qX)e2cBU_`|cuh|C&yyBYOW%pbG4JSlI(tjsQ|5g~a-0>*mTz71^7Qq2 z6)Ef1m(E7IV#BHs%XYTr)v|{v` zcK7Blodf5Sc9uRqpi(A%dolAy;e3uK^7&%l_WiZ}#K#5 zEYkkio9mY&JJ;@&W{bP}Fi9gi{?1&pi#uLTXi55dxnX^Yb8LJ!$8 zXS4ggy{Z-6uV1vimGSyR>CMH)_q`-hWz|*L5eAS-{-pQQkJ*yG=*`=#_7sez-1g{kNuc z$w&Kk?=O#g|5x_W4yl3}bCmL0?$j|0n15_Dyv;o&-Qx9`qjB?Af0v$de&0PQGoBym z?~?fKd$Wy&cba~v`21^;k^ zwRi8K?~hb!>niI`-MX@To%!diTjd9&Dr^r1U-NwP)9l+PB`?NywY*2y);2t6T_Za2 zFxwNaCyTYVGlr~;eq2{~aK2K!$j_Aiz|Vaur|w>n)6o;!r+&Eo`19$@P3#=?_t?Eq z`+Ru1)n|_x^}?$v{(kxN=ZApTdGYMeKNqU&r%cIusNefeE& z_U?ODS;B=eFRC^>-rAqA%*gASq}SD)y7KRpeD9N|*j>-74S6DVfP2wI?*zRkkL~rd zTmR%mJYCi>W!HPHJFlnL%c-t79liMPA;F5L=Qb-bbK1II5*G}*leYNVhsBbA_uqE< zUHJc@q38A2)6*ZUZLQ<1&8Ryo@-|=LpM1y7*`=R;JO~za)L!l`xn}ybY4@LJKRnGb zXW`1|?L{xSEcdlVfBf)cQ{?=RxQg4F2e!vu4EbL5`O^=DE(W=)$KDDkZP{~h0ZTEb z;h*bAK^Q*n>8`i$H<_SfYcPYf2{(1_lyclyIt zr>TGX-~X-Z5Gm@(tld~6GokCQgU#v!cmDkb*U~DFzs};>bMBmD8^@;7?euLk;Cv4xjSN9TI^vrcWC-x@$ zY@d5SjoGmJNbl_1t2>+jOsKGXb!~3c>a!7cVblBlcJ$rdx%}0;cQX>`t>>I(2GR5Xfb<17fiGG%wmr>r*WqI{!d90TF zrtP^YS-rcgPk;J1{Ypk13!5$5DQnj0j5nj&t;<)v7A^5e;(9J_B;RrK+P4se^NQun z^}8Ln_w6x${MYy{16PN{^;xAq?>^mlDq&jW)-%zi<a$w%J*F|fK4jU~ED_{Ih zZS`a+%d0QFpH&vFnw|Y~iq@jfJHATKZ5J+_x?8dE{NXPP)T8H@Fg9I!uqJZ4_M>BK zPxtMzmey2pe;#fgz3I_M&cf#JZwsGy?_^lWw9{>0WmQOLOxlz$w|pb6KfO_Xq4ej^ ziO)9d{kZFP5%a4@)|dBwZu<24U)Teqyge)SEI;7YRQ3Ar&0kNn{dVcyPur!p-LB5& z>fOqD=|{Kl{+Qn96uNiqIWGpAC;0|qyfUW(64uI8*3K%bPrr10!~BBHdgU`e6x_|d z*%1(^=3f5K$6b|c-_OEl+xNTMwKPgRE<9zt>zlk;_< zN8Z2xq`Ir*>IqGe{QD>7>I+spz4pGy%J=4x4_}RvcSOB4JGyz2mUa1t^3Mk@UKRYf z^@r=;($kyXTr*=33R(Q7=HP+wS9+ppulX>H$+()7h5NL5f zKX^dWqFh^X6jOZ)rryBqgBt2({@)9ZqQdG{Z_o^{~#`J(;SHIho@w;Im>y`H$e zo&79ZP5qI~_pxuL?!LS3&RhQDkN534R&{#)`t^?!%Qa4adXV(Kz#>9mI~(7##v|+Q zNGp{ywCwo)l#fAH?|zl}g9hmpZ@*7Jas180^lv9>*d4yL|IKUJb@flcjpNKh+T~9l z7PRcod3!Lupz7EO-NwgDCVYRM?s=ko{$}Rz9jDLxE7jS!zhjZ9oIbyP*989C!8`2B zKLj@Ib2exWGM^Xkd_&=FZRcj|8|$VQy!qE~+Eg`ElRHDz4N;^_!YC4`KUf{GYPV;g^9?uJHQ1lZo)FlvZhd9r^%G~4cPcJ8ccZrRwwOiE!}+J? zD{FGht6%e$@yoI+=Pxi9J)W_8%3ZFTA5vA{Y}#_qUS-|a<(IYx_TIk!(0X@79?Of( z`epBzJ!M(@M&?6}?D2D6#+yGoy4<=tF5-EVfNj`@ak zk=?Ql^5-{yE-uge&GdH4rL9+X7f4_EYFZ?+E$G{lCE+_uTYp>3Tf6(~CEcW-D{K$n z$mM^rI&a$)*_%7Fg*yK2wRxxMc+awwDLZxgQ;rhzmdW{K+xqS9neyT6evu4HXpG1+O5A-TcPnFj`puskr+*L9b6AlRyE4rndVba8rN+~w%jfANZ9mHP#&^@_ zR>u7F*UWprz6_tEm$Wl9HcMvrS@Q=Sci-K+_cN(+`=(N!C%eyG$?dbwT^o^CKQCKs zcdz+^nRCm(oIC!e_ILFY=XSxh_o{Xp?+SPrvFt^}yH9Pij^;U6AG`TesPT1p2ieTMC;x#s7Nol30K=iPDcT7SD$?d}T?YOYUFzq)jHWzwz6_kVtv z9;+_2uL}Np?e%Iw@w{5k@0ZSR`doBnuD;-ph;9269vr_M%HI5@X5#_Mo{%t61&)a-iIcwJ~?+1?^1!A}>WVi*7cN}5aX{sO;{9yI+Gt6`178vj}T{s#i;`-sFfW3cl zvw7{juZuLBWEtL=OqqM)_*+#cm5w_;Pp%zEd>EuG-pE+w?XX07VWD@$4W0v{`7LTo zwro{b)^rVV=6{%~^6K7}uUglFPL%A8T%OpmzvaV}8`t7QPO?m7E)+b&FB2wn@V?Ye zgMv3<4O5K8rOI9SxtCY-+=zan+wh(BQ)0E?zT$;EiRO!ize??TzUkfr7U@>mWna8S zR!>w3``pa<*<1V3zdZ*6i$5^@@m6j>VYsM>+hNH&g%wwP`4_4CGV<-%%W$`lXU)Xz z0t;8#-thh5u)@uEZ_~Qu{`Adp@zo!t%s8Vr_dV>^uql3X_%pY26@TZCC^j~w?F@BH zjaKVJ?56FLWL_0)x-{?WlvhWK*y477mPl0ov^nBlKL0%ZrWZ0*r}zIBEfub|JK~U{ zJ4L+zioO4a#FMx7nosIW@Z?PM zzZ^g8UrH$*SXJ~~r9h!$&7WYe+v)ty-F{bAL!Ia}(No zBls>)Idov2&k}}5T{~GGeWH5#J*Yo~fi`KNx zJ+gJ%VJlDnU@q$kyoa~(-Q+$IDe%$7P5sg1owGL{60|%j_eEC9@+tS1-~S@=7(9;W zPtx~_3{P#fILkVS%d!9a@jtTI*({M3=bM_N4}V6V>Atal#Hu$>|Dj{AX_^h#5{UkAb+emE;_?|8^%>7%zY#7~p?Wx?DGhu_SF(=A9Qnjp-Q~6VtkBhI8?;`mGU{Ond~M@lU_IT+cDdi}oqKeDvutht zF1SnJ-QLPCk9bpee>0TY866>-;b0S*e=%lniOp@t?&aUqJvT4^eJy+a-B9kWd$hH+ zgjn;WxdIHm1oGdWzqp-!Uj4z_+t#gLw9Ec&iT099-e0(HUyx({tIFlVuFfcWF8i=r@_=-sP3&p5k1lMN6xfaC7lbaEd%S2iXZewL-A-p-6)c)o zzV*(RL#^-Q#H$Zy^c+2wNG zTDHq0?ma%Y8(e$MRXDNM**0wZ-9>HD-_x1bC0W|7a(efvEo?_r&ak+eKH>ketmt%>xYaec)_N^>Im_L*xkj1k*r%1AJq3GP%ColpD19FjeqZDL0{a?$?ux~B z-dWrIdcTET-Mrwvjpfeb!dG+oD?hg~hNmynDtJ9MH z@2JEJ75K_*{<_NUaE@)vS}`sersgYWuRM9Q?65yW+}&=6N1-bHI-g{M-cu9d!9y#Ft6z|C2^+}}i2_eitfJ9kaF{qW@II}NAiN`HuZFu!BL zEQ3W;SLw=F#2S4&v+rPe<$={6?prfQpP7%9%pWXgoL{6r7uJ<{ rmGFRP4z5vq_^^KC=O2oX|1)e8jXC8P^~{EWfq}u()z4*}Q$iB}+%6z8 literal 0 HcmV?d00001 From 07177467b370b0b474f012bb529514f7f0b3b153 Mon Sep 17 00:00:00 2001 From: mmtunligit <156685720+mmtunligit@users.noreply.github.com> Date: Mon, 24 Nov 2025 20:56:19 +0100 Subject: [PATCH 218/280] Feature: Signs, waypoint and station names may be moved (#14744) --- src/command_type.h | 3 ++ src/lang/english.txt | 13 ++++--- src/misc_gui.cpp | 68 ++++++++++++++++++++++++++++++++--- src/signs.cpp | 6 ++-- src/signs_cmd.cpp | 32 ++++++++++++++++- src/signs_cmd.h | 2 ++ src/signs_func.h | 2 +- src/signs_gui.cpp | 53 ++++++++++++++++++++++----- src/station_cmd.cpp | 55 ++++++++++++++++++++++++++++ src/station_cmd.h | 4 +++ src/station_gui.cpp | 14 ++++++-- src/textbuf_gui.h | 1 + src/viewport.cpp | 75 +++++++++++++++++++++++++++++++++++++++ src/viewport_func.h | 2 ++ src/waypoint_cmd.cpp | 57 +++++++++++++++++++++++++++++ src/waypoint_cmd.h | 4 +++ src/waypoint_gui.cpp | 14 ++++++-- src/widgets/misc_widget.h | 2 ++ src/widgets/sign_widget.h | 1 + 19 files changed, 380 insertions(+), 28 deletions(-) diff --git a/src/command_type.h b/src/command_type.h index babf32dd54..6445913bc6 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -214,6 +214,7 @@ enum Commands : uint8_t { CMD_BUILD_RAIL_WAYPOINT, ///< build a waypoint CMD_RENAME_WAYPOINT, ///< rename a waypoint + CMD_MOVE_WAYPOINT_NAME, ///< move a waypoint name CMD_REMOVE_FROM_RAIL_WAYPOINT, ///< remove a (rectangle of) tiles from a rail waypoint CMD_BUILD_ROAD_WAYPOINT, ///< build a road waypoint @@ -275,10 +276,12 @@ enum Commands : uint8_t { CMD_RENAME_COMPANY, ///< change the company name CMD_RENAME_PRESIDENT, ///< change the president name CMD_RENAME_STATION, ///< rename a station + CMD_MOVE_STATION_NAME, ///< move a station name CMD_RENAME_DEPOT, ///< rename a depot CMD_PLACE_SIGN, ///< place a sign CMD_RENAME_SIGN, ///< rename a sign + CMD_MOVE_SIGN, ///< move a sign CMD_TURN_ROADVEH, ///< turn a road vehicle around diff --git a/src/lang/english.txt b/src/lang/english.txt index dd2f426621..04efb34743 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}By enabl STR_BUTTON_DEFAULT :{BLACK}Default STR_BUTTON_CANCEL :{BLACK}Cancel STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Move # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -3687,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Match ca STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Toggle matching case when comparing sign names against the filter string # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign text +STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centre the main view on sign location. Ctrl+Click to open a new viewport on sign location STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign @@ -3904,14 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Outstanding STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on station location. Ctrl+Click to open a new viewport on station location -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Change name of station +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Rename station or move sign STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Show all road vehicles which have this station on their schedule STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Show all aircraft which have this station on their schedule STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Show all ships which have this station on their schedule -STR_STATION_VIEW_RENAME_STATION_CAPTION :Rename station/loading area +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Edit station sign STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Close airport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent aircraft from landing on this airport @@ -3919,11 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Change waypoint name +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Rename waypoint or move sign STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on buoy location. Ctrl+Click to open a new viewport on buoy location STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Change buoy name -STR_EDIT_WAYPOINT_NAME :{WHITE}Edit waypoint name +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Edit waypoint sign # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finances {BLACK}{COMPANY_NUM} @@ -5137,6 +5138,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Can't move station sign... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... road owned by a town STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners @@ -5168,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Can't bu STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Can't build road waypoint here... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Can't place buoy here... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Can't change waypoint name... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Can't move waypoint sign... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Can't remove rail waypoint here... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Can't remove road waypoint here... diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 5b9d683a55..936480e855 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -13,11 +13,14 @@ #include "error.h" #include "gui.h" #include "gfx_layout.h" +#include "tilehighlight_func.h" #include "command_func.h" #include "company_func.h" #include "town.h" #include "string_func.h" #include "company_base.h" +#include "station_base.h" +#include "waypoint_base.h" #include "texteff.hpp" #include "strings_func.h" #include "window_func.h" @@ -27,6 +30,8 @@ #include "zoom_func.h" #include "viewport_func.h" #include "landscape_cmd.h" +#include "station_cmd.h" +#include "waypoint_cmd.h" #include "rev.h" #include "timer/timer.h" #include "timer/timer_window.h" @@ -899,6 +904,8 @@ struct QueryStringWindow : public Window QueryString editbox; ///< Editbox. QueryStringFlags flags{}; ///< Flags controlling behaviour of the window. + WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action. + QueryStringWindow(std::string_view str, StringID caption, uint max_bytes, uint max_chars, WindowDesc &desc, Window *parent, CharSetFilter afilter, QueryStringFlags flags) : Window(desc), editbox(max_bytes, max_chars) { @@ -913,7 +920,9 @@ struct QueryStringWindow : public Window this->editbox.text.afilter = afilter; this->flags = flags; - this->InitNested(WN_QUERY_STRING); + this->CreateNestedTree(); + this->GetWidget(WID_QS_MOVE_SEL)->SetDisplayedPlane((this->flags.Test(QueryStringFlag::EnableMove)) ? 0 : SZSP_NONE); + this->FinishInitNested(WN_QUERY_STRING); this->parent = parent; @@ -961,16 +970,64 @@ struct QueryStringWindow : public Window case WID_QS_CANCEL: this->Close(); break; + + case WID_QS_MOVE: + this->last_user_action = widget; + + if (Station::IsExpected(Station::Get(this->parent->window_number))) { + /* this is a station */ + SetViewportStationRect(Station::Get(this->parent->window_number), !this->IsWidgetLowered(WID_QS_MOVE)); + } else { + /* this is a waypoint */ + SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), !this->IsWidgetLowered(WID_QS_MOVE)); + } + + HandlePlacePushButton(this, WID_QS_MOVE, SPR_CURSOR_SIGN, HT_RECT); + break; } } + void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override + { + switch (this->last_user_action) { + case WID_QS_MOVE: // Move name button + if (Station::IsExpected(Station::Get(this->parent->window_number))) { + /* this is a station */ + Command::Post(STR_ERROR_CAN_T_MOVE_STATION_NAME, CcMoveStationName, this->parent->window_number, tile); + } else { + /* this is a waypoint */ + Command::Post(STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME, CcMoveWaypointName, this->parent->window_number, tile); + } + break; + + default: NOT_REACHED(); + } + } + + void OnPlaceObjectAbort() override + { + if (Station::IsExpected(Station::Get(this->parent->window_number))) { + /* this is a station */ + SetViewportStationRect(Station::Get(this->parent->window_number), false); + } else { + /* this is a waypoint */ + SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), false); + } + + this->RaiseButtons(); + } + void Close([[maybe_unused]] int data = 0) override { + if (this->parent->window_class == WC_STATION_VIEW) SetViewportStationRect(Station::Get(this->parent->window_number), false); + if (this->parent->window_class == WC_WAYPOINT_VIEW) SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), false); + if (!this->editbox.handled && this->parent != nullptr) { Window *parent = this->parent; this->parent = nullptr; // so parent doesn't try to close us again parent->OnQueryTextFinished(std::nullopt); } + this->Window::Close(); } }; @@ -984,9 +1041,12 @@ static constexpr std::initializer_list _nested_query_string_widgets NWidget(WWT_EDITBOX, COLOUR_GREY, WID_QS_TEXT), SetMinimalSize(256, 0), SetFill(1, 0), SetPadding(2, 2, 2, 2), EndContainer(), NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(86, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_QS_MOVE_SEL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_MOVE), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_MOVE), + EndContainer(), EndContainer(), }; diff --git a/src/signs.cpp b/src/signs.cpp index a2bf7ab979..90fcf00cf2 100644 --- a/src/signs.cpp +++ b/src/signs.cpp @@ -55,11 +55,11 @@ void UpdateAllSignVirtCoords() } /** - * Check if the current company can rename a given sign. + * Check if the current company can rename or move a given sign. * @param *si The sign in question. - * @return true if the sign can be renamed, else false. + * @return true if the sign can be renamed or moved, else false. */ -bool CompanyCanRenameSign(const Sign *si) +bool CompanyCanEditSign(const Sign *si) { if (si->owner == OWNER_DEITY && _current_company != OWNER_DEITY && _game_mode != GM_EDITOR) return false; return true; diff --git a/src/signs_cmd.cpp b/src/signs_cmd.cpp index 0e02401129..9ac496ce1b 100644 --- a/src/signs_cmd.cpp +++ b/src/signs_cmd.cpp @@ -68,7 +68,7 @@ CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::strin { Sign *si = Sign::GetIfValid(sign_id); if (si == nullptr) return CMD_ERROR; - if (!CompanyCanRenameSign(si)) return CMD_ERROR; + if (!CompanyCanEditSign(si)) return CMD_ERROR; /* Rename the signs when empty, otherwise remove it */ if (!text.empty()) { @@ -95,6 +95,36 @@ CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::strin return CommandCost(); } +/** + * Move a sign to the given coordinates. Ownership of signs + * has no meaning/effect whatsoever except for eyecandy. + * @param flags type of operation + * @param sign_id index of the sign to be moved + * @param tile tile to place the sign at + * @return the cost of this operation or an error + */ +CommandCost CmdMoveSign(DoCommandFlags flags, SignID sign_id, TileIndex tile) +{ + Sign *si = Sign::GetIfValid(sign_id); + if (si == nullptr) return CMD_ERROR; + if (!CompanyCanEditSign(si)) return CMD_ERROR; + + /* Move the sign */ + if (flags.Test(DoCommandFlag::Execute)) { + int x = TileX(tile) * TILE_SIZE; + int y = TileY(tile) * TILE_SIZE; + + si->x = x; + si->y = y; + si->z = GetSlopePixelZ(x, y); + if (_game_mode != GM_EDITOR) si->owner = _current_company; + + si->UpdateVirtCoord(); + } + + return CommandCost(); +} + /** * Callback function that is called after a sign is placed * @param result of the operation diff --git a/src/signs_cmd.h b/src/signs_cmd.h index 3d8722b070..b51abd88d1 100644 --- a/src/signs_cmd.h +++ b/src/signs_cmd.h @@ -15,9 +15,11 @@ std::tuple CmdPlaceSign(DoCommandFlags flags, TileIndex tile, const std::string &text); CommandCost CmdRenameSign(DoCommandFlags flags, SignID sign_id, const std::string &text); +CommandCost CmdMoveSign(DoCommandFlags flags, SignID sign_id, TileIndex tile); DEF_CMD_TRAIT(CMD_PLACE_SIGN, CmdPlaceSign, CommandFlag::Deity, CommandType::OtherManagement) DEF_CMD_TRAIT(CMD_RENAME_SIGN, CmdRenameSign, CommandFlag::Deity, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_MOVE_SIGN, CmdMoveSign, CommandFlag::Deity, CommandType::OtherManagement) void CcPlaceSign(Commands cmd, const CommandCost &result, SignID new_sign); diff --git a/src/signs_func.h b/src/signs_func.h index 18f27fc81e..21abdc98fe 100644 --- a/src/signs_func.h +++ b/src/signs_func.h @@ -17,7 +17,7 @@ struct Window; void UpdateAllSignVirtCoords(); void PlaceProc_Sign(TileIndex tile); -bool CompanyCanRenameSign(const Sign *si); +bool CompanyCanEditSign(const Sign *si); /* signs_gui.cpp */ void ShowRenameSignWindow(const Sign *si); diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index eb62f3e95d..109773b952 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -20,6 +20,7 @@ #include "viewport_func.h" #include "querystring_gui.h" #include "sortlist_type.h" +#include "tilehighlight_func.h" #include "stringfilter_type.h" #include "string_func.h" #include "core/geometry_func.hpp" @@ -387,9 +388,20 @@ static bool RenameSign(SignID index, std::string_view text) return remove; } +/** + * Actually move the sign. + * @param index the sign to move. + * @param tile on which to move the sign to. + */ +void MoveSign(SignID index, TileIndex tile) +{ + Command::Post(STR_ERROR_CAN_T_PLACE_SIGN_HERE, index, tile); +} + struct SignWindow : Window, SignList { QueryString name_editbox; SignID cur_sign{}; + WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action. SignWindow(WindowDesc &desc, const Sign *si) : Window(desc), name_editbox(MAX_LENGTH_SIGN_NAME_CHARS * MAX_CHAR_LENGTH, MAX_LENGTH_SIGN_NAME_CHARS) { @@ -487,12 +499,6 @@ struct SignWindow : Window, SignList { break; } - case WID_QES_DELETE: - /* Only need to set the buffer to null, the rest is handled as the OK button */ - RenameSign(this->cur_sign, ""); - /* don't delete this, we are deleted in Sign::~Sign() -> DeleteRenameSignWindow() */ - break; - case WID_QES_OK: if (RenameSign(this->cur_sign, this->name_editbox.text.GetText())) break; [[fallthrough]]; @@ -500,8 +506,37 @@ struct SignWindow : Window, SignList { case WID_QES_CANCEL: this->Close(); break; + + case WID_QES_DELETE: + /* Only need to set the buffer to null, the rest is handled as the OK button */ + RenameSign(this->cur_sign, ""); + /* don't delete this, we are deleted in Sign::~Sign() -> DeleteRenameSignWindow() */ + break; + + case WID_QES_MOVE: + HandlePlacePushButton(this, WID_QES_MOVE, SPR_CURSOR_SIGN, HT_RECT); + this->last_user_action = widget; + break; } } + + void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override + { + switch (this->last_user_action) { + case WID_QES_MOVE: // Place sign button + RenameSign(this->cur_sign, this->name_editbox.text.GetText()); + MoveSign(this->cur_sign, tile); + this->Close(); + break; + + default: NOT_REACHED(); + } + } + + void OnPlaceObjectAbort() override + { + this->RaiseButtons(); + } }; static constexpr std::initializer_list _nested_query_sign_edit_widgets = { @@ -517,7 +552,7 @@ static constexpr std::initializer_list _nested_query_sign_edit_widg NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_QES_OK), SetMinimalSize(61, 12), SetStringTip(STR_BUTTON_OK), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_QES_CANCEL), SetMinimalSize(60, 12), SetStringTip(STR_BUTTON_CANCEL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_QES_DELETE), SetMinimalSize(60, 12), SetStringTip(STR_TOWN_VIEW_DELETE_BUTTON), - NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), EndContainer(), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QES_MOVE), SetMinimalSize(60, 12), SetStringTip(STR_BUTTON_MOVE), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_QES_PREVIOUS), SetMinimalSize(11, 12), SetArrowWidgetTypeTip(AWV_DECREASE, STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP), NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_QES_NEXT), SetMinimalSize(11, 12), SetArrowWidgetTypeTip(AWV_INCREASE, STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP), EndContainer(), @@ -536,8 +571,8 @@ static WindowDesc _query_sign_edit_desc( */ void HandleClickOnSign(const Sign *si) { - /* If we can't rename the sign, don't even open the rename GUI. */ - if (!CompanyCanRenameSign(si)) return; + /* If we can't edit the sign, don't even open the rename GUI. */ + if (!CompanyCanEditSign(si)) return; if (_ctrl_pressed && (si->owner == _local_company || (si->owner == OWNER_DEITY && _game_mode == GM_EDITOR))) { RenameSign(si->index, ""); diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index c77f4c0440..4bc5e35091 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -29,6 +29,7 @@ #include "road_internal.h" /* For drawing catenary/checking road removal */ #include "autoslope.h" #include "water.h" +#include "tilehighlight_func.h" #include "strings_func.h" #include "clear_func.h" #include "timer/timer_game_calendar.h" @@ -71,6 +72,7 @@ #include "station_layout_type.h" #include "widgets/station_widget.h" +#include "widgets/misc_widget.h" #include "table/strings.h" #include "table/station_land.h" @@ -4475,6 +4477,59 @@ CommandCost CmdRenameStation(DoCommandFlags flags, StationID station_id, const s return CommandCost(); } +/** + * Move a station name. + * @param flags type of operation + * @param station_id id of the station + * @param tile to move the station name to + * @return the cost of this operation or an error and the station ID + */ +std::tuple CmdMoveStationName(DoCommandFlags flags, StationID station_id, TileIndex tile) +{ + Station *st = Station::GetIfValid(station_id); + if (st == nullptr) return { CMD_ERROR, StationID::Invalid() }; + + if (st->owner != OWNER_NONE) { + CommandCost ret = CheckOwnership(st->owner); + if (ret.Failed()) return { ret, StationID::Invalid() }; + } + + const StationRect *r = &st->rect; + if (!r->PtInExtendedRect(TileX(tile), TileY(tile))) { + return { CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() }; + } + + bool other_station = false; + /* Check if the tile is the base tile of another station */ + ForAllStationsRadius(tile, 0, [&](BaseStation *s) { + if (s != nullptr) { + if (s != st && s->xy == tile) other_station = true; + } + }); + if (other_station) return { CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() }; + + if (flags.Test(DoCommandFlag::Execute)) { + st->MoveSign(tile); + + st->UpdateVirtCoord(); + } + return { CommandCost(), station_id }; +} + +/** +* Callback function that is called after a name is moved +* @param result of the operation +* @param station_id ID of the changed station +*/ +void CcMoveStationName(Commands, const CommandCost &result, StationID station_id) + { + if (result.Failed()) return; + + ResetObjectToPlace(); + Station *st = Station::Get(station_id); + SetViewportStationRect(st, false); + } + static void AddNearbyStationsByCatchment(TileIndex tile, StationList &stations, StationList &nearby) { for (Station *st : nearby) { diff --git a/src/station_cmd.h b/src/station_cmd.h index 38382cee27..5c12bf407d 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -30,6 +30,7 @@ CommandCost CmdRemoveFromRailStation(DoCommandFlags flags, TileIndex start, Tile CommandCost CmdBuildRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width, uint8_t length, RoadStopType stop_type, bool is_drive_through, DiagDirection ddir, RoadType rt, RoadStopClassID spec_class, uint16_t spec_index, StationID station_to_join, bool adjacent); CommandCost CmdRemoveRoadStop(DoCommandFlags flags, TileIndex tile, uint8_t width, uint8_t height, RoadStopType stop_type, bool remove_road); CommandCost CmdRenameStation(DoCommandFlags flags, StationID station_id, const std::string &text); +std::tuple CmdMoveStationName(DoCommandFlags flags, StationID station_id, TileIndex tile); CommandCost CmdOpenCloseAirport(DoCommandFlags flags, StationID station_id); DEF_CMD_TRAIT(CMD_BUILD_AIRPORT, CmdBuildAirport, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) @@ -39,6 +40,9 @@ DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_STATION, CmdRemoveFromRailStation, {}, DEF_CMD_TRAIT(CMD_BUILD_ROAD_STOP, CmdBuildRoadStop, CommandFlags({CommandFlag::Auto, CommandFlag::NoWater}), CommandType::LandscapeConstruction) DEF_CMD_TRAIT(CMD_REMOVE_ROAD_STOP, CmdRemoveRoadStop, {}, CommandType::LandscapeConstruction) DEF_CMD_TRAIT(CMD_RENAME_STATION, CmdRenameStation, {}, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_MOVE_STATION_NAME, CmdMoveStationName, {}, CommandType::OtherManagement) DEF_CMD_TRAIT(CMD_OPEN_CLOSE_AIRPORT, CmdOpenCloseAirport, {}, CommandType::RouteManagement) +void CcMoveStationName(Commands cmd, const CommandCost &result, StationID station_id); + #endif /* STATION_CMD_H */ diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 9cb198d434..5804a8eed2 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -35,6 +35,7 @@ #include "station_cmd.h" #include "widgets/station_widget.h" +#include "widgets/misc_widget.h" #include "table/strings.h" @@ -814,7 +815,7 @@ void ShowCompanyStations(CompanyID company) static constexpr std::initializer_list _nested_station_view_widgets = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SV_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_STATION_VIEW_RENAME_TOOLTIP), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SV_RENAME), SetAspect(WidgetDimensions::ASPECT_RENAME), SetSpriteTip(SPR_RENAME, STR_STATION_VIEW_EDIT_TOOLTIP), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SV_CAPTION), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_SV_LOCATION), SetAspect(WidgetDimensions::ASPECT_LOCATION), SetSpriteTip(SPR_GOTO_LOCATION, STR_STATION_VIEW_CENTER_TOOLTIP), NWidget(WWT_SHADEBOX, COLOUR_GREY), @@ -1957,6 +1958,8 @@ struct StationViewWindow : public Window { void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { + Window *w = FindWindowByClass(WC_QUERY_STRING); + switch (widget) { case WID_SV_WAITING: this->HandleCargoWaitingClick(this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SV_WAITING, WidgetDimensions::scaled.framerect.top) - this->vscroll->GetPosition()); @@ -1964,6 +1967,11 @@ struct StationViewWindow : public Window { case WID_SV_CATCHMENT: SetViewportCatchmentStation(Station::Get(this->window_number), !this->IsWidgetLowered(WID_SV_CATCHMENT)); + + if (w != nullptr && this->IsWidgetLowered(WID_SV_CATCHMENT)) { + if (w->parent->window_class == WC_STATION_VIEW && w->IsWidgetLowered(WID_QS_MOVE)) SetViewportStationRect(Station::Get(w->parent->window_number), true); + if (w->parent->window_class == WC_WAYPOINT_VIEW && w->IsWidgetLowered(WID_QS_MOVE)) SetViewportWaypointRect(Waypoint::Get(w->parent->window_number), true); + } break; case WID_SV_LOCATION: @@ -1990,8 +1998,8 @@ struct StationViewWindow : public Window { } case WID_SV_RENAME: - ShowQueryString(GetString(STR_STATION_NAME, this->window_number), STR_STATION_VIEW_RENAME_STATION_CAPTION, MAX_LENGTH_STATION_NAME_CHARS, - this, CS_ALPHANUMERAL, {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars}); + ShowQueryString(GetString(STR_STATION_NAME, this->window_number), STR_STATION_VIEW_EDIT_STATION_SIGN, MAX_LENGTH_STATION_NAME_CHARS, + this, CS_ALPHANUMERAL, {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars, QueryStringFlag::EnableMove}); break; case WID_SV_CLOSE_AIRPORT: diff --git a/src/textbuf_gui.h b/src/textbuf_gui.h index 5b758183c7..d3f4f9915d 100644 --- a/src/textbuf_gui.h +++ b/src/textbuf_gui.h @@ -19,6 +19,7 @@ enum class QueryStringFlag : uint8_t { AcceptUnchanged, ///< return success even when the text didn't change EnableDefault, ///< enable the 'Default' button ("\0" is returned) LengthIsInChars, ///< the length of the string is counted in characters + EnableMove, ///< enable the 'Move' button }; using QueryStringFlags = EnumBitSet; diff --git a/src/viewport.cpp b/src/viewport.cpp index 83d08f5c56..ea0da5a477 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1009,7 +1009,9 @@ enum TileHighlightType : uint8_t { }; const Station *_viewport_highlight_station; ///< Currently selected station for coverage area highlight +const Station *_viewport_highlight_station_rect; ///< Currently selected station for rectangle highlight const Waypoint *_viewport_highlight_waypoint; ///< Currently selected waypoint for coverage area highlight +const Waypoint *_viewport_highlight_waypoint_rect; ///< Currently selected waypoint for rectangle highlight const Town *_viewport_highlight_town; ///< Currently selected town for coverage area highlight /** @@ -1023,10 +1025,23 @@ static TileHighlightType GetTileHighlightType(TileIndex t) if (IsTileType(t, MP_STATION) && GetStationIndex(t) == _viewport_highlight_station->index) return THT_WHITE; if (_viewport_highlight_station->TileIsInCatchment(t)) return THT_BLUE; } + + if (_viewport_highlight_station_rect != nullptr) { + if (IsTileType(t, MP_STATION) && GetStationIndex(t) == _viewport_highlight_station_rect->index) return THT_WHITE; + const StationRect *r = &_viewport_highlight_station_rect->rect; + if (r->PtInExtendedRect(TileX(t), TileY(t))) return THT_BLUE; + } + if (_viewport_highlight_waypoint != nullptr) { if (IsTileType(t, MP_STATION) && GetStationIndex(t) == _viewport_highlight_waypoint->index) return THT_BLUE; } + if (_viewport_highlight_waypoint_rect != nullptr) { + if (IsTileType(t, MP_STATION) && GetStationIndex(t) == _viewport_highlight_waypoint_rect->index) return THT_WHITE; + const StationRect *r = &_viewport_highlight_waypoint_rect->rect; + if (r->PtInExtendedRect(TileX(t), TileY(t))) return THT_BLUE; + } + if (_viewport_highlight_town != nullptr) { if (IsTileType(t, MP_HOUSE)) { if (GetTownIndex(t) == _viewport_highlight_town->index) { @@ -3635,6 +3650,7 @@ void MarkCatchmentTilesDirty() MarkWholeScreenDirty(); return; } + if (_viewport_highlight_station != nullptr) { if (_viewport_highlight_station->catchment_tiles.tile == INVALID_TILE) { MarkWholeScreenDirty(); @@ -3646,18 +3662,35 @@ void MarkCatchmentTilesDirty() } } } + + if (_viewport_highlight_station_rect != nullptr) { + if (!_viewport_highlight_station_rect->IsInUse()) { + _viewport_highlight_station_rect = nullptr; + } + MarkWholeScreenDirty(); + } + if (_viewport_highlight_waypoint != nullptr) { if (!_viewport_highlight_waypoint->IsInUse()) { _viewport_highlight_waypoint = nullptr; } MarkWholeScreenDirty(); } + + if (_viewport_highlight_waypoint_rect != nullptr) { + if (!_viewport_highlight_waypoint_rect->IsInUse()) { + _viewport_highlight_waypoint_rect = nullptr; + } + MarkWholeScreenDirty(); + } } static void SetWindowDirtyForViewportCatchment() { if (_viewport_highlight_station != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station->index); + if (_viewport_highlight_station_rect != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station_rect->index); if (_viewport_highlight_waypoint != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint->index); + if (_viewport_highlight_waypoint_rect != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint_rect->index); if (_viewport_highlight_town != nullptr) SetWindowDirty(WC_TOWN_VIEW, _viewport_highlight_town->index); } @@ -3665,7 +3698,9 @@ static void ClearViewportCatchment() { MarkCatchmentTilesDirty(); _viewport_highlight_station = nullptr; + _viewport_highlight_station_rect = nullptr; _viewport_highlight_waypoint = nullptr; + _viewport_highlight_waypoint_rect = nullptr; _viewport_highlight_town = nullptr; } @@ -3689,6 +3724,26 @@ void SetViewportCatchmentStation(const Station *st, bool sel) if (_viewport_highlight_station != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station->index); } +/** + * Select or deselect station for rectangle area highlight. + * Selecting a station will deselect a town. + * @param *st Station in question + * @param sel Select or deselect given station + */ +void SetViewportStationRect(const Station *st, bool sel) +{ + SetWindowDirtyForViewportCatchment(); + if (sel && _viewport_highlight_station_rect != st) { // mark tiles dirty for redrawing and update selected station if a different station is already highlighted + ClearViewportCatchment(); + _viewport_highlight_station_rect = st; + MarkCatchmentTilesDirty(); + } else if (!sel && _viewport_highlight_station_rect == st) { // mark tiles dirty for redrawing and clear station selection if deselecting highlight + MarkCatchmentTilesDirty(); + _viewport_highlight_station_rect = nullptr; + } + if (_viewport_highlight_station_rect != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station_rect->index); // redraw the currently selected station window +} + /** * Select or deselect waypoint for coverage area highlight. * Selecting a waypoint will deselect a town. @@ -3709,6 +3764,26 @@ void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel) if (_viewport_highlight_waypoint != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint->index); } +/** + * Select or deselect waypoint for rectangle area highlight. + * Selecting a waypoint will deselect a town. + * @param *wp Waypoint in question + * @param sel Select or deselect given waypoint + */ +void SetViewportWaypointRect(const Waypoint *wp, bool sel) +{ + SetWindowDirtyForViewportCatchment(); + if (sel && _viewport_highlight_waypoint_rect != wp) { // mark tiles dirty for redrawing and update selected waypoint if a different waypoint is already highlighted + ClearViewportCatchment(); + _viewport_highlight_waypoint_rect = wp; + MarkCatchmentTilesDirty(); + } else if (!sel && _viewport_highlight_waypoint_rect == wp) { // mark tiles dirty for redrawing and clear waypoint selection if deselecting highlight + MarkCatchmentTilesDirty(); + _viewport_highlight_waypoint_rect = nullptr; + } + if (_viewport_highlight_waypoint_rect != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint_rect->index); // redraw the currently selected waypoint window +} + /** * Select or deselect town for coverage area highlight. * Selecting a town will deselect a station. diff --git a/src/viewport_func.h b/src/viewport_func.h index e218b41fe0..f58cf5ad80 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -104,7 +104,9 @@ struct Waypoint; struct Town; void SetViewportCatchmentStation(const Station *st, bool sel); +void SetViewportStationRect(const Station *st, bool sel); void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel); +void SetViewportWaypointRect(const Waypoint *wp, bool sel); void SetViewportCatchmentTown(const Town *t, bool sel); void MarkCatchmentTilesDirty(); diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index f76d9bd1f7..aee8f9dbd0 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -16,9 +16,11 @@ #include "waypoint_base.h" #include "pathfinder/yapf/yapf_cache.h" #include "pathfinder/water_regions.h" +#include "tilehighlight_func.h" #include "strings_func.h" #include "viewport_func.h" #include "viewport_kdtree.h" +#include "station_kdtree.h" #include "window_func.h" #include "timer/timer_game_calendar.h" #include "vehicle_func.h" @@ -33,6 +35,8 @@ #include "landscape_cmd.h" #include "station_layout_type.h" +#include "widgets/misc_widget.h" + #include "table/strings.h" #include "safeguards.h" @@ -603,3 +607,56 @@ CommandCost CmdRenameWaypoint(DoCommandFlags flags, StationID waypoint_id, const } return CommandCost(); } + +/** + * Move a waypoint name. + * @param flags type of operation + * @param waypoint_id id of waypoint + * @param tile to move the waypoint name to + * @return the cost of this operation or an error and the waypoint ID + */ +std::tuple CmdMoveWaypointName(DoCommandFlags flags, StationID waypoint_id, TileIndex tile) +{ + Waypoint *wp = Waypoint::GetIfValid(waypoint_id); + if (wp == nullptr) return { CMD_ERROR, StationID::Invalid() }; + + if (wp->owner != OWNER_NONE) { + CommandCost ret = CheckOwnership(wp->owner); + if (ret.Failed()) return { ret, StationID::Invalid() }; + } + + const StationRect *r = &wp->rect; + if (!r->PtInExtendedRect(TileX(tile), TileY(tile))) { + return { CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() }; + } + + bool other_station = false; + /* Check if the tile is the base tile of another station */ + ForAllStationsRadius(tile, 0, [&](BaseStation *st) { + if (st != nullptr) { + if (st != wp && st->xy == tile) other_station = true; + } + }); + if (other_station) return { CommandCost(STR_ERROR_SITE_UNSUITABLE), StationID::Invalid() }; + + if (flags.Test(DoCommandFlag::Execute)) { + wp->MoveSign(tile); + + wp->UpdateVirtCoord(); + } + return { CommandCost(), waypoint_id }; +} + +/** + * Callback function that is called after a name is moved + * @param result of the operation + * @param waypoint_id ID of the changed waypoint + */ +void CcMoveWaypointName(Commands, const CommandCost &result, StationID waypoint_id) +{ + if (result.Failed()) return; + + ResetObjectToPlace(); + Waypoint *wp = Waypoint::Get(waypoint_id); + SetViewportCatchmentWaypoint(wp, false); +} diff --git a/src/waypoint_cmd.h b/src/waypoint_cmd.h index 2831c5c981..61cd6f4581 100644 --- a/src/waypoint_cmd.h +++ b/src/waypoint_cmd.h @@ -22,6 +22,7 @@ CommandCost CmdBuildRoadWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi CommandCost CmdRemoveFromRoadWaypoint(DoCommandFlags flags, TileIndex start, TileIndex end); CommandCost CmdBuildBuoy(DoCommandFlags flags, TileIndex tile); CommandCost CmdRenameWaypoint(DoCommandFlags flags, StationID waypoint_id, const std::string &text); +std::tuple CmdMoveWaypointName(DoCommandFlags flags, StationID waypoint_id, TileIndex tile); DEF_CMD_TRAIT(CMD_BUILD_RAIL_WAYPOINT, CmdBuildRailWaypoint, {}, CommandType::LandscapeConstruction) DEF_CMD_TRAIT(CMD_REMOVE_FROM_RAIL_WAYPOINT, CmdRemoveFromRailWaypoint, {}, CommandType::LandscapeConstruction) @@ -29,5 +30,8 @@ DEF_CMD_TRAIT(CMD_BUILD_ROAD_WAYPOINT, CmdBuildRoadWaypoint, {}, DEF_CMD_TRAIT(CMD_REMOVE_FROM_ROAD_WAYPOINT, CmdRemoveFromRoadWaypoint, {}, CommandType::LandscapeConstruction) DEF_CMD_TRAIT(CMD_BUILD_BUOY, CmdBuildBuoy, CommandFlag::Auto, CommandType::LandscapeConstruction) DEF_CMD_TRAIT(CMD_RENAME_WAYPOINT, CmdRenameWaypoint, {}, CommandType::OtherManagement) +DEF_CMD_TRAIT(CMD_MOVE_WAYPOINT_NAME, CmdMoveWaypointName, {}, CommandType::OtherManagement) + +void CcMoveWaypointName(Commands cmd, const CommandCost &result, StationID waypoint_id); #endif /* WAYPOINT_CMD_H */ diff --git a/src/waypoint_gui.cpp b/src/waypoint_gui.cpp index 6efd4cb29a..ae95632de8 100644 --- a/src/waypoint_gui.cpp +++ b/src/waypoint_gui.cpp @@ -20,10 +20,12 @@ #include "company_base.h" #include "window_func.h" #include "waypoint_base.h" +#include "station_base.h" #include "waypoint_cmd.h" #include "zoom_func.h" #include "widgets/waypoint_widget.h" +#include "widgets/misc_widget.h" #include "table/strings.h" @@ -87,7 +89,7 @@ public: } if (this->vt != VEH_SHIP) { this->GetWidget(WID_W_CENTER_VIEW)->SetToolTip(STR_WAYPOINT_VIEW_CENTER_TOOLTIP); - this->GetWidget(WID_W_RENAME)->SetToolTip(STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME); + this->GetWidget(WID_W_RENAME)->SetToolTip(STR_WAYPOINT_VIEW_EDIT_TOOLTIP); } this->FinishInitNested(window_number); @@ -125,6 +127,8 @@ public: void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { + Window *w = FindWindowByClass(WC_QUERY_STRING); + switch (widget) { case WID_W_CENTER_VIEW: // scroll to location if (_ctrl_pressed) { @@ -135,7 +139,8 @@ public: break; case WID_W_RENAME: // rename - ShowQueryString(GetString(STR_WAYPOINT_NAME, this->wp->index), STR_EDIT_WAYPOINT_NAME, MAX_LENGTH_STATION_NAME_CHARS, this, CS_ALPHANUMERAL, {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars}); + ShowQueryString(GetString(STR_WAYPOINT_NAME, this->wp->index), STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN, MAX_LENGTH_STATION_NAME_CHARS, this, CS_ALPHANUMERAL, + {QueryStringFlag::EnableDefault, QueryStringFlag::LengthIsInChars, QueryStringFlag::EnableMove}); break; case WID_W_SHOW_VEHICLES: // show list of vehicles having this waypoint in their orders @@ -144,6 +149,11 @@ public: case WID_W_CATCHMENT: SetViewportCatchmentWaypoint(Waypoint::Get(this->window_number), !this->IsWidgetLowered(WID_W_CATCHMENT)); + + if (w != nullptr && this->IsWidgetLowered(WID_W_CATCHMENT)) { + if (w->parent->window_class == WC_STATION_VIEW && w->IsWidgetLowered(WID_QS_MOVE)) SetViewportStationRect(Station::Get(w->parent->window_number), true); + if (w->parent->window_class == WC_WAYPOINT_VIEW && w->IsWidgetLowered(WID_QS_MOVE)) SetViewportWaypointRect(Waypoint::Get(w->parent->window_number), true); + } break; } } diff --git a/src/widgets/misc_widget.h b/src/widgets/misc_widget.h index 0d59ee4f8e..758d418014 100644 --- a/src/widgets/misc_widget.h +++ b/src/widgets/misc_widget.h @@ -35,6 +35,8 @@ enum QueryStringWidgets : WidgetID { WID_QS_DEFAULT, ///< Default button. WID_QS_CANCEL, ///< Cancel button. WID_QS_OK, ///< OK button. + WID_QS_MOVE, ///< Move button. + WID_QS_MOVE_SEL, ///< Container for move button, which can be hidden. }; /** Widgets of the #QueryWindow class. */ diff --git a/src/widgets/sign_widget.h b/src/widgets/sign_widget.h index e8b9a95866..d6c023465c 100644 --- a/src/widgets/sign_widget.h +++ b/src/widgets/sign_widget.h @@ -28,6 +28,7 @@ enum QueryEditSignWidgets : WidgetID { WID_QES_OK, ///< OK button. WID_QES_CANCEL, ///< Cancel button. WID_QES_DELETE, ///< Delete button. + WID_QES_MOVE, ///< Move Sign button. WID_QES_PREVIOUS, ///< Previous button. WID_QES_NEXT, ///< Next button. }; From 316f36fe149d03dd5411a68991d0e79a329d3296 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 24 Nov 2025 22:04:01 +0100 Subject: [PATCH 219/280] Codefix: comparison of narrow type with wide type in loop condition --- src/industry_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 5467332793..ffad97ae52 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -451,7 +451,7 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca } } - for (uint8_t i = 0; i < std::size(itspec->accepts_cargo); i++) { + for (size_t i = 0; i < std::size(itspec->accepts_cargo); i++) { CargoType cargo = accepts_cargo[i]; if (!IsValidCargoType(cargo) || cargo_acceptance[i] <= 0) continue; // work only with valid cargoes From 5533a24d8465f2892183ef475d4e9b30bf6afa54 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 24 Nov 2025 22:25:34 +0100 Subject: [PATCH 220/280] Codechange: silence CodeQL complaints about long switches --- .github/codeql/codeql-config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index b5fd9c58ed..3942340c2a 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -10,3 +10,5 @@ query-filters: - cpp/irregular-enum-init # Our GUI code tends to use switches for OnClick handlers, DrawWidget, and UpdateWidgetSize. Sometimes GUIs just don't have many elements, but we want to keep consistency. - cpp/trivial-switch + # Our (GUI) code tends to use long switches. + - cpp/long-switch From 3555f26ae6b43e17d1ed72fe72e1147468ffefde Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 24 Nov 2025 22:19:25 +0000 Subject: [PATCH 221/280] Add: [NewGRF] Allow badges to be excluded from badge name list. (#14818) This allows badges to have names that can be filtered, but avoid cluttering the purchase text. --- src/newgrf_badge_gui.cpp | 1 + src/newgrf_badge_type.h | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 93e133cf99..525f751a3a 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -133,6 +133,7 @@ int DrawBadgeNameList(Rect r, std::span badges, GrfSpecFeature) const Badge *badge = GetBadge(index); if (badge == nullptr || badge->name == STR_NULL) continue; if (badge->class_index != class_index) continue; + if (badge->flags.Test(BadgeFlag::NameListSkip)) continue; if (!s.empty()) { if (badge->flags.Test(BadgeFlag::NameListFirstOnly)) continue; diff --git a/src/newgrf_badge_type.h b/src/newgrf_badge_type.h index f23daf2f9a..59864c20af 100644 --- a/src/newgrf_badge_type.h +++ b/src/newgrf_badge_type.h @@ -24,10 +24,11 @@ template <> struct std::hash { }; enum class BadgeFlag : uint8_t { - Copy = 0, ///< Copy badge to related things. - NameListStop = 1, ///< Stop adding names to the name list after this badge. + Copy = 0, ///< Copy badge to related things. + NameListStop = 1, ///< Stop adding names to the name list after this badge. NameListFirstOnly = 2, ///< Don't add this name to the name list if not first. - UseCompanyColour = 3, ///< Apply company colour palette to this badge. + UseCompanyColour = 3, ///< Apply company colour palette to this badge. + NameListSkip = 4, ///< Don't show name in name list at all. HasText, ///< Internal flag set if the badge has text. }; From 26a84fad55c40135b5cd8dd9fd61d17d14173f5b Mon Sep 17 00:00:00 2001 From: Cyprian Klimaszewski <111280526+Rito13@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:28:41 +0100 Subject: [PATCH 222/280] Fix 98700eee43, Fix #14815: Properly handle picker window invalidation. (#14816) --- src/picker_gui.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index d4799b3fb8..12085ec828 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -468,7 +468,7 @@ void PickerWindow::OnDropdownSelect(WidgetID widget, int index, int click_result } /* We need to refresh if a filter is removed. */ - this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter}); + this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter, PickerInvalidation::Position}); break; } @@ -479,7 +479,7 @@ void PickerWindow::OnDropdownSelect(WidgetID widget, int index, int click_result } else { SetBadgeFilter(this->badge_filter_choices, BadgeID(index)); } - this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter}); + this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter, PickerInvalidation::Position}); } break; } @@ -555,7 +555,7 @@ void PickerWindow::OnEditboxChanged(WidgetID wid) } else { this->type_string_filter.btf.reset(); } - this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter}); + this->InvalidateData({PickerInvalidation::Type, PickerInvalidation::Filter, PickerInvalidation::Position}); break; default: @@ -693,7 +693,6 @@ void PickerWindow::BuildPickerTypeList() if (!this->has_type_picker) return; this->GetWidget(WID_PW_TYPE_MATRIX)->SetCount(static_cast(this->types.size())); - this->EnsureSelectedTypeIsVisible(); } void PickerWindow::EnsureSelectedTypeIsValid() From 5bd28fa69253548eba5bb781cd8d8df409ea2de4 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 25 Nov 2025 04:41:35 +0000 Subject: [PATCH 223/280] Update: Translations from eints portuguese: 4 changes by jcteotonio --- src/lang/afrikaans.txt | 4 ---- src/lang/arabic_egypt.txt | 4 ---- src/lang/basque.txt | 4 ---- src/lang/belarusian.txt | 4 ---- src/lang/brazilian_portuguese.txt | 4 ---- src/lang/bulgarian.txt | 4 ---- src/lang/catalan.txt | 4 ---- src/lang/croatian.txt | 4 ---- src/lang/czech.txt | 4 ---- src/lang/danish.txt | 4 ---- src/lang/dutch.txt | 4 ---- src/lang/english_AU.txt | 4 ---- src/lang/english_US.txt | 4 ---- src/lang/esperanto.txt | 4 ---- src/lang/estonian.txt | 4 ---- src/lang/faroese.txt | 4 ---- src/lang/finnish.txt | 4 ---- src/lang/french.txt | 4 ---- src/lang/frisian.txt | 4 ---- src/lang/gaelic.txt | 4 ---- src/lang/galician.txt | 4 ---- src/lang/german.txt | 4 ---- src/lang/greek.txt | 4 ---- src/lang/hebrew.txt | 4 ---- src/lang/hungarian.txt | 4 ---- src/lang/icelandic.txt | 4 ---- src/lang/indonesian.txt | 4 ---- src/lang/irish.txt | 4 ---- src/lang/italian.txt | 4 ---- src/lang/japanese.txt | 4 ---- src/lang/korean.txt | 4 ---- src/lang/latin.txt | 4 ---- src/lang/latvian.txt | 4 ---- src/lang/lithuanian.txt | 4 ---- src/lang/luxembourgish.txt | 4 ---- src/lang/malay.txt | 4 ---- src/lang/maori.txt | 4 ---- src/lang/norwegian_bokmal.txt | 4 ---- src/lang/norwegian_nynorsk.txt | 4 ---- src/lang/persian.txt | 4 ---- src/lang/polish.txt | 4 ---- src/lang/portuguese.txt | 12 ++++-------- src/lang/romanian.txt | 4 ---- src/lang/russian.txt | 4 ---- src/lang/serbian.txt | 4 ---- src/lang/simplified_chinese.txt | 4 ---- src/lang/slovak.txt | 4 ---- src/lang/slovenian.txt | 4 ---- src/lang/spanish.txt | 4 ---- src/lang/spanish_MX.txt | 4 ---- src/lang/swedish.txt | 4 ---- src/lang/tamil.txt | 4 ---- src/lang/thai.txt | 4 ---- src/lang/traditional_chinese.txt | 4 ---- src/lang/turkish.txt | 4 ---- src/lang/ukrainian.txt | 4 ---- src/lang/vietnamese.txt | 4 ---- src/lang/welsh.txt | 4 ---- 58 files changed, 4 insertions(+), 236 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index fe8ec70155..72a98f5211 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -3248,14 +3248,12 @@ STR_CARGO_RATING_EXCELLENT :Uitstekend STR_CARGO_RATING_OUTSTANDING :Treffend STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Skuif skerm na stasie. Ctrl+klik maak 'n nuwe venster oop vir die stasie -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Verander naam van stasie STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Toon alle treine wat hierdie stasie op hul skedule het STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Toon alle pad voertuie wat hierdie stasie op hul skedule het STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Toon alle vliegtuie wat hierdie stasie op hul skedule het STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Toon alle skepe wat hierdie stasie op hul skedule het -STR_STATION_VIEW_RENAME_STATION_CAPTION :Hernoem stasie/laai area STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Maak lughawe toe STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Verhoed dat vliegtuie by hierdie lughawe te land @@ -3263,11 +3261,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Verhoed # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Senter skerm op roetebaken. Ctrl+klik maak 'n nuwe venster oop vir die roetebaken -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Verander roetebaken se naam STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Sentreer hoofuitsig op boei. Ctrl+klik maak 'n nuwe venster oop vir die boei STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Verander baken naam -STR_EDIT_WAYPOINT_NAME :{WHITE}Redigeer roetebaken se naam # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finansies {BLACK}{COMPANY_NUM} diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 6323e068fc..af62bc17b4 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -3143,25 +3143,21 @@ STR_CARGO_RATING_EXCELLENT :ممتاز STR_CARGO_RATING_OUTSTANDING :خارق STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}وسط الشاشة على موقع المحطة -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}غير اسم المحطة STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK} عرض جميع القطارات المرتبطة بهذه المحطة STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK} عرض جميع العربات المرتبطة بهذه المحطة STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK} عرض جميع القطارات المرتبطة بهذه المحطة STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}عرض جميع السفن المرتبطة بهذا المرفئ -STR_STATION_VIEW_RENAME_STATION_CAPTION :اعادة تسمية المحطة STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}اغلاق المطار # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK} ركز شاشة العرض على نقطة العبور -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}غير اسم نقطة العبور STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK} ضع العوامة في مركز الشاشة. Ctrl+Click لفتح نافذة لموقع العوامة STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK} غير اسم العومة -STR_EDIT_WAYPOINT_NAME :{WHITE}عدل اسم نقطة العبور # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} {BLACK} {COMPANY_NUM} سجل المحاسبة diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 4267f20101..2ca23509b1 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -3071,14 +3071,12 @@ STR_CARGO_RATING_EXCELLENT :Bikaina STR_CARGO_RATING_OUTSTANDING :Ezin hobea STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Ikuspegi nagusi geltokian kokatu. Ktrl+Klik ikuspegi lehio berria irekiko da geltokiaren kokapenean -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Geltokiaren izena aldatu STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Erakutsi geltoki hau erabiltzen duten trenak STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Erakutsi geltoki hau erabiltzen duten errepide ibilgailuak STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Erakutsi geltoki hau erabiltzen duten hegazkinak STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Erakutsi geltoki hau erabiltzen duten itsasontziak -STR_STATION_VIEW_RENAME_STATION_CAPTION :Geltokiaren izena aldatu STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Aireporturik hurbilenak STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hegazkinak aireportu honetan lurreratzea ekiditu @@ -3086,11 +3084,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hegazkin # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Ikuspegi nagusia bidepuntuan kokatu. Ktrl+Klik Ikuspegi lehio berria irekiko du bidepuntuaren kokapenerakin -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Bidepuntuaren izena aldatu STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Ikuspegi nagusia buian kokatu. ktrl+Klik Ikuspegi lehio berria irekiko du buiaren kokapenarekin STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Buiaren izena aldatu -STR_EDIT_WAYPOINT_NAME :{WHITE}Bidepuntuaren izena aldatu # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finantzak {BLACK}{COMPANY_NUM} diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 22cd4a442d..a2050466b8 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -4079,14 +4079,12 @@ STR_CARGO_RATING_EXCELLENT :Выдатны STR_CARGO_RATING_OUTSTANDING :Цудоўны STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць станцыю ў асноўным вакне. Ctrl+клік — паказаць у дадатковым вакне. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Перайменаваць станцыю STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Паказаць усе цягнiкi, у раскладзе якіх ёсьць гэтая станцыя STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Паказаць усе аўтамабiлi, у раскладзе якіх ёсьць гэты тэрмiнал/прыпынак STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Паказаць увесь авiятранспарт, у раскладзе якога ёсьць гэты аэрапорт STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Паказаць усе караблі, у раскладзе якіх ёсьць гэтая прыстань -STR_STATION_VIEW_RENAME_STATION_CAPTION :Перайменаваць станцыю STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Закрыць аэрапорт STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Прадухiляць пасадку паветранаго судна ў гэтым аэрапорце @@ -4094,11 +4092,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Прад # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць маршрутны пункт у асноўным вакне. Ctrl+клік — паказаць у дадатковым вакне. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Перайменаваць маршрутны пункт STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць буй у асноўным вакне. Ctrl+пстрычка — паказаць у дадатковым вакне. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Зьмяніць назву буя -STR_EDIT_WAYPOINT_NAME :{WHITE}Назва маршрутнага пункта # Finances window STR_FINANCES_CAPTION :{WHITE}Фінансы — {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 8b265aca39..1aa0988a40 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -3905,14 +3905,12 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização da estação. Ctrl+Clique para abrir uma nova visualização na localização da estação -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar todas as embarcações que têm esta estação na sua programação -STR_STATION_VIEW_RENAME_STATION_CAPTION :Renomear estação/local de carga STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fechar aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não permitir o pouso de aviões neste aeroporto @@ -3920,11 +3918,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não per # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização do ponto de controle. Ctrl+Clique para abrir uma nova visualização na localização do ponto de controle -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Alterar o nome do ponto de controle STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização da boia. Ctrl+Clique para abrir uma nova visualização na localização da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da boia -STR_EDIT_WAYPOINT_NAME :{WHITE}Editar o nome do ponto de controle # Finances window STR_FINANCES_CAPTION :{WHITE}Finanças de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 1975b3a0fa..6969225471 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -3818,14 +3818,12 @@ STR_CARGO_RATING_EXCELLENT :Отлично STR_CARGO_RATING_OUTSTANDING :Невероятно STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Центриране на камерата върху станцията. Ctrl+Click отваря прозорец с нов изглед към станцията -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Промяна името на станцията STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Показване на всички влакове които минават през гарата STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Показване на всички автомобили които минават през гарата STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Показване на всички летателни средства които кацат на летището STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Показване на всички кораби които спират на пристанището -STR_STATION_VIEW_RENAME_STATION_CAPTION :Преименуване на станция STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Затвори летище STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Забранява кацането на летателни средства на това летище @@ -3833,11 +3831,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Забр # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Центриране на камерата върху междинния пункт. Ctrl+Click отваря прозорец с нов изглед към пункта -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Смяна на името на междинния пункт STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Центриране на камерата върху шамандура. Ctrl+Click отваря прозорец с нов изглед към шамандурата STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Промяна на името на шамандурата -STR_EDIT_WAYPOINT_NAME :{WHITE}Редакция на името на междинния пункт # Finances window STR_FINANCES_CAPTION :{WHITE}Финансов отчет на {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 269d2e2aa4..30f475523a 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -3905,14 +3905,12 @@ STR_CARGO_RATING_EXCELLENT :Excel·lent STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc de l'estació. Amb Ctrl+clic, s'obre una vista al lloc de l'estació. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Canvia el nom de l'estació STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostra tots els trens que tinguin aquesta estació en el seu itinerari STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostra tots els vehicles que tinguin aquesta estació en el seu itinerari STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostra tots els avions que tinguin aquest aeroport en el seu itinerari STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostra tots els vaixells que tinguin aquest port en el seu itinerari -STR_STATION_VIEW_RENAME_STATION_CAPTION :Canvia el nom de l'estació/àrea de càrrega STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Tanca l'aeroport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita que els avions aterrin en aquest aeroport @@ -3920,11 +3918,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc del punt de pas. Amb Ctrl+clic, s'obre una vista al lloc del punt de pas. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Canvia el nom del punt de pas STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal en la boia. Amb Ctrl+clic, s'obre una vista centrada a la boia. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Canvia el nom de la boia -STR_EDIT_WAYPOINT_NAME :{WHITE}Edita el nom del punt de pas # Finances window STR_FINANCES_CAPTION :{WHITE}Finances de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 7bc156fb65..b8f1096a77 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -3423,14 +3423,12 @@ STR_CARGO_RATING_EXCELLENT :Izvrsno STR_CARGO_RATING_OUTSTANDING :Izvanredno STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centriraj glavni pogled na lokaciju postaje. Ctrl+klik otvara novi prozor sa lokacijom postaje -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Promijeni ime postaje STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Pokaži sve vlakove koji imaju ovu postaju u svom rasporedu STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Pokaži sva cestovna vozila koja imaju ovu postaju u svom rasporedu STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Pokaži sve zrakoplove koji imaju ovu postaju u svom rasporedu STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Pokaži sve brodove koji imaju ovu postaju u svom rasporedu -STR_STATION_VIEW_RENAME_STATION_CAPTION :Preimenuj postaju/terminal STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Zatvori zračnu luku STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Spriječi slijetanje zrakoplova u ovu zračnu luku @@ -3438,11 +3436,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Spriječ # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centriraj glavni pogled na lokaciju čvorišta. Ctrl+klik otvara novi pogled na lokaciju čvorišta. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Promijeni ime čvorišta STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centriraj glavni pogled na lokaciju plutače. Ctrl+klik otvara novi pogled na lokaciju plutače. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Promijeni ime plutače -STR_EDIT_WAYPOINT_NAME :{WHITE}Promijeni ime čvorišta # Finances window STR_FINANCES_CAPTION :Financije tvrtke {WHITE}{COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/czech.txt b/src/lang/czech.txt index fd987da743..f3963a61ab 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -3921,14 +3921,12 @@ STR_CARGO_RATING_EXCELLENT :Vynikající STR_CARGO_RATING_OUTSTANDING :Úžasné STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Vystředit pohled na stanici. Ctrl+Klik otevře nový pohled na umístění stanice -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Přejmenovat stanici STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Zobrazit všechny vlaky, které mají tuto stanici v jízdním řádu STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Zobrazit všechna silniční vozidla, která mají tuto stanici v jízdním řádu STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Zobrazit všechna letadla, která mají tuto stanici v jízdním řádu STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Zobrazit všechny lodě, které mají tuto stanici v jízdním řádu -STR_STATION_VIEW_RENAME_STATION_CAPTION :Přejmenovat stanici STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Uzavřít letiště STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Zabránit letadlu od přistání na tomto letišti @@ -3936,11 +3934,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Zabráni # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Zaměřit hlavní pohled na umístění bodu na trase. Při stisknutí Ctrl+Klik otevřete nové okno na umístění bodu na trase -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Přejmenovat směrování STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Vystředit pohled na bójku. Ctrl+Klik otevře nové okno náhledu STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Přejmenovat bójku -STR_EDIT_WAYPOINT_NAME :{WHITE}Přejmenovat směrování # Finances window STR_FINANCES_CAPTION :{WHITE}Finance - {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index c870b46988..563784ff5f 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -3896,14 +3896,12 @@ STR_CARGO_RATING_EXCELLENT :Fortrinlig STR_CARGO_RATING_OUTSTANDING :Enestående STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrer skærmen over stationens lokalitet. Ctrl+Klik åbner et nyt vindue ved stationens lokalitet. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Ændre stationens navn STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Vis alle toge, som har denne station i deres ruteplan STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Vis alle køretøjer, som har denne station i deres ruteplan STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Vis alle fly, som har denne lufthavn i deres ruteplan STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Vis alle skibe, som har denne station i deres ruteplan -STR_STATION_VIEW_RENAME_STATION_CAPTION :Omdøb stationen/fragtcentralen STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Luk lufthavn STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Forhindre at fly lander i denne lufthavn @@ -3911,11 +3909,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Forhindr # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrer skærmen over rutepunktets lokalitet. Ctrl+Klik åbner et nyt vindue ved rutepunktets lokalitet. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Omdøb rutepunkt STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrér skærmen ved bøjens placering. Ctrl+klik åbner et nyt vindue ved bøjens placering STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Ændr navnet på bøjen -STR_EDIT_WAYPOINT_NAME :{WHITE}Omdøb rutepunkt # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finanser {BLACK}{COMPANY_NUM} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index ce787417e8..c09d50a732 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -3900,14 +3900,12 @@ STR_CARGO_RATING_EXCELLENT :Uitstekend STR_CARGO_RATING_OUTSTANDING :Voortreffelijk STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van het station. Ctrl+klik opent een nieuw venster op de locatie van het station -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Station hernoemen STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Geef alle treinen weer die dit station in hun opdrachtenlijst hebben STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Geef alle wegvoertuigen weer die dit station in hun opdrachtenlijst hebben STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Geef alle vliegtuigen weer die dit station in hun opdrachtenlijst hebben STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Geef alle schepen weer die dit station in hun opdrachtenlijst hebben -STR_STATION_VIEW_RENAME_STATION_CAPTION :Station/laadgebied hernoemen STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Luchthaven sluiten STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Voorkom landen van vliegtuig op deze luchthaven @@ -3915,11 +3913,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Voorkom # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op het routepunt. Ctrl+klik opent nieuw venster op locatie van routepunt. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Naam routepunt aanpassen STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centreer het hoofdscherm op de locatie van de boei. Ctrl+klik opent een nieuw venster op de locatie van de boei. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Naam van boei aanpassen -STR_EDIT_WAYPOINT_NAME :{WHITE}Naam routepunt aanpassen # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Financiën {BLACK}{COMPANY_NUM} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 55c66782b1..8d05c5c163 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Outstanding STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on station location. Ctrl+Click to open a new viewport on station location -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Change name of station STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Show all road vehicles which have this station on their schedule STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Show all aircraft which have this station on their schedule STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Show all ships which have this station on their schedule -STR_STATION_VIEW_RENAME_STATION_CAPTION :Rename station/loading area STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Close airport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent aircraft from landing on this airport @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Change waypoint name STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on buoy location. Ctrl+Click to open a new viewport on buoy location STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Change buoy name -STR_EDIT_WAYPOINT_NAME :{WHITE}Edit waypoint name # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finances {BLACK}{COMPANY_NUM} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 63796fbe52..ed6d5236f1 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Outstanding STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on station location. Ctrl+Click to open a new viewport on station location -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Change name of station STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Show all road vehicles which have this station on their schedule STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Show all aircraft which have this station on their schedule STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Show all ships which have this station on their schedule -STR_STATION_VIEW_RENAME_STATION_CAPTION :Rename station/loading area STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Close airport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent aircraft from landing on this airport @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Change waypoint name STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on buoy location. Ctrl+Click to open a new viewport on buoy location STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Change buoy name -STR_EDIT_WAYPOINT_NAME :{WHITE}Edit waypoint name # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finances {BLACK}{COMPANY_NUM} diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 8898cf0864..a0370f2266 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -3660,14 +3660,12 @@ STR_CARGO_RATING_EXCELLENT :Bonege STR_CARGO_RATING_OUTSTANDING :Elstare bonege STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la stacio. Stir+Klak por malfermi novan vidujon ĉe la stacioloko. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Ŝanĝu nomon de stacio STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Montru ĉiujn vagonarojn kun ĉi tiu stacio en la plano STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Montru ĉiujn stratveturilojn kun ĉi tiu stacio en la plano STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Montru ĉiujn aviadilojn kun ĉi tiu stacio en la plano STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Montru ĉiujn ŝipojn kun ĉi tiu stacio en la plano -STR_STATION_VIEW_RENAME_STATION_CAPTION :Alinomi stacion/ŝarĝejon STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fermu la flughavenon STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Malpermesu al aviadiloj surteriĝi ĉe tiu ĉi flughaveno @@ -3675,11 +3673,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Malperme # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la vojpunkto. Stir+Klak por malfermi novan vidujon ĉe la loko. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Ŝanĝi nomon de vojpunkto. STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la buo. Ctrl+Klak por malfermi novan vidujon ĉe la bua loko. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Ŝanĝi nomon de la buo. -STR_EDIT_WAYPOINT_NAME :{WHITE}Ŝanĝu vojpunktonomon # Finances window STR_FINANCES_CAPTION :{WHITE}Financoj de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 24edd3e26d..ec511f33e5 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -3826,14 +3826,12 @@ STR_CARGO_RATING_EXCELLENT :Suurepärane STR_CARGO_RATING_OUTSTANDING :Suurepärane STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Vaate viimine jaama juurde -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Muuda jaama nime STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Näita kõiki ronge, mille sõidugraafik sisaldab seda rongijaama STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Näita kõiki mootorsõidukeid, mille sõidugraafik sisaldab seda jaama STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Näita kõiki õhusõidukeid, mille graafik sisaldab seda jaama STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Näita kõiki laevu, mille sõidugraafik sisaldab seda sadamat -STR_STATION_VIEW_RENAME_STATION_CAPTION :Ümbernimeta jaam/laadimisala STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Sulge lennujaam STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Keela õhusõidukite maandumine selles lennujaamas @@ -3841,11 +3839,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Keela õ # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Keskenda vaade teemärgisel. Ctrl+klõps avab teemärgisel uue vaate -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Muuda meldepunkti nime STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Keskenda vaade poi kohale. Ctrl+klõps avab poi kohal uue vaateakna STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Muuda poi nime -STR_EDIT_WAYPOINT_NAME :{WHITE}Muuda meldepunkti nime # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} rahavoogude aruanne {BLACK}{COMPANY_NUM} diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index b2b65047ad..e5b24720ab 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -2820,14 +2820,12 @@ STR_CARGO_RATING_EXCELLENT :Framúrskarandi STR_CARGO_RATING_OUTSTANDING :Avberða gott STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Savna høvuðs sýni á støðina. Ctrl+trýst letur nýggjan sýnisglugga upp við sýni á støðina -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Broyt navn á støð STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Vís øll tok ið hava hesa støðina í teirra skrá STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Vís øll akfør ið hava hesa støðina í teirra skrá STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Vís øll flogfør ið hava hesa støðina í teirra skrá STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Vís øll skip ið hava hesa støðina í teirra skrá -STR_STATION_VIEW_RENAME_STATION_CAPTION :Navngev støð/lessingar øki STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Stong floghavn STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Forða flogførum í at lenda í hesari floghavnini @@ -2835,11 +2833,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Forða f # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Savna høvuðs sýni á waypoint. Ctrl+trýst letur nýggjan sýnisglugga upp við sýni á waypoint -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Broyt navn á waypoint STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Savna høvuðs sýni á boyjuna. Ctrl+trýst letur nýggjan sýnisglugga upp á boyjuna STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Broyt navn á boyju -STR_EDIT_WAYPOINT_NAME :{WHITE}Rætta waypoint navn # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Fíggjar støða {BLACK}{COMPANY_NUM} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 80a1c2f87b..c3248c6342 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Mainio STR_CARGO_RATING_OUTSTANDING :Loistava STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä aseman sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan aseman sijaintiin. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Muuta aseman nimi STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Näytä kaikki junat, joilla on tämä asema käskyissään STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Näytä kaikki ajoneuvot, joilla on tämä asema käskyissään. STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Näytä kaikki lentokoneet, joilla on tämä asema käskyissään STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Näytä kaikki laivat, joilla on tämä asema käskyissään -STR_STATION_VIEW_RENAME_STATION_CAPTION :Nimeä asema/lastausalue STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Sulje lentokenttä STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Estä ilma-aluksia laskeutumasta tälle lentokentälle @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Estä il # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä reittipisteen sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan reittipisteen sijaintiin. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Muuta reittipisteen nimeä STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä poijun sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan poijun sijaintiin STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Vaihda poijun nimeä -STR_EDIT_WAYPOINT_NAME :{WHITE}Muokkaa reittipisteen nimeä # Finances window STR_FINANCES_CAPTION :{WHITE}Talous, {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/french.txt b/src/lang/french.txt index d7912b7127..d027a54ff1 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -3901,14 +3901,12 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Exceptionnel STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrer la vue sur la station. Ctrl-clic pour ouvrir une nouvelle vue sur la station. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Renommer la station STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Afficher les trains ayant cette station dans leurs ordres STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Afficher les véhicules routiers ayant cette station dans leurs ordres STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Afficher les aéronefs ayant cette station dans leurs ordres STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Afficher les navires ayant cette station dans leurs ordres -STR_STATION_VIEW_RENAME_STATION_CAPTION :Renommer la gare STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fermer l'aéroport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Empêcher l'aéronef de se poser sur cet aéroport @@ -3916,11 +3914,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Empêche # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrer la vue sur le point de contrôle. Ctrl-clic pour ouvrir une nouvelle vue sur le point de contrôle -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Renommer le point de contrôle STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrer la vue sur la bouée. Ctrl-clic pour ouvrir une nouvelle vue sur la bouée STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Renommer la bouée -STR_EDIT_WAYPOINT_NAME :{WHITE}Modifier le nom du point de contrôle # Finances window STR_FINANCES_CAPTION :{WHITE}Finances de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 6b3fc822a5..41c7911bbb 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -3041,21 +3041,17 @@ STR_CARGO_RATING_EXCELLENT :Geweldich STR_CARGO_RATING_OUTSTANDING :Poerbêst STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan dit stasjon -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Feroarje stasjonsnamme -STR_STATION_VIEW_RENAME_STATION_CAPTION :Jou stasjon in nije namme STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fleanfjild slute # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan dizze kontrôlepost -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Namme fan kontrôlepost oanpasse STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Sintrearje it byld op de lokaasje fan dizze boei STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Namme fan boei oanpasse -STR_EDIT_WAYPOINT_NAME :{WHITE}Namme fan kontrôlepost oanpasse # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finânsjes {BLACK}{COMPANY_NUM} diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index c747f8bc6a..8b85f4ff28 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -3432,14 +3432,12 @@ STR_CARGO_RATING_EXCELLENT :Uabhasach math STR_CARGO_RATING_OUTSTANDING :Barraichte STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Meadhanaich am prìomh-shealladh air an stèisean. Fosglaidh Ctrl+briogadh port-seallaidh ùr air ionad an stèisein -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Atharraich ainm an stèisein STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Seall a h-uile trèan is an stèisean seo air a' chlàr-ama aice STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Seall a h-uile carbad-rathaid is an stèisean seo air a' chlàr-ama aige STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Seall a h-uile carbad-adhair is am port-adhair seo air an clàr-ama aige STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Seall a h-uile long is am port seo air a' chlàr-ama aice -STR_STATION_VIEW_RENAME_STATION_CAPTION :Thoir ainm ùr air an stèisean/ionad-luchdaidh STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Dùin am port-adhair STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Bac carbadan-adhair bho laighe air a' phort-adhair seo @@ -3447,11 +3445,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Bac carb # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Meadhanaich am prìomh-shealladh air a' phuing-thurais. Fosglaidh Ctrl+briogadh port-seallaidh ùr air ionad na puinge-turais -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Thoir ainm ùr air a' phuing-thurais STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Meadhanaich am prìomh-shealladh air an fhleodrainn. Fosglaidh Ctrl+briogadh port-seallaidh ùr air ionad na fleodrainn STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Atharraich ainm an fhleodrainn -STR_EDIT_WAYPOINT_NAME :{WHITE}Deasaich ainm na puinge-turais # Finances window STR_FINANCES_CAPTION :{WHITE}Maoin aig {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/galician.txt b/src/lang/galician.txt index e5f6f2b46c..445cc99887 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -3905,14 +3905,12 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra a vista principal na localización da estación. Ctrl+Clic abre un novo punto de vista da localización da estación -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar o nome da estación STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar tódolos trens que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar tódolos vehículos de estrada que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar tódolos avións que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar tódolos barcos que teñen esta estación nas súas ordes -STR_STATION_VIEW_RENAME_STATION_CAPTION :Renomear estación/área de carga STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Pechar aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita que os avións aterren neste aeroporto @@ -3920,11 +3918,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra a vista principal na localización do punto de ruta. Ctrl+Clic abre unha nova ventá na localización do punto de ruta -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Cambiar o nome do punto de ruta STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar a vista principal na localización da boia. Ctrl+Clic abre unha nova ventá na localización da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar o nome da boia -STR_EDIT_WAYPOINT_NAME :{WHITE}Editar o nome do punto de ruta # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finanzas {BLACK}{COMPANY_NUM} diff --git a/src/lang/german.txt b/src/lang/german.txt index ff17c31330..4639e9b5ba 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -3891,14 +3891,12 @@ STR_CARGO_RATING_EXCELLENT :Ausgezeichnet STR_CARGO_RATING_OUTSTANDING :Hervorragend STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Hauptansicht zur Station scrollen. Mit Strg+Klick wird eine neue Zusatzansicht bei der Station geöffnet -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Namen der Station ändern STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Alle Züge, die diesen Bahnhof anfahren, anzeigen STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Alle Straßenfahrzeuge, die diese Station anfahren, anzeigen STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Alle Flugzeuge, die diesen Flughafen anfliegen, anzeigen STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Alle Schiffe, die diesen Hafen ansteuern, anzeigen -STR_STATION_VIEW_RENAME_STATION_CAPTION :Station/Ladeplatz umbenennen STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Flughafen schließen STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Luftfahrzeugen die Landeerlaubnis verweigern @@ -3906,11 +3904,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Luftfahr # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Hauptansicht auf den Wegpunktstandort zentrieren. Mit Strg+Klick wird neue Zusatzansicht beim Wegpunktstandort geöffnet -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Namen der Wegpunkte ändern STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Hauptansicht zum Bojenstandort zentrierten. Mit Strg+Klick wird eine neue Zusatzansicht beim Bojenstandort geöffnet STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Namen der Boje ändern -STR_EDIT_WAYPOINT_NAME :{WHITE}Namen des Wegpunkts ändern # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} – Finanzen {BLACK}{COMPANY_NUM} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index ca49e0fa51..be2d6d3036 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -3997,14 +3997,12 @@ STR_CARGO_RATING_EXCELLENT :Εξαιρετ STR_CARGO_RATING_OUTSTANDING :Καταπληκτική STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Κεντράρισμα της κύριας προβολής στην τοποθεσία του σταθμού. Ctrl+Κλικ για άνοιγμα νέου παραθύρου προβολής στην τοποθεσία του σταθμού -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Αλλαγή ονόματος του σταθμού STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Εμφάνιση όλων των τρένων που έχουν αυτό τον σταθμό στο δρομολόγιό τους STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Εμφάνιση όλων των οχημάτων που έχουν αυτόν τον σταθμό στο δρομολόγιό τους STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Εμφάνιση όλων των αεροσκαφών που έχουν αυτόν τον σταθμό στο δρομολόγιό τους STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Εμφάνιση όλων των πλοίων που έχουν αυτόν τον σταθμό στο δρομολόγιό τους -STR_STATION_VIEW_RENAME_STATION_CAPTION :Μετονομασία περιοχής σταθμού/φόρτωσης STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Κλείσιμο αεροδρομίου STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Αποτροπή προσγείωσης αεροσκαφών σε αυτό το αεροδρόμιο @@ -4012,11 +4010,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Αποτ # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Κεντράρισμα της κύριας προβολής στην τοποθεσία του σημείου καθοδήγησης. Ctrl+Κλικ για άνοιγμα νέου παραθύρου προβολής στην τοποθεσία του σημείου καθοδήγησης -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Αλλαγή του ονόματος του σημείου καθοδήγησης STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Κεντράρισμα της κύριας προβολής στη τοποθεσία της σημαδούρας. Ctrl+Κλικ για άνοιγμα νέου παραθύρου προβολής στην τοποθεσία της σημαδούρας STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Αλλαγή ονόματος σημαδούρας -STR_EDIT_WAYPOINT_NAME :{WHITE}Διαμόρφωση ονόματος σημείου καθοδήγησης # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Οικονομικά {BLACK}{COMPANY_NUM} diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index fe2efa775c..c52ea6e7eb 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -3458,14 +3458,12 @@ STR_CARGO_RATING_EXCELLENT :מצויין STR_CARGO_RATING_OUTSTANDING :מדהים STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}מרכז תצוגה ראשית על מיקום תחנה. Ctrl+לחיצה פותח חלונית תצוגה חדשה על מיקום תחנה -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}שנה שם של תחנה STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}הצג את כל הרכבות העוברות דרך תחנה זו STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}הצג את כל הרכבים העוברים דרך תחנה זו STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}הצג את כל כלי הטייס העוברים דרך תחנה זו STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}הצג את כל כלי השייט העוברים דרך תחנה זו -STR_STATION_VIEW_RENAME_STATION_CAPTION :שנה שם של תחנה/אזור טעינה STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}סגור נמל תעופה STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}מנע ממטוסים לנחות בנמל תעופה זה @@ -3473,11 +3471,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}מנע # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}מרכז תצוגה ראשית על מיקום ציון הדרך. Ctrl+לחיצה פותח תצוגה חדשה על מיקום ציון הדרך -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}שנה שם נקודת ציון STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}מרכז תצוגה ראשית על מיקום מצוף. Ctrl+לחיצה פותח חלון תצוגה חדש על מיקום מצוף STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}שנה שם מצוף -STR_EDIT_WAYPOINT_NAME :{WHITE}ערוך שם נקודת ציון # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} נתונים כלכליים {BLACK}{COMPANY_NUM} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 0898e35329..a31fca11ee 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3968,14 +3968,12 @@ STR_CARGO_RATING_EXCELLENT :kiváló STR_CARGO_RATING_OUTSTANDING :kimagasló STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet az állomásra állítja. Ctrl+kattintással új nézet nyílik az állomás helyzeténél -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Az állomás nevének megváltoztatása STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Kilistázza az összes vonatot, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Kilistázza az összes közúti járművet, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Kilistázza az összes repülőt, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Kilistázza az összes hajót, aminek a menetrendjében szerepel ez az állomás -STR_STATION_VIEW_RENAME_STATION_CAPTION :Állomás/rakodóhely átnevezése STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Reptér bezárása STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Repülőgép leszállásának megakadályozása ezen a reptéren @@ -3983,11 +3981,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Repülő # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet az ellenőrzőpontra állítja. Ctrl+kattintással új nézet nyílik az ellenőrzőpontnál -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Ellenőrzőpont nevének megváltoztatása STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet a bójára állítja. Ctrl+kattintással új nézet nyílik a bója helyzeténél STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Bója nevének megváltoztatása -STR_EDIT_WAYPOINT_NAME :{WHITE}Ellenőrző pont nevének módosítása # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} pénzügyei {BLACK}{COMPANY_NUM} diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index d76cab670b..fcd7544bc8 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -2975,14 +2975,12 @@ STR_CARGO_RATING_EXCELLENT :Frábær STR_CARGO_RATING_OUTSTANDING :Framúrskarandi STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Færa miðju aðal sjónarhorns á staðsetningu stöðvar. Ctrl+smelltu til að opna sýnisglugga yfir þessari stöð -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Breyta nafni stöðvar STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Sýna allar lestir sem hafa þessa stöð á sinni áætlun STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Sýna allar bifreiðir sem hafa þessa stöð á sinni áætlun STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Sýna allar flugvélar sem hafa þessa stöð á sinni áætlun STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Sýna öll skip sem hafa þessa stöð á sinni áætlun -STR_STATION_VIEW_RENAME_STATION_CAPTION :Endurnefna stöð/lestunarsvæði STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Loka flugvelli STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Koma í veg fyrir að flugvélar geti lent á þessum flugvelli @@ -2990,11 +2988,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Koma í # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Færa sjónarhorn á staðsetningu millistöðvar. Ctrl+Smelltu til að opna sýniglugg á þessa staðsetningu -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Breyta nafni á vegleiðara STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Færa sjónarhorn á staðsetningu bauju. Ctrl+Smelltu til að opna sýnisglugga á þessa staðsetningu. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Breyta nafni bauju -STR_EDIT_WAYPOINT_NAME :{WHITE}Breyta nafni millistöðvar # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Fjármál {BLACK}{COMPANY_NUM} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 4f6fb8ee18..e9e62673dd 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -3672,14 +3672,12 @@ STR_CARGO_RATING_EXCELLENT :Sempurna STR_CARGO_RATING_OUTSTANDING :Luar Biasa STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Arahkan pandangan utama pada lokasi stasiun. Ctrl+Click akan membuka viewport baru pada lokasi stasiun -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Ganti nama stasiun STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Tampilkan semua kereta yang memiliki jadwal menuju stasiun ini. STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Tampilkan semua kendaraan yang memiliki jadwal menuju terminal ini. STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Tampilkan semua Pesawat yang memiliki jadwal menuju bandara ini. STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Tampilkan semua kapal yang memiliki jadwal menuju pelabuhan ini. -STR_STATION_VIEW_RENAME_STATION_CAPTION :Ubah nama stasiun/area bongkar muat STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Tutup bandara STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Cegah pesawat mendarat di bandara ini @@ -3687,11 +3685,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Cegah pe # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Arahkan pandangan utama pada lokasi waypoint. Ctrl+Click akan membuka viewport baru pada lokasi waypoint -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Ubah nama waypoint STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Arahkan pandangan utama pada lokasi pelampung. Ctrl+Click akan membuka viewport baru pada lokasi pelampung STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Ubah nama pelampung -STR_EDIT_WAYPOINT_NAME :{WHITE}Ubah nama waypoint # Finances window STR_FINANCES_CAPTION :{WHITE}Keuangan {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/irish.txt b/src/lang/irish.txt index c11a13d9b3..51e5153682 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -3458,14 +3458,12 @@ STR_CARGO_RATING_EXCELLENT :Ar fheabhas STR_CARGO_RATING_OUTSTANDING :Go hiontach STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Láraigh an príomhamharc ar shuíomh an stáisiúin. Osclaítear amharc nua ar shuíomh an stáisiúin le Ctrl+Cliceáil -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Athraigh ainm an stásiúin STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Taispeáin gach traein a bhfuil an stáisiún seo ar a sceideal STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Taispeáin gach feithicil bóthair a bhfuil an stáisiún seo ar a sceideal STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Taispeáin gach aerárthach a bhfuil an stáisiún seo ar a sceideal STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Taispeáin gach long a bhfuil an stáisiún seo ar a sceideal -STR_STATION_VIEW_RENAME_STATION_CAPTION :Athainmnigh stáisiún/limistéar lódála STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Dún an t-aerfort STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Cuir cosc ar aerárthaigh tuirlingt ag an aerfort seo @@ -3473,11 +3471,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Cuir cos # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Láraigh an príomhamharc ar shuíomh an phointe bealaigh. Osclaítear amharc nua ar shuíomh an phointe bealaigh le Ctrl+Cliceáil -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Athraigh ainm an phointe bealaigh STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Láraigh an príomhamharc ar shuíomh an bhaoi. Osclaítear amharc nua ar shuíomh an bhaoi le Ctrl+Cliceáil STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Athraigh ainm an bhaoi -STR_EDIT_WAYPOINT_NAME :{WHITE}Cuir ainm an phointe bealaigh in eagar # Finances window STR_FINANCES_CAPTION :{WHITE}Airgeadas {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 7ed8445e02..50874a718a 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -3885,14 +3885,12 @@ STR_CARGO_RATING_EXCELLENT :Eccellente STR_CARGO_RATING_OUTSTANDING :Eccezionale STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principale sulla posizione della stazione. Ctrl+Clic per aprire una nuova finestra sulla posizione della stazione -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambia il nome della stazione STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostra tutti i treni che hanno questa stazione pianificata STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostra tutti gli automezzi che hanno questa stazione pianificata STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostra tutti gli aeromobili che hanno questa stazione pianificata STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostra tutte le navi che hanno questa stazione pianificata -STR_STATION_VIEW_RENAME_STATION_CAPTION :Rinomina stazione/area di carico STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Chiudi aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedisce agli aeromobili di atterrare in questo aeroporto @@ -3900,11 +3898,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedisc # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principale sulla posizione del waypoint. Ctrl+Clic per aprire una nuova finestra sulla posizione del waypoint. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Cambia il nome del waypoint STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centra la visuale principale sulla posizione della boa. Ctrl+Clic per aprire una nuova finestra di visualizzazione sulla posizione della boa STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Cambia il nome della boa -STR_EDIT_WAYPOINT_NAME :{WHITE}Rinomina il waypoint # Finances window STR_FINANCES_CAPTION :{WHITE}Finanze della {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 61999a9fbe..ba5278c213 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -3609,14 +3609,12 @@ STR_CARGO_RATING_EXCELLENT :すばらしい STR_CARGO_RATING_OUTSTANDING :最高 STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}メイン画面をこの停留施設の場所に移動します。Ctrl+クリックではこの停留施設の場所を新たなビューポートに表示します -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}駅名を変更します STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}この駅が指令リストに入っている全列車を表示します STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}このバス停/荷役所が指令リストに入っている全車両を表示します STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}この空港が指令リストに入っている全航空機を表示します STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}この埠頭が指令リストに入っている全船舶を表示します -STR_STATION_VIEW_RENAME_STATION_CAPTION :停留施設の名称を変更 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}空港を閉鎖 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}航空機がこの空港に着陸できないようにします @@ -3624,11 +3622,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}航空 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}メイン画面をこの中継駅の場所に移動します。Ctrl+クリックではこの通過点の場所を新たなビューポートに表示します -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}中継駅の名称を変更 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}メイン画面をこのブイの場所に移動します。Ctrl+クリックでこのブイの場所を新たなビューポートに表示します STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}ブイの名称を変更 -STR_EDIT_WAYPOINT_NAME :{WHITE}中継駅名を表示 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 経営状況 {BLACK}{COMPANY_NUM} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index e79cf65ee7..c648958286 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -3905,14 +3905,12 @@ STR_CARGO_RATING_EXCELLENT :훌륭함 STR_CARGO_RATING_OUTSTANDING :매우 훌륭함 STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}이 역의 위치로 시점을 변경합니다. CTRL+클릭하면 이 역 위치를 기준으로 새로운 외부 화면을 엽니다 -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}이 역의 이름을 변경합니다 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 열차를 보여줍니다 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 차량을 보여줍니다 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 항공기를 보여줍니다 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 선박을 보여줍니다 -STR_STATION_VIEW_RENAME_STATION_CAPTION :이 역의 이름을 변경합니다 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}공항 폐쇄 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}이 공항에 항공기가 착륙하는 것을 금지합니다 @@ -3920,11 +3918,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}이 공 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}이 경유지의 위치로 시점을 변경합니다. CTRL+클릭하면 이 경유지 위치를 기준으로 새로운 외부 화면을 엽니다 -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}이 경유지의 이름을 변경합니다 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}이 부표의 위치로 이동합니다. CTRL+클릭하면 이 부표 위치를 기준으로 새로운 외부 화면을 엽니다 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}부표 이름 바꾸기 -STR_EDIT_WAYPOINT_NAME :{WHITE}경유지 이름 설정 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY}의 재정 {BLACK}{COMPANY_NUM} diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 43c99cba60..658d4cca96 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -3405,14 +3405,12 @@ STR_CARGO_RATING_EXCELLENT :Praestans STR_CARGO_RATING_OUTSTANDING :Optima STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Movere conspectum supra hanc stationem. Ctrl+Preme ut nova fenestra conspectus aperiatur supra stationem -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Mutare nomen stationis STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Monstrare omnia tramina quae hanc stationem in horario habent STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Monstrare omnia vehicula viaria quae hanc stationem in horario habent STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Monstrare omnia aeroplana quae hanc stationem in horario habent STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Monstrare omnes naves quae hanc stationem in horario habent -STR_STATION_VIEW_RENAME_STATION_CAPTION :Renominare stationem STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Claudere aeroportum STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Facere ut aeroplana non appellant in hoc aeroportu @@ -3420,11 +3418,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Facere u # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Movere conspectum supra hunc interlocum. ut nova fenestra conspectus aperiatur supra interlocum -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Mutare nomen interloci STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Movere conspectum supra hoc signum monitorium. ut nova fenestra conspectus aperiatur supra signum monitorium STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Mutare nomen signi monitorii -STR_EDIT_WAYPOINT_NAME :{WHITE}Recensere nomen interloci # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Res Fiscales {BLACK}{COMPANY_NUM} diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 8422f4c211..bf5281b7d0 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -3906,14 +3906,12 @@ STR_CARGO_RATING_EXCELLENT :lielisks STR_CARGO_RATING_OUTSTANDING :izcils STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz staciju. Ctrl+klikšķis atvērs skatu uz staciju jaunā skatlaukā -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Pārdēvēt staciju STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Rādīt vilcienus, kuru rīkojumu sarakstos ir šī stacija STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Rādīt autotransporta līdzekļus, kuru rīkojumu sarakstos ir šī stacija STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Rādīt lidaparātus, kuru rīkojumu sarakstos ir šī stacija STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Rādīt kuģus, kuru rīkojumu sarakstos ir šī stacija -STR_STATION_VIEW_RENAME_STATION_CAPTION :Pārdēvēt staciju/iekraušanas zonu STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Slēgt lidostu STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Novērst lidaparātu nolaišanos šajā lidostā @@ -3921,11 +3919,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Novērst # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz pieturas punktu. Ctrl+klikšķis atvērs skatu uz pieturas punktu jaunā skatlaukā -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Mainīt pieturas punkta nosaukumu STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz boju. Ctrl+klikšķis atvērs skatu uz boju jaunā skatlaukā STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Mainīt bojas nosaukumu -STR_EDIT_WAYPOINT_NAME :{WHITE}Labot pieturas punkta nosaukumu # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} finanses {BLACK}{COMPANY_NUM} diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index c4c4d96a55..958511692c 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Puikus STR_CARGO_RATING_OUTSTANDING :Nuostabus STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centruoti stotį pagrindiniame lange. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus atidarytas naujas peržiūros langas su vaizdu į šią stotį -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Pakeisti stoties pavadinimą STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Rodyti visus traukinius, į kurių užduotis yra įtraukta ši stotelė STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Rodyti visus automobilius, į kurių užduotis yra įtraukta ši stotelė STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Rodyti visus lėktuvus, į kurių užduotis yra įtraukta ši stotelė STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Rodyti visus laivus, į kurių užduotis yra įtraukta ši stotelė -STR_STATION_VIEW_RENAME_STATION_CAPTION :Pervardinti stotį STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Uždaryti STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Uždrausti lėktuvams leistis šiame oro uoste @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Uždraus # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Rodyti kontrolės punktą lango centre.Ctrl+Paspaudimas atidaro naują langą su kontrolės punkto vazidu. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Keisti waypoint pavadinimą STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centruoti plūdurą pagrindiniame lange. Spragtelėkite laikant nuspaustą Ctrl klavišą, kad atidarytumėte naują peržiūros langą su vaizdu į šį plūdurą STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Pakeisti plūduro pavadinimą -STR_EDIT_WAYPOINT_NAME :{WHITE}Redaguoti punkto vardą # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finansai {BLACK}{COMPANY_NUM} diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 81a43c962d..4001109b74 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -3900,14 +3900,12 @@ STR_CARGO_RATING_EXCELLENT :Exzellent STR_CARGO_RATING_OUTSTANDING :Perfekt STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op d'Statioun. Ctrl+Klick erstellt eng nei Usiicht op d'Statioun -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Den Numm vun der Statioun änneren STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Weis all Zich déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Weis all Stroossegefierer déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Weis all Fliger déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Weis all Schëffer déi des Statioun an hierem Zäitplang hunn -STR_STATION_VIEW_RENAME_STATION_CAPTION :D'Gare ëmbenennen STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fluchhafen zoumaachen STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hal de Fliger dovun of op dësem Fluchhafen ze landen @@ -3915,11 +3913,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hal de F # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op de Weepunkt. Ctrl+Klick erstellt eng nei Usiicht um Weepunkt -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Weepunkt Numm änneren STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op d'Boje. Ctrl+Klick erstellt eng nei Usiicht op d'Boje STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Boje ëmbenennen -STR_EDIT_WAYPOINT_NAME :{WHITE}Weepunktnumm # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finanzen {BLACK}{COMPANY_NUM} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 5da82b66f2..c410eb8397 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -2878,25 +2878,21 @@ STR_CARGO_RATING_EXCELLENT :Cemerlang STR_CARGO_RATING_OUTSTANDING :Mengkagumkan STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Pusatkan pemandangan utama ke lokasi stesen. Ctrl+Klik untuk membuka tetingkap pemandangan di lokasi stesen -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Tukarkan nama stesen STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Tunjukkan semua keretapi yang mengandungi stesen ini dalam jadual mereka STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Tunjukkan semua kenderaan darat yang mempunyai stesen ini di dalam jadual mereka STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Tunjukkan semua pesawat yang mengandungi lapangan terbang ini dalam jadual mereka STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Tunjukkan semua kapal yang mengandungi stesen ini dalam jadual mereka -STR_STATION_VIEW_RENAME_STATION_CAPTION :Namakan semula stesen/ruang punggahan STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Halang pesawat daripada mendarat di lapangan terbang ini # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Pusatkan pemandangan utama ke lokasi tandatuju. Ctrl+Klik untuk membuka tetingkap pemandangan di lokasi tandatuju -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Tukar nama tandatuju STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Pusatkan pemandangan utama ke lokasi pelampung. Ctrl+Klik untuk membuka tetingkap pemandangan di lokasi pelampung STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Tukar nama pelampung -STR_EDIT_WAYPOINT_NAME :{WHITE}Tukar nama tandatuju # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Kewangan {BLACK}{COMPANY_NUM} diff --git a/src/lang/maori.txt b/src/lang/maori.txt index a1b4ba38b6..28a5d2c37c 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Rawe STR_CARGO_RATING_OUTSTANDING :Kei runga rawa atu STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Nekehia te tirohanga matua ki te tauwāhi o te teihana. Pātaki+Pāwhiri kia huaki i tētahi atu tirohanga i te tauwāhi o te teihana -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Panonitia te ingoa o te teihana STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Whakaaria ngā tereina katoa e toro ana i tēnei teihana i ana rārangi mahi STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Whakaaria ngā waka rori katoa e toro ana i tēnei teihana i ana rārangi mahi STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Whakaaria ngā waka rererangi katoa e toro ana i tēnei teihana i ana rārangi mahi STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Whakaaria ngā kaipuke katoa e toro ana i tēnei teihana i ana rārangi mahi -STR_STATION_VIEW_RENAME_STATION_CAPTION :Tapaia anō te teihana/wāhi utauta STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Katia te taunga rererangi STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Āraia ngā waka rererangi kei tau ki tēnei taunga @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Āraia n # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Nekehia te tirohanga matua ki te tauwāhi o te aratohu. Pātaki+Pāwhiri kia huaki i tētahi atu tirohanga i te tauwāhi o te aratohu -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Panonitia te ingoa o te aratohu STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Nekehia te tirohanga matua ki te tauwāhi o te kārewa. Pātaki+Pāwhiri kia huaki i tētahi atu tirohanga i te tauwāhi o te kārewa STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Panonitia te ingoa o te kārewa -STR_EDIT_WAYPOINT_NAME :{WHITE}Whakarerekētia te ingoa o te aratohu # Finances window STR_FINANCES_CAPTION :{WHITE}Ahumoni o {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 454c7c8481..284ef8b659 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -3906,14 +3906,12 @@ STR_CARGO_RATING_EXCELLENT :Utmerket STR_CARGO_RATING_OUTSTANDING :Fremragende STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvisningen på stasjonslokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på stasjonslokasjon -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Endre stasjonens navn STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Vis alle tog som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Vis alle kjøretøy som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Vis alle luftfartøy som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Vis alle skip som har denne stasjonen på sin ordreliste -STR_STATION_VIEW_RENAME_STATION_CAPTION :Endre navnet til stasjon/godsterminal STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Steng flyplass STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre fly i å lande på denne flyplassen. @@ -3921,11 +3919,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre f # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvinduet på veipunktets lokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på veipunktets lokasjon -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Endre veipunktets navn STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvinduet på bøyens lokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på bøyens lokasjon STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Endre navn på bøye -STR_EDIT_WAYPOINT_NAME :{WHITE}Endre navn på veipunkt # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY}s regnskap{BLACK}{COMPANY_NUM} diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 290c4c01b1..c34f5f1c7e 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -3101,14 +3101,12 @@ STR_CARGO_RATING_EXCELLENT :Utmerkt STR_CARGO_RATING_OUTSTANDING :Framifrå STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Midtstill hovedvisninga på stasjonen. CTRL+klikk syner stasjonen i eit nytt tilleggsvindauge -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Byt namn på stasjonen STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Syne alle tog som har denne stasjonen på ruteplanen sin STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Syne alle køyretøy som har denne stasjonen på ruteplanen sin STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Syne alle luftfartøy som har denne stasjonen på ruteplanen sin STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Syne alle skip som har denne stasjonen på ruteplanen sin -STR_STATION_VIEW_RENAME_STATION_CAPTION :Endre namnet på stasjon/lasteterminal STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Steng flyplassen STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre at luftfartøy lander på flyplassen @@ -3116,11 +3114,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre a # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Midtstill hovedvisninga på kontrollpunktet. CTRL+klikk syner kontrollpunktet i eit nytt tilleggsvindauge -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Byt namn på kontrollpunkt STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Midtstill hovedvisninga på bøyen. CTRL+klikk syner bøyen i eit nytt tilleggsvindauge STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Byt namn på bøyen -STR_EDIT_WAYPOINT_NAME :{WHITE}Endre namn på kontrollpunkt # Finances window STR_FINANCES_CAPTION :{WHITE}Rekneskapen til {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/persian.txt b/src/lang/persian.txt index b911136150..cf3ed27ab5 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -3168,24 +3168,20 @@ STR_CARGO_RATING_EXCELLENT :عالی STR_CARGO_RATING_OUTSTANDING :بسیار عالی STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}مرکز تصویر اصلی را روی محل ایستگاه قرار بده. Ctrl+Click برای گشودن یک پنجره نما از ایستگاه -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}تغییر نام ایستگاه STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}همه قطار هایی که در ایستگاه هایشان دارای زمانبندی می باشند را نشان می دهد. STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}همه خودروهایی هایی که در ایستگاه هایشان دارای زمانبندی می باشند را نشان می دهد. STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}همه هواپیماهایی که در ایستگاه هایشان دارای زمانبندی می باشند را نشان می دهد. STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}همه کشتی هایی هایی که در ایستگاه هایشان دارای زمانبندی می باشند را نشان می دهد. -STR_STATION_VIEW_RENAME_STATION_CAPTION :نام گذاری محوطه ایستگاه/بارگیری STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}بستن (یا نزدیک) فرودگاه STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}جلوگیری از فرود هواپیما در این فرودگاه # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}تغییر نام نقطه مسیر STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}تغییر نام شناور -STR_EDIT_WAYPOINT_NAME :{WHITE}ویرایش نام نقطه راه # Finances window STR_FINANCES_YEAR :{WHITE}{NUM} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index f4c6d6274b..bd77e41fcb 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -4284,14 +4284,12 @@ STR_CARGO_RATING_EXCELLENT :Wspaniałe STR_CARGO_RATING_OUTSTANDING :Niezwykłe STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji stacji. Użyj Ctrl, aby otworzyć nowy podgląd na jej lokalizację -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Zmień nazwę stacji STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Pokaż wszystkie pociągi, które mają tę stację w swoim rozkładzie STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Pokaż wszystkie pojazdy, które mają tę stację w swoim rozkładzie STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Pokaż wszystkie samoloty, które mają tę stację w swoim rozkładzie STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Pokaż wszystkie statki, które mają tę stację w swoim rozkładzie -STR_STATION_VIEW_RENAME_STATION_CAPTION :Zmień nazwę stacji STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Zamknij lotnisko STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Nie zezwalaj maszynie lądować na tym lotnisku @@ -4299,11 +4297,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Nie zezw # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji posterunku. Użyj Ctrl, aby otworzyć nowy podgląd na jego lokalizację -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Zmień nazwę posterunku STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji boi. Użyj Ctrl, aby otworzyć nowy podgląd na jej lokalizację STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Zmień nazwę boi -STR_EDIT_WAYPOINT_NAME :{WHITE}Edytuj nazwę posterunku # Finances window STR_FINANCES_CAPTION :{WHITE}Finanse {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 24a9599b30..ea4f4672fe 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -772,7 +772,7 @@ STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHIT STR_SMALLMAP_CAPTION :{WHITE}Mapa - {STRING} ###length 7 -STR_SMALLMAP_TYPE_CONTOURS :Isolinhas +STR_SMALLMAP_TYPE_CONTOURS :Topografia STR_SMALLMAP_TYPE_VEHICLES :Veículos STR_SMALLMAP_TYPE_INDUSTRIES :Indústrias STR_SMALLMAP_TYPE_ROUTEMAP :Fluxo de Carga @@ -780,7 +780,7 @@ STR_SMALLMAP_TYPE_ROUTES :Rotas STR_SMALLMAP_TYPE_VEGETATION :Vegetação STR_SMALLMAP_TYPE_OWNERS :Proprietários -STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar isolinhas do terreno no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar topografia do terreno no mapa STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar veículos no mapa STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar indústrias no mapa STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar fluxo de carga no mapa @@ -3709,7 +3709,7 @@ STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} ( STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} no último mês: {ORANGE}{COMMA}{BLACK} máx.: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} no último minuto: {ORANGE}{COMMA}{BLACK} máx.: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Mercadoria necessária para o desenvolvimento da localidade: +STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Requisitos para o desenvolvimento da localidade: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}{G 0 É É É São São} necessári{G 0 o o o os as} {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{BLACK}No inverno, {G 0 é é é são são} necessári{G 0 o o o os as} {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} fo{G 0 i i i ram ram} entregue{G 0 "" "" "" s s} @@ -3905,14 +3905,12 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excecional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da estação. Ctrl+Clique para abrir um novo visualizador na localização da estação -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os comboios que têm esta estação nas ordens de serviço STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos rodoviários que têm esta estação nas ordens de serviço STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação nas ordens de serviço STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar todos os navios que têm esta estação nas ordens de serviço -STR_STATION_VIEW_RENAME_STATION_CAPTION :Alterar nome de estação/local de carga STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fechar aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não permitir que aviões aterrarem neste aeroporto @@ -3920,11 +3918,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não per # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização do ponto de controlo. Ctrl+Clique para abrir um novo visualizador na localização do ponto de controlo -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Mudar o nome do ponto de controlo STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização principal na localização da boia. Ctrl+Clique para abrir um novo visualizador na localização da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da boia -STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controlo # Finances window STR_FINANCES_CAPTION :{WHITE}Finanças de {COMPANY} {BLACK}{COMPANY_NUM} @@ -4323,7 +4319,7 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Clonar n STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Clonar Aeronave ###length VEHICLE_TYPES -STR_DEPOT_CLONE_TRAIN_DEPOT_TOOLTIP :{BLACK}Comprar uma cópia de um comboio, incluindo todos os veículos rebocados. Clique neste botão e de seguida, num comboio que se encontre dentro ou fora do depósito ferroviário. Ctrl+Clique para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado +STR_DEPOT_CLONE_TRAIN_DEPOT_TOOLTIP :{BLACK}Comprar uma cópia de um comboio, incluindo as suas carruagens e os seus vagões. Clique neste botão e de seguida, num comboio que se encontre dentro ou fora do depósito ferroviário. Ctrl+Clique para partilhar as mesmas ordens. Pressione também Shift para apenas mostrar o custo estimado STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_TOOLTIP :{BLACK}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 para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado STR_DEPOT_CLONE_SHIP_DEPOT_TOOLTIP :{BLACK}Comprar uma cópia de um navio. Clique neste botão e de seguida, num navio dentro ou fora do estaleiro naval. Ctrl+Clique para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado STR_DEPOT_CLONE_AIRCRAFT_HANGAR_TOOLTIP :{BLACK}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 para partilhar as ordens. Pressione também Shift para apenas mostrar o custo estimado diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 2b6f5bcea7..71941f2fcf 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -3829,14 +3829,12 @@ STR_CARGO_RATING_EXCELLENT :Excelent STR_CARGO_RATING_OUTSTANDING :Fantastic STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrează imaginea pe locația stației. Ctrl+Click pentru a deshide o fereastra cu locația stației -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Schimbă numele stației STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Afiseaza toate trenurile care opresc in aceasta statie STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Afiseaza toate autovehiculele care opresc in aceasta statie STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Afiseaza toate aeronavele care opresc in aceasta statie STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Afiseaza toate navele care opresc in aceasta statie -STR_STATION_VIEW_RENAME_STATION_CAPTION :Redenumește stația STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Închide aeroport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Nu permite avioanelor să aterizeze pe acest aeroport @@ -3844,11 +3842,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Nu permi # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrază fereasta principală pe punctul de tranzit. Ctrl+Click pentru a deshide o fereastra cu locația punctului de tranzit -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Schimbă numele haltei STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrează vizorul principal pe locația balizei. Ctrl+Clic pentru a deschide o nouă fereastră de vizualizare cu locația balizei STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Schimbă numele balizei -STR_EDIT_WAYPOINT_NAME :{WHITE}Editează numele haltei # Finances window STR_FINANCES_CAPTION :{WHITE}Situația financiară a companiei {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 309c3a92e5..e9937a5d87 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -4079,14 +4079,12 @@ STR_CARGO_RATING_EXCELLENT :Отличны STR_CARGO_RATING_OUTSTANDING :Великолепный STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Показать станцию в основном окне. Ctrl+щелчок - показать в дополнительном окне. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Переименовать станцию STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Показать список поездов, маршрут которых проходит через эту станцию STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Показать список автомобилей, маршрут которых проходит через эту станцию/остановку STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Показать список воздушных судов, маршрут которых проходит через этот аэропорт STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Показать список судов, маршрут которых проходит через эту пристань -STR_STATION_VIEW_RENAME_STATION_CAPTION :Название станции STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Закрыть аэропорт STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Запретить воздушным судам садиться в этом аэропорту @@ -4094,11 +4092,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Запр # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Показать маршрутную точку в основном окне. Ctrl+щелчок{}NBSP- показать в дополнительном окне. -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Переименовать маршрутную точку STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Показать буй в основном окне. Ctrl+щелчок - показать в дополнительном окне. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Изменить название буя -STR_EDIT_WAYPOINT_NAME :{WHITE}Название маршрутной точки # Finances window STR_FINANCES_CAPTION :{WHITE}Финансы - {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index efdb5971ca..9e9006a930 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -3869,14 +3869,12 @@ STR_CARGO_RATING_EXCELLENT :odlično STR_CARGO_RATING_OUTSTANDING :izvanredno STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Prebacuje glavni pogled na lokaciju stanice. Ctrl+klik otvara novi pogled na lokaciju stanice -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Preimenuj stanicu STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Prikazuje sve vozove koji imaju ovu stanicu u svom voznom redu STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Prikazuje sva drumska vozila koja imaju ovu stanicu u svom voznom redu STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Prikazuje sve letelice koje imaju ovu stanicu u svom voznom redu STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Prikazuje sve brodove koji imaju ovu stanicu u svom voznom redu -STR_STATION_VIEW_RENAME_STATION_CAPTION :Preimenuj stanicu STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Zatvori aerodrom STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Spreči letelicu da sleti na ovaj aerodrom @@ -3884,11 +3882,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Spreči # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Prebacuje glavni pogled na lokaciju čvorišta. Ctrl+klik otvara novi pogled na čvorište -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Promena naziva putanje STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Prebacuje glavni pogled na lokaciju bove. Ctrl+klik otvara novi pogled na bovu STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Promeni naziv bove -STR_EDIT_WAYPOINT_NAME :{WHITE}Promena naziva putanje # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finansije {BLACK}{COMPANY_NUM} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 17e04752d0..77dd80c0bc 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -3900,14 +3900,12 @@ STR_CARGO_RATING_EXCELLENT :卓越 STR_CARGO_RATING_OUTSTANDING :完美(最高评价) STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到车站所在的位置。按住 单击会在新视点中显示目标位置 -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}重命名车站 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}显示所有调度计划中含有此车站的列车 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}显示所有调度计划中含有此车站的汽车 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}显示所有调度计划中含有此机场的飞机 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}显示所有调度计划中含有此码头的船只 -STR_STATION_VIEW_RENAME_STATION_CAPTION :重命名车站 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}关闭机场 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}禁止飞机降落本场 @@ -3915,11 +3913,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}禁止 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到路点所在的位置。按住 单击会在新视点中显示路点 -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}修改路点名 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到浮标所在的位置。按住 单击会在新视点中显示目标位置 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}修改浮标名 -STR_EDIT_WAYPOINT_NAME :{WHITE}编辑路点名称 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 财务报表 {BLACK}{COMPANY_NUM} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index fdd76be32a..6d6c706058 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -3828,14 +3828,12 @@ STR_CARGO_RATING_EXCELLENT :Výborné STR_CARGO_RATING_OUTSTANDING :Perfektné STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Vycentrovať pohľad na pozíciu stanice. Ctrl+Klik otvorí nové okno s pohľadom na stanicu -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Zmeniť názov stanice STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Zobraziť všetky vlaky, ktoré majú túto stanicu v cestovnom poriadku STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Zobraziť všetky autá, ktoré majú túto stanicu v cestovnom poriadku STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Zobraziť všetky lietadlá, ktoré majú túto stanicu v cestovnom poriadku STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Zobraziť všetky lode, ktoré majú túto stanicu v cestovnom poriadku -STR_STATION_VIEW_RENAME_STATION_CAPTION :Premenovať stanicu/vykládku STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Uzavri letisko STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Zakáž lietadlám pristávať na tomto letisku @@ -3843,11 +3841,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Zakáž # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Vycentrovať pohľad na pozíciu smerového bodu. Ctrl+Klik otvorí nové okno s pohľadom na smerový bod -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Zmeniť meno smerového bodu STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Vycentrovať pohľad na pozíciu bóje. Ctrl+Klik otvorí nové okno s pohľadom na bóju STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Zmeniť meno bóje -STR_EDIT_WAYPOINT_NAME :{WHITE}Upraviť názvy smerových bodov # Finances window STR_FINANCES_CAPTION :{WHITE}Financie spoločnosti {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index e6e9b9742f..04b02deec8 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -3325,14 +3325,12 @@ STR_CARGO_RATING_EXCELLENT :Izvrstno STR_CARGO_RATING_OUTSTANDING :Sijajno STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Osredotoči pogled na lokacijo postaje. Ctrl+Klik odpre nov pogled na lokaciji postaje -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Spremeni ime postaje STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Prikaz vsah vlakov, ki imajo to postajo na urniku STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Prikaz vseh cestnih vozil, ki imajo to postajo na urniku STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Prikaz vseh letal, ki imajo to postajo na urniku STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Prikaz vseh ladij, ki imajo to postajo na urniku -STR_STATION_VIEW_RENAME_STATION_CAPTION :Preimenuj postajo STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Zapri letališče STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prepreči letalom pristajanje na tem letališču @@ -3340,11 +3338,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prepreč # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Osredotoči pogled na lokacijo točke poti. Ctrl+Klik odpre nov pogled na lokaciji točke poti -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Spremeni ime točke poti STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Osredotoči pogled na lokacijo boje. Ctrl+Klik odpre nov pogled na lokaciji boje STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Spremeni ime boje -STR_EDIT_WAYPOINT_NAME :{WHITE}Uredi ime točke poti # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finance {BLACK}{COMPANY_NUM} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 7627577713..a380405d84 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -3862,14 +3862,12 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal en la posición de la estación. Ctrl+clic abre un punto de vista en dicha posición -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambia el nombre de la estación STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Muestra todos los trenes que tienen esta estación en sus órdenes STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Muestra todos los vehículos de carretera que tienen esta estación en sus órdenes STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Muestra todas las aeronaves que tienen esta estación en sus órdenes STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Muestra todos los barcos que tienen esta estación en sus órdenes -STR_STATION_VIEW_RENAME_STATION_CAPTION :Renombrar estación/zona de carga STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Cerrar aeropuerto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita que las aeronaves aterricen en este aeropuerto @@ -3877,11 +3875,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista principal en la posición del punto de ruta. Ctrl+clic abre un punto de vista en dicha posición -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Cambiar nombre del punto de ruta STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal en la boya. Ctrl+clic abre una nueva vista en dicha posición STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar nombre de boya -STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nombre del punto de ruta # Finances window STR_FINANCES_CAPTION :{WHITE}Finanzas de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 4d128a76f1..c55bd141df 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -3886,14 +3886,12 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en la estación. Ctrl+Clic abre una vista aparte en su ubicación -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar nombre de la estación STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar los trenes con esta estación en su horario STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar los autotransportes con esta estación en su horario STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar las aeronaves con este aeropuerto en su horario STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar los barcos con este muelle en su horario -STR_STATION_VIEW_RENAME_STATION_CAPTION :Cambiar nombre de estación STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Cerrar aeropuerto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita el aterrizaje de aeronaves en este aeropuerto @@ -3901,11 +3899,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita el # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en el punto de ruta. Ctrl+Clic abre una vista aparte en su ubicación -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Cambiar nombre de punto de ruta STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar vista en la boya. Ctrl+Clic abre una vista aparte en su ubicación STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar nombre de boya -STR_EDIT_WAYPOINT_NAME :{WHITE}Cambiar nombre de punto de ruta # Finances window STR_FINANCES_CAPTION :{WHITE}Finanzas de {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index abddddf73e..d0730b7b3e 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -3904,14 +3904,12 @@ STR_CARGO_RATING_EXCELLENT :Utmärkt STR_CARGO_RATING_OUTSTANDING :Enastående STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på stationen. Ctrl+Klick öppnar en ny fönstervy över stationens läge -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Byt namn på stationen STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Visa alla tåg där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Visa alla vägfordon där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Visa alla flygplan där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Visa alla skepp där denna station finns med i rutten -STR_STATION_VIEW_RENAME_STATION_CAPTION :Byt namn på station STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Stäng flygplats STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindra flygplan från att landa på den här flygplatsen @@ -3919,11 +3917,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindra f # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på riktmärket. Ctrl+Klick för att öppna en ny fönstervy över riktmärkets läge -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Byt namn på riktmärke STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på bojen. Ctrl+klicka för att öppna en ny skärmvy över bojens läge STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Ändra namn på boj -STR_EDIT_WAYPOINT_NAME :{WHITE}Ändra namn på riktmärke # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Budget {BLACK}{COMPANY_NUM} diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 516cfb1db3..7a1cd43f7e 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -3425,24 +3425,20 @@ STR_CARGO_RATING_EXCELLENT :சிறப் STR_CARGO_RATING_OUTSTANDING :மிகச்சிறப்பு STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}நிலைய இருப்பிடத்தின் மையக் காட்சி. Ctrl + Click நிலைய இருப்பிடத்தில் புதிய காட்சிப்பலகையைத் திறக்கிறது -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}நிலையத்தின் பெயரை மாற்று STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}இந்த நிலையத்தினை அட்டவணையில் வைத்துள்ள அனைத்து இரயில்களையும் காட்டு STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}இந்த நிலையத்தினை அட்டவணையில் வைத்துள்ள அனைத்து சாலை வாகனங்களையும் காட்டு STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}இந்த நிலையத்தினை அட்டவணையில் வைத்துள்ள அனைத்து விமானங்களையும் காட்டு STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}இந்த நிலையத்தினை அட்டவணையில் வைத்துள்ள அனைத்து கப்பல்களையும் காட்டு -STR_STATION_VIEW_RENAME_STATION_CAPTION :நிலையம்/சரக்கேற்றும் பகுதியின் பெயரினை மாற்றவும் STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}விமான நிலையத்தினை மூடு STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}விமானத்தை இந்த விமான நிலையத்தில் தரையிரங்க அனுமதிக்காதே # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}பாதைப்புள்ளியின் பெயரை மாற்று STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}மிதவையின் பெயரை மாற்று -STR_EDIT_WAYPOINT_NAME :{WHITE}பாதைப்புள்ளியின் பெயரை திருத்து # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} நிதிநிலைமை {BLACK}{COMPANY_NUM} diff --git a/src/lang/thai.txt b/src/lang/thai.txt index c3c517a6fe..bd338b6b5d 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -3257,14 +3257,12 @@ STR_CARGO_RATING_EXCELLENT :ยอดเย STR_CARGO_RATING_OUTSTANDING :เกินความคาดหมาย STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}จุดศูนย์กลางมุมมองสถานี -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}เปลี่ยนชื่อสถานี STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}แสดงขบวนรถไฟที่มีรายการเข้าจอดที่สถานีนี้ STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}แสดงยานพาหนะทางบกที่มีรายการเข้าจอดที่สถานีนี้ STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}แสดงอากาศยานที่มีรายการลงจอดจอดที่สถานีนี้ STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}แสดงเรือที่มีรายการเข้าเทียบท่าที่ท่านี้ -STR_STATION_VIEW_RENAME_STATION_CAPTION :เปลี่ยนชื่อสถานี/พื้นที่รับส่งสินค้า STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}ปิดท่าอากาศยาน STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}ไม่ให้เที่ยวบินมาลงจอดที่ท่าอากาศยานนี้ @@ -3272,11 +3270,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}ไม # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}จุดศูนย์กลางมุมมองสถานี -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}เปลี่ยนชื่อ Waypoint STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}จุดศูนย์กลางมุมมองสถานี STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}เปลี่ยนชื่อทุ่มลอยน้ำ -STR_EDIT_WAYPOINT_NAME :{WHITE}เปลี่ยนชื่อ Waypoint # Finances window STR_FINANCES_CAPTION :{WHITE} สภาวะการเงินของ {COMPANY}{BLACK}{COMPANY_NUM} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 23c0ccb9e5..3f190c1bf1 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -3900,14 +3900,12 @@ STR_CARGO_RATING_EXCELLENT :極佳 STR_CARGO_RATING_OUTSTANDING :傑出 STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}將車站置於畫面正中央。按住 點選可於車站位置開啟新檢視視窗 -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}修改車站名稱 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}顯示所有指令內包含這個車站的列車 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}顯示所有指令內包含這個車站的車輛 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}顯示所有指令內包含這座機場的飛機 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}顯示所有指令內包含這個碼頭的船舶 -STR_STATION_VIEW_RENAME_STATION_CAPTION :修改車站/載貨區名稱 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}關閉機場 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}防止飛機在此機場降落 @@ -3915,11 +3913,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}防止 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}將中途站置於畫面正中央。按住 點選可於中途站位置開啟新檢視視窗 -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}修改中途站名稱 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}將浮標置於畫面正中央。按住 點選可於浮標位置開啟新檢視視窗 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}修改浮標名稱 -STR_EDIT_WAYPOINT_NAME :{WHITE}編輯中途站名稱 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 財務狀況 {BLACK}{COMPANY_NUM} diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 35d04b5311..48dd7c8f73 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -3792,14 +3792,12 @@ STR_CARGO_RATING_EXCELLENT :Harika STR_CARGO_RATING_OUTSTANDING :Mükemmel STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Durağın oldugu yeri ortala. Ctrl + Sol Tıklama durağın olduğu yere ait bir görünüm penceresi açar. -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}İstasyonun ismini değiştir STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Talimat listesinde bu durak olan trenleri listele STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Talimat listesinde bu durak olan tüm karayolu araçlarını listele STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Talimat listesinde bu durak olan uçakları listele STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Talimat listesinde bu durak olan gemileri listele -STR_STATION_VIEW_RENAME_STATION_CAPTION :İstasyonu yeniden adlandır STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Havalimanını kapat STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Uçağın bu havalimanına iniş yapmasını engelle @@ -3807,11 +3805,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Uçağı # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Ana görünümü güzergaha ortala. Ctrl+Sol tık ile güzegahın konumunu gösteren yeni bir pencere açabilirsiniz -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Ara nokta adını değiştir STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Ana görünümü şamandıra(duba) konumuna ortala. Ctrl + Sol Tıklama şamandıranın olduğu yere ait bir görünüm penceresi açar. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Şamandıra adını değiştir -STR_EDIT_WAYPOINT_NAME :{WHITE}Yerimi adını değiştir # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Hesaplar {BLACK}{COMPANY_NUM} diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index c96a193178..5d56b9df71 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -4001,14 +4001,12 @@ STR_CARGO_RATING_EXCELLENT :відмінн STR_CARGO_RATING_OUTSTANDING :найкраще STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Показувати станцію в центрі екрану. Ctrl+клац мишею відкриє нове вікно з видом на станцію -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Перейменувати станцію STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Показати всі поїзди, які заходять на цю станцію STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Показати всі авто, які заходять на цю станцію STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Показати всі літаки, які залітають на цю станцію STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Показати всі кораблі, які запливають на цю станцію -STR_STATION_VIEW_RENAME_STATION_CAPTION :Перейменування станції STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Закрити аеропорт STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Заборонити посадку авіатранспорту на цей аеропорт @@ -4016,11 +4014,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Забо # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Показати точку маршруту в центрі екрану. Ctrl+клац мишею відкриє нове вікно з видом на точку маршруту -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Перейменувати точку маршруту STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Показати буй в центрі екрану. Ctrl+клац мишею відкриє нове вікно з видом на розташування буя STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Перейменувати буй -STR_EDIT_WAYPOINT_NAME :{WHITE}Перейменуйте точку маршруту # Finances window STR_FINANCES_CAPTION :{WHITE}Фінанси {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 4cbf272ae3..9b40266c55 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -3894,14 +3894,12 @@ STR_CARGO_RATING_EXCELLENT :Tuyệt vời STR_CARGO_RATING_OUTSTANDING :Hoàn hảo STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Xem trung tâm ga, bến, cảng. Ctrl+Click mở cửa sổ mới để xem -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Đổi tên ga, bến, cảng STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Hiện lên tất cả các đoàn tàu có lộ trình đi qua ga này STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Hiện lên tất cả các xe có lộ trình đi qua bến này STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Hiện tất cả các máy bay có lộ trình đi qua sân bay này STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Hiện tất cả tàu thuỷ có lộ trình đi qua cảng này. -STR_STATION_VIEW_RENAME_STATION_CAPTION :Đổi tên ga, bến, cảng STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Đóng cửa sân bay STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Không cho máy bay hạ cánh ở sân bay này @@ -3909,11 +3907,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Không c # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Xem vị trí của điểm mốc. Ctrl+Click để mở cửa sổ mới cho điểm mốc -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Đổi tên điểm mốc STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Xem vị trí phao hàng hải. Ctrl+Click mở cửa sổ mới vị trí phao STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Đổi tên phao -STR_EDIT_WAYPOINT_NAME :{WHITE}Sửa tên điểm mốc # Finances window STR_FINANCES_CAPTION :{WHITE}Tài Chính Công Ty {COMPANY} {BLACK}{COMPANY_NUM} diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 271efe20fb..b9d4110191 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -3878,14 +3878,12 @@ STR_CARGO_RATING_EXCELLENT :Gwych STR_CARGO_RATING_OUTSTANDING :Rhagorol STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Canoli'r brif olygfa ar leoliad yr orsaf. Ctrl+Clic i agor ffenest golwg newydd ar leoliad yr orsaf -STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Newid enw'r orsaf STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Dangos pob trên sydd â'r orsaf hon yn eu hamserlen STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Dangos pob cerbyd ffordd sydd â'r orsaf hon yn eu hamserlen STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Dangos pob awyren sydd â'r orsaf hon yn eu hamserlen STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Dangos pob llong sydd â'r orsaf hon yn eu hamserlen -STR_STATION_VIEW_RENAME_STATION_CAPTION :Ailenwi gorsaf/ardal lwytho STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Cau'r maes awyr STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Rhwystro awyrennau rhag glanio ar y maes awyr yma @@ -3893,11 +3891,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Rhwystro # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Canoli'r brif olygfa ar leoliad y pwynt llwybro. Ctrl+Clic i agor ffenest olygfa newydd ar leoliad y pwynt llwybro -STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Newid enw pwynt llwybro STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Canoli'r brif olygfa ar leoliad y bwï. Ctrl+Clic i agor ffenestr olygfa newydd ar leoliad y bwï STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Newid enw bwï -STR_EDIT_WAYPOINT_NAME :{WHITE}Golygu enw pwynt llwybro # Finances window STR_FINANCES_CAPTION :{WHITE}Cyllid {COMPANY}{BLACK}{COMPANY_NUM} From b4ac5e22318fe825023cf1ba43a66e3f238d0b64 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 25 Nov 2025 05:39:17 -0500 Subject: [PATCH 224/280] Change: Ensure generated towns have enough room (#14803) --- src/town_cmd.cpp | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 60cde52c29..48280bd300 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -55,6 +55,8 @@ #include "road_cmd.h" #include "terraform_cmd.h" #include "tunnelbridge_cmd.h" +#include "clear_map.h" +#include "tree_map.h" #include "map_func.h" #include "timer/timer.h" #include "timer/timer_game_calendar.h" @@ -2113,9 +2115,10 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32_t townnameparts, TownSi /** * Check if it's possible to place a town on a given tile. * @param tile The tile to check. + * @param check_surrounding Should we ensure surrounding tiles are free too? * @return A zero cost if allowed, otherwise an error. */ -static CommandCost TownCanBePlacedHere(TileIndex tile) +static CommandCost TownCanBePlacedHere(TileIndex tile, bool check_surrounding) { /* Check if too close to the edge of map */ if (DistanceFromEdge(tile) < 12) { @@ -2132,6 +2135,29 @@ static CommandCost TownCanBePlacedHere(TileIndex tile) return CommandCost(STR_ERROR_SITE_UNSUITABLE); } + /* We might want to make sure the town has enough room. */ + if (check_surrounding) { + constexpr uint SEARCH_DIAMETER = 5; // Center tile of town + 2 tile radius. + /* Half of the tiles in the search must be valid for the town to build upon. */ + constexpr uint VALID_TILE_GOAL = (SEARCH_DIAMETER * SEARCH_DIAMETER) / 2; + uint counter = 0; + for (TileIndex t : SpiralTileSequence(tile, SEARCH_DIAMETER)) { + if (counter == VALID_TILE_GOAL) break; + + /* The most likely unsuitable tile type is water, test that first. */ + if (IsTileType(tile, MP_WATER)) continue; + + /* Don't allow rough tiles, as they are likely wetlands. */ + bool clear = IsTileType(t, MP_CLEAR) && GetClearDensity(t) != CLEAR_ROUGH; + bool trees = IsTileType(t, MP_TREES) && GetTreeGround(t) != TREE_GROUND_ROUGH; + int town_height = GetTileZ(tile); + bool elevation_similar = (GetTileMaxZ(t) <= town_height + 1) && (GetTileZ(t) >= town_height - 1); + if ((clear || trees) && elevation_similar) counter++; + } + + if (counter < VALID_TILE_GOAL) return CommandCost(STR_ERROR_SITE_UNSUITABLE); + } + return CommandCost(EXPENSES_OTHER); } @@ -2194,7 +2220,7 @@ std::tuple CmdFoundTown(DoCommandFlags flags, TileIn if (!Town::CanAllocateItem()) return { CommandCost(STR_ERROR_TOO_MANY_TOWNS), 0, TownID::Invalid() }; if (!random_location) { - CommandCost ret = TownCanBePlacedHere(tile); + CommandCost ret = TownCanBePlacedHere(tile, false); if (ret.Failed()) return { ret, 0, TownID::Invalid() }; } @@ -2311,6 +2337,7 @@ static TileIndex FindNearestGoodCoastalTownSpot(TileIndex tile, TownLayout layou uint max_dist = 0; for (auto test : SpiralTileSequence(coast, 10)) { if (!IsTileType(test, MP_CLEAR) || !IsTileFlat(test) || !IsTileAlignedToGrid(test, layout)) continue; + if (TownCanBePlacedHere(tile, true).Failed()) continue; uint dist = GetClosestWaterDistance(test, true); if (dist > max_dist) { @@ -2359,15 +2386,12 @@ static Town *CreateRandomTown(uint attempts, uint32_t townnameparts, TownSize si /* Generate a tile index not too close from the edge */ TileIndex tile = AlignTileToGrid(RandomTile(), layout); - /* if we tried to place the town on water, slide it over onto - * the nearest likely-looking spot */ + /* If we tried to place the town on water, find a suitable land tile nearby. + * Otherwise, evaluate the land tile. */ if (IsTileType(tile, MP_WATER)) { tile = FindNearestGoodCoastalTownSpot(tile, layout); if (tile == INVALID_TILE) continue; - } - - /* Make sure town can be placed here */ - if (TownCanBePlacedHere(tile).Failed()) continue; + } else if (TownCanBePlacedHere(tile, true).Failed()) continue; /* Allocate a town struct */ Town *t = new Town(tile); From 3b541d4c74e38b927ef6f252f8246650b84b3e9b Mon Sep 17 00:00:00 2001 From: mmtunligit <156685720+mmtunligit@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:04:16 +0100 Subject: [PATCH 225/280] Codefix: Add comments to SetViewport functions (#14822) --- src/viewport.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/viewport.cpp b/src/viewport.cpp index ea0da5a477..e1c7b93791 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -3713,14 +3713,17 @@ static void ClearViewportCatchment() void SetViewportCatchmentStation(const Station *st, bool sel) { SetWindowDirtyForViewportCatchment(); + /* Mark tiles dirty for redrawing and update selected station if a different station is already highlighted. */ if (sel && _viewport_highlight_station != st) { ClearViewportCatchment(); _viewport_highlight_station = st; MarkCatchmentTilesDirty(); + /* Mark tiles dirty for redrawing and clear station selection if deselecting highlight. */ } else if (!sel && _viewport_highlight_station == st) { MarkCatchmentTilesDirty(); _viewport_highlight_station = nullptr; } + /* Redraw the currently selected station window */ if (_viewport_highlight_station != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station->index); } @@ -3733,15 +3736,18 @@ void SetViewportCatchmentStation(const Station *st, bool sel) void SetViewportStationRect(const Station *st, bool sel) { SetWindowDirtyForViewportCatchment(); - if (sel && _viewport_highlight_station_rect != st) { // mark tiles dirty for redrawing and update selected station if a different station is already highlighted + /* Mark tiles dirty for redrawing and update selected station if a different station is already highlighted. */ + if (sel && _viewport_highlight_station_rect != st) { ClearViewportCatchment(); _viewport_highlight_station_rect = st; MarkCatchmentTilesDirty(); - } else if (!sel && _viewport_highlight_station_rect == st) { // mark tiles dirty for redrawing and clear station selection if deselecting highlight + /* Mark tiles dirty for redrawing and clear station selection if deselecting highlight. */ + } else if (!sel && _viewport_highlight_station_rect == st) { MarkCatchmentTilesDirty(); _viewport_highlight_station_rect = nullptr; } - if (_viewport_highlight_station_rect != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station_rect->index); // redraw the currently selected station window + /* Redraw the currently selected station window */ + if (_viewport_highlight_station_rect != nullptr) SetWindowDirty(WC_STATION_VIEW, _viewport_highlight_station_rect->index); } /** @@ -3753,14 +3759,17 @@ void SetViewportStationRect(const Station *st, bool sel) void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel) { SetWindowDirtyForViewportCatchment(); + /* Mark tiles dirty for redrawing and update selected waypoint if a different waypoint is already highlighted. */ if (sel && _viewport_highlight_waypoint != wp) { ClearViewportCatchment(); _viewport_highlight_waypoint = wp; MarkCatchmentTilesDirty(); + /* Mark tiles dirty for redrawing and clear waypoint selection if deselecting highlight. */ } else if (!sel && _viewport_highlight_waypoint == wp) { MarkCatchmentTilesDirty(); _viewport_highlight_waypoint = nullptr; } + /* Redraw the currently selected waypoint window */ if (_viewport_highlight_waypoint != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint->index); } @@ -3773,15 +3782,18 @@ void SetViewportCatchmentWaypoint(const Waypoint *wp, bool sel) void SetViewportWaypointRect(const Waypoint *wp, bool sel) { SetWindowDirtyForViewportCatchment(); - if (sel && _viewport_highlight_waypoint_rect != wp) { // mark tiles dirty for redrawing and update selected waypoint if a different waypoint is already highlighted + /* Mark tiles dirty for redrawing and update selected waypoint if a different waypoint is already highlighted. */ + if (sel && _viewport_highlight_waypoint_rect != wp) { ClearViewportCatchment(); _viewport_highlight_waypoint_rect = wp; MarkCatchmentTilesDirty(); - } else if (!sel && _viewport_highlight_waypoint_rect == wp) { // mark tiles dirty for redrawing and clear waypoint selection if deselecting highlight + /* Mark tiles dirty for redrawing and clear waypoint selection if deselecting highlight. */ + } else if (!sel && _viewport_highlight_waypoint_rect == wp) { MarkCatchmentTilesDirty(); _viewport_highlight_waypoint_rect = nullptr; } - if (_viewport_highlight_waypoint_rect != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint_rect->index); // redraw the currently selected waypoint window + /* Redraw the currently selected waypoint window */ + if (_viewport_highlight_waypoint_rect != nullptr) SetWindowDirty(WC_WAYPOINT_VIEW, _viewport_highlight_waypoint_rect->index); } /** @@ -3793,14 +3805,17 @@ void SetViewportWaypointRect(const Waypoint *wp, bool sel) void SetViewportCatchmentTown(const Town *t, bool sel) { SetWindowDirtyForViewportCatchment(); + /* Mark tiles dirty for redrawing and update selected town if a different town is already highlighted. */ if (sel && _viewport_highlight_town != t) { ClearViewportCatchment(); _viewport_highlight_town = t; MarkWholeScreenDirty(); + /* Mark tiles dirty for redrawing and clear town selection if deselecting highlight. */ } else if (!sel && _viewport_highlight_town == t) { _viewport_highlight_town = nullptr; MarkWholeScreenDirty(); } + /* Redraw the currently selected town window */ if (_viewport_highlight_town != nullptr) SetWindowDirty(WC_TOWN_VIEW, _viewport_highlight_town->index); } From c3f9cdf84f8e0075ad12afcad67e4038175deb22 Mon Sep 17 00:00:00 2001 From: mmtunligit <156685720+mmtunligit@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:05:24 +0100 Subject: [PATCH 226/280] Codechange 7a0814c: Use SetDisplayedPlane instead of UpdateWidgetSize (#14823) --- src/misc_gui.cpp | 15 ++++----------- src/widgets/misc_widget.h | 1 + 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 936480e855..fdb53d53d4 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -921,6 +921,7 @@ struct QueryStringWindow : public Window this->flags = flags; this->CreateNestedTree(); + this->GetWidget(WID_QS_DEFAULT_SEL)->SetDisplayedPlane((this->flags.Test(QueryStringFlag::EnableDefault)) ? 0 : SZSP_NONE); this->GetWidget(WID_QS_MOVE_SEL)->SetDisplayedPlane((this->flags.Test(QueryStringFlag::EnableMove)) ? 0 : SZSP_NONE); this->FinishInitNested(WN_QUERY_STRING); @@ -929,16 +930,6 @@ struct QueryStringWindow : public Window this->SetFocusedWidget(WID_QS_TEXT); } - void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override - { - if (widget == WID_QS_DEFAULT && !this->flags.Test(QueryStringFlag::EnableDefault)) { - /* We don't want this widget to show! */ - fill.width = 0; - resize.width = 0; - size.width = 0; - } - } - std::string GetWidgetString(WidgetID widget, StringID stringid) const override { if (widget == WID_QS_CAPTION) return GetString(this->editbox.caption); @@ -1041,7 +1032,9 @@ static constexpr std::initializer_list _nested_query_string_widgets NWidget(WWT_EDITBOX, COLOUR_GREY, WID_QS_TEXT), SetMinimalSize(256, 0), SetFill(1, 0), SetPadding(2, 2, 2, 2), EndContainer(), NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_QS_DEFAULT_SEL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT), + EndContainer(), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_QS_MOVE_SEL), diff --git a/src/widgets/misc_widget.h b/src/widgets/misc_widget.h index 758d418014..79ff3a4cd9 100644 --- a/src/widgets/misc_widget.h +++ b/src/widgets/misc_widget.h @@ -33,6 +33,7 @@ enum QueryStringWidgets : WidgetID { WID_QS_CAPTION, ///< Caption of the window. WID_QS_TEXT, ///< Text of the query. WID_QS_DEFAULT, ///< Default button. + WID_QS_DEFAULT_SEL, ///< Container for default button, which can be hidden. WID_QS_CANCEL, ///< Cancel button. WID_QS_OK, ///< OK button. WID_QS_MOVE, ///< Move button. From f1937222d38189a18c3a7d1e7ce17115f1ce1914 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 25 Nov 2025 21:23:19 +0000 Subject: [PATCH 227/280] Change: Make picker label/text colours consistent. (#14829) Use {GOLD} instead of {ORANGE} in house picker window, to match other picker windows. --- src/lang/english.txt | 18 +++++++++--------- src/picker_gui.cpp | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 04efb34743..c95775c37d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2862,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Select a town z STR_PICKER_HOUSE_TYPE_TOOLTIP :Select a house type to build. Ctrl+Click to add or remove in saved items STR_HOUSE_PICKER_CAPTION :House Selection -STR_HOUSE_PICKER_NAME :{BLACK}Name: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Years: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {ORANGE}Any -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {ORANGE}From {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {ORANGE}Until {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Size: {ORANGE}{NUM}x{NUM} tiles -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Name: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Years: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {GOLD}Any +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {GOLD}From {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {GOLD}Until {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Size: {GOLD}{NUM}x{NUM} tiles +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Edge STR_HOUSE_PICKER_CLASS_ZONE2 :Outskirts diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index 12085ec828..d03a52e871 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -358,7 +358,7 @@ void PickerWindow::DrawWidget(const Rect &r, WidgetID widget) const } case WID_PW_TYPE_NAME: - DrawString(r, this->callbacks.GetTypeName(this->callbacks.GetSelectedClass(), this->callbacks.GetSelectedType()), TC_ORANGE, SA_CENTER); + DrawString(r, this->callbacks.GetTypeName(this->callbacks.GetSelectedClass(), this->callbacks.GetSelectedType()), TC_GOLD, SA_CENTER); break; } } From 67ded4f980587c923c36631d88dc7e5be907f420 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 26 Nov 2025 04:41:30 +0000 Subject: [PATCH 228/280] Update: Translations from eints english (au): 8 changes by krysclarke greek: 8 changes by gh658804 russian: 8 changes by Ln-Wolf finnish: 8 changes by hpiirai portuguese: 8 changes by jcteotonio portuguese (brazilian): 8 changes by pasantoro polish: 10 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 9 ++++++++- src/lang/english_AU.txt | 9 ++++++++- src/lang/finnish.txt | 9 ++++++++- src/lang/greek.txt | 9 ++++++++- src/lang/polish.txt | 13 ++++++++++--- src/lang/portuguese.txt | 9 ++++++++- src/lang/russian.txt | 9 ++++++++- 7 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 1aa0988a40..9a76a92b4d 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -313,6 +313,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ativando STR_BUTTON_DEFAULT :{BLACK}Padrão STR_BUTTON_CANCEL :{BLACK}Cancelar STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Mover # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -3688,7 +3689,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenc STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Considerar correspondência de maiúsculas e minúsculas quando comparar os nomes das placas com a palavra-chave fornecida # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto da placa +STR_EDIT_SIGN_CAPTION :{WHITE}Editar a placa STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centralizar visualização principal na localização da placa. Ctrl+Clique para abrir uma nova visualização na localização da placa STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Ir para a próxima placa STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Ir para a placa anterior @@ -3905,12 +3906,14 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização da estação. Ctrl+Clique para abrir uma nova visualização na localização da estação +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Renomear a estação ou mover a placa STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação na sua programação STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar todas as embarcações que têm esta estação na sua programação +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Editar a placa da estação STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fechar aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não permitir o pouso de aviões neste aeroporto @@ -3918,9 +3921,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Não per # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização do ponto de controle. Ctrl+Clique para abrir uma nova visualização na localização do ponto de controle +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Renomear o ponto de controle ou mover a placa STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centralizar visualização principal na localização da boia. Ctrl+Clique para abrir uma nova visualização na localização da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da boia +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Editar a placa do ponto de controle # Finances window STR_FINANCES_CAPTION :{WHITE}Finanças de {COMPANY} {BLACK}{COMPANY_NUM} @@ -5134,6 +5139,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Há esta STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Muito perto de outra doca STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Muito perto de outro aeroporto STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Não é possível renomear a estação... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Não é possível mover a placa da estação... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... estrada pertence a uma localidade STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... estrada orientada na direção errada STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... estações de passagem não podem ter curvas @@ -5165,6 +5171,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Não é STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Não é possível construir ponto de controle rodoviário aqui... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Não é possível colocar boia aqui... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Não é possível alterar o nome do ponto de controle... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Não é possível mover a placa do ponto de controle... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Não é possível remover ponto de controle ferroviário aqui... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Não é possível remover ponto de controle rodoviário aqui... diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 8d05c5c163..e8d0d176c3 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}By enabl STR_BUTTON_DEFAULT :{BLACK}Default STR_BUTTON_CANCEL :{BLACK}Cancel STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Move # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -3687,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Match ca STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Toggle matching case when comparing sign names against the filter string # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign text +STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centre the main view on sign location. Ctrl+Click to open a new viewport on sign location STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign @@ -3904,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Outstanding STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on station location. Ctrl+Click to open a new viewport on station location +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Rename station or move sign STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Show all road vehicles which have this station on their schedule STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Show all aircraft which have this station on their schedule STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Show all ships which have this station on their schedule +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Edit station sign STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Close airport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent aircraft from landing on this airport @@ -3917,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Rename waypoint or move sign STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centre main view on buoy location. Ctrl+Click to open a new viewport on buoy location STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Change buoy name +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Edit waypoint sign # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finances {BLACK}{COMPANY_NUM} @@ -5133,6 +5138,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Can't move station sign... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... road owned by a town STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners @@ -5164,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Can't bu STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Can't build road waypoint here... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Can't place buoy here... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Can't change waypoint name... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Can't move waypoint sign... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Can't remove train waypoint here... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Can't remove road waypoint here... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index c3248c6342..74443345b2 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Kun otat STR_BUTTON_DEFAULT :{BLACK}Oletus STR_BUTTON_CANCEL :{BLACK}Peruuta STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Siirrä # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :§1234567890+´ qwertyuiopå¨asdfghjklöä' Date: Thu, 20 Nov 2025 12:54:33 +0100 Subject: [PATCH 229/280] Add: [Script] ScriptTile::IsHouseTile --- src/script/api/ai_changelog.hpp | 1 + src/script/api/game_changelog.hpp | 1 + src/script/api/script_tile.cpp | 7 +++++++ src/script/api/script_tile.hpp | 8 ++++++++ 4 files changed, 17 insertions(+) diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index dbb10f1df7..6f1642254a 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -30,6 +30,7 @@ * \li AIVehicleList_Waypoint * \li AIError::ERR_BRIDGE_TOO_LOW * \li AIEngine::GetAllRailTypes + * \li AITile::IsHouseTile * * Other changes: * \li AIBridge::GetBridgeID renamed to AIBridge::GetBridgeType diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 4dbb379896..ac6d56d3ad 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -31,6 +31,7 @@ * \li GSBaseStation::GetOwner * \li GSError::ERR_BRIDGE_TOO_LOW * \li GSEngine::GetAllRailTypes + * \li GSTile::IsHouseTile * * Other changes: * \li GSBridge::GetBridgeID renamed to GSBridge::GetBridgeType diff --git a/src/script/api/script_tile.cpp b/src/script/api/script_tile.cpp index e837472f7d..9979285610 100644 --- a/src/script/api/script_tile.cpp +++ b/src/script/api/script_tile.cpp @@ -154,6 +154,13 @@ return (::IsTileType(tile, MP_CLEAR) && ::IsClearGround(tile, CLEAR_DESERT)); } +/* static */ bool ScriptTile::IsHouseTile(TileIndex tile) +{ + if (!::IsValidTile(tile)) return false; + + return ::IsTileType(tile, MP_HOUSE); +} + /* static */ ScriptTile::TerrainType ScriptTile::GetTerrainType(TileIndex tile) { if (!::IsValidTile(tile)) return TERRAIN_NORMAL; diff --git a/src/script/api/script_tile.hpp b/src/script/api/script_tile.hpp index aec9329b45..6a3154a632 100644 --- a/src/script/api/script_tile.hpp +++ b/src/script/api/script_tile.hpp @@ -275,6 +275,14 @@ public: */ static bool IsDesertTile(TileIndex tile); + /** + * Check if the tile is town house/building + * @param tile The tile to check on. + * @pre ScriptMap::IsValidTile(tile). + * @return True if and only if the tile is house tile. + */ + static bool IsHouseTile(TileIndex tile); + /** * Get the type of terrain regardless of buildings or infrastructure. * @note When a desert or rainforest tile are changed, their terrain type will remain the same. In other words, a sea tile can be of the desert terrain type. From 3e73a130d8fe454157a613bdfc4fa575bc276c8d Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 26 Nov 2025 16:34:05 -0500 Subject: [PATCH 230/280] Fix 509cbed: Don't give up erroneously when building lakes (#14832) --- src/landscape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index 4c645faba5..f36a8406ca 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1077,7 +1077,7 @@ static void MakeLake(TileIndex lake_centre, uint height_lake) TileIndex t = tile + TileOffsByDiagDir(d); if (IsWaterTile(t)) { MakeRiverAndModifyDesertZoneAround(tile); - return; + break; } } } From fa0fd235c2726b74a26386b9b56c5a7eea61054e Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 27 Nov 2025 04:39:51 +0000 Subject: [PATCH 231/280] Update: Translations from eints english (au): 9 changes by krysclarke swedish: 17 changes by robert-i english (us): 17 changes by 2TallTyler greek: 9 changes by gh658804 russian: 9 changes by Ln-Wolf finnish: 9 changes by hpiirai portuguese (brazilian): 9 changes by pasantoro polish: 9 changes by pAter-exe --- src/lang/brazilian_portuguese.txt | 18 +++++++++--------- src/lang/english_AU.txt | 18 +++++++++--------- src/lang/english_US.txt | 27 +++++++++++++++++---------- src/lang/finnish.txt | 18 +++++++++--------- src/lang/greek.txt | 18 +++++++++--------- src/lang/polish.txt | 18 +++++++++--------- src/lang/russian.txt | 18 +++++++++--------- src/lang/swedish.txt | 27 +++++++++++++++++---------- 8 files changed, 88 insertions(+), 74 deletions(-) diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 9a76a92b4d..2faf0207ff 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -2863,15 +2863,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Selecionar uma STR_PICKER_HOUSE_TYPE_TOOLTIP :Selecionar um tipo de casa para construir. Ctrl+Clique para adicionar ou remover nos itens salvos STR_HOUSE_PICKER_CAPTION :Seleção de Casas -STR_HOUSE_PICKER_NAME :{BLACK}Nome: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}População: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {ORANGE}Qualquer -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {ORANGE}De {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {ORANGE}Até {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Tamanho: {ORANGE}{NUM}x{NUM} quadrados -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceita: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga produzida: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nome: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}População: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {GOLD}Qualquer +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {GOLD}De {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {GOLD}Até {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Tamanho: {GOLD}{NUM}x{NUM} quadrados +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceita: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga produzida: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Borda STR_HOUSE_PICKER_CLASS_ZONE2 :Subúrbio diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index e8d0d176c3..81d2533faa 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -2862,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Select a town z STR_PICKER_HOUSE_TYPE_TOOLTIP :Select a house type to build. Ctrl+Click to add or remove in saved items STR_HOUSE_PICKER_CAPTION :House Selection -STR_HOUSE_PICKER_NAME :{BLACK}Name: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Years: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {ORANGE}Any -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {ORANGE}From {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {ORANGE}Until {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Size: {ORANGE}{NUM}x{NUM} tiles -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Name: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Years: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {GOLD}Any +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {GOLD}From {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {GOLD}Until {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Size: {GOLD}{NUM}x{NUM} tiles +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Edge STR_HOUSE_PICKER_CLASS_ZONE2 :Outskirts diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index ed6d5236f1..46b684dd6d 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}By enabl STR_BUTTON_DEFAULT :{BLACK}Default STR_BUTTON_CANCEL :{BLACK}Cancel STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Move # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -2861,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Select a town z STR_PICKER_HOUSE_TYPE_TOOLTIP :Select a house type to build. Ctrl+Click to add or remove in saved items STR_HOUSE_PICKER_CAPTION :House Selection -STR_HOUSE_PICKER_NAME :{BLACK}Name: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Years: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {ORANGE}Any -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {ORANGE}From {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {ORANGE}Until {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Size: {ORANGE}{NUM}x{NUM} tiles -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Name: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Population: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Years: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Years: {GOLD}Any +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Years: {GOLD}From {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Years: {GOLD}Until {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Size: {GOLD}{NUM}x{NUM} tiles +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Cargo accepted: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Cargo produced: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Edge STR_HOUSE_PICKER_CLASS_ZONE2 :Outskirts @@ -3687,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Match ca STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Toggle matching case when comparing sign names against the filter string # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign text +STR_EDIT_SIGN_CAPTION :{WHITE}Edit sign STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Center the main view on sign location. Ctrl+Click to open a new viewport on sign location STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign @@ -3904,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :Excellent STR_CARGO_RATING_OUTSTANDING :Outstanding STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on station location. Ctrl+Click to open a new viewport on station location +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Rename station or move sign STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Show all trains which have this station on their schedule STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Show all road vehicles which have this station on their schedule STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Show all aircraft which have this station on their schedule STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Show all ships which have this station on their schedule +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Edit station sign STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Close airport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent aircraft from landing on this airport @@ -3917,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Prevent # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on waypoint location. Ctrl+Click to open a new viewport on waypoint location +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Rename waypoint or move sign STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Center main view on buoy location. Ctrl+Click to open a new viewport on buoy location STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Change buoy name +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Edit waypoint sign # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finances {BLACK}{COMPANY_NUM} @@ -5133,6 +5138,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Too many STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Too close to another dock STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Too close to another airport STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Can't rename station... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Can't move station sign... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... road owned by a town STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners @@ -5164,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Can't bu STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Can't build road waypoint here... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Can't place buoy here... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Can't change waypoint name... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Can't move waypoint sign... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Can't remove train waypoint here... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Can't remove road waypoint here... diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 74443345b2..61c9cf4b71 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -2862,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Valitse näytet STR_PICKER_HOUSE_TYPE_TOOLTIP :Valitse rakennettavan talon tyyppi. Ctrl+napsautus lisää tallennettuihin tai poistaa tallennetuista STR_HOUSE_PICKER_CAPTION :Talojen valinta -STR_HOUSE_PICKER_NAME :{BLACK}Nimi: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Asukasluku: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Vuodet: {ORANGE}{NUM}–{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Vuodet: {ORANGE}milloin tahansa -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Vuodet: {ORANGE}{NUM} alkaen -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Vuodet: {ORANGE}{NUM} saakka -STR_HOUSE_PICKER_SIZE :{BLACK}Koko: {ORANGE}{NUM}×{NUM} ruutua -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Ottaa vastaan: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Tuottaa: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nimi: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Asukasluku: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Vuodet: {GOLD}{NUM}–{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Vuodet: {GOLD}milloin tahansa +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Vuodet: {GOLD}{NUM} alkaen +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Vuodet: {GOLD}{NUM} saakka +STR_HOUSE_PICKER_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Ottaa vastaan: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Tuottaa: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Reuna-alueet STR_HOUSE_PICKER_CLASS_ZONE2 :Laitamat diff --git a/src/lang/greek.txt b/src/lang/greek.txt index d28e991c37..f0111786b7 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -2955,15 +2955,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Επιλέξτ STR_PICKER_HOUSE_TYPE_TOOLTIP :Επιλογή τύπου σπιτιού για κατασκευή. Ctrl+κλικ για προσθήκη σε ή αφαίρεση από αποθηκευμένα στοιχεία STR_HOUSE_PICKER_CAPTION :Επιλογή Σπιτιού -STR_HOUSE_PICKER_NAME :{BLACK}Όνομα: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Πληθυσμός: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Έτη: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Έτη: {ORANGE}Όσα -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Έτη: {ORANGE}Από {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Έτη: {ORANGE}Έως {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Μέγεθος: {ORANGE}{NUM}x{NUM} τετραγωνίδια -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Αποδεκτό φορτίο: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Φορτίο που παρήχθει: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Όνομα: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Πληθυσμός: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Έτη: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Έτη: {GOLD}Όσα +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Έτη: {GOLD}Από {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Έτη: {GOLD}Έως {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Μέγεθος: {GOLD}{NUM}x{NUM} τετραγωνίδια +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Αποδεκτό φορτίο: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Φορτίο που παρήχθει: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Άκρη STR_HOUSE_PICKER_CLASS_ZONE2 :Περίχωρα diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 2e2ddbd5db..1101599223 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -3242,15 +3242,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Wybierz strefę STR_PICKER_HOUSE_TYPE_TOOLTIP :Wybierz typ budynku do zbudowania. Użyj Ctrl, aby dodać lub usunąć z zapisanych elementów STR_HOUSE_PICKER_CAPTION :Wybór Budynków -STR_HOUSE_PICKER_NAME :{BLACK}Nazwa: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Populacja: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Lata: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Lata: {ORANGE}Kiedykolwiek -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Lata: {ORANGE}Od {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Lata: {ORANGE}Do {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Rozmiar: {ORANGE}{NUM}x{NUM} p{P ole ola ól} -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Akceptowany ładunek: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Produkowany ładunek: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nazwa: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Populacja: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Lata: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Lata: {GOLD}Kiedykolwiek +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Lata: {GOLD}Od {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Lata: {GOLD}Do {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Rozmiar: {GOLD}{NUM}x{NUM} p{P ole ola ól} +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Akceptowany ładunek: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Produkowany ładunek: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Obrzeża STR_HOUSE_PICKER_CLASS_ZONE2 :Peryferia diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 2bc4f0be52..2893dc1c7e 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -3033,15 +3033,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Выберит STR_PICKER_HOUSE_TYPE_TOOLTIP :Выберите здание для строительства. Ctrl+щелчок добавит его в «избранное» или удалит. STR_HOUSE_PICKER_CAPTION :Выбор типов зданий -STR_HOUSE_PICKER_NAME :{BLACK}Здание: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Кол-во жителей: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Дата: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Дата: {ORANGE}любая -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Дата: {ORANGE}с {NUM} г. -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Дата: {ORANGE}до {NUM} г. -STR_HOUSE_PICKER_SIZE :{BLACK}Размеры: {ORANGE}{NUM}×{NUM} -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Принимаемый груз: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Груза отдано: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Здание: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Кол-во жителей: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Дата: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Дата: {GOLD}любая +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Дата: {GOLD}с {NUM} г. +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Дата: {GOLD}до {NUM} г. +STR_HOUSE_PICKER_SIZE :{BLACK}Размеры: {GOLD}{NUM}×{NUM} +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Принимаемый груз: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Груза отдано: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Пригород STR_HOUSE_PICKER_CLASS_ZONE2 :Окраина diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index d0730b7b3e..e6e0aaa683 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}När den STR_BUTTON_DEFAULT :{BLACK}Standardinställning STR_BUTTON_CANCEL :{BLACK}Avbryt STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Flytta # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -2861,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Välj vilken st STR_PICKER_HOUSE_TYPE_TOOLTIP :Välj en hustyp att bygga. Ctrl+Klick för att lägga till eller ta bort i sparade objekt STR_HOUSE_PICKER_CAPTION :Husval -STR_HOUSE_PICKER_NAME :{BLACK}Namn: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Invånarantal: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}År: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}År: {ORANGE}Alla -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}År: {ORANGE}Från {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}År: {ORANGE}Till {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Storlek: {ORANGE}{NUM}x{NUM} rutor -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Accepterat gods: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Fraktgods producerat: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Namn: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Invånarantal: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}År: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}År: {GOLD}Alla +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}År: {GOLD}Från {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}År: {GOLD}Till {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Storlek: {GOLD}{NUM}x{NUM} rutor +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Accepterat gods: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Fraktgods producerat: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Gräns STR_HOUSE_PICKER_CLASS_ZONE2 :Utkanter @@ -3687,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Matcha V STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Slå på/av matchning av VERSALER/gemener när skyltnamn matchas mot sökfiltret # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Ändra skylttext +STR_EDIT_SIGN_CAPTION :{WHITE}Ändra skylt STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrera huvudvyn på skyltens läge Ctrl+Klick för att öppna en ny fönstervy över skyltens läge STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Åk till nästa skylt STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Åk till föregående skylt @@ -3904,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :Utmärkt STR_CARGO_RATING_OUTSTANDING :Enastående STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på stationen. Ctrl+Klick öppnar en ny fönstervy över stationens läge +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Döp om station eller flytta skylt STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Visa alla tåg där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Visa alla vägfordon där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Visa alla flygplan där denna station finns med i rutten STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Visa alla skepp där denna station finns med i rutten +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Ändra skylt på station STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Stäng flygplats STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindra flygplan från att landa på den här flygplatsen @@ -3917,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindra f # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på riktmärket. Ctrl+Klick för att öppna en ny fönstervy över riktmärkets läge +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Döp om riktmärke eller flytta skylt STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrera huvudvyn på bojen. Ctrl+klicka för att öppna en ny skärmvy över bojens läge STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Ändra namn på boj +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Ändra skylt på riktmärke # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Budget {BLACK}{COMPANY_NUM} @@ -5133,6 +5138,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_CAN_T_MOVE_STATION_NAME :{WHITE}Kan inte flytta stationsskylt... 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 @@ -5164,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Kan inte STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Kan inte bygga vägriktmärke här... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Kan inte placera boj här... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Kan inte ändra riktmärkets namn... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Kain inte flytta skylt för riktmärke... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Kan inte ta bort järnvägsriktmärke här... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Kan inte ta bort vägriktmärke här... From b9deabab7e28b8c63ff1ccbf59db8a9abbba2081 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 27 Nov 2025 20:56:02 +0000 Subject: [PATCH 232/280] Codefix: Add missing consts in group handling. (#14834) --- src/group_cmd.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index 2ba83c4dd8..ab971376cc 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -46,7 +46,7 @@ void GroupStatistics::Clear() */ void UpdateGroupChildren() { - for (Group *g : Group::Iterate()) { + for (const Group *g : Group::Iterate()) { if (g->parent != GroupID::Invalid()) Group::Get(g->parent)->children.insert(g->index); } } @@ -402,7 +402,7 @@ CommandCost CmdDeleteGroup(DoCommandFlags flags, GroupID group_id) Company *c = Company::Get(g->owner); /* If we set an autoreplace for the group we delete, remove it. */ - for (EngineRenew *er : EngineRenew::Iterate()) { + for (const EngineRenew *er : EngineRenew::Iterate()) { if (er->group_id == g->index) RemoveEngineReplacementForCompany(c, er->from, g->index, flags); } @@ -557,7 +557,7 @@ std::tuple CmdAddVehicleGroup(DoCommandFlags flags, GroupI if (veh_id == VehicleID::Invalid() && vli.Valid()) { if (!GenerateVehicleSortList(&list, vli) || list.empty()) return { CMD_ERROR, GroupID::Invalid() }; } else { - Vehicle *v = Vehicle::GetIfValid(veh_id); + const Vehicle *v = Vehicle::GetIfValid(veh_id); if (v == nullptr) return { CMD_ERROR, GroupID::Invalid() }; list.push_back(v); } @@ -568,7 +568,7 @@ std::tuple CmdAddVehicleGroup(DoCommandFlags flags, GroupI } if (Group::IsValidID(new_g)) { - Group *g = Group::Get(new_g); + const Group *g = Group::Get(new_g); if (g->owner != _current_company || g->vehicle_type != vtype) return { CMD_ERROR, GroupID::Invalid() }; } @@ -646,7 +646,7 @@ CommandCost CmdAddSharedVehicleGroup(DoCommandFlags flags, GroupID id_g, Vehicle */ CommandCost CmdRemoveAllVehiclesGroup(DoCommandFlags flags, GroupID group_id) { - Group *g = Group::GetIfValid(group_id); + const Group *g = Group::GetIfValid(group_id); if (g == nullptr || g->owner != _current_company) return CMD_ERROR; @@ -810,7 +810,7 @@ uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e) { uint count = 0; - if (Group *g = Group::GetIfValid(id_g); g != nullptr) { + if (const Group *g = Group::GetIfValid(id_g); g != nullptr) { for (const GroupID &childgroup : g->children) { count += GetGroupNumEngines(company, childgroup, id_e); } @@ -831,7 +831,7 @@ uint GetGroupNumVehicle(CompanyID company, GroupID id_g, VehicleType type) { uint count = 0; - if (Group *g = Group::GetIfValid(id_g); g != nullptr) { + if (const Group *g = Group::GetIfValid(id_g); g != nullptr) { for (const GroupID &childgroup : g->children) { count += GetGroupNumVehicle(company, childgroup, type); } @@ -852,7 +852,7 @@ uint GetGroupNumVehicleMinAge(CompanyID company, GroupID id_g, VehicleType type) { uint count = 0; - if (Group *g = Group::GetIfValid(id_g); g != nullptr) { + if (const Group *g = Group::GetIfValid(id_g); g != nullptr) { for (const GroupID &childgroup : g->children) { count += GetGroupNumVehicleMinAge(company, childgroup, type); } @@ -873,7 +873,7 @@ Money GetGroupProfitLastYearMinAge(CompanyID company, GroupID id_g, VehicleType { Money sum = 0; - if (Group *g = Group::GetIfValid(id_g); g != nullptr) { + if (const Group *g = Group::GetIfValid(id_g); g != nullptr) { for (const GroupID &childgroup : g->children) { sum += GetGroupProfitLastYearMinAge(company, childgroup, type); } From ff578faf95f44323358d2b1f5feb6f6118146ffb Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 28 Nov 2025 04:40:44 +0000 Subject: [PATCH 233/280] Update: Translations from eints korean: 17 changes by telk5093 hungarian: 18 changes by vargaviktor portuguese: 9 changes by jcteotonio --- src/lang/hungarian.txt | 29 ++++++++++++++++++----------- src/lang/korean.txt | 27 +++++++++++++++++---------- src/lang/portuguese.txt | 18 +++++++++--------- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index a31fca11ee..fb7a46d313 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -375,6 +375,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ezzel a STR_BUTTON_DEFAULT :{BLACK}Alapértelmezett STR_BUTTON_CANCEL :{BLACK}Mégsem STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Mozgatás # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :0123456789öüóqwertzuiopőúasdfghjkléáűíyxcvbnm,.- . @@ -2873,7 +2874,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Vasútá STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Vasúti jelzők építése. Ctrl+kattintással váltás az alak- és fényjelzők között{}Kattintás+húzással a sínek mentén végig jelzők épülnek. Ctrl+kattintás+húzással a következő pályakiágazásig vagy jelzőig épít jelzőket. Shift+kattintással csak a becsült költséget jeleníti meg STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Vasúti híd építése. Shift+kattintással csak a becsült költséget jeleníti meg STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Vasúti alagút építése. Shift+kattintással csak a becsült költséget jeleníti meg -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Váltás építés/feleszedés között vasúti pályák, jelzők, ellenőrző pontok és vasútállomások esetében. Ctrl+kattintással az ellenőrző pontokon és állomásokon a vasúti pályát is eltávolítja +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Váltás építés/felszedés között vasúti pályák, jelzők, ellenőrző pontok és vasútállomások esetében. Ctrl+kattintással az ellenőrző pontokon és állomásokon a vasúti pályát is eltávolítja STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Sínek átalakítása a kiválasztott típusra. Shift+kattintással csak a becsült költséget jeleníti meg STR_RAIL_NAME_RAILROAD :Vasút @@ -2925,15 +2926,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Válassz egy te STR_PICKER_HOUSE_TYPE_TOOLTIP :Válassz egy ház típúst az építéshez. Ctrl+kattintás a mentett elemek hozzáadásához vagy eltávolításához STR_HOUSE_PICKER_CAPTION :Ház kiválasztása -STR_HOUSE_PICKER_NAME :{BLACK}Név: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Lakosság: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Év: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Év: {ORANGE}Bármelyik -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Év: {ORANGE}{NUM} óta -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Év: {ORANGE}{NUM}-ig -STR_HOUSE_PICKER_SIZE :{BLACK}Méret: {ORANGE}{NUM}x{NUM} négyzet -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Rakomány elfogadva: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Előállított rakomány: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Név: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Lakosság: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Év: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Év: {GOLD}Bármelyik +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Év: {GOLD}{NUM} óta +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Év: {GOLD}{NUM}-ig +STR_HOUSE_PICKER_SIZE :{BLACK}Méret: {GOLD}{NUM}x{NUM} négyzet +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Rakomány elfogadva: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Előállított rakomány: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Szél STR_HOUSE_PICKER_CLASS_ZONE2 :Külváros @@ -3751,7 +3752,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Kis- és STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Kis- és nagybetűk megkülönböztetése a feliratok szövegei és a szűrő kulcsszó összehasonlítása közben # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Felirat szerkesztése +STR_EDIT_SIGN_CAPTION :{WHITE}Tábla szerkesztése STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}A fő nézetet a felirat helyére állítja. Ctrl+kattintással új nézet nyílik a felirat helyzeténél STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Következő felirat STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Előző felirat @@ -3968,12 +3969,14 @@ STR_CARGO_RATING_EXCELLENT :kiváló STR_CARGO_RATING_OUTSTANDING :kimagasló STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet az állomásra állítja. Ctrl+kattintással új nézet nyílik az állomás helyzeténél +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Nevezze át az állomást vagy mozgassa a táblát STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Kilistázza az összes vonatot, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Kilistázza az összes közúti járművet, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Kilistázza az összes repülőt, aminek a menetrendjében szerepel ez az állomás STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Kilistázza az összes hajót, aminek a menetrendjében szerepel ez az állomás +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Állomás tábla szerkesztése STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Reptér bezárása STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Repülőgép leszállásának megakadályozása ezen a reptéren @@ -3981,9 +3984,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Repülő # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet az ellenőrzőpontra állítja. Ctrl+kattintással új nézet nyílik az ellenőrzőpontnál +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Nevezze át az ellenőrző pontot vagy mozgassa el a táblát STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}A fő nézetet a bójára állítja. Ctrl+kattintással új nézet nyílik a bója helyzeténél STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Bója nevének megváltoztatása +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Ellenőrzőpont tábla szerkesztése # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} pénzügyei {BLACK}{COMPANY_NUM} @@ -5197,6 +5202,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Túl sok STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Túl közel van egy másik kikötőhöz STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Túl közel van egy másik repülőtérhez STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Nem nevezheted át az állomást... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Az állomás tábla nem mozgatható STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... városi tulajdonban lévő út STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... az út a másik irányba vezet STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... áthaladó megállóhelyeken nem lehet kanyar @@ -5228,6 +5234,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Ide nem STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Ide nem lehet útpontot építeni... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nem rakhatsz ide bóját... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nem lehet megváltoztatni az ellenőrző pont nevét... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Az ellenőrzőpont tábla nem mozgatható... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Nem lehet eltávolítani az ellenőrző pontot... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Nem lehet innen útpontot eltávolítani... diff --git a/src/lang/korean.txt b/src/lang/korean.txt index c648958286..53c7c40b4c 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -313,6 +313,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}이 버 STR_BUTTON_DEFAULT :{BLACK}기본값 STR_BUTTON_CANCEL :{BLACK}취소 STR_BUTTON_OK :{BLACK}확인 +STR_BUTTON_MOVE :{BLACK}이동 # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ[]ㅁㄴㅇㄹㅎㅗㅓㅏㅣ;' ㅋㅌㅊㅍㅠㅜㅡ,./ . @@ -2862,15 +2863,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :표시할 도 STR_PICKER_HOUSE_TYPE_TOOLTIP :지으려는 건물 종류를 선택하세요. CTRL+클릭하면 즐겨찾기 추가/제거가 가능합니다 STR_HOUSE_PICKER_CAPTION :건물 선택 -STR_HOUSE_PICKER_NAME :{BLACK}이름: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}인구: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}연도: {ORANGE}{NUM} ~ {NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}연도: {ORANGE}항상 -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}연도: {ORANGE}{NUM}년부터 -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}연도: {ORANGE}{NUM}년까지 -STR_HOUSE_PICKER_SIZE :{BLACK}크기: {ORANGE}{NUM}x{NUM}칸 -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}받는 화물: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}생산 화물량: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}이름: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}인구: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}연도: {GOLD}{NUM} ~ {NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}연도: {GOLD}항상 +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}연도: {GOLD}{NUM}년부터 +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}연도: {GOLD}{NUM}년까지 +STR_HOUSE_PICKER_SIZE :{BLACK}크기: {GOLD}{NUM}x{NUM}칸 +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}받는 화물: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}생산 화물량: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :가장자리 STR_HOUSE_PICKER_CLASS_ZONE2 :교외 @@ -3688,7 +3689,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}대소 STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}팻말의 이름을 비교할 때 검색 문자열의 대소문자 구분할지 여부를 선택합니다 # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}팻말 내용 고치기 +STR_EDIT_SIGN_CAPTION :{WHITE}팻말 고치기 STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}이 팻말의 위치로 이동합니다. CTRL+클릭하면 이 팻말 위치를 기준으로 새로운 외부 화면을 엽니다 STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}다음 팻말로 가기 STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}이전 팻말로 가기 @@ -3905,12 +3906,14 @@ STR_CARGO_RATING_EXCELLENT :훌륭함 STR_CARGO_RATING_OUTSTANDING :매우 훌륭함 STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}이 역의 위치로 시점을 변경합니다. CTRL+클릭하면 이 역 위치를 기준으로 새로운 외부 화면을 엽니다 +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}역의 이름을 바꾸거나 팻말 위치를 바꿉니다 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 열차를 보여줍니다 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 차량을 보여줍니다 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 항공기를 보여줍니다 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}이 역을 거쳐가는 모든 선박을 보여줍니다 +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}역 팻말 수정 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}공항 폐쇄 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}이 공항에 항공기가 착륙하는 것을 금지합니다 @@ -3918,9 +3921,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}이 공 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}이 경유지의 위치로 시점을 변경합니다. CTRL+클릭하면 이 경유지 위치를 기준으로 새로운 외부 화면을 엽니다 +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}경유지의 이름을 바꾸거나 팻말 위치를 바꿉니다 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}이 부표의 위치로 이동합니다. CTRL+클릭하면 이 부표 위치를 기준으로 새로운 외부 화면을 엽니다 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}부표 이름 바꾸기 +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}경유지 팻말 수정 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY}의 재정 {BLACK}{COMPANY_NUM} @@ -5134,6 +5139,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_CAN_T_MOVE_STATION_NAME :{WHITE}역 팻말 위치를 옮길 수 없습니다... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... 도시 소유의 도로입니다 STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... 도로의 방향과 일치하지 않습니다 STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... 통과식 도로 정류장은 굽은 도로에 건설할 수 없습니다 @@ -5165,6 +5171,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}여기 STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}여기에 도로 경유지를 지을 수 없습니다... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}여기에 부표를 설치할 수 없습니다... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}경유지의 이름을 변경할 수 없습니다... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}경유지 팻말 위치를 옮길 수 없습니다... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}이 열차 경유지를 제거할 수 없습니다... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}이 도로 경유지를 제거할 수 없습니다... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 0122db43bb..63e906eac9 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -2863,15 +2863,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Selecione uma z STR_PICKER_HOUSE_TYPE_TOOLTIP :Escolher um tipo de casa para construir. Ctrl+Clique para adicionar ou remover nos itens guardados STR_HOUSE_PICKER_CAPTION :Seleção de Casas -STR_HOUSE_PICKER_NAME :{BLACK}Nome: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}População: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {ORANGE}Qualquer -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {ORANGE}De {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {ORANGE}Até {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Tamanho: {ORANGE}{NUM}x{NUM} mosaicos -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceite: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga produzida: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nome: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}População: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {GOLD}Qualquer +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {GOLD}De {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {GOLD}Até {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Tamanho: {GOLD}{NUM}x{NUM} mosaicos +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceite: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga produzida: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Borda STR_HOUSE_PICKER_CLASS_ZONE2 :Arredores From 18103546227a470e1b1cdb5972e7f3da3b801784 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 29 Nov 2025 04:39:53 +0000 Subject: [PATCH 234/280] Update: Translations from eints galician: 17 changes by pvillaverde german: 47 changes by Wuzzy2 --- src/lang/galician.txt | 27 ++++++++++++------- src/lang/german.txt | 62 ++++++++++++++++++++++++++++++++----------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 445cc99887..a569f4a531 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -313,6 +313,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Habilita STR_BUTTON_DEFAULT :{BLACK}Por defecto STR_BUTTON_CANCEL :{BLACK}Cancelar STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Mover # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -2862,15 +2863,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Selecciona unha STR_PICKER_HOUSE_TYPE_TOOLTIP :Selecciona un tipo de casa a construír. Ctrl+Click para engadir ou eliminar nos elementos gardados. STR_HOUSE_PICKER_CAPTION :Selección de casas -STR_HOUSE_PICKER_NAME :{BLACK}Nome: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Poboación: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {ORANGE}Calquera -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {ORANGE}Dende {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {ORANGE}Ata {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Tamaño: {ORANGE}{NUM}x{NUM} cadros -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceptada: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga producida: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nome: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Poboación: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Anos: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anos: {GOLD}Calquera +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anos: {GOLD}Dende {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anos: {GOLD}Ata {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Tamaño: {GOLD}{NUM}x{NUM} cadros +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceptada: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga producida: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Borde STR_HOUSE_PICKER_CLASS_ZONE2 :Periferia @@ -3688,7 +3689,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Correspo STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Activar correspondencia de maiúsculas ao comparar os nomes dos rótulos coa cadea de filtrado # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Edita-lo texto do rótulo +STR_EDIT_SIGN_CAPTION :{WHITE}Editar o rótulo STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrar a vista principal na localización do sinal. Ctrl+Clic abre unha nova ventá na localización do sinal. STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Ir ao seguinte rótulo STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Ir ao rótulo anterior @@ -3905,12 +3906,14 @@ STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra a vista principal na localización da estación. Ctrl+Clic abre un novo punto de vista da localización da estación +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Renomear estación ou mover o sinal STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar tódolos trens que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar tódolos vehículos de estrada que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar tódolos avións que teñen esta estación nas súas ordes STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostrar tódolos barcos que teñen esta estación nas súas ordes +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Editar sinal da estación STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Pechar aeroporto STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita que os avións aterren neste aeroporto @@ -3918,9 +3921,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra a vista principal na localización do punto de ruta. Ctrl+Clic abre unha nova ventá na localización do punto de ruta +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Renomear punto de ruta ou mover o sinal STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar a vista principal na localización da boia. Ctrl+Clic abre unha nova ventá na localización da boia STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Cambiar o nome da boia +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Editar sinal de punto de ruta # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finanzas {BLACK}{COMPANY_NUM} @@ -5134,6 +5139,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Demasiad STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Demasiado preto doutro peirao STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Demasiado preto doutro aeroporto STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Non se pode renomear a estación... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Non se pode mover o sinal da estación STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta rúa é municipal STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... a estrada vai na dirección incorrecta STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... as paradas pasantes non poden ter esquinas @@ -5165,6 +5171,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Non se p STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Non se poden construír puntos de ruta de estrada aquí... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Non se pode coloca-la boia aquí... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Non se pode cambia-lo nome do punto de ruta... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Non se pode mover o sinal do punto de ruta STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Non se pode eliminar-lo punto de ruta aquí... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Non se pode eliminar o punto de ruta da estrada de aquí... diff --git a/src/lang/german.txt b/src/lang/german.txt index 4639e9b5ba..e4af35817d 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -255,6 +255,7 @@ STR_UNITS_FORCE_SI :{DECIMAL} kN STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}Fuß STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_HEIGHT_GAMEUNITS :{DECIMAL}{NBSP}Ebene{P "" n} # Time units used in string control characters STR_UNITS_DAYS :{COMMA}{NBSP}Tag{P "" e} @@ -312,6 +313,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Zeigt au STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_CANCEL :{BLACK}Abbrechen STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Verschieben # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :^1234567890ß'€qwertzuiopü+asdfghjklöä# Date: Thu, 27 Nov 2025 15:34:33 +0000 Subject: [PATCH 235/280] Codechange: Extract functions to get group name and profit sprite. Improves readability and allows long if-else conditions to be replaced with early returns. --- src/group_gui.cpp | 53 +++++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index af4d073c1a..69044577fe 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -279,6 +279,34 @@ private: WidgetDimensions::scaled.framerect.right; } + /** + * Get the string to draw for the given group. + * @param g_id Group to get string for. + * @return Formatted string to draw. + */ + std::string GetGroupNameString(GroupID g_id) const + { + if (IsAllGroupID(g_id)) return GetString(STR_GROUP_ALL_TRAINS + this->vli.vtype); + if (IsDefaultGroupID(g_id)) return GetString(STR_GROUP_DEFAULT_TRAINS + this->vli.vtype); + return GetString(STR_GROUP_NAME, g_id); + } + + /** + * Get the profit sprite ID to draw for the given group. + * @param g_id Group to get profit sprite ID for. + * @return SpriteID to draw. + */ + SpriteID GetGroupProfitSpriteID(GroupID g_id) const + { + uint num_vehicle_min_age = GetGroupNumVehicleMinAge(this->vli.company, g_id, this->vli.vtype); + if (num_vehicle_min_age == 0) return SPR_PROFIT_NA; + + Money profit_last_year_min_age = GetGroupProfitLastYearMinAge(this->vli.company, g_id, this->vli.vtype); + if (profit_last_year_min_age < 0) return SPR_PROFIT_NEGATIVE; + if (profit_last_year_min_age < VEHICLE_PROFIT_THRESHOLD * num_vehicle_min_age) return SPR_PROFIT_SOME; + return SPR_PROFIT_LOT; + } + /** * Draw a row in the group list. * @param r Rect to draw row in. @@ -329,16 +357,8 @@ private: int text_width = this->column_size[VGC_NAME].width - indent * WidgetDimensions::scaled.hsep_indent; /* draw group name */ - std::string str; - if (IsAllGroupID(g_id)) { - str = GetString(STR_GROUP_ALL_TRAINS + this->vli.vtype); - } else if (IsDefaultGroupID(g_id)) { - str = GetString(STR_GROUP_DEFAULT_TRAINS + this->vli.vtype); - } else { - str = GetString(STR_GROUP_NAME, g_id); - } r = r.Indent(this->column_size[VGC_FOLD].width + WidgetDimensions::scaled.hsep_normal, rtl); - DrawString(r.WithWidth(text_width, rtl).CentreToHeight(this->column_size[VGC_NAME].height), std::move(str), colour); + DrawString(r.WithWidth(text_width, rtl).CentreToHeight(this->column_size[VGC_NAME].height), this->GetGroupNameString(g_id), colour); /* draw autoreplace protection */ r = r.Indent(text_width + WidgetDimensions::scaled.hsep_wide, rtl); @@ -353,21 +373,8 @@ private: } /* draw the profit icon */ - SpriteID spr; - uint num_vehicle_min_age = GetGroupNumVehicleMinAge(this->vli.company, g_id, this->vli.vtype); - Money profit_last_year_min_age = GetGroupProfitLastYearMinAge(this->vli.company, g_id, this->vli.vtype); - if (num_vehicle_min_age == 0) { - spr = SPR_PROFIT_NA; - } else if (profit_last_year_min_age < 0) { - spr = SPR_PROFIT_NEGATIVE; - } else if (profit_last_year_min_age < VEHICLE_PROFIT_THRESHOLD * num_vehicle_min_age) { - spr = SPR_PROFIT_SOME; - } else { - spr = SPR_PROFIT_LOT; - } - r = r.Indent(this->column_size[VGC_AUTOREPLACE].width + WidgetDimensions::scaled.hsep_normal, rtl); - DrawSpriteIgnorePadding(spr, PAL_NONE, r.WithWidth(this->column_size[VGC_PROFIT].width, rtl), SA_CENTER); + DrawSpriteIgnorePadding(this->GetGroupProfitSpriteID(g_id), PAL_NONE, r.WithWidth(this->column_size[VGC_PROFIT].width, rtl), SA_CENTER); /* draw the number of vehicles of the group */ r = r.Indent(this->column_size[VGC_PROFIT].width + WidgetDimensions::scaled.hsep_normal, rtl); From 91a12a3928016689a564430c9fd419e61524ec3a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 27 Nov 2025 15:35:32 +0000 Subject: [PATCH 236/280] Codechange: Precalculate group column rects. Simplifies drawing group list which no longer needs to calculate horizontal positions for each row. --- src/group_gui.cpp | 72 +++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 69044577fe..1b0dc461d0 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -193,20 +193,21 @@ void BuildGuiGroupList(GUIGroupList &list, bool fold, Owner owner, VehicleType v } } +/* Columns in the group list */ +enum VehicleGroupColumns : uint8_t { + VGC_FOLD, ///< Fold / Unfold button. + VGC_NAME, ///< Group name. + VGC_PROTECT, ///< Autoreplace protect icon. + VGC_AUTOREPLACE, ///< Autoreplace active icon. + VGC_PROFIT, ///< Profit icon. + VGC_NUMBER, ///< Number of vehicles in the group. + + VGC_END +}; +DECLARE_INCREMENT_DECREMENT_OPERATORS(VehicleGroupColumns); + class VehicleGroupWindow : public BaseVehicleListWindow { private: - /* Columns in the group list */ - enum ListColumns : uint8_t { - VGC_FOLD, ///< Fold / Unfold button. - VGC_NAME, ///< Group name. - VGC_PROTECT, ///< Autoreplace protect icon. - VGC_AUTOREPLACE, ///< Autoreplace active icon. - VGC_PROFIT, ///< Profit icon. - VGC_NUMBER, ///< Number of vehicles in the group. - - VGC_END - }; - GroupID group_sel = GroupID::Invalid(); ///< Selected group (for drag/drop) GroupID group_rename = GroupID::Invalid(); ///< Group being renamed, GroupID::Invalid() if none GroupID group_over = GroupID::Invalid(); ///< Group over which a vehicle is dragged, GroupID::Invalid() if none @@ -216,6 +217,7 @@ private: Scrollbar *group_sb = nullptr; std::array column_size{}; ///< Size of the columns in the group list. + std::array column_rects{}; bool last_overlay_state = false; /** @@ -279,6 +281,28 @@ private: WidgetDimensions::scaled.framerect.right; } + /** + * Update precalculated column rects for drawing group information. + */ + void UpdateColumnRects() + { + bool rtl = _current_text_dir == TD_RTL; + Rect r = this->GetWidget(WID_GL_LIST_GROUP)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + + /* Place columns before VGC_NAME from start to end. */ + for (VehicleGroupColumns lc{}; lc != VGC_NAME; ++lc) { + this->column_rects[lc] = r.WithWidth(this->column_size[lc].width, rtl); + r = r.Indent(this->column_size[lc].width + WidgetDimensions::scaled.hsep_normal, rtl); + } + /* Place columns after VGC_NAME from end to start. */ + for (VehicleGroupColumns lc{VGC_END - 1}; lc != VGC_NAME; --lc) { + this->column_rects[lc] = r.WithWidth(this->column_size[lc].width, !rtl); + r = r.Indent(this->column_size[lc].width + WidgetDimensions::scaled.hsep_normal, !rtl); + } + /* Name column fills remaining space. */ + this->column_rects[VGC_NAME] = r; + } + /** * Get the string to draw for the given group. * @param g_id Group to get string for. @@ -348,42 +372,33 @@ private: } /* draw fold / unfold button */ - r = r.Indent(indent * WidgetDimensions::scaled.hsep_indent, rtl); if (has_children) { - DrawSpriteIgnorePadding(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, r.WithWidth(this->column_size[VGC_FOLD].width, rtl), SA_CENTER); + DrawSpriteIgnorePadding(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, r.WithX(this->column_rects[VGC_FOLD]).Translate(indent * level_width, 0), SA_CENTER); } - /* Group name text column shrinks to fit available space. */ - int text_width = this->column_size[VGC_NAME].width - indent * WidgetDimensions::scaled.hsep_indent; - /* draw group name */ - r = r.Indent(this->column_size[VGC_FOLD].width + WidgetDimensions::scaled.hsep_normal, rtl); - DrawString(r.WithWidth(text_width, rtl).CentreToHeight(this->column_size[VGC_NAME].height), this->GetGroupNameString(g_id), colour); + DrawString(r.WithX(this->column_rects[VGC_NAME]).Indent(indent * WidgetDimensions::scaled.hsep_indent, rtl).CentreToHeight(this->column_size[VGC_NAME].height), this->GetGroupNameString(g_id), colour); /* draw autoreplace protection */ - r = r.Indent(text_width + WidgetDimensions::scaled.hsep_wide, rtl); if (protection) { - DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, r.WithWidth(this->column_size[VGC_PROTECT].width, rtl), SA_CENTER); + DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, r.WithX(this->column_rects[VGC_PROTECT]), SA_CENTER); } /* draw autoreplace status */ - r = r.Indent(this->column_size[VGC_PROTECT].width + WidgetDimensions::scaled.hsep_normal, rtl); if (stats.autoreplace_defined) { - DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, r.WithWidth(this->column_size[VGC_AUTOREPLACE].width, rtl), SA_CENTER); + DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, r.WithX(this->column_rects[VGC_AUTOREPLACE]), SA_CENTER); } /* draw the profit icon */ - r = r.Indent(this->column_size[VGC_AUTOREPLACE].width + WidgetDimensions::scaled.hsep_normal, rtl); - DrawSpriteIgnorePadding(this->GetGroupProfitSpriteID(g_id), PAL_NONE, r.WithWidth(this->column_size[VGC_PROFIT].width, rtl), SA_CENTER); + DrawSpriteIgnorePadding(this->GetGroupProfitSpriteID(g_id), PAL_NONE, r.WithX(this->column_rects[VGC_PROFIT]), SA_CENTER); /* draw the number of vehicles of the group */ - r = r.Indent(this->column_size[VGC_PROFIT].width + WidgetDimensions::scaled.hsep_normal, rtl); int num_vehicle_with_subgroups = GetGroupNumVehicle(this->vli.company, g_id, this->vli.vtype); int num_vehicle = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype).num_vehicle; if (IsAllGroupID(g_id) || IsDefaultGroupID(g_id) || num_vehicle_with_subgroups == num_vehicle) { - DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL); + DrawString(r.WithX(this->column_rects[VGC_NUMBER]).CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL); } else { - DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE); + DrawString(r.WithX(this->column_rects[VGC_NUMBER]).CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE); } } @@ -997,6 +1012,7 @@ public: { this->group_sb->SetCapacityFromWidget(this, WID_GL_LIST_GROUP); this->vscroll->SetCapacityFromWidget(this, WID_GL_LIST_VEHICLE); + this->UpdateColumnRects(); } void OnDropdownSelect(WidgetID widget, int index, int) override From 26752956757c4855a10d78b6ce576caeefb8f9de Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 27 Nov 2025 22:47:07 +0000 Subject: [PATCH 237/280] Fix #8062: (Try to) ensure enough room for profit in vehicle group window. Width of group info panel previously relied entirely on the size of other widgets. --- src/group_gui.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 1b0dc461d0..c123176165 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -468,6 +468,22 @@ public: size.height = this->tiny_step_height; break; + case WID_GL_INFO: { + uint left_side = 0; + for (const StringID &label : {STR_GROUP_PROFIT_THIS_PERIOD, STR_GROUP_PROFIT_THIS_YEAR, STR_GROUP_PROFIT_LAST_PERIOD, STR_GROUP_PROFIT_LAST_YEAR, STR_GROUP_OCCUPANCY}) { + left_side = std::max(left_side, GetStringBoundingBox(label).width); + } + + /* Guestimate that 12 digits is reasonable*/ + uint right_side = std::max( + GetStringBoundingBox(GetString(STR_GROUP_OCCUPANCY_VALUE, GetParamMaxDigits(3))).width, + GetStringBoundingBox(GetString(STR_JUST_CURRENCY_LONG, GetParamMaxDigits(12))).width + ); + + size.width = left_side + WidgetDimensions::scaled.hsep_wide + right_side + padding.width; + break; + } + case WID_GL_SORT_BY_ORDER: { Dimension d = GetStringBoundingBox(this->GetWidget(widget)->GetString()); d.width += padding.width + Window::SortButtonWidth() * 2; // Doubled since the string is centred and it also looks better. From 069833963ce5ed317f502f0c6fec4afd493dc147 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 29 Nov 2025 16:17:44 +0000 Subject: [PATCH 238/280] Codechange: Replace drop down list's default bools with DropDownOptions. (#14837) Improves maintainability and avoids positional ambiguity. --- src/build_vehicle_gui.cpp | 4 ++-- src/dropdown.cpp | 37 +++++++++++++++---------------------- src/dropdown_type.h | 11 +++++++++-- src/network/network_gui.cpp | 4 ++-- src/picker_gui.cpp | 4 ++-- src/station_gui.cpp | 2 +- src/toolbar_gui.cpp | 30 ++++++++++++++++++------------ 7 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 27deb5f430..965e969c31 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1705,7 +1705,7 @@ struct BuildVehicleWindow : Window { case WID_BV_CONFIGURE_BADGES: if (this->badge_classes.GetClasses().empty()) break; - ShowDropDownList(this, this->BuildBadgeConfigurationList(), -1, widget, 0, false, true); + ShowDropDownList(this, this->BuildBadgeConfigurationList(), -1, widget, 0, DropDownOption::Persist); break; case WID_BV_SHOW_HIDE: { @@ -1732,7 +1732,7 @@ struct BuildVehicleWindow : Window { default: if (IsInsideMM(widget, this->badge_filters.first, this->badge_filters.second)) { PaletteID palette = SPR_2CCMAP_BASE + Company::Get(_local_company)->GetCompanyRecolourOffset(LS_DEFAULT); - ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(palette), -1, widget, 0, false); + ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(palette), -1, widget, 0); } break; } diff --git a/src/dropdown.cpp b/src/dropdown.cpp index 30e56c3fb2..36efb5f98e 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -81,8 +81,7 @@ struct DropdownWindow : Window { int selected_click_result = -1; ///< Click result value, from the OnClick handler of the selected item. uint8_t click_delay = 0; ///< Timer to delay selection. bool drag_mode = true; - bool instant_close = false; ///< Close the window when the mouse button is raised. - bool persist = false; ///< Persist dropdown menu. + DropDownOptions options; ///< Options for this drop down menu. int scrolling = 0; ///< If non-zero, auto-scroll the item list (one time). Point position{}; ///< Position of the topleft corner of the window. Scrollbar *vscroll = nullptr; @@ -96,18 +95,16 @@ struct DropdownWindow : Window { * @param selected Initial selected result of the list. * @param button Widget of the parent window doing the dropdown. * @param wi_rect Rect of the button that opened the dropdown. - * @param instant_close Close the window when the mouse button is raised. * @param wi_colour Colour of the parent widget. - * @param persist Dropdown menu will persist. + * @param options Drop Down options for this menu. */ - DropdownWindow(Window *parent, DropDownList &&list, int selected, WidgetID button, const Rect wi_rect, bool instant_close, Colours wi_colour, bool persist) + DropdownWindow(Window *parent, DropDownList &&list, int selected, WidgetID button, const Rect wi_rect, Colours wi_colour, DropDownOptions options) : Window(_dropdown_desc) , parent_button(button) , wi_rect(wi_rect) , list(std::move(list)) , selected_result(selected) - , instant_close(instant_close) - , persist(persist) + , options(options) { assert(!this->list.empty()); @@ -133,7 +130,7 @@ struct DropdownWindow : Window { Point pt = _cursor.pos; pt.x -= this->parent->left; pt.y -= this->parent->top; - this->parent->OnDropdownClose(pt, this->parent_button, this->selected_result, this->selected_click_result, this->instant_close); + this->parent->OnDropdownClose(pt, this->parent_button, this->selected_result, this->selected_click_result, this->options.Test(DropDownOption::InstantClose)); /* Set flag on parent widget to indicate that we have just closed. */ NWidgetCore *nwc = this->parent->GetWidget(this->parent_button); @@ -143,7 +140,7 @@ struct DropdownWindow : Window { void OnFocusLost(bool closing) override { if (!closing) { - this->instant_close = false; + this->options.Reset(DropDownOption::InstantClose); this->Close(); } } @@ -311,7 +308,7 @@ struct DropdownWindow : Window { if (this->click_delay != 0 && --this->click_delay == 0) { /* Close the dropdown, so it doesn't affect new window placement. * Also mark it dirty in case the callback deals with the screen. (e.g. screenshots). */ - if (!this->persist) this->Close(); + if (!this->options.Test(DropDownOption::Persist)) this->Close(); this->parent->OnDropdownSelect(this->parent_button, this->selected_result, this->selected_click_result); return; } @@ -322,7 +319,7 @@ struct DropdownWindow : Window { if (!_left_button_clicked) { this->drag_mode = false; if (!this->GetDropDownItem(result, click_result)) { - if (this->instant_close) this->Close(); + if (this->options.Test(DropDownOption::InstantClose)) this->Close(); return; } this->click_delay = 2; @@ -390,14 +387,12 @@ Dimension GetDropDownListDimension(const DropDownList &list) * @param button The widget which is passed to Window::OnDropdownSelect and OnDropdownClose. * Unless you override those functions, this should be then widget index of the dropdown button. * @param wi_rect Coord of the parent drop down button, used to position the dropdown menu. - * @param instant_close Set to true if releasing mouse button should close the - * list regardless of where the cursor is. - * @param persist Set if this dropdown should stay open after an option is selected. + * @param options Drop Down options for this menu. */ -void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close, bool persist) +void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, DropDownOptions options) { CloseWindowByClass(WC_DROPDOWN_MENU); - new DropdownWindow(w, std::move(list), selected, button, wi_rect, instant_close, wi_colour, persist); + new DropdownWindow(w, std::move(list), selected, button, wi_rect, wi_colour, options); } /** @@ -408,11 +403,9 @@ void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID b * @param button The widget within the parent window that is used to determine * the list's location. * @param width Override the minimum width determined by the selected widget and list contents. - * @param instant_close Set to true if releasing mouse button should close the - * list regardless of where the cursor is. - * @param persist Set if this dropdown should stay open after an option is selected. + * @param options Drop Down options for this menu. */ -void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist) +void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, DropDownOptions options) { /* Handle the beep of the player's click. */ SndClickBeep(); @@ -438,7 +431,7 @@ void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID but } } - ShowDropDownListAt(w, std::move(list), selected, button, wi_rect, wi_colour, instant_close, persist); + ShowDropDownListAt(w, std::move(list), selected, button, wi_rect, wi_colour, options); } /** @@ -464,5 +457,5 @@ void ShowDropDownMenu(Window *w, std::span strings, int selected ++i; } - if (!list.empty()) ShowDropDownList(w, std::move(list), selected, button, width); + if (!list.empty()) ShowDropDownList(w, std::move(list), selected, button, width, {}); } diff --git a/src/dropdown_type.h b/src/dropdown_type.h index 5e6057d1ee..9afc546aa4 100644 --- a/src/dropdown_type.h +++ b/src/dropdown_type.h @@ -10,6 +10,7 @@ #ifndef DROPDOWN_TYPE_H #define DROPDOWN_TYPE_H +#include "core/enum_type.hpp" #include "window_type.h" #include "gfx_func.h" #include "gfx_type.h" @@ -54,9 +55,15 @@ public: */ typedef std::vector> DropDownList; -void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close = false, bool persist = false); +enum class DropDownOption : uint8_t { + InstantClose, ///< Set if releasing mouse button should close the list regardless of where the cursor is. + Persist, ///< Set if this dropdown should stay open after an option is selected. +}; +using DropDownOptions = EnumBitSet; -void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width = 0, bool instant_close = false, bool persist = false); +void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, DropDownOptions options = {}); + +void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width = 0, DropDownOptions options = {}); Dimension GetDropDownListDimension(const DropDownList &list); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 9aa146e95f..fdc4ecaab4 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1606,7 +1606,7 @@ private: wi_rect.bottom = pt.y; w->dd_client_id = client_id; - ShowDropDownListAt(w, std::move(list), -1, WID_CL_MATRIX, wi_rect, COLOUR_GREY, true); + ShowDropDownListAt(w, std::move(list), -1, WID_CL_MATRIX, wi_rect, COLOUR_GREY, DropDownOption::InstantClose); } /** @@ -1627,7 +1627,7 @@ private: wi_rect.bottom = pt.y; w->dd_company_id = company_id; - ShowDropDownListAt(w, std::move(list), -1, WID_CL_MATRIX, wi_rect, COLOUR_GREY, true); + ShowDropDownListAt(w, std::move(list), -1, WID_CL_MATRIX, wi_rect, COLOUR_GREY, DropDownOption::InstantClose); } /** * Chat button on a Client is clicked. diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index d03a52e871..4fc2172cd0 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -442,12 +442,12 @@ void PickerWindow::OnClick(Point pt, WidgetID widget, int) case WID_PW_CONFIGURE_BADGES: if (this->badge_classes.GetClasses().empty()) break; - ShowDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}), -1, widget, 0, false, true); + ShowDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}), -1, widget, 0, DropDownOption::Persist); break; default: if (IsInsideMM(widget, this->badge_filters.first, this->badge_filters.second)) { - ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(), -1, widget, 0, false); + ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(), -1, widget, 0); } break; } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 5804a8eed2..5dad2723cd 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -664,7 +664,7 @@ public: case WID_STL_CARGODROPDOWN: this->filter_expanded = false; - ShowDropDownList(this, this->BuildCargoDropDownList(this->filter_expanded), -1, widget, 0, false, true); + ShowDropDownList(this, this->BuildCargoDropDownList(this->filter_expanded), -1, widget, 0, DropDownOption::Persist); break; } } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index b37ef7e837..8bffb87292 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -107,6 +107,12 @@ public: } }; +static DropDownOptions GetToolbarDropDownOptions() +{ + if (_settings_client.gui.toolbar_dropdown_autoselect) return DropDownOption::InstantClose; + return {}; +} + /** * Pop up a generic text only menu. * @param w Toolbar @@ -116,7 +122,7 @@ public: */ static void PopupMainToolbarMenu(Window *w, WidgetID widget, DropDownList &&list, int def) { - ShowDropDownList(w, std::move(list), def, widget, 0, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), def, widget, 0, GetToolbarDropDownOptions()); } /** @@ -289,7 +295,7 @@ static CallBackFunction ToolbarOptionsClick(Window *w) list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_HOUSES), STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS, OME_TRANSPARENTBUILDINGS)); list.push_back(MakeDropDownListCheckedItem(IsTransparencySet(TO_SIGNS), STR_SETTINGS_MENU_TRANSPARENT_SIGNS, OME_SHOW_STATIONSIGNS)); - ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), 0, WID_TN_SETTINGS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -681,7 +687,7 @@ static CallBackFunction ToolbarGraphsClick(Window *w) if (_toolbar_mode != TB_NORMAL) AddDropDownLeagueTableOptions(list); - ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), GRMN_OPERATING_PROFIT_GRAPH, WID_TN_GRAPHS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -692,7 +698,7 @@ static CallBackFunction ToolbarLeagueClick(Window *w) AddDropDownLeagueTableOptions(list); int selected = list[0]->result; - ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), selected, WID_TN_LEAGUE, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -869,7 +875,7 @@ static CallBackFunction ToolbarZoomOutClick(Window *w) static CallBackFunction ToolbarBuildRailClick(Window *w) { - ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, GetRailTypeDropDownList(), _last_built_railtype, WID_TN_RAILS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -890,7 +896,7 @@ static CallBackFunction MenuClickBuildRail(int index) static CallBackFunction ToolbarBuildRoadClick(Window *w) { - ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TN_ROADS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -911,7 +917,7 @@ static CallBackFunction MenuClickBuildRoad(int index) static CallBackFunction ToolbarBuildTramClick(Window *w) { - ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, GetRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TN_TRAMS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -934,7 +940,7 @@ static CallBackFunction ToolbarBuildWaterClick(Window *w) { DropDownList list; list.push_back(MakeDropDownListIconItem(SPR_IMG_BUILD_CANAL, PAL_NONE, STR_WATERWAYS_MENU_WATERWAYS_CONSTRUCTION, 0)); - ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), 0, WID_TN_WATER, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -955,7 +961,7 @@ static CallBackFunction ToolbarBuildAirClick(Window *w) { DropDownList list; list.push_back(MakeDropDownListIconItem(SPR_IMG_AIRPORT, PAL_NONE, STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION, 0)); - ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), 0, WID_TN_AIR, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -978,7 +984,7 @@ static CallBackFunction ToolbarForestClick(Window *w) list.push_back(MakeDropDownListIconItem(SPR_IMG_LANDSCAPING, PAL_NONE, STR_LANDSCAPING_MENU_LANDSCAPING, 0)); list.push_back(MakeDropDownListIconItem(SPR_IMG_PLANTTREES, PAL_NONE, STR_LANDSCAPING_MENU_PLANT_TREES, 1)); list.push_back(MakeDropDownListIconItem(SPR_IMG_SIGN, PAL_NONE, STR_LANDSCAPING_MENU_PLACE_SIGN, 2)); - ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, std::move(list), 0, WID_TN_LANDSCAPE, 100, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -1247,7 +1253,7 @@ static CallBackFunction ToolbarScenGenIndustry(Window *w) static CallBackFunction ToolbarScenBuildRoadClick(Window *w) { - ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_ROAD), _last_built_roadtype, WID_TE_ROADS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } @@ -1266,7 +1272,7 @@ static CallBackFunction ToolbarScenBuildRoad(int index) static CallBackFunction ToolbarScenBuildTramClick(Window *w) { - ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, _settings_client.gui.toolbar_dropdown_autoselect); + ShowDropDownList(w, GetScenRoadTypeDropDownList(RTTB_TRAM), _last_built_tramtype, WID_TE_TRAMS, 140, GetToolbarDropDownOptions()); return CBF_NONE; } From 712ca5e3eca90e33f4852470e2dd0b3b9bd182d6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sat, 29 Nov 2025 17:36:41 +0000 Subject: [PATCH 239/280] Codechange: [Script] Use std::optional for script list next iteration item (#14753) Avoids false positive updates in Remove when iterating the final item and leftover values being returned when IsEnd is true --- regression/regression/result.txt | 2 +- src/script/api/script_list.cpp | 82 ++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index ec60ce3651..4b17a7b39b 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -590,7 +590,7 @@ ERROR: IsEnd() is invalid as Begin() is never called 0 => 5 (true) 2 => 6 (true) 3 => 6 (true) - 9 => 0 (false) + 0 => 5 (false) Clone ListDump: 1005 => 1005 4000 => 50 diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index fc629d39fe..9337ac5461 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -21,7 +21,7 @@ class ScriptListSorter { protected: ScriptList *list; ///< The list that's being sorted. bool has_no_more_items; ///< Whether we have more items to iterate over. - SQInteger item_next; ///< The next item we will show. + std::optional item_next{}; ///< The next item we will show, or std::nullopt if there are no more items to iterate over. public: /** @@ -32,7 +32,7 @@ public: /** * Get the first item of the sorter. */ - virtual SQInteger Begin() = 0; + virtual std::optional Begin() = 0; /** * Stop iterating a sorter. @@ -42,7 +42,7 @@ public: /** * Get the next item of the sorter. */ - virtual SQInteger Next() = 0; + virtual std::optional Next() = 0; /** * See if the sorter has reached the end. @@ -89,9 +89,12 @@ public: this->End(); } - SQInteger Begin() override + std::optional Begin() override { - if (this->list->buckets.empty()) return 0; + if (this->list->buckets.empty()) { + this->item_next = std::nullopt; + return std::nullopt; + } this->has_no_more_items = false; this->bucket_iter = this->list->buckets.begin(); @@ -99,7 +102,7 @@ public: this->bucket_list_iter = this->bucket_list->begin(); this->item_next = *this->bucket_list_iter; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -107,8 +110,8 @@ public: void End() override { this->bucket_list = nullptr; + this->item_next = std::nullopt; this->has_no_more_items = true; - this->item_next = 0; } /** @@ -117,6 +120,7 @@ public: void FindNext() { if (this->bucket_list == nullptr) { + this->item_next = std::nullopt; this->has_no_more_items = true; return; } @@ -126,6 +130,7 @@ public: ++this->bucket_iter; if (this->bucket_iter == this->list->buckets.end()) { this->bucket_list = nullptr; + this->item_next = std::nullopt; return; } this->bucket_list = &this->bucket_iter->second; @@ -134,11 +139,11 @@ public: this->item_next = *this->bucket_list_iter; } - SQInteger Next() override + std::optional Next() override { - if (this->IsEnd()) return 0; + if (this->IsEnd()) return std::nullopt; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -178,9 +183,12 @@ public: this->End(); } - SQInteger Begin() override + std::optional Begin() override { - if (this->list->buckets.empty()) return 0; + if (this->list->buckets.empty()) { + this->item_next = std::nullopt; + return std::nullopt; + } this->has_no_more_items = false; /* Go to the end of the bucket-list */ @@ -193,7 +201,7 @@ public: --this->bucket_list_iter; this->item_next = *this->bucket_list_iter; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -201,8 +209,8 @@ public: void End() override { this->bucket_list = nullptr; + this->item_next = std::nullopt; this->has_no_more_items = true; - this->item_next = 0; } /** @@ -211,6 +219,7 @@ public: void FindNext() { if (this->bucket_list == nullptr) { + this->item_next = std::nullopt; this->has_no_more_items = true; return; } @@ -218,6 +227,7 @@ public: if (this->bucket_list_iter == this->bucket_list->begin()) { if (this->bucket_iter == this->list->buckets.begin()) { this->bucket_list = nullptr; + this->item_next = std::nullopt; return; } --this->bucket_iter; @@ -229,11 +239,11 @@ public: this->item_next = *this->bucket_list_iter; } - SQInteger Next() override + std::optional Next() override { - if (this->IsEnd()) return 0; + if (this->IsEnd()) return std::nullopt; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -268,21 +278,25 @@ public: this->End(); } - SQInteger Begin() override + std::optional Begin() override { - if (this->list->items.empty()) return 0; + if (this->list->items.empty()) { + this->item_next = std::nullopt; + return std::nullopt; + } this->has_no_more_items = false; this->item_iter = this->list->items.begin(); this->item_next = this->item_iter->first; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } void End() override { + this->item_next = std::nullopt; this->has_no_more_items = true; } @@ -291,6 +305,7 @@ public: */ void FindNext() { + this->item_next = std::nullopt; if (this->item_iter == this->list->items.end()) { this->has_no_more_items = true; return; @@ -299,11 +314,11 @@ public: if (this->item_iter != this->list->items.end()) this->item_next = this->item_iter->first; } - SQInteger Next() override + std::optional Next() override { - if (this->IsEnd()) return 0; + if (this->IsEnd()) return std::nullopt; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -341,22 +356,26 @@ public: this->End(); } - SQInteger Begin() override + std::optional Begin() override { - if (this->list->items.empty()) return 0; + if (this->list->items.empty()) { + this->item_next = std::nullopt; + return std::nullopt; + } this->has_no_more_items = false; this->item_iter = this->list->items.end(); --this->item_iter; this->item_next = this->item_iter->first; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } void End() override { + this->item_next = std::nullopt; this->has_no_more_items = true; } @@ -365,6 +384,7 @@ public: */ void FindNext() { + this->item_next = std::nullopt; if (this->item_iter == this->list->items.end()) { this->has_no_more_items = true; return; @@ -378,11 +398,11 @@ public: if (this->item_iter != this->list->items.end()) this->item_next = this->item_iter->first; } - SQInteger Next() override + std::optional Next() override { - if (this->IsEnd()) return 0; + if (this->IsEnd()) return std::nullopt; - SQInteger item_current = this->item_next; + std::optional item_current = this->item_next; this->FindNext(); return item_current; } @@ -523,7 +543,7 @@ void ScriptList::RemoveItem(SQInteger item) SQInteger ScriptList::Begin() { this->initialized = true; - return this->sorter->Begin(); + return this->sorter->Begin().value_or(0); } SQInteger ScriptList::Next() @@ -532,7 +552,7 @@ SQInteger ScriptList::Next() Debug(script, 0, "Next() is invalid as Begin() is never called"); return 0; } - return this->sorter->Next(); + return this->sorter->Next().value_or(0); } bool ScriptList::IsEmpty() From 84d89cc8027285aa22d5dc17dd311ce0d179c484 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 30 Nov 2025 04:44:11 +0000 Subject: [PATCH 240/280] Update: Translations from eints norwegian (bokmal): 17 changes by eriksorngard portuguese: 17 changes by jcteotonio --- src/lang/norwegian_bokmal.txt | 27 +++++++++++++++++---------- src/lang/portuguese.txt | 34 +++++++++++++++++----------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 284ef8b659..b98cb74896 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -314,6 +314,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Ved å a STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_CANCEL :{BLACK}Avbryt STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Flytt # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -2863,15 +2864,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Velg byområdet STR_PICKER_HOUSE_TYPE_TOOLTIP :Velg type hus å bygge. Ctrl+klikk for å legge til eller fjerne lagrede elementer STR_HOUSE_PICKER_CAPTION :Husvalg -STR_HOUSE_PICKER_NAME :{BLACK}Navn: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Beboere: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}År: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}År: {ORANGE}Ethvert -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}År: {ORANGE}Fra {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}År: {ORANGE}Til {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Størrelse: {ORANGE}{NUM}x{NUM} ruter -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Godtatte varer: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Varer produsert: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Navn: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Beboere: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}År: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}År: {GOLD}Ethvert +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}År: {GOLD}Fra {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}År: {GOLD}Til {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Størrelse: {GOLD}{NUM}x{NUM} ruter +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Godtatte varer: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Varer produsert: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Kant STR_HOUSE_PICKER_CLASS_ZONE2 :Ytterkant @@ -3689,7 +3690,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Skriftfo STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Veksle mellom skriftformgjenkjennelse ved sammenligning av skiltnavn mot filterstrengen # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Skriv inn skilttekst +STR_EDIT_SIGN_CAPTION :{WHITE}Endre skilt STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Sentrer hovedvinduet på skiltets lokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på skiltets lokasjon STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Gå til neste skilt STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Gå til forrige skilt @@ -3906,12 +3907,14 @@ STR_CARGO_RATING_EXCELLENT :Utmerket STR_CARGO_RATING_OUTSTANDING :Fremragende STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvisningen på stasjonslokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på stasjonslokasjon +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Endre stasjonsnavn eller flytt skilt STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Vis alle tog som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Vis alle kjøretøy som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Vis alle luftfartøy som har denne stasjonen på sin ordreliste STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Vis alle skip som har denne stasjonen på sin ordreliste +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Rediger stasjonsskilt STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Steng flyplass STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre fly i å lande på denne flyplassen. @@ -3919,9 +3922,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hindre f # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvinduet på veipunktets lokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på veipunktets lokasjon +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Gi veipunkt nytt navn eller flytt skilt STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Sentrer hovedvinduet på bøyens lokasjon. Ctrl+klikk for å åpne et nytt tilleggsvindu på bøyens lokasjon STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Endre navn på bøye +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Rediger veipunktsskilt # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY}s regnskap{BLACK}{COMPANY_NUM} @@ -5135,6 +5140,7 @@ STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}For mang STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}For nærme enn annen havn STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}For nærme en annen flyplass STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kan ikke endre stasjonens navn... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Kan ikke flytte stasjonskilt... STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... veien er eid av en by STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... veien vender i feil retning STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... gjennomkjøringsstopper kan ikke ha hjørner @@ -5166,6 +5172,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Kan ikke STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Kan ikke bygge veipunkt for vei her... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Kan ikke plassere bøye her... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Kan ikke endre navn på veipunkt... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Kan ikke flytte veipunktskilt... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Kan ikke fjerne veipunkt for tog her... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Kan ikke fjerne veipunkt for vei her... diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 63e906eac9..9b6cb83218 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -834,7 +834,7 @@ STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar STR_SMALLMAP_SHOW_INDUSTRY_NAMES :{BLACK}Mostrar nomes das indústrias STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não mostrar indústrias no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Mostrar todas as indústrias no mapa -STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a disposição do mapa de alturas +STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a disposição de alturas no mapa STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRY_NAMES :{BLACK}Alternar exibição dos nomes das indústrias STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Mostrar propriedades que não sejam de empresas no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Mostrar todos as propriedades da empresa no mapa @@ -967,7 +967,7 @@ STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLAC # Extra view window STR_EXTRA_VIEWPORT_TITLE :{WHITE}Visualizador {COMMA} -STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Alterar janela de exibição +STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN :{BLACK}Alterar visualizador STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TOOLTIP :{BLACK}Copiar a localização do visualizador global para este visualizador STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Alterar vista principal STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TOOLTIP :{BLACK}Copiar a localização desta janela de exibição para a vista principal @@ -2307,7 +2307,7 @@ STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Exibir e STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Exibir esquemas de cores dos comboios STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Exibir esquemas de cores dos veículos rodoviários STR_LIVERY_SHIP_TOOLTIP :{BLACK}Exibir esquemas de cores dos navios -STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Exibir esquema de cores da aeronave +STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Exibir esquema de cores das aeronaves STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de comboios STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de veículos rodoviários STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de navios @@ -3138,8 +3138,8 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Selecion # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Informações do Terreno STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do mosaico. Ctrl+Clique para abrir uma nova janela de visualização nesse mosaico. -STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Custo de desobstrução: {LTBLUE}N/D -STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Custo de desobstrução: {RED}{CURRENCY_LONG} +STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Custo para limpar/demolir: {LTBLUE}N/D +STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Custo para limpar/demolir: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Receitas apuradas: {LTBLUE}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_OWNER_N_A :N/D STR_LAND_AREA_INFORMATION_OWNER :{BLACK}Proprietário: {LTBLUE}{STRING} @@ -3151,7 +3151,7 @@ STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Nenhuma STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Coordenadas: {LTBLUE}{NUM} x {NUM} x {NUM} STR_LAND_AREA_INFORMATION_LANDINFO_INDEX :{BLACK}Índice do mosaico: {LTBLUE}{NUM} ({HEX}) STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Construído/renovado: {LTBLUE}{DATE_LONG} -STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Tipo de estação: {LTBLUE}{STRING} +STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Classe da estação: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Tipo de estação: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Tipo de aeroporto: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_NAME :{BLACK}Nome do aeroporto: {LTBLUE}{STRING} @@ -3551,9 +3551,9 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatí # NewGRF save preset window STR_SAVE_PRESET_CAPTION :{WHITE}Gravar predefinição STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lista de predefinições disponíveis, seleciona uma para a copiar para o nome da gravação abaixo -STR_SAVE_PRESET_TITLE :{BLACK}Intriduza um nome para a predefinição +STR_SAVE_PRESET_TITLE :{BLACK}Introduza um nome para a predefinição STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Nome selecionado atualmente para gravação da predefinição -STR_SAVE_PRESET_SAVE :{BLACK}Grava +STR_SAVE_PRESET_SAVE :{BLACK}Gravar STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Grava a predefinição com o nome selecionado # NewGRF parameters window @@ -3686,7 +3686,7 @@ STR_NEWGRF_SCAN_STATUS :{BLACK}{NUM} Ne # Sign list window STR_SIGN_LIST_CAPTION :{WHITE}Lista de Letreiros - {COMMA} Letreiro{P "" s} STR_SIGN_LIST_MATCH_CASE :{BLACK}Maiúsculas/Minúsculas -STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ligar/desligar correspondência de maiúsculas/minúsculas com a frase a filtrar +STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Considerar ou ignorar maiúsculas/minúsculas na pesquisa dos letreiros # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Editar letreiro @@ -4406,7 +4406,7 @@ STR_REPLACE_VEHICLES_WHEN_OLD :Substituir apen STR_REPLACE_START_BUTTON_TOOLTIP :{BLACK}Pressione para iniciar a substituição do tipo de locomotiva que selecionou à esquerda, com o tipo de motor selecionado à direita STR_REPLACE_NOT_REPLACING :{BLACK}Não substituindo STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED :{BLACK}Nenhum veículo selecionado -STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando velho +STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando estiver velho STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Subst. de Veículos STR_REPLACE_STOP_BUTTON_TOOLTIP :{BLACK}Pressione para parar a substituição do tipo de locomotiva que selecionou à esquerda @@ -5478,27 +5478,27 @@ STR_BASEMUSIC_NONE_DESCRIPTION :Um conjunto de ##id 0x2000 # Town building names -STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1 :Edifício alto de escritórios -STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Edifício de escritórios +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1 :Edifício alto com escritórios +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Edifício com escritórios STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Edifício pequeno com apartamentos STR_TOWN_BUILDING_NAME_CHURCH_1 :Igreja -STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Edifício grande de escritórios +STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Edifício grande com escritórios STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Casas STR_TOWN_BUILDING_NAME_HOTEL_1 :Hotel STR_TOWN_BUILDING_NAME_STATUE_1 :Estátua STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Fonte STR_TOWN_BUILDING_NAME_PARK_1 :Parque -STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Edifício de escritórios +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Edifício com escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Lojas e escritórios -STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Edifício de escritórios moderno +STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Edifício moderno com escritórios STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :Armazém -STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Edifício de escritórios +STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Edifício com escritórios STR_TOWN_BUILDING_NAME_STADIUM_1 :Estádio STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas antigas STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas de campo STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas STR_TOWN_BUILDING_NAME_FLATS_1 :Apartamentos -STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edifício alto de escritórios +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edifício alto com escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Lojas e escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Lojas e escritórios STR_TOWN_BUILDING_NAME_THEATER_1 :Casa de Teatro From 0600fbe34b541855b300473193f7fee88c9e36ca Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 30 Nov 2025 09:12:29 +0000 Subject: [PATCH 241/280] Change: Explicitly reserve sprite group types >= 0x80. (#14836) The NewGRF spec does not mention that sprite group `type` and the `num-ent1` fields are the same. Reserve all unrecognised special types in case they are wanted at some point. --- src/newgrf/newgrf_act2.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/newgrf/newgrf_act2.cpp b/src/newgrf/newgrf_act2.cpp index 9f99cdf4ee..5b1e61ab4b 100644 --- a/src/newgrf/newgrf_act2.cpp +++ b/src/newgrf/newgrf_act2.cpp @@ -525,6 +525,11 @@ static void NewSpriteGroup(ByteReader &buf) /* Neither a variable or randomized sprite group... must be a real group */ default: { + if (type >= 0x80) { + GrfMsg(0, "NewSpriteGroup: Reserved group type 0x{:02X}, skipping", type); + return; + } + switch (feature) { case GSF_TRAINS: case GSF_ROADVEHICLES: From 66185a312da9a198907d86ca04a593bc19a5ccd4 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 1 Dec 2025 04:48:24 +0000 Subject: [PATCH 242/280] Update: Translations from eints luxembourgish: 23 changes by phreeze83 --- src/lang/luxembourgish.txt | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 4001109b74..59edb699c9 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Mat dës STR_BUTTON_DEFAULT :{BLACK}Standard STR_BUTTON_CANCEL :{BLACK}Ofbriechen STR_BUTTON_OK :{BLACK}OK +STR_BUTTON_MOVE :{BLACK}Versetzen # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :§1234567890'^ qwertzuiopè¨asdfghjkléà$\yxcvbnm,.- . @@ -2861,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Wiel eng Stad-Z STR_PICKER_HOUSE_TYPE_TOOLTIP :Wiel en Haustyp fir ze bauen. Ctrl+Klick fir en bei d'gespäichert Objeten dobäizesetzen oder ewechzehuelen STR_HOUSE_PICKER_CAPTION :Häiserauswiel -STR_HOUSE_PICKER_NAME :{BLACK}Numm: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Awunner: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Joer: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Joer: {ORANGE}All -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Joer: {ORANGE}Vun {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Joer: {ORANGE}Bis {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Gréisst: {ORANGE}{NUM}x{NUM} Felder -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Akzeptéiert Wuer: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Produzéiert Wuer: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Numm: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Awunner: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Joer: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Joer: {GOLD}All +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Joer: {GOLD}Vun {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Joer: {GOLD}Bis {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Gréisst: {GOLD}{NUM}x{NUM} Felder +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Akzeptéiert Wuer: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Produzéiert Wuer: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Rand STR_HOUSE_PICKER_CLASS_ZONE2 :Ausseberäich @@ -3006,7 +3007,7 @@ STR_AIRPORT_COMMUTER :Pendler STR_AIRPORT_INTERCONTINENTAL :Interkontinental STR_AIRPORT_HELIPORT :Heliport STR_AIRPORT_HELIDEPOT :Helidepot -STR_AIRPORT_HELISTATION :Helistatioun +STR_AIRPORT_HELISTATION :Helikoptergare STR_AIRPORT_CLASS_SMALL :Kleng Fluchhäfen STR_AIRPORT_CLASS_LARGE :Grouss Fluchhäfen @@ -3427,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}Nordwest STR_MAPGEN_NORTHEAST :{BLACK}Nordost STR_MAPGEN_SOUTHEAST :{BLACK}Südost STR_MAPGEN_SOUTHWEST :{BLACK}Südwest +STR_MAPGEN_NORTHWEST_TOOLTIP :Wiesselen tëschend Waasser oder Fräiformeck am Nordwesten vun dem Kaartenenn +STR_MAPGEN_NORTHEAST_TOOLTIP :Wiesselen tëschend Waasser oder Fräiformeck am Nordosten vun dem Kaartenenn +STR_MAPGEN_SOUTHEAST_TOOLTIP :Wiesselen tëschend Waasser oder Fräiformeck am Südosten vun dem Kaartenenn +STR_MAPGEN_SOUTHWEST_TOOLTIP :Wiesselen tëschend Waasser oder Fräiformeck am Südwesten vun dem Kaartenenn STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fräiform STR_MAPGEN_BORDER_WATER :{BLACK}Waasser STR_MAPGEN_BORDER_RANDOM :{BLACK}Zoufälleg @@ -3683,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}Passende STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Zoutreffend Fäll wiesselen wann Schëldernimm mam String-Filter verglach ginn # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}Schëldtext änneren +STR_EDIT_SIGN_CAPTION :{WHITE}Schëld änneren STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Zentréiert d'Usiicht op d'Schëld. Ctrl+Klick erstellt eng nei Usiicht op d'Schëld STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Géi bei d'nächst Schëld STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Géi bei d'Schëld firdrun @@ -3900,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :Exzellent STR_CARGO_RATING_OUTSTANDING :Perfekt STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op d'Statioun. Ctrl+Klick erstellt eng nei Usiicht op d'Statioun +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Gare embënennen oder Schëld versetzen STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Weis all Zich déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Weis all Stroossegefierer déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Weis all Fliger déi des Statioun an hierem Zäitplang hunn STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Weis all Schëffer déi des Statioun an hierem Zäitplang hunn +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Gareschëld änneren STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Fluchhafen zoumaachen STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hal de Fliger dovun of op dësem Fluchhafen ze landen @@ -3913,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Hal de F # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op de Weepunkt. Ctrl+Klick erstellt eng nei Usiicht um Weepunkt +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Weepunkt embënennen oder Schëld versetzen STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Zentréiert d'Usiicht op d'Boje. Ctrl+Klick erstellt eng nei Usiicht op d'Boje STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Boje ëmbenennen +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Weepunktschëld änneren # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} Finanzen {BLACK}{COMPANY_NUM} @@ -5128,7 +5137,8 @@ STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Ze vill STR_ERROR_TOO_MANY_TRUCK_STOPS :{WHITE}Ze vill Camionsgaren STR_ERROR_TOO_CLOSE_TO_ANOTHER_DOCK :{WHITE}Ze no un engem aanere Quai STR_ERROR_TOO_CLOSE_TO_ANOTHER_AIRPORT :{WHITE}Ze no un engem aanere Fluchhafen -STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann d'Statioun net ëmbenennen... +STR_ERROR_CAN_T_RENAME_STATION :{WHITE}Kann d'Gare net ëmbenennen... +STR_ERROR_CAN_T_MOVE_STATION_NAME :{WHITE}Ka Gareschëld net versetzen STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... d'Strooss ass am Besëtz vun der Stad STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Strooss geet an dei falsch Richtung STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Duerchfahrtstops kënnen keng Kéiren hunn @@ -5160,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Kann kee STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Kann kee Stroosseweepunkt he bauen... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Kann Boje net hei plazéieren... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Kann de Weepunktnumm net änneren... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}Ka Weepunktschëld net versetzen STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Kann de Weepunkt hei net ofrappen... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Kann de Stroosseweepunkt hei net ofrappen... From e96f35cda9d6fd8a2a310fa2513d8d63c3f8bdc2 Mon Sep 17 00:00:00 2001 From: mmtunligit <156685720+mmtunligit@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:43:48 +0100 Subject: [PATCH 243/280] Codechange: Use SetDisplayedPlane instead of UpdateWidgetSize to hide various buttons (#14831) --- src/company_gui.cpp | 10 +++++----- src/news_gui.cpp | 24 +++++++++++------------- src/station_gui.cpp | 16 +++++----------- src/vehicle_gui.cpp | 7 ++++++- src/widgets/company_widget.h | 1 + src/widgets/news_widget.h | 1 + src/widgets/station_widget.h | 1 + src/widgets/vehicle_widget.h | 1 + 8 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 957d17e298..ca56d03a36 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -697,6 +697,7 @@ public: SelectCompanyLiveryWindow(WindowDesc &desc, CompanyID company, GroupID group) : Window(desc) { this->CreateNestedTree(); + this->GetWidget(WID_SCL_SEC_COL_DROP_SEL)->SetDisplayedPlane(_loaded_newgrf_features.has_2CC ? 0 : SZSP_NONE); this->vscroll = this->GetScrollbar(WID_SCL_MATRIX_SCROLLBAR); if (group == GroupID::Invalid()) { @@ -767,10 +768,7 @@ public: } case WID_SCL_SEC_COL_DROPDOWN: - if (!_loaded_newgrf_features.has_2CC) { - size.width = 0; - break; - } + if (!_loaded_newgrf_features.has_2CC) break; [[fallthrough]]; case WID_SCL_PRI_COL_DROPDOWN: { @@ -1089,7 +1087,9 @@ static constexpr std::initializer_list _nested_select_company_liver NWidget(NWID_HORIZONTAL), NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetFill(1, 1), SetResize(1, 0), EndContainer(), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetFill(0, 1), SetToolTip(STR_LIVERY_PRIMARY_TOOLTIP), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetFill(0, 1), SetToolTip(STR_LIVERY_SECONDARY_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SCL_SEC_COL_DROP_SEL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetFill(0, 1), SetToolTip(STR_LIVERY_SECONDARY_TOOLTIP), + EndContainer(), NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), }; diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 1e45fbd2b4..8e63a624b7 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -266,10 +266,12 @@ static constexpr std::initializer_list _nested_small_news_widgets = NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_LIGHT_BLUE, WID_N_CLOSEBOX), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_N_CAPTION), - NWidget(WWT_TEXTBTN, COLOUR_LIGHT_BLUE, WID_N_SHOW_GROUP), - SetAspect(WidgetDimensions::ASPECT_VEHICLE_ICON), - SetResize(1, 0), - SetToolTip(STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_N_SHOW_GROUP_SEL), + NWidget(WWT_TEXTBTN, COLOUR_LIGHT_BLUE, WID_N_SHOW_GROUP), + SetAspect(WidgetDimensions::ASPECT_VEHICLE_ICON), + SetResize(1, 0), + SetToolTip(STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP), + EndContainer(), EndContainer(), /* Main part */ @@ -368,8 +370,12 @@ struct NewsWindow : Window { this->CreateNestedTree(); + bool has_vehicle_id = std::holds_alternative(ni->ref1); + NWidgetStacked *nwid_sel = this->GetWidget(WID_N_SHOW_GROUP_SEL); + if (nwid_sel != nullptr) nwid_sel->SetDisplayedPlane(has_vehicle_id ? 0 : SZSP_NONE); + NWidgetCore *nwid = this->GetWidget(WID_N_SHOW_GROUP); - if (std::holds_alternative(ni->ref1) && nwid != nullptr) { + if (has_vehicle_id && nwid != nullptr) { const Vehicle *v = Vehicle::Get(std::get(ni->ref1)); switch (v->type) { case VEH_TRAIN: @@ -470,14 +476,6 @@ struct NewsWindow : Window { d2.height += WidgetDimensions::scaled.captiontext.Vertical(); d2.width += WidgetDimensions::scaled.captiontext.Horizontal(); size = d2; - } else { - /* Hide 'Show group window' button if this news is not about a vehicle. */ - size.width = 0; - size.height = 0; - resize.width = 0; - resize.height = 0; - fill.width = 0; - fill.height = 0; } return; diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 5dad2723cd..00ab921110 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -838,8 +838,10 @@ static constexpr std::initializer_list _nested_station_view_widgets NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SV_ACCEPTS_RATINGS), SetMinimalSize(46, 12), SetResize(1, 0), SetFill(1, 1), SetStringTip(STR_STATION_VIEW_RATINGS_BUTTON, STR_STATION_VIEW_RATINGS_TOOLTIP), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SV_CLOSE_AIRPORT), SetMinimalSize(45, 12), SetResize(1, 0), SetFill(1, 1), - SetStringTip(STR_STATION_VIEW_CLOSE_AIRPORT, STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_SV_CLOSE_AIRPORT_SEL), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SV_CLOSE_AIRPORT), SetMinimalSize(45, 12), SetResize(1, 0), SetFill(1, 1), + SetStringTip(STR_STATION_VIEW_CLOSE_AIRPORT, STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP), + EndContainer(), NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SV_CATCHMENT), SetMinimalSize(45, 12), SetResize(1, 0), SetFill(1, 1), SetStringTip(STR_BUTTON_CATCHMENT, STR_TOOLTIP_CATCHMENT), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SV_TRAINS), SetAspect(WidgetDimensions::ASPECT_VEHICLE_ICON), SetFill(0, 1), SetStringTip(STR_TRAIN, STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SV_ROADVEHS), SetAspect(WidgetDimensions::ASPECT_VEHICLE_ICON), SetFill(0, 1), SetStringTip(STR_LORRY, STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP), @@ -1321,6 +1323,7 @@ struct StationViewWindow : public Window { StationViewWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc) { this->CreateNestedTree(); + this->GetWidget(WID_SV_CLOSE_AIRPORT_SEL)->SetDisplayedPlane(Station::Get(this->window_number)->facilities.Test(StationFacility::Airport) ? 0 : SZSP_NONE); this->vscroll = this->GetScrollbar(WID_SV_SCROLLBAR); /* Nested widget tree creation is done in two steps to ensure that this->GetWidget(WID_SV_ACCEPTS_RATINGS) exists in UpdateWidgetSize(). */ this->FinishInitNested(window_number); @@ -1409,15 +1412,6 @@ struct StationViewWindow : public Window { case WID_SV_ACCEPT_RATING_LIST: size.height = ((this->GetWidget(WID_SV_ACCEPTS_RATINGS)->GetString() == STR_STATION_VIEW_RATINGS_BUTTON) ? this->accepts_lines : this->rating_lines) * GetCharacterHeight(FS_NORMAL) + padding.height; break; - - case WID_SV_CLOSE_AIRPORT: - if (!Station::Get(this->window_number)->facilities.Test(StationFacility::Airport)) { - /* Hide 'Close Airport' button if no airport present. */ - size.width = 0; - resize.width = 0; - fill.width = 0; - } - break; } } diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index a9a37ecd0e..9b0e0af438 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2843,8 +2843,10 @@ static constexpr std::initializer_list _nested_vehicle_view_widgets NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_CLONE), SetMinimalSize(18, 18), SetSpriteTip(SPR_EMPTY /* filled later */), EndContainer(), /* For trains only, 'ignore signal' button. */ - NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_FORCE_PROCEED), SetMinimalSize(18, 18), + NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VV_FORCE_PROCEED_SEL), + NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_FORCE_PROCEED), SetMinimalSize(18, 18), SetSpriteTip(SPR_IGNORE_SIGNALS, STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP), + EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_VV_SELECT_REFIT_TURN), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_REFIT), SetMinimalSize(18, 18), SetSpriteTip(SPR_REFIT_VEHICLE), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_VV_TURN_AROUND), SetMinimalSize(18, 18), @@ -3017,13 +3019,16 @@ public: switch (v->type) { case VEH_TRAIN: this->GetWidget(WID_VV_TURN_AROUND)->SetToolTip(STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP); + this->GetWidget(WID_VV_FORCE_PROCEED_SEL)->SetDisplayedPlane(0); break; case VEH_ROAD: + this->GetWidget(WID_VV_FORCE_PROCEED_SEL)->SetDisplayedPlane(SZSP_NONE); break; case VEH_SHIP: case VEH_AIRCRAFT: + this->GetWidget(WID_VV_FORCE_PROCEED_SEL)->SetDisplayedPlane(SZSP_NONE); this->SelectPlane(SEL_RT_REFIT); break; diff --git a/src/widgets/company_widget.h b/src/widgets/company_widget.h index 2964b341c0..3be1f9a6ac 100644 --- a/src/widgets/company_widget.h +++ b/src/widgets/company_widget.h @@ -90,6 +90,7 @@ enum SelectCompanyLiveryWidgets : WidgetID { WID_SCL_SPACER_DROPDOWN, ///< Spacer for dropdown. WID_SCL_PRI_COL_DROPDOWN, ///< Dropdown for primary colour. WID_SCL_SEC_COL_DROPDOWN, ///< Dropdown for secondary colour. + WID_SCL_SEC_COL_DROP_SEL, ///< Container for secondary color dropdown, which can be hidden. WID_SCL_MATRIX, ///< Matrix. WID_SCL_MATRIX_SCROLLBAR, ///< Matrix scrollbar. }; diff --git a/src/widgets/news_widget.h b/src/widgets/news_widget.h index 68d59fa133..e5e702ae22 100644 --- a/src/widgets/news_widget.h +++ b/src/widgets/news_widget.h @@ -32,6 +32,7 @@ enum NewsWidgets : WidgetID { WID_N_VEH_SPR, ///< Graphical display of the new vehicle. WID_N_VEH_INFO, ///< Some technical data of the new vehicle. WID_N_SHOW_GROUP, ///< Show vehicle's group + WID_N_SHOW_GROUP_SEL, ///< Selector for showing vehicle group, which can be hidden. }; /** Widgets of the #MessageHistoryWindow class. */ diff --git a/src/widgets/station_widget.h b/src/widgets/station_widget.h index fda195456e..5bef150819 100644 --- a/src/widgets/station_widget.h +++ b/src/widgets/station_widget.h @@ -24,6 +24,7 @@ enum StationViewWidgets : WidgetID { WID_SV_ACCEPTS_RATINGS, ///< 'Accepts' / 'Ratings' button. WID_SV_RENAME, ///< 'Rename' button. WID_SV_CLOSE_AIRPORT, ///< 'Close airport' button. + WID_SV_CLOSE_AIRPORT_SEL, ///< Container for 'close airport' button, which can be hidden. WID_SV_TRAINS, ///< List of scheduled trains button. WID_SV_ROADVEHS, ///< List of scheduled road vehs button. WID_SV_SHIPS, ///< List of scheduled ships button. diff --git a/src/widgets/vehicle_widget.h b/src/widgets/vehicle_widget.h index e74011b9cb..296948283e 100644 --- a/src/widgets/vehicle_widget.h +++ b/src/widgets/vehicle_widget.h @@ -27,6 +27,7 @@ enum VehicleViewWidgets : WidgetID { WID_VV_SELECT_REFIT_TURN, ///< Selection widget between 'refit' and 'turn around' buttons. WID_VV_TURN_AROUND, ///< Turn this vehicle around. WID_VV_FORCE_PROCEED, ///< Force this vehicle to pass a signal at danger. + WID_VV_FORCE_PROCEED_SEL, ///< Container for 'force proceed' button, which can be hidden. WID_VV_HONK_HORN, ///< Honk the vehicles horn (not drawn on UI, only used for hotkey). }; From faf3bb9739b568eb6b0d075d248a98759cd702b6 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 1 Dec 2025 11:44:28 -0500 Subject: [PATCH 244/280] Fix #9071: Don't consider tram tracks when growing towns (#14833) --- src/town_cmd.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 48280bd300..67034fd2bf 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1476,9 +1476,7 @@ static inline bool RoadTypesAllowHouseHere(TileIndex t) allow = true; RoadType road_rt = GetRoadTypeRoad(cur_tile); - RoadType tram_rt = GetRoadTypeTram(cur_tile); if (road_rt != INVALID_ROADTYPE && !GetRoadTypeInfo(road_rt)->flags.Test(RoadTypeFlag::NoHouses)) return true; - if (tram_rt != INVALID_ROADTYPE && !GetRoadTypeInfo(tram_rt)->flags.Test(RoadTypeFlag::NoHouses)) return true; } /* If no road was found surrounding the tile we can allow building the house since there is From 595b696d61860ad883ec9f6fd060ac3ad8d7be4c Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 2 Dec 2025 09:28:12 -0500 Subject: [PATCH 245/280] Change: Avoid building farm fields in wetlands (#14846) --- src/industry_cmd.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index ffad97ae52..2abdc1aecb 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -993,16 +993,23 @@ static const uint8_t _plantfarmfield_type[] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, /** * Check whether the tile can be replaced by a farm field. - * @param tile the tile to investigate. - * @param allow_fields if true, the method will return true even if - * the tile is a farm tile, otherwise the tile may not be a farm tile + * @param tile The tile to investigate. + * @param allow_fields Can we replace an existing field? + * @param allow_rough Can we build on rough tiles? (clear or trees) * @return true if the tile can become a farm field */ -static bool IsSuitableForFarmField(TileIndex tile, bool allow_fields) +static bool IsSuitableForFarmField(TileIndex tile, bool allow_fields, bool allow_rough) { switch (GetTileType(tile)) { - case MP_CLEAR: return !IsSnowTile(tile) && !IsClearGround(tile, CLEAR_DESERT) && (allow_fields || !IsClearGround(tile, CLEAR_FIELDS)); - case MP_TREES: return GetTreeGround(tile) != TREE_GROUND_SHORE; + case MP_CLEAR: + switch (GetClearGround(tile)) { + case CLEAR_SNOW: return false; + case CLEAR_DESERT: return false; + case CLEAR_ROUGH: return allow_rough; + case CLEAR_FIELDS: return allow_fields; + default: return true; + } + case MP_TREES: return GetTreeGround(tile) != TREE_GROUND_SHORE && (allow_rough || GetTreeGround(tile) != TREE_GROUND_ROUGH); default: return false; } } @@ -1059,7 +1066,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry) int count = 0; for (TileIndex cur_tile : ta) { assert(cur_tile < Map::Size()); - count += IsSuitableForFarmField(cur_tile, false); + count += IsSuitableForFarmField(cur_tile, false, false); } if (count * 2 < ta.w * ta.h) return; @@ -1071,7 +1078,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry) /* make field */ for (TileIndex cur_tile : ta) { assert(cur_tile < Map::Size()); - if (IsSuitableForFarmField(cur_tile, true)) { + if (IsSuitableForFarmField(cur_tile, true, true)) { MakeField(cur_tile, field_type, industry); SetClearCounter(cur_tile, counter); MarkTileDirtyByTile(cur_tile); From c24526a2e11c2ed81015d748018688cd10f78e5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 14:49:36 +0000 Subject: [PATCH 246/280] Upgrade: Bump the actions group across 1 directory with 5 updates (#14731) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-emscripten.yml | 2 +- .github/workflows/ci-linux.yml | 2 +- .github/workflows/ci-macos.yml | 2 +- .github/workflows/ci-mingw.yml | 2 +- .github/workflows/ci-windows.yml | 2 +- .github/workflows/codeql.yml | 8 ++++---- .github/workflows/commit-checker.yml | 2 +- .github/workflows/preview-build.yml | 2 +- .github/workflows/release-docs.yml | 4 ++-- .github/workflows/release-linux.yml | 6 +++--- .github/workflows/release-macos.yml | 6 +++--- .github/workflows/release-source.yml | 10 +++++----- .github/workflows/release-windows-store.yml | 10 +++++----- .github/workflows/release-windows.yml | 6 +++--- .github/workflows/script-missing-mode-enforcement.yml | 2 +- .github/workflows/unused-strings.yml | 2 +- .github/workflows/upload-cdn.yml | 8 ++++---- .github/workflows/upload-gog.yml | 10 +++++----- .github/workflows/upload-steam.yml | 10 +++++----- 19 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ci-emscripten.yml b/.github/workflows/ci-emscripten.yml index d115ea9e56..04ac94e0e1 100644 --- a/.github/workflows/ci-emscripten.yml +++ b/.github/workflows/ci-emscripten.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Fix dubious ownership run: | diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 2883cb55d7..e93a136695 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup vcpkg uses: ./.github/actions/setup-vcpkg diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml index 972615f865..bf4ce8fe6b 100644 --- a/.github/workflows/ci-macos.yml +++ b/.github/workflows/ci-macos.yml @@ -32,7 +32,7 @@ jobs: xcode-version: latest-stable - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup vcpkg uses: ./.github/actions/setup-vcpkg diff --git a/.github/workflows/ci-mingw.yml b/.github/workflows/ci-mingw.yml index b1079a534c..dd648d6068 100644 --- a/.github/workflows/ci-mingw.yml +++ b/.github/workflows/ci-mingw.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup MSYS2 uses: msys2/setup-msys2@v2 diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 7830c64d64..e1bcb6a527 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup vcpkg uses: ./.github/actions/setup-vcpkg diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 904ad6feed..b93e7fce20 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup vcpkg uses: ./.github/actions/setup-vcpkg @@ -77,7 +77,7 @@ jobs: echo "::endgroup::" - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: cpp config-file: ./.github/codeql/codeql-config.yml @@ -93,7 +93,7 @@ jobs: echo "::endgroup::" - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: category: /language:cpp upload: False @@ -111,6 +111,6 @@ jobs: output: sarif-results/cpp.sarif - name: Upload results - uses: github/codeql-action/upload-sarif@v3 + uses: github/codeql-action/upload-sarif@v4 with: sarif_file: sarif-results/cpp.sarif diff --git a/.github/workflows/commit-checker.yml b/.github/workflows/commit-checker.yml index 319ab8a5b9..f656a4b323 100644 --- a/.github/workflows/commit-checker.yml +++ b/.github/workflows/commit-checker.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 4 diff --git a/.github/workflows/preview-build.yml b/.github/workflows/preview-build.yml index cf9e8394af..86091c9ebc 100644 --- a/.github/workflows/preview-build.yml +++ b/.github/workflows/preview-build.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index c811e01e18..e7d1260142 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source @@ -78,7 +78,7 @@ jobs: echo "::endgroup::" - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-docs path: build/bundles/*.tar.xz diff --git a/.github/workflows/release-linux.yml b/.github/workflows/release-linux.yml index c7f1956a6e..4ccfebfb52 100644 --- a/.github/workflows/release-linux.yml +++ b/.github/workflows/release-linux.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source @@ -156,14 +156,14 @@ jobs: echo "::endgroup::" - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-linux-generic path: build/bundles retention-days: 5 - name: Store symbols - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: symbols-linux-generic path: build/symbols diff --git a/.github/workflows/release-macos.yml b/.github/workflows/release-macos.yml index 9d7f09813a..bf110a6e8b 100644 --- a/.github/workflows/release-macos.yml +++ b/.github/workflows/release-macos.yml @@ -23,7 +23,7 @@ jobs: xcode-version: latest-stable - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source @@ -205,14 +205,14 @@ jobs: mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/ - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-macos-universal path: build-x64/bundles retention-days: 5 - name: Store symbols - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: symbols-macos-universal path: build-x64/symbols diff --git a/.github/workflows/release-source.yml b/.github/workflows/release-source.yml index c2d414266b..a8a813ee50 100644 --- a/.github/workflows/release-source.yml +++ b/.github/workflows/release-source.yml @@ -30,14 +30,14 @@ jobs: steps: - name: Checkout (Release) if: github.event_name == 'release' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: # We generate a changelog; for this we need the full git log. fetch-depth: 0 - name: Checkout (Manual) if: github.event_name == 'workflow_dispatch' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.inputs.ref }} # We generate a changelog; for this we need the full git log. @@ -45,7 +45,7 @@ jobs: - name: Checkout (Trigger) if: github.event_name == 'repository_dispatch' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.client_payload.ref }} # We generate a changelog; for this we need the full git log. @@ -202,14 +202,14 @@ jobs: echo "::endgroup::" - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-source path: build/bundles/* retention-days: 5 - name: Store source (for other jobs) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: internal-source path: source.tar.gz diff --git a/.github/workflows/release-windows-store.yml b/.github/workflows/release-windows-store.yml index 93aaafd799..7ed434561e 100644 --- a/.github/workflows/release-windows-store.yml +++ b/.github/workflows/release-windows-store.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source @@ -25,17 +25,17 @@ jobs: tar -xf source.tar.gz --strip-components=1 - name: Download x86 build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x86 - name: Download x64 build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x64 - name: Download arm64 build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-arm64 @@ -185,7 +185,7 @@ jobs: move output\OpenTTD.appxbundle bundles\internal\openttd-${{ inputs.version }}-windows-store.appxbundle - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-windows-store path: builds/bundles diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index 7e818bfd50..393566ebb8 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source @@ -194,14 +194,14 @@ jobs: AZURE_CODESIGN_PROFILE_NAME: ${{ secrets.AZURE_CODESIGN_PROFILE_NAME }} - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: openttd-windows-${{ matrix.arch }} path: build/bundles retention-days: 5 - name: Store symbols - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: symbols-windows-${{ matrix.arch }} path: build/symbols diff --git a/.github/workflows/script-missing-mode-enforcement.yml b/.github/workflows/script-missing-mode-enforcement.yml index 5b98576686..e5a2f6517f 100644 --- a/.github/workflows/script-missing-mode-enforcement.yml +++ b/.github/workflows/script-missing-mode-enforcement.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Check for finding script functions that require company/deity mode enforcement/checks run: | diff --git a/.github/workflows/unused-strings.yml b/.github/workflows/unused-strings.yml index dc488b8456..e77bb932ca 100644 --- a/.github/workflows/unused-strings.yml +++ b/.github/workflows/unused-strings.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Check for unused strings run: | diff --git a/.github/workflows/upload-cdn.yml b/.github/workflows/upload-cdn.yml index 91c5a165cf..4033b56927 100644 --- a/.github/workflows/upload-cdn.yml +++ b/.github/workflows/upload-cdn.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Download all bundles - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 - name: Calculate checksums run: | @@ -70,14 +70,14 @@ jobs: done - name: Store bundles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: cdn-bundles path: bundles/* retention-days: 5 - name: Store breakpad symbols - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: cdn-symbols path: symbols/* @@ -130,7 +130,7 @@ jobs: installation_retrieval_payload: "OpenTTD/workflows" - name: Trigger 'Publish Docs' - uses: peter-evans/repository-dispatch@v3 + uses: peter-evans/repository-dispatch@v4 with: token: ${{ steps.generate_token.outputs.token }} repository: OpenTTD/workflows diff --git a/.github/workflows/upload-gog.yml b/.github/workflows/upload-gog.yml index a1a6526e7e..94da233878 100644 --- a/.github/workflows/upload-gog.yml +++ b/.github/workflows/upload-gog.yml @@ -15,31 +15,31 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source path: internal-source - name: Download bundle (Windows x86) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x86 path: openttd-windows-x86 - name: Download bundle (Windows x64) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x64 path: openttd-windows-x64 - name: Download bundle (MacOS) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-macos-universal path: openttd-macos-universal - name: Download bundle (Linux) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-linux-generic path: openttd-linux-generic diff --git a/.github/workflows/upload-steam.yml b/.github/workflows/upload-steam.yml index 1cf17239fd..60a22a0c92 100644 --- a/.github/workflows/upload-steam.yml +++ b/.github/workflows/upload-steam.yml @@ -18,31 +18,31 @@ jobs: steps: - name: Download source - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: internal-source path: internal-source - name: Download bundle (Windows x86) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x86 path: openttd-windows-x86 - name: Download bundle (Windows x64) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-windows-x64 path: openttd-windows-x64 - name: Download bundle (MacOS) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-macos-universal path: openttd-macos-universal - name: Download bundle (Linux) - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: openttd-linux-generic path: openttd-linux-generic From 43a82c2e278b07e3ab55f2d222c9e001eb79d584 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 3 Dec 2025 04:42:04 +0000 Subject: [PATCH 247/280] Update: Translations from eints portuguese: 8 changes by jcteotonio --- src/lang/portuguese.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 9b6cb83218..24b8493ab9 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1751,7 +1751,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :Sim, exceto col STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :Usar formato de data {STRING} para jogos guardados. STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :Formato da data nos ficheiros de jogos guardados ###length 3 -STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :longo (31 de Dez. de 2008) +STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :longo (31 Dez 2008) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :curto (31-12-2008) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31) @@ -2405,7 +2405,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamanho do mapa STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa{}Clique para ordenar por área STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data -STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data de hoje +STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Tempo de jogo STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Tempo jogado enquanto{}o jogo não esteve em pausa @@ -2440,7 +2440,7 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Renovar STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Pesquisar na internet STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Pesquisar servidores públicos na internet -STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Search LAN +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Procurar na rede local (LAN) STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Pesquisar por servidores na rede local STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Adicionar servidor STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adiciona um servidor à lista. Pode ser um endereço de servidor ou um código de convite @@ -2873,10 +2873,10 @@ STR_HOUSE_PICKER_SIZE :{BLACK}Tamanho: STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Carga aceite: {GOLD} STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Carga produzida: {GOLD}{CARGO_LIST} -STR_HOUSE_PICKER_CLASS_ZONE1 :Borda +STR_HOUSE_PICKER_CLASS_ZONE1 :Limite STR_HOUSE_PICKER_CLASS_ZONE2 :Arredores -STR_HOUSE_PICKER_CLASS_ZONE3 :Subúrbios Externos -STR_HOUSE_PICKER_CLASS_ZONE4 :Subúrbios Internos +STR_HOUSE_PICKER_CLASS_ZONE3 :Subúrbios Periféricos +STR_HOUSE_PICKER_CLASS_ZONE4 :Subúrbios Centrais STR_HOUSE_PICKER_CLASS_ZONE5 :Centro da localidade STR_HOUSE_PICKER_PROTECT_TITLE :Impedir atualizações @@ -3620,7 +3620,7 @@ STR_NEWGRF_ERROR_INVALID_PARAMETER :Parâmetro inv STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} deve ser carregado antes de {2:STRING} STR_NEWGRF_ERROR_LOAD_AFTER :{1:STRING} deve ser carregado depois de {2:STRING} STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{1:STRING} requer OpenTTD versão {2:STRING} ou superior -STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :ficheiro GRF concebido para o traduzir +STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :o ficheiro GRF que foi desenvolvido para tradução STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Demasiados NewGRFs carregados. STR_NEWGRF_ERROR_STATIC_GRF_CAUSES_DESYNC :Carregar {1:STRING} como NewGRF estático com {2:STRING} pode causar dessincronização STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Gráfico inválido (sprite {3:NUM}) @@ -5865,7 +5865,7 @@ STR_VEHICLE_NAME_AIRCRAFT_POWERNAUT_HELICOPTER :Helicóptero Po # Formatting of some strings STR_FORMAT_DATE_TINY :{ZEROFILL_NUM}-{ZEROFILL_NUM}-{NUM} STR_FORMAT_DATE_SHORT :{STRING} de {NUM} -STR_FORMAT_DATE_LONG :{STRING} de {STRING}. de {NUM} +STR_FORMAT_DATE_LONG :{STRING} {STRING} {NUM} STR_FORMAT_DATE_ISO :{2:NUM}-{1:ZEROFILL_NUM}-{0:ZEROFILL_NUM} STR_FORMAT_COMPANY_NUM :(Empresa {COMMA}) From 73b260ce057cc677b6964f6c9ff94e2e66e9cbbe Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 3 Dec 2025 08:19:49 +0000 Subject: [PATCH 248/280] Codefix: Leading newlines in Squirrel error/callstack prints (#14851) --- regression/regression/result.txt | 2 ++ src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 4b17a7b39b..3c98d4b27e 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -10116,8 +10116,10 @@ ERROR: IsEnd() is invalid as Begin() is never called constructor failed with: excessive CPU usage in list filter function Your script made an error: excessive CPU usage in valuator function +CALLSTACK *FUNCTION [Start()] regression/main.nut line [2184] +LOCALS [Infinite] CLOSURE [list] INSTANCE [this] INSTANCE diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp index f5763589c2..8f3b6b78b4 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp @@ -18,7 +18,8 @@ void sqstd_printcallstack(HSQUIRRELVM v) SQFloat f; SQInteger level=1; //1 is to skip this function that is level 0 SQInteger seq=0; - pf(v,"\nCALLSTACK\n"); + pf(v,"\n"); + pf(v,"CALLSTACK\n"); while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si))) { std::string_view fn="unknown"; @@ -37,7 +38,8 @@ void sqstd_printcallstack(HSQUIRRELVM v) level++; } level=0; - pf(v,"\nLOCALS\n"); + pf(v,"\n"); + pf(v,"LOCALS\n"); for(level=0;level<10;level++){ seq=0; @@ -116,11 +118,12 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v) if(pf) { std::string_view error; if(sq_gettop(v)>=1) { + pf(v,"\n"); if(SQ_SUCCEEDED(sq_getstring(v,2,error))) { - pf(v,fmt::format("\nAN ERROR HAS OCCURRED [{}]\n",error)); + pf(v,fmt::format("AN ERROR HAS OCCURRED [{}]\n",error)); } else{ - pf(v,"\nAN ERROR HAS OCCURRED [unknown]\n"); + pf(v,"AN ERROR HAS OCCURRED [unknown]\n"); } sqstd_printcallstack(v); } From 7e046f112be42d9a4b8c7ed819f968e1e9c482da Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 3 Dec 2025 14:38:03 +0000 Subject: [PATCH 249/280] Fix #14844: Use company colour remap for badges in picker window. (#14849) (Except for houses, which are not company-owned.) --- src/picker_gui.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index 4fc2172cd0..d73b2a5dd1 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -341,7 +341,9 @@ void PickerWindow::DrawWidget(const Rect &r, WidgetID widget) const int by = ir.Height() - ScaleGUITrad(12); GrfSpecFeature feature = this->callbacks.GetFeature(); - DrawBadgeColumn({0, by, ir.Width() - 1, ir.Height() - 1}, 0, this->badge_classes, this->callbacks.GetTypeBadges(item.class_index, item.index), feature, std::nullopt, PAL_NONE); + /* Houses have recolours but not related to the company colour. */ + PaletteID palette = feature == GSF_HOUSES ? PAL_NONE : GetCompanyPalette(_local_company); + DrawBadgeColumn({0, by, ir.Width() - 1, ir.Height() - 1}, 0, this->badge_classes, this->callbacks.GetTypeBadges(item.class_index, item.index), feature, std::nullopt, palette); if (this->callbacks.saved.contains(item)) { DrawSprite(SPR_BLOT, PALETTE_TO_YELLOW, 0, 0); @@ -447,7 +449,9 @@ void PickerWindow::OnClick(Point pt, WidgetID widget, int) default: if (IsInsideMM(widget, this->badge_filters.first, this->badge_filters.second)) { - ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(), -1, widget, 0); + /* Houses have recolours but not related to the company colour. */ + PaletteID palette = this->callbacks.GetFeature() == GSF_HOUSES ? PAL_NONE : GetCompanyPalette(_local_company); + ShowDropDownList(this, this->GetWidget(widget)->GetDropDownList(palette), -1, widget, 0); } break; } From bd338d6e426bbeff5bf6c962a8160d0654e7740c Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 3 Dec 2025 14:38:20 +0000 Subject: [PATCH 250/280] Fix 25f1c97bea: Incorrect background colour in badge configuration list. (#14850) Provide correct widget colour instead of assuming COLOUR_GREY. --- src/build_vehicle_gui.cpp | 2 +- src/newgrf_badge_gui.cpp | 6 +++--- src/newgrf_badge_gui.h | 2 +- src/picker_gui.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 965e969c31..d8912bc89c 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1617,7 +1617,7 @@ struct BuildVehicleWindow : Window { DropDownList BuildBadgeConfigurationList() const { static const auto separators = {STR_BADGE_CONFIG_PREVIEW, STR_BADGE_CONFIG_NAME}; - return BuildBadgeClassConfigurationList(this->badge_classes, BADGE_COLUMNS, separators); + return BuildBadgeClassConfigurationList(this->badge_classes, BADGE_COLUMNS, separators, COLOUR_GREY); } void BuildVehicle() diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index 525f751a3a..c2d0dba8f2 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -330,7 +330,7 @@ enum BadgeClick : int { BADGE_CLICK_TOGGLE_FILTER, }; -DropDownList BuildBadgeClassConfigurationList(const GUIBadgeClasses &gui_classes, uint columns, std::span column_separators) +DropDownList BuildBadgeClassConfigurationList(const GUIBadgeClasses &gui_classes, uint columns, std::span column_separators, Colours bg_colour) { DropDownList list; @@ -349,7 +349,7 @@ DropDownList BuildBadgeClassConfigurationList(const GUIBadgeClasses &gui_classes bool first = (i == 0 && gc.class_index == front); bool last = (i == columns - 1 && gc.class_index == back); - list.push_back(std::make_unique(first ? 0 : BADGE_CLICK_MOVE_UP, last ? 0 : BADGE_CLICK_MOVE_DOWN, COLOUR_YELLOW, gc.visible, BADGE_CLICK_TOGGLE_ICON, COLOUR_YELLOW, COLOUR_GREY, GetString(GetClassBadge(gc.class_index)->name), gc.class_index.base())); + list.push_back(std::make_unique(first ? 0 : BADGE_CLICK_MOVE_UP, last ? 0 : BADGE_CLICK_MOVE_DOWN, COLOUR_YELLOW, gc.visible, BADGE_CLICK_TOGGLE_ICON, COLOUR_YELLOW, bg_colour, GetString(GetClassBadge(gc.class_index)->name), gc.class_index.base())); } if (i >= column_separators.size()) continue; @@ -369,7 +369,7 @@ DropDownList BuildBadgeClassConfigurationList(const GUIBadgeClasses &gui_classes if (!badge->flags.Test(BadgeFlag::HasText)) continue; const auto [config, _] = GetBadgeClassConfigItem(gui_classes.GetFeature(), badge->label); - list.push_back(std::make_unique(config.show_filter, BADGE_CLICK_TOGGLE_FILTER, COLOUR_YELLOW, COLOUR_GREY, GetString(badge->name), (1U << 16) | badge_class_index.base())); + list.push_back(std::make_unique(config.show_filter, BADGE_CLICK_TOGGLE_FILTER, COLOUR_YELLOW, bg_colour, GetString(badge->name), (1U << 16) | badge_class_index.base())); } return list; diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index af2ed4cafc..868cdf86d6 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -54,7 +54,7 @@ std::unique_ptr MakeDropDownListBadgeItem(const std::shared_pt std::unique_ptr MakeDropDownListBadgeItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, std::string &&str, int value, bool masked = false, bool shaded = false); std::unique_ptr MakeDropDownListBadgeIconItem(const std::shared_ptr &gui_classes, std::span badges, GrfSpecFeature feature, std::optional introduction_date, Money cost, const Dimension &dim, SpriteID sprite, PaletteID palette, std::string &&str, int value, bool masked = false, bool shaded = false); -DropDownList BuildBadgeClassConfigurationList(const class GUIBadgeClasses &badge_class, uint columns, std::span column_separators); +DropDownList BuildBadgeClassConfigurationList(const class GUIBadgeClasses &badge_class, uint columns, std::span column_separators, Colours bg_colour); bool HandleBadgeConfigurationDropDownClick(GrfSpecFeature feature, uint columns, int result, int click_result, BadgeFilterChoices &choices); std::pair AddBadgeDropdownFilters(NWidgetContainer &container, WidgetID widget, Colours colour, GrfSpecFeature feature); diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index d73b2a5dd1..a594b7c37b 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -444,7 +444,7 @@ void PickerWindow::OnClick(Point pt, WidgetID widget, int) case WID_PW_CONFIGURE_BADGES: if (this->badge_classes.GetClasses().empty()) break; - ShowDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}), -1, widget, 0, DropDownOption::Persist); + ShowDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}, COLOUR_DARK_GREEN), -1, widget, 0, DropDownOption::Persist); break; default: @@ -466,7 +466,7 @@ void PickerWindow::OnDropdownSelect(WidgetID widget, int index, int click_result this->ReInit(); if (reopen) { - ReplaceDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}), -1); + ReplaceDropDownList(this, BuildBadgeClassConfigurationList(this->badge_classes, 1, {}, COLOUR_DARK_GREEN), -1); } else { this->CloseChildWindows(WC_DROPDOWN_MENU); } From bca8913d1dc2d81800f35b3e40d50ab4d96635ee Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Thu, 4 Dec 2025 10:55:13 -0500 Subject: [PATCH 251/280] Change: Eliminate small seas instead of ending rivers there (#14797) --- src/landscape.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/landscape.cpp b/src/landscape.cpp index f36a8406ca..a6041f733a 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1326,6 +1326,39 @@ bool RiverFlowsDown(TileIndex begin, TileIndex end) return slope_end == SLOPE_FLAT || slope_begin == SLOPE_FLAT; } +/** + * Find the size of a patch of connected sea tiles. + * @param tile The starting tile to search. + * @param sea The set of sea tiles found. + * @param limit How many tiles to find before cutting the search short. + * @return True iff we found a map edge and broke out early, otherwise false (use the sea parameter as the output count/tile set). + */ +static bool CountConnectedSeaTiles(TileIndex tile, std::unordered_set &sea, const uint limit) +{ + /* This tile might not be sea. */ + if (!IsWaterTile(tile) || GetWaterClass(tile) != WaterClass::Sea || !IsTileFlat(tile)) return false; + + /* If we've found an edge tile, we are "connected to the sea outside the map." */ + if (DistanceFromEdge(tile) <= 1) return true; + + /* We have now evaluated this tile and don't want to check it again. */ + sea.insert(tile); + + /* We might want to cut our search short if the size of the sea is "big enough". + * Count this tile but don't check its neighbors. */ + if (sea.size() > limit) return false; + + /* Count adjacent tiles using recusion. */ + for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { + TileIndex t = tile + TileOffsByDiagDir(d); + if (IsValidTile(t) && !sea.contains(t)) { + if (CountConnectedSeaTiles(t, sea, limit)) return true; + } + } + + return false; +} + /** * Try to flow the river down from a given begin. * @param spring The springing point of the river. @@ -1358,8 +1391,29 @@ static std::tuple FlowRiver(TileIndex spring, TileIndex begin, uint int height_end; if (IsTileFlat(end, &height_end) && (height_end < height_begin || (height_end == height_begin && IsWaterTile(end)))) { - found = true; - break; + if (IsWaterTile(end) && GetWaterClass(end) == WaterClass::Sea) { + /* If we've found the sea, make sure it's large enough. Scale by the map size but set a cap to avoid performance issues on large maps. */ + const uint MAX_SEA_SIZE_THRESHOLD = 1024; + const uint SEA_SIZE_THRESHOLD = std::min(static_cast(2 * std::sqrt(Map::SizeX() * Map::SizeY())), MAX_SEA_SIZE_THRESHOLD); + std::unordered_set sea; + /* Count the connected tiles, if the sea is large we can end the river here. */ + bool found_edge = CountConnectedSeaTiles(end, sea, SEA_SIZE_THRESHOLD); + if (found_edge || sea.size() > SEA_SIZE_THRESHOLD) { + found = true; + break; + } else { + /* Sea is too small, flatten it so the river keeps looking or forms a lake / wetland. */ + for (TileIndex sea_tile : sea) { + Command::Do(DoCommandFlag::Execute, sea_tile, SLOPE_ELEVATED, false); + Slope slope = ComplementSlope(GetTileSlope(sea_tile)); + Command::Do(DoCommandFlag::Execute, sea_tile, slope, true); + } + } + } else { + /* We've found a river. */ + found = true; + break; + } } for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) { From ad63087928a36d352ce228e642540ae94f420eda Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 5 Dec 2025 04:43:02 +0000 Subject: [PATCH 252/280] Update: Translations from eints portuguese: 2 changes by jcteotonio --- src/lang/portuguese.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 24b8493ab9..a1c56a63e0 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -510,7 +510,7 @@ STR_INDUSTRY_MENU_FUND_NEW_INDUSTRY :Financiar nova STR_RAIL_MENU_RAILROAD_CONSTRUCTION :Construção de caminhos-de-ferro STR_RAIL_MENU_ELRAIL_CONSTRUCTION :Construção de caminhos-de-ferro eletrificados STR_RAIL_MENU_MONORAIL_CONSTRUCTION :Construção de monocarris -STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construção de linhas maglev +STR_RAIL_MENU_MAGLEV_CONSTRUCTION :Construção de linhas Maglev # Road construction menu STR_ROAD_MENU_ROAD_CONSTRUCTION :Construção de estradas @@ -4363,7 +4363,7 @@ STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Desenvolv STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :{G=f}locomotiva ferroviária STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :{G=f}locomotiva elétrica ferroviária STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :{G=f}locomotiva monocarril -STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotiva maglev +STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :{G=f}locomotiva Maglev STR_ENGINE_PREVIEW_ROAD_VEHICLE :{G=m}veículo rodoviário STR_ENGINE_PREVIEW_TRAM_VEHICLE :{G=m}elétrico From 06d3ae7381760a39a26c4b2a411bafa0d1364654 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 6 Dec 2025 04:38:49 +0000 Subject: [PATCH 253/280] Update: Translations from eints chinese (simplified): 22 changes by WenSimEHRP --- src/lang/simplified_chinese.txt | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 77dd80c0bc..fa7f98df92 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}启用 STR_BUTTON_DEFAULT :{BLACK}默认 STR_BUTTON_CANCEL :{BLACK}取消 STR_BUTTON_OK :{BLACK}确定 +STR_BUTTON_MOVE :{BLACK}移动 # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -2406,7 +2407,7 @@ STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}日期 STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}当前日期 STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}时{NBSP}{NUM}{NBSP}分 STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :游戏时间 -STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}有戏已进行的时间,不计暂停的时间 +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}游戏已进行的时间,不计暂停的时间 STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}服务器兼容性与验证信息 STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}点击列表中的服务器可以选定它 @@ -2861,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :选择显示的 STR_PICKER_HOUSE_TYPE_TOOLTIP :选择建造的房屋类型。按住 键操作以保存或删除当前项目 STR_HOUSE_PICKER_CAPTION :房屋选择 -STR_HOUSE_PICKER_NAME :{BLACK}名称:{ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}人口:{ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}可用年份:{ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}可用年份:{ORANGE}不限 -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}可用年份:{ORANGE}自 {NUM} 年起可用 -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}可用年份:{ORANGE}至 {NUM} 年前可用 -STR_HOUSE_PICKER_SIZE :{BLACK}大小:{ORANGE}{NUM}×{NUM} 格 -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}接受货物:{ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}产出货物:{ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}名称:{GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}人口:{GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}可用年份:{GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}可用年份:{GOLD}不限 +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}可用年份:{GOLD}自 {NUM} 年起可用 +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}可用年份:{GOLD}至 {NUM} 年前可用 +STR_HOUSE_PICKER_SIZE :{BLACK}大小:{GOLD}{NUM}×{NUM} 格 +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}接受货物:{GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}产出货物:{GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :城镇边缘 STR_HOUSE_PICKER_CLASS_ZONE2 :郊区边缘 @@ -3427,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}西北 STR_MAPGEN_NORTHEAST :{BLACK}东北 STR_MAPGEN_SOUTHEAST :{BLACK}东南 STR_MAPGEN_SOUTHWEST :{BLACK}西南 +STR_MAPGEN_NORTHWEST_TOOLTIP :切换地图西北边为水面或自由边界 +STR_MAPGEN_NORTHEAST_TOOLTIP :切换地图东北边为水面或自由边界 +STR_MAPGEN_SOUTHEAST_TOOLTIP :切换地图东南边为水面或自由边界 +STR_MAPGEN_SOUTHWEST_TOOLTIP :切换地图西南边为水面或自由边界 STR_MAPGEN_BORDER_FREEFORM :{BLACK}自由形式 STR_MAPGEN_BORDER_WATER :{BLACK}水面 STR_MAPGEN_BORDER_RANDOM :{BLACK}随机 @@ -3683,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}符合 STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}显示大小写符合过滤字符串的标志列表 # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}标记标志文字 +STR_EDIT_SIGN_CAPTION :{WHITE}编辑标志 STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}将屏幕中心移动到标志所在的位置。按住 单击会在新视点中显示目标位置 STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}前往下个标记 STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}前往上个标记 @@ -3900,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :卓越 STR_CARGO_RATING_OUTSTANDING :完美(最高评价) STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到车站所在的位置。按住 单击会在新视点中显示目标位置 +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}重命名车站或移动车站标志 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}显示所有调度计划中含有此车站的列车 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}显示所有调度计划中含有此车站的汽车 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}显示所有调度计划中含有此机场的飞机 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}显示所有调度计划中含有此码头的船只 +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}编辑车站标志 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}关闭机场 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}禁止飞机降落本场 @@ -3913,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}禁止 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到路点所在的位置。按住 单击会在新视点中显示路点 +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}重命名路点或移动路点标志 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}将屏幕中心移动到浮标所在的位置。按住 单击会在新视点中显示目标位置 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}修改浮标名 +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}编辑路点标志 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 财务报表 {BLACK}{COMPANY_NUM} @@ -5129,6 +5138,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_CAN_T_MOVE_STATION_NAME :{WHITE}无法移动车站标志…… STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}……道路由城镇所有 STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}……道路方向不对 STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}……途中型车站不能建在转角处 @@ -5160,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}不能 STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}不能在这里设置路点…… STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}不能将浮标放置在这里…… STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}不能更改路点名称…… +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}无法移动路点标志…… STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}不能拆除此处的铁路路点…… STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}不能拆除此处的道路路点…… From 22569515df05d752325884618250d0dd00db4858 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 6 Dec 2025 09:15:55 +0000 Subject: [PATCH 254/280] Fix: Drop down scrolling broken for mixed-height items. (#14840) --- src/dropdown.cpp | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/dropdown.cpp b/src/dropdown.cpp index 36efb5f98e..540b623a47 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -8,6 +8,7 @@ /** @file dropdown.cpp Implementation of the dropdown widget. */ #include "stdafx.h" +#include "core/backup_type.hpp" #include "dropdown_type.h" #include "dropdown_func.h" #include "strings_func.h" @@ -205,8 +206,9 @@ struct DropdownWindow : Window { this->GetWidget(WID_DM_SHOW_SCROLL)->SetDisplayedPlane(list_dim.height > widget_dim.height ? 0 : SZSP_NONE); /* Capacity is the average number of items visible */ - this->vscroll->SetCapacity((widget_dim.height - WidgetDimensions::scaled.dropdownlist.Vertical()) * this->list.size() / list_dim.height); - this->vscroll->SetCount(this->list.size()); + this->vscroll->SetCapacity(widget_dim.height - WidgetDimensions::scaled.dropdownlist.Vertical()); + this->vscroll->SetStepSize(list_dim.height / this->list.size()); + this->vscroll->SetCount(list_dim.height); /* If the dropdown is positioned above the parent widget, start selection at the bottom. */ if (this->position.y < button_rect.top && list_dim.height > widget_dim.height) this->vscroll->UpdatePosition(INT_MAX); @@ -233,23 +235,22 @@ struct DropdownWindow : Window { if (GetWidgetFromPos(this, _cursor.pos.x - this->left, _cursor.pos.y - this->top) < 0) return false; const Rect &r = this->GetWidget(WID_DM_ITEMS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.dropdownlist).Shrink(WidgetDimensions::scaled.dropdowntext, RectPadding::zero); - int y = _cursor.pos.y - this->top - r.top; - int pos = this->vscroll->GetPosition(); + int click_y = _cursor.pos.y - this->top - r.top; + int y = -this->vscroll->GetPosition(); + int y_end = r.Height(); for (const auto &item : this->list) { - /* Skip items that are scrolled up */ - if (--pos >= 0) continue; - int item_height = item->Height(); - if (y < item_height) { + /* Skip items that are scrolled up */ + if (y > y_end) break; + if (click_y >= y && click_y < y + item_height) { if (item->masked || !item->Selectable()) return false; result = item->result; - click_result = item->OnClick(r.WithY(0, item_height - 1), {_cursor.pos.x - this->left, y}); + click_result = item->OnClick(r.WithY(0, item_height - 1), {_cursor.pos.x - this->left, click_y - y}); return true; } - - y -= item_height; + y += item_height; } return false; @@ -262,16 +263,25 @@ struct DropdownWindow : Window { Colours colour = this->GetWidget(widget)->colour; Rect ir = r.Shrink(WidgetDimensions::scaled.dropdownlist); - int y = ir.top; - int pos = this->vscroll->GetPosition(); + + /* Setup a clipping rectangle... */ + DrawPixelInfo tmp_dpi; + if (!FillDrawPixelInfo(&tmp_dpi, ir)) return; + /* ...but keep coordinates relative to the window. */ + tmp_dpi.left += ir.left; + tmp_dpi.top += ir.top; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); + + int y = -this->vscroll->GetPosition(); + int y_end = ir.Height(); + for (const auto &item : this->list) { int item_height = item->Height(); /* Skip items that are scrolled up */ - if (--pos >= 0) continue; - - if (y + item_height - 1 <= ir.bottom) { - Rect full = ir.WithY(y, y + item_height - 1); + if (y > y_end) break; + if (y > -item_height) { + Rect full = ir.Translate(0, y).WithHeight(item_height); bool selected = (this->selected_result == item->result) && item->Selectable(); if (selected) GfxFillRect(full, PC_BLACK); From 2c9160767115d3a96a0a5392d473669de61b4022 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 09:38:50 +0100 Subject: [PATCH 255/280] Fix #14839, e4cf6ca0ba: do not set stacked widget height, which might not be shown --- src/timetable_gui.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index ea3e253e59..f7413e6678 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -240,7 +240,6 @@ struct TimetableWindow : Window { } [[fallthrough]]; - case WID_VT_ARRIVAL_DEPARTURE_SELECTION: case WID_VT_TIMETABLE_PANEL: fill.height = resize.height = GetCharacterHeight(FS_NORMAL); size.height = 8 * resize.height + padding.height; From 1829f7926d634b9062704bcd502b7ed1b5addee3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 6 Dec 2025 10:47:12 +0000 Subject: [PATCH 256/280] Change: Support side-by-side fallback FontCaches instead of hierarchical. (#13303) The text layouter system can now support using different fonts for different glyphs, including mixing scalable and sprite glyphs. --- src/console_cmds.cpp | 35 +++-- src/fontcache.cpp | 183 ++++++++++++++++++++------- src/fontcache.h | 139 ++++++++++++++++---- src/fontcache/freetypefontcache.cpp | 33 ++--- src/fontcache/spritefontcache.cpp | 41 +++--- src/fontcache/spritefontcache.h | 7 +- src/fontcache/truetypefontcache.cpp | 4 - src/gfx.cpp | 19 ++- src/gfx_layout.cpp | 88 ++++++------- src/gfx_layout.h | 35 +++-- src/gfx_layout_fallback.cpp | 31 ++--- src/gfx_layout_fallback.h | 19 +++ src/gfx_layout_icu.cpp | 100 ++++++++++----- src/lang/english.txt | 2 + src/os/macosx/font_osx.cpp | 35 ++--- src/os/macosx/font_osx.h | 2 +- src/os/macosx/string_osx.cpp | 74 +++++------ src/os/unix/font_unix.cpp | 49 ++++--- src/os/unix/font_unix.h | 2 +- src/os/windows/font_win32.cpp | 42 +++--- src/os/windows/font_win32.h | 4 +- src/os/windows/string_uniscribe.cpp | 98 +++++++++----- src/settings_gui.cpp | 34 ++++- src/strings.cpp | 88 +++++++------ src/strings_func.h | 43 ++++--- src/survey.cpp | 14 +- src/table/settings/misc_settings.ini | 6 + src/tests/mock_fontcache.h | 7 +- src/textfile_gui.cpp | 15 +-- src/textfile_gui.h | 4 +- src/widgets/settings_widget.h | 2 + src/zoom_func.h | 10 ++ 32 files changed, 784 insertions(+), 481 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 7b97fab118..e0402b4454 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2319,6 +2319,18 @@ static bool ConContent(std::span argv) } #endif /* defined(WITH_ZLIB) */ +/** + * Get string representation of a font load reason. + * @param load_reason The font load reason. + * @return String representation. + */ +static std::string_view FontLoadReasonToName(FontLoadReason load_reason) +{ + static const std::string_view LOAD_REASON_TO_NAME[] = { "default", "configured", "language" }; + static_assert(std::size(LOAD_REASON_TO_NAME) == to_underlying(FontLoadReason::End)); + return LOAD_REASON_TO_NAME[to_underlying(load_reason)]; +} + static bool ConFont(std::span argv) { if (argv.empty()) { @@ -2367,17 +2379,18 @@ static bool ConFont(std::span argv) SetFont(argfs, font, size); } - for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) { - FontCache *fc = FontCache::Get(fs); - FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); - /* Make sure all non sprite fonts are loaded. */ - if (!setting->font.empty() && !fc->HasParent()) { - FontCache::LoadFontCaches(fs); - fc = FontCache::Get(fs); - } - IConsolePrint(CC_DEFAULT, "{} font:", FontSizeToName(fs)); - IConsolePrint(CC_DEFAULT, "Currently active: \"{}\", size {}", fc->GetFontName(), fc->GetFontSize()); - IConsolePrint(CC_DEFAULT, "Requested: \"{}\", size {}", setting->font, setting->size); + IConsolePrint(CC_INFO, "Configured fonts:"); + for (uint i = 0; FontSize fs : FONTSIZES_ALL) { + const FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); + IConsolePrint(CC_DEFAULT, "{}) {} font: \"{}\", size {}", i, FontSizeToName(fs), setting->font, setting->size); + ++i; + } + + IConsolePrint(CC_INFO, "Currently active fonts:"); + for (uint i = 0; const auto &fc : FontCache::Get()) { + if (fc == nullptr) continue; + IConsolePrint(CC_DEFAULT, "{}) {} font: \"{}\" size {} [{}]", i, FontSizeToName(fc->GetSize()), fc->GetFontName(), fc->GetFontSize(), FontLoadReasonToName(fc->GetFontLoadReason())); + ++i; } return true; diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 4589ff88d1..379516ca3d 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -8,6 +8,8 @@ /** @file fontcache.cpp Cache for characters from fonts. */ #include "stdafx.h" + +#include "core/string_consumer.hpp" #include "fontcache.h" #include "blitter/factory.hpp" #include "gfx_layout.h" @@ -17,13 +19,14 @@ #include "viewport_func.h" #include "window_func.h" #include "fileio_func.h" +#include "zoom_func.h" #include "safeguards.h" /** Default unscaled heights for the different sizes of fonts. */ /* static */ const int FontCache::DEFAULT_FONT_HEIGHT[FS_END] = {10, 6, 18, 10}; /** Default unscaled ascenders for the different sizes of fonts. */ -/* static */ const int FontCache::DEFAULT_FONT_ASCENDER[FS_END] = {8, 5, 15, 8}; +/* static */ const int FontCache::DEFAULT_FONT_ASCENDER[FS_END] = {8, 6, 15, 8}; FontCacheSettings _fcsettings; @@ -33,10 +36,10 @@ FontCacheSettings _fcsettings; * @param fonttype Font type requested. * @return FontCache of the font if loaded, or nullptr. */ -/* static */ std::unique_ptr FontProviderManager::LoadFont(FontSize fs, FontType fonttype) +/* static */ std::unique_ptr FontProviderManager::LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font_name, std::span os_handle) { for (auto &provider : FontProviderManager::GetProviders()) { - auto fc = provider->LoadFont(fs, fonttype); + auto fc = provider->LoadFont(fs, fonttype, search, font_name, os_handle); if (fc != nullptr) return fc; } @@ -52,10 +55,10 @@ FontCacheSettings _fcsettings; * @param callback The function to call to check for missing glyphs. * @return true if a font has been set, false otherwise. */ -/* static */ bool FontProviderManager::FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) +/* static */ bool FontProviderManager::FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback) { return std::ranges::any_of(FontProviderManager::GetProviders(), - [&](auto *provider) { return provider->FindFallbackFont(settings, language_isocode, callback); }); + [&](auto *provider) { return provider->FindFallbackFont(language_isocode, fontsizes, callback); }); } int FontCache::GetDefaultFontHeight(FontSize fs) @@ -63,21 +66,33 @@ int FontCache::GetDefaultFontHeight(FontSize fs) return FontCache::DEFAULT_FONT_HEIGHT[fs]; } -/** - * Get the font name of a given font size. - * @param fs The font size to look up. - * @return The font name. - */ -std::string FontCache::GetName(FontSize fs) +/* static */ void FontCache::UpdateCharacterHeight(FontSize fs) { - FontCache *fc = FontCache::Get(fs); - if (fc != nullptr) { - return fc->GetFontName(); - } else { - return "[NULL]"; + FontMetrics &metrics = FontCache::metrics[fs]; + + int ascender = 0; + int descender = 0; + + for (const auto &fc : FontCache::caches) { + if (fc == nullptr || fc->fs != fs) continue; + ascender = std::max(ascender, fc->ascender); + descender = std::min(descender, fc->descender); } + + if (ascender == 0 && descender == 0) { + /* It's possible that no font is loaded yet, in which case use default values. */ + ascender = ScaleGUITrad(FontCache::DEFAULT_FONT_ASCENDER[fs]); + descender = ScaleGUITrad(FontCache::DEFAULT_FONT_ASCENDER[fs] - FontCache::DEFAULT_FONT_HEIGHT[fs]); + } + + metrics.height = ascender - descender; + metrics.baseline = ascender; } +int FontCache::GetGlyphYOffset() +{ + return FontCache::GetFontBaseline(this->fs) - this->ascender; +} /** * Get height of a character for a given font size. @@ -86,20 +101,22 @@ std::string FontCache::GetName(FontSize fs) */ int GetCharacterHeight(FontSize size) { - return FontCache::Get(size)->GetHeight(); + uint height = FontCache::GetCharacterHeight(size); + if (height == 0) height = ScaleGUITrad(FontCache::GetDefaultFontHeight(FS_MONO)); + return height; } - -/* static */ std::array, FS_END> FontCache::caches{}; +/* static */ FontCache::FontCaches FontCache::caches; +/* static */ std::array FontCache::metrics{}; +/* static */ std::array FontCache::default_font_index{}; /** * Initialise font caches with the base sprite font cache for all sizes. */ /* static */ void FontCache::InitializeFontCaches() { - for (FontSize fs = FS_BEGIN; fs != FS_END; fs++) { - if (FontCache::Get(fs) != nullptr) continue; - FontCache::Register(FontProviderManager::LoadFont(fs, FontType::Sprite)); + for (FontSize fs : FONTSIZES_ALL) { + UpdateCharacterHeight(fs); } } @@ -130,19 +147,13 @@ void SetFont(FontSize fontsize, const std::string &font, uint size) if (!changed) return; if (fontsize != FS_MONO) { - /* Try to reload only the modified font. */ - FontCacheSettings backup = _fcsettings; - for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) { - if (fs == fontsize) continue; - FontCache *fc = FontCache::Get(fs); - GetFontCacheSubSetting(fs)->font = fc->HasParent() ? fc->GetFontName() : ""; - } + /* Check if fallback fonts are needed. */ CheckForMissingGlyphs(); - _fcsettings = std::move(backup); } else { FontCache::LoadFontCaches(fontsize); } + FontCache::UpdateCharacterHeight(fontsize); LoadStringWidthTable(fontsize); UpdateAllVirtCoords(); ReInitAllWindows(true); @@ -156,7 +167,7 @@ void SetFont(FontSize fontsize, const std::string &font, uint size) */ static bool IsDefaultFont(const FontCacheSubSetting &setting) { - return setting.font.empty() && setting.os_handle == nullptr; + return setting.font.empty(); } /** @@ -193,7 +204,7 @@ static std::string GetDefaultTruetypeFont(FontSize fs) * @param fs Font size. * @return Full path of default font file. */ -static std::string GetDefaultTruetypeFontFile([[maybe_unused]] FontSize fs) +std::string GetDefaultTruetypeFontFile([[maybe_unused]] FontSize fs) { #if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) /* Find font file. */ @@ -216,18 +227,54 @@ std::string GetFontCacheFontName(FontSize fs) return GetDefaultTruetypeFontFile(fs); } -/** - * Register a FontCache for its font size. - * @param fc FontCache to register. - */ -/* static */ void FontCache::Register(std::unique_ptr &&fc) +/* static */ void FontCache::Register(std::unique_ptr &&fc, FontLoadReason load_reason) { if (fc == nullptr) return; FontSize fs = fc->fs; - fc->parent = std::move(FontCache::caches[fs]); - FontCache::caches[fs] = std::move(fc); + /* Find an empty font cache slot. */ + auto it = std::find(std::begin(FontCache::caches), std::end(FontCache::caches), nullptr); + if (it == std::end(FontCache::caches)) it = FontCache::caches.insert(it, nullptr); + + /* Set up our font index and make us the default font cache for this font size. */ + fc->font_index = static_cast(std::distance(std::begin(FontCache::caches), it)); + fc->load_reason = load_reason; + FontCache::default_font_index[fs] = fc->font_index; + + /* Register this font cache in the slot. */ + *it = std::move(fc); +} + +/** + * Add a fallback font, with optional OS-specific handle. + * @param fontsizes Fontsizes to add fallback to. + * @param name Name of font to add. + * @param handle OS-specific handle or data of font. + */ +/* static */ void FontCache::AddFallback(FontSizes fontsizes, FontLoadReason load_reason, std::string_view name, std::span os_data) +{ + for (FontSize fs : fontsizes) { + GetFontCacheSubSetting(fs)->fallback_fonts.emplace_back(load_reason, std::string{name}, std::vector{os_data.begin(), os_data.end()}); + } +} + +/* static */ void FontCache::LoadDefaultFonts(FontSize fs) +{ + /* Load the sprite font, even if it's not preferred. */ + FontCache::Register(FontProviderManager::LoadFont(fs, FontType::Sprite, false, {}, {}), FontLoadReason::Default); + if (!_fcsettings.prefer_sprite) { + /* Load the default truetype font if sprite font is not preferred. */ + FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType, false, GetDefaultTruetypeFontFile(fs), {}), FontLoadReason::Default); + } +} + +/* static */ void FontCache::LoadFallbackFonts(FontSize fs) +{ + const FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); + for (auto it = setting->fallback_fonts.rbegin(); it != setting->fallback_fonts.rend(); ++it) { + FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType, false, it->name, it->os_handle), it->load_reason); + } } /** @@ -236,17 +283,53 @@ std::string GetFontCacheFontName(FontSize fs) */ /* static */ void FontCache::LoadFontCaches(FontSizes fontsizes) { - FontCache::InitializeFontCaches(); + static constexpr std::string_view FALLBACK_FONT = "fallback"; + static constexpr std::string_view DEFAULT_FONT = "default"; + static constexpr std::initializer_list extra_prefer_default = {DEFAULT_FONT, FALLBACK_FONT}; + static constexpr std::initializer_list extra_prefer_fallback = {FALLBACK_FONT, DEFAULT_FONT}; for (FontSize fs : fontsizes) { Layouter::ResetFontCache(fs); + FontCache::default_font_index[fs] = INVALID_FONT_INDEX; + } - /* Unload everything except the sprite font cache. */ - while (FontCache::Get(fs)->HasParent()) { - FontCache::caches[fs] = std::move(FontCache::caches[fs]->parent); + /* Remove all existing FontCaches. */ + if (fontsizes == FONTSIZES_ALL) { + FontCache::caches.clear(); + } else { + for (auto it = std::begin(FontCache::caches); it != std::end(FontCache::caches); ++it) { + if (*it == nullptr) continue; + if (!fontsizes.Test((*it)->fs)) continue; + it->reset(); + } + } + + for (FontSize fs : fontsizes) { + /* Parse configured fonts, separated by ';' into a list. */ + std::vector fontnames; + StringConsumer consumer(GetFontCacheSubSetting(fs)->font); + do { + auto fontname = StrTrimView(consumer.ReadUntilChar(';', StringConsumer::SKIP_ONE_SEPARATOR), " \t"); + if (!fontname.empty()) fontnames.push_back(fontname); + } while (consumer.AnyBytesLeft()); + + /* Add the default and fallback fonts as lowest priority if not manually specified. */ + for (const auto &extra_font : _fcsettings.prefer_default ? extra_prefer_default : extra_prefer_fallback) { + if (std::ranges::find(fontnames, extra_font) == std::end(fontnames)) fontnames.push_back(extra_font); } - FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType)); + /* Load configured fonts in reverse order so that the first entry has priority. */ + for (auto it = fontnames.rbegin(); it != fontnames.rend(); ++it) { + if (*it == DEFAULT_FONT) { + FontCache::LoadDefaultFonts(fs); + } else if (*it == FALLBACK_FONT) { + FontCache::LoadFallbackFonts(fs); + } else { + FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType, true, std::string{*it}, {}), FontLoadReason::Configured); + } + } + + FontCache::UpdateCharacterHeight(fs); } } @@ -256,8 +339,14 @@ std::string GetFontCacheFontName(FontSize fs) */ /* static */ void FontCache::ClearFontCaches(FontSizes fontsizes) { + for (const auto &fc : FontCache::caches) { + if (fc == nullptr) continue; + if (!fontsizes.Test(fc->GetSize())) continue; + fc->ClearFontCache(); + } + for (FontSize fs : fontsizes) { - FontCache::Get(fs)->ClearFontCache(); + FontCache::UpdateCharacterHeight(fs); } } @@ -266,7 +355,5 @@ std::string GetFontCacheFontName(FontSize fs) */ /* static */ void FontCache::UninitializeFontCaches() { - for (auto &fc : FontCache::caches) { - fc.reset(); - } + FontCache::caches.clear(); } diff --git a/src/fontcache.h b/src/fontcache.h index b03f84514d..0b2a054b28 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -16,20 +16,42 @@ /** Glyphs are characters from a font. */ typedef uint32_t GlyphID; -static const GlyphID SPRITE_GLYPH = 1U << 30; +using FontIndex = uint8_t; + +static const FontIndex INVALID_FONT_INDEX = std::numeric_limits::max(); + +enum class FontLoadReason : uint8_t { + Default, + Configured, + LanguageFallback, + End, +}; /** Font cache for basic fonts. */ class FontCache { protected: - static std::array, FS_END> caches; ///< All the font caches. - std::unique_ptr parent; ///< The parent of this font cache. + using FontCaches = std::vector>; + static FontCaches caches; + + struct FontMetrics { + int height = 0; + int baseline = 0; + }; + + static std::array metrics; + static std::array default_font_index; + const FontSize fs; ///< The size of the font. + FontIndex font_index; ///< The index of the font. + FontLoadReason load_reason; ///< Reason why the font is loaded. int height = 0; ///< The height of the font. int ascender = 0; ///< The ascender value of the font. int descender = 0; ///< The descender value of the font. FontCache(FontSize fs) : fs(fs) {} - static void Register(std::unique_ptr &&fc); + static void Register(std::unique_ptr &&fc, FontLoadReason load_reason); + static void LoadDefaultFonts(FontSize fs); + static void LoadFallbackFonts(FontSize fs); public: virtual ~FontCache() = default; @@ -46,12 +68,36 @@ public: static int GetDefaultFontHeight(FontSize fs); + static inline int GetFontBaseline(FontSize fs) + { + return FontCache::metrics[fs].baseline; + } + + static void AddFallback(FontSizes fontsizes, FontLoadReason load_reason, std::string_view name, std::span os_data = {}); + + /** + * Add a fallback font, with OS-specific handle. + * @param fontsizes Fontsizes to add fallback to. + * @param name Name of font to add. + * @param handle OS-specific handle or data of font. + */ + template + static void AddFallbackWithHandle(FontSizes fontsizes, FontLoadReason load_reason, std::string_view name, T &handle) + { + auto os_data = std::as_bytes(std::span(&handle, 1)); + FontCache::AddFallback(fontsizes, load_reason, name, os_data); + } + /** * Get the FontSize of the font. * @return The FontSize. */ inline FontSize GetSize() const { return this->fs; } + inline FontIndex GetIndex() const { return this->font_index; } + + inline FontLoadReason GetFontLoadReason() const { return this->load_reason; } + /** * Get the height of the font. * @return The height of the font. @@ -102,10 +148,9 @@ public: /** * Map a character into a glyph. * @param key The character. - * @param fallback Allow fallback to the parent font. * @return The glyph ID used to draw the character. */ - virtual GlyphID MapCharToGlyph(char32_t key, bool fallback = true) = 0; + virtual GlyphID MapCharToGlyph(char32_t key) = 0; /** * Get the native OS font handle, if there is one. @@ -122,25 +167,57 @@ public: */ virtual std::string GetFontName() = 0; + virtual int GetGlyphYOffset(); + + /** + * Get span of all FontCaches. + * @return Span of all FontCaches. + */ + static inline std::span> Get() + { + return FontCache::caches; + } + /** * Get the font cache of a given font size. * @param fs The font size to look up. * @return The font cache. */ - static inline FontCache *Get(FontSize fs) + static inline FontCache *Get(FontIndex font_index) { - assert(fs < FS_END); - return FontCache::caches[fs].get(); + assert(font_index < FontCache::caches.size()); + return FontCache::caches[font_index].get(); } - static std::string GetName(FontSize fs); - - /** - * Check whether the font cache has a parent. - */ - inline bool HasParent() + static inline int GetCharacterHeight(FontSize fs) { - return this->parent != nullptr; + return FontCache::metrics[fs].height; + } + + static void UpdateCharacterHeight(FontSize fs); + + static inline FontIndex GetDefaultFontIndex(FontSize fs) + { + return FontCache::default_font_index[fs]; + } + + static inline class FontCache *GetDefaultFontCache(FontSize fs) + { + FontIndex index = FontCache::GetDefaultFontIndex(fs); + if (index != INVALID_FONT_INDEX) return FontCache::Get(index); + NOT_REACHED(); + } + + static inline FontIndex GetFontIndexForCharacter(FontSize fs, char32_t c) + { + for (auto it = std::rbegin(FontCache::caches); it != std::rend(FontCache::caches); ++it) { + FontCache *fc = it->get(); + if (fc == nullptr) continue; + if (fc->GetSize() != fs) continue; + if (fc->MapCharToGlyph(c) == 0) continue; + return std::distance(std::begin(FontCache::caches), std::next(it).base()); + } + return INVALID_FONT_INDEX; } /** @@ -152,28 +229,33 @@ public: /** Get the Sprite for a glyph */ inline const Sprite *GetGlyph(FontSize size, char32_t key) { - FontCache *fc = FontCache::Get(size); + FontIndex font_index = FontCache::GetFontIndexForCharacter(size, key); + FontCache *fc = font_index != INVALID_FONT_INDEX ? FontCache::Get(font_index) : FontCache::GetDefaultFontCache(size); + if (fc == nullptr) return nullptr; return fc->GetGlyph(fc->MapCharToGlyph(key)); } /** Get the width of a glyph */ inline uint GetGlyphWidth(FontSize size, char32_t key) { - FontCache *fc = FontCache::Get(size); + FontIndex font_index = FontCache::GetFontIndexForCharacter(size, key); + FontCache *fc = font_index != INVALID_FONT_INDEX ? FontCache::Get(font_index) : FontCache::GetDefaultFontCache(size); + if (fc == nullptr) return 0; return fc->GetGlyphWidth(fc->MapCharToGlyph(key)); } -inline bool GetDrawGlyphShadow(FontSize size) -{ - return FontCache::Get(size)->GetDrawGlyphShadow(); -} - /** Settings for a single font. */ struct FontCacheSubSetting { std::string font; ///< The name of the font, or path to the font. uint size; ///< The (requested) size of the font. - const void *os_handle = nullptr; ///< Optional native OS font info. Only valid during font search. + struct FontCacheFallback { + FontLoadReason load_reason = FontLoadReason::LanguageFallback; + std::string name; + std::vector os_handle; + }; + + std::vector fallback_fonts; }; /** Settings for the four different fonts. */ @@ -184,6 +266,7 @@ struct FontCacheSettings { FontCacheSubSetting mono; ///< The mono space font used for license/readme viewers. bool prefer_sprite; ///< Whether to prefer the built-in sprite font over resizable fonts. bool global_aa; ///< Whether to anti alias all font sizes. + bool prefer_default; ///< Prefer OpenTTD's default font over autodetected fallback fonts. }; extern FontCacheSettings _fcsettings; @@ -229,14 +312,14 @@ public: ProviderManager::Unregister(*this); } - virtual std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const = 0; - virtual bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) const = 0; + virtual std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font_name, std::span os_handle) const = 0; + virtual bool FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, class MissingGlyphSearcher *callback) const = 0; }; class FontProviderManager : ProviderManager { public: - static std::unique_ptr LoadFont(FontSize fs, FontType fonttype); - static bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback); + static std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font_name, std::span os_handle); + static bool FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, class MissingGlyphSearcher *callback); }; /* Implemented in spritefontcache.cpp */ diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 254b722415..33500d787a 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -41,7 +41,7 @@ public: FreeTypeFontCache(FontSize fs, FT_Face face, int pixels); ~FreeTypeFontCache(); void ClearFontCache() override; - GlyphID MapCharToGlyph(char32_t key, bool allow_fallback = true) override; + GlyphID MapCharToGlyph(char32_t key) override; std::string GetFontName() override { return fmt::format("{}, {}", face->family_name, face->style_name); } bool IsBuiltInFont() override { return false; } const void *GetOSHandle() override { return &face; } @@ -194,17 +194,11 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa) } -GlyphID FreeTypeFontCache::MapCharToGlyph(char32_t key, bool allow_fallback) +GlyphID FreeTypeFontCache::MapCharToGlyph(char32_t key) { assert(IsPrintable(key)); - FT_UInt glyph = FT_Get_Char_Index(this->face, key); - - if (glyph == 0 && allow_fallback && key >= SCC_SPRITE_START && key <= SCC_SPRITE_END) { - return this->parent->MapCharToGlyph(key); - } - - return glyph; + return FT_Get_Char_Index(this->face, key); } FT_Library _ft_library = nullptr; @@ -226,15 +220,10 @@ public: * format is 'font family name' or 'font family name, font style'. * @param fs The font size to load. */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font, std::span os_handle) const override { if (fonttype != FontType::TrueType) return nullptr; - FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - - std::string font = GetFontCacheFontName(fs); - if (font.empty()) return nullptr; - if (_ft_library == nullptr) { if (FT_Init_FreeType(&_ft_library) != FT_Err_Ok) { ShowInfo("Unable to initialize FreeType, using sprite fonts instead"); @@ -248,7 +237,9 @@ public: /* If font is an absolute path to a ttf, try loading that first. */ int32_t index = 0; - if (settings->os_handle != nullptr) index = *static_cast(settings->os_handle); + if (os_handle.size() == sizeof(index)) { + index = *reinterpret_cast(os_handle.data()); + } FT_Error error = FT_New_Face(_ft_library, font.c_str(), index, &face); if (error != FT_Err_Ok) { @@ -260,8 +251,8 @@ public: } #ifdef WITH_FONTCONFIG - /* Try loading based on font face name (OS-wide fonts). */ - if (error != FT_Err_Ok) error = GetFontByFaceName(font, &face); + /* If allowed to search, try loading based on font face name (OS-wide fonts). */ + if (error != FT_Err_Ok && search) error = GetFontByFaceName(font, &face); #endif /* WITH_FONTCONFIG */ if (error != FT_Err_Ok) { @@ -272,10 +263,10 @@ public: return LoadFont(fs, face, font, GetFontCacheFontSize(fs)); } - bool FindFallbackFont(struct FontCacheSettings *settings, const std::string &language_isocode, class MissingGlyphSearcher *callback) const override + bool FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback) const override { #ifdef WITH_FONTCONFIG - if (FontConfigFindFallbackFont(settings, language_isocode, callback)) return true; + if (FontConfigFindFallbackFont(language_isocode, fontsizes, callback)) return true; #endif /* WITH_FONTCONFIG */ return false; @@ -309,7 +300,7 @@ private: if (error != FT_Err_Ok) { FT_Done_Face(face); - ShowInfo("Unable to use '{}' for {} font, FreeType reported error 0x{:X}, using sprite font instead", font_name, FontSizeToName(fs), error); + ShowInfo("Unable to use '{}' for {} font, FreeType reported error 0x{:X}", font_name, FontSizeToName(fs), error); return nullptr; } diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index 8d67237266..c20aa68445 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -23,16 +23,6 @@ static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter. -/** - * Scale traditional pixel dimensions to font zoom level, for drawing sprite fonts. - * @param value Pixel amount at #ZOOM_BASE (traditional "normal" interface size). - * @return Pixel amount at _font_zoom (current interface size). - */ -static int ScaleFontTrad(int value) -{ - return UnScaleByZoom(value * ZOOM_BASE, _font_zoom); -} - static std::array, FS_END> _char_maps{}; ///< Glyph map for each font size. /** @@ -116,37 +106,48 @@ void InitializeUnicodeGlyphMap() */ SpriteFontCache::SpriteFontCache(FontSize fs) : FontCache(fs) { - this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); - this->ascender = (this->height - ScaleFontTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2; + this->UpdateMetrics(); } void SpriteFontCache::ClearFontCache() { Layouter::ResetFontCache(this->fs); - this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs)); - this->ascender = (this->height - ScaleFontTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2; + this->UpdateMetrics(); +} + +void SpriteFontCache::UpdateMetrics() +{ + this->height = ScaleFontTrad(DEFAULT_FONT_HEIGHT[this->fs]); + this->ascender = ScaleGUITrad(DEFAULT_FONT_ASCENDER[this->fs]); + this->descender = ScaleGUITrad(DEFAULT_FONT_ASCENDER[this->fs] - DEFAULT_FONT_HEIGHT[this->fs]); + this->scaled_ascender = ScaleFontTrad(DEFAULT_FONT_ASCENDER[this->fs]); +} + +int SpriteFontCache::GetGlyphYOffset() +{ + return FontCache::GetFontBaseline(this->fs) - this->scaled_ascender; } const Sprite *SpriteFontCache::GetGlyph(GlyphID key) { - SpriteID sprite = static_cast(key & ~SPRITE_GLYPH); + SpriteID sprite = static_cast(key); if (sprite == 0) sprite = GetUnicodeGlyph(this->fs, '?'); return GetSprite(sprite, SpriteType::Font); } uint SpriteFontCache::GetGlyphWidth(GlyphID key) { - SpriteID sprite = static_cast(key & ~SPRITE_GLYPH); + SpriteID sprite = static_cast(key); if (sprite == 0) sprite = GetUnicodeGlyph(this->fs, '?'); return SpriteExists(sprite) ? GetSprite(sprite, SpriteType::Font)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0; } -GlyphID SpriteFontCache::MapCharToGlyph(char32_t key, [[maybe_unused]] bool allow_fallback) +GlyphID SpriteFontCache::MapCharToGlyph(char32_t key) { assert(IsPrintable(key)); SpriteID sprite = GetUnicodeGlyph(this->fs, key); if (sprite == 0) return 0; - return SPRITE_GLYPH | sprite; + return static_cast(sprite); } bool SpriteFontCache::GetDrawGlyphShadow() @@ -158,14 +159,14 @@ class SpriteFontCacheFactory : public FontCacheFactory { public: SpriteFontCacheFactory() : FontCacheFactory("sprite", "Sprite font provider") {} - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool, const std::string &, std::span) const override { if (fonttype != FontType::Sprite) return nullptr; return std::make_unique(fs); } - bool FindFallbackFont(struct FontCacheSettings *, const std::string &, class MissingGlyphSearcher *) const override + bool FindFallbackFont(const std::string &, FontSizes, class MissingGlyphSearcher *) const override { return false; } diff --git a/src/fontcache/spritefontcache.h b/src/fontcache/spritefontcache.h index 5403348cbe..183e31e7dc 100644 --- a/src/fontcache/spritefontcache.h +++ b/src/fontcache/spritefontcache.h @@ -17,12 +17,17 @@ class SpriteFontCache : public FontCache { public: SpriteFontCache(FontSize fs); void ClearFontCache() override; + int GetGlyphYOffset() override; const Sprite *GetGlyph(GlyphID key) override; uint GetGlyphWidth(GlyphID key) override; bool GetDrawGlyphShadow() override; - GlyphID MapCharToGlyph(char32_t key, bool allow_fallback = true) override; + GlyphID MapCharToGlyph(char32_t key) override; std::string GetFontName() override { return "sprite"; } bool IsBuiltInFont() override { return true; } + +private: + void UpdateMetrics(); + int scaled_ascender; }; #endif /* SPRITEFONTCACHE_H */ diff --git a/src/fontcache/truetypefontcache.cpp b/src/fontcache/truetypefontcache.cpp index 890464e039..fe0a358c69 100644 --- a/src/fontcache/truetypefontcache.cpp +++ b/src/fontcache/truetypefontcache.cpp @@ -64,8 +64,6 @@ bool TrueTypeFontCache::GetDrawGlyphShadow() uint TrueTypeFontCache::GetGlyphWidth(GlyphID key) { - if ((key & SPRITE_GLYPH) != 0) return this->parent->GetGlyphWidth(key); - GlyphEntry *glyph = this->GetGlyphPtr(key); if (glyph == nullptr || glyph->data == nullptr) { this->GetGlyph(key); @@ -77,8 +75,6 @@ uint TrueTypeFontCache::GetGlyphWidth(GlyphID key) const Sprite *TrueTypeFontCache::GetGlyph(GlyphID key) { - if ((key & SPRITE_GLYPH) != 0) return this->parent->GetGlyph(key); - /* Check for the glyph in our cache */ GlyphEntry *glyph = this->GetGlyphPtr(key); if (glyph != nullptr && glyph->data != nullptr) return glyph->GetSprite(); diff --git a/src/gfx.cpp b/src/gfx.cpp index 87b6c7c50e..8ad6de81cc 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -537,7 +537,7 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, * another size would be chosen it won't have truncated too little for * the truncation dots. */ - truncation_layout.emplace(GetEllipsis(), INT32_MAX, line.GetVisualRun(0).GetFont()->fc->GetSize()); + truncation_layout.emplace(GetEllipsis(), INT32_MAX, line.GetVisualRun(0).GetFont().GetFontCache().GetSize()); truncation_width = truncation_layout->GetBounds().width; /* Is there enough space even for an ellipsis? */ @@ -593,15 +593,15 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, const ParagraphLayouter::VisualRun &run = line.GetVisualRun(run_index); const auto &glyphs = run.GetGlyphs(); const auto &positions = run.GetPositions(); - const Font *f = run.GetFont(); + const Font &f = run.GetFont(); - FontCache *fc = f->fc; - TextColour colour = f->colour; + FontCache &fc = f.GetFontCache(); + TextColour colour = f.colour; if (colour == TC_INVALID || HasFlag(initial_colour, TC_FORCED)) colour = initial_colour; bool colour_has_shadow = (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK; /* Update the last colour for the truncation ellipsis. */ last_colour = colour; - if (do_shadow && (!fc->GetDrawGlyphShadow() || !colour_has_shadow)) continue; + if (do_shadow && (!fc.GetDrawGlyphShadow() || !colour_has_shadow)) continue; SetColourRemap(do_shadow ? TC_BLACK : colour); for (int i = 0; i < run.GetGlyphCount(); i++) { @@ -616,13 +616,10 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, /* Truncated away. */ if (truncation && (begin_x < min_x || end_x > max_x)) continue; + /* Outside the clipping area. */ + if (begin_x > dpi_right || end_x < dpi_left) continue; - const Sprite *sprite = fc->GetGlyph(glyph); - /* Check clipping (the "+ 1" is for the shadow). */ - if (begin_x + sprite->x_offs > dpi_right || begin_x + sprite->x_offs + sprite->width /* - 1 + 1 */ < dpi_left) continue; - - if (do_shadow && (glyph & SPRITE_GLYPH) != 0) continue; - + const Sprite *sprite = fc.GetGlyph(glyph); GfxMainBlitter(sprite, begin_x + (do_shadow ? shadow_offset : 0), top + (do_shadow ? shadow_offset : 0), BlitterMode::ColourRemap); } } diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 32f0f7bd46..e39863bf39 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -37,21 +37,6 @@ /** Cache of ParagraphLayout lines. */ std::unique_ptr Layouter::linecache; -/** Cache of Font instances. */ -Layouter::FontColourMap Layouter::fonts[FS_END]; - - -/** - * Construct a new font. - * @param size The font size to use for this font. - * @param colour The colour to draw this font in. - */ -Font::Font(FontSize size, TextColour colour) : - fc(FontCache::Get(size)), colour(colour) -{ - assert(size < FS_END); -} - /** * Helper for getting a ParagraphLayouter of the given type. * @@ -71,7 +56,7 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s const typename T::CharType *buffer_last = buff_begin + str.size() + 1; typename T::CharType *buff = buff_begin; FontMap &font_mapping = line.runs; - Font *f = Layouter::GetFont(state.fontsize, state.cur_colour); + Font f{state.font_index, state.cur_colour}; font_mapping.clear(); @@ -80,7 +65,10 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s * whenever the font changes, and convert the wide characters into a format * usable by ParagraphLayout. */ - for (char32_t c : Utf8View(str)) { + Utf8View view(str); + for (auto it = view.begin(); it != view.end(); /* nothing */) { + auto cur = it; + uint32_t c = *it++; if (c == '\0' || c == '\n') { /* Caller should already have filtered out these characters. */ NOT_REACHED(); @@ -95,19 +83,40 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s } else { /* Filter out non printable characters */ if (!IsPrintable(c)) continue; - /* Filter out text direction characters that shouldn't be drawn, and - * will not be handled in the fallback case because they are mostly - * needed for RTL languages which need more proper shaping support. */ - if (!T::SUPPORTS_RTL && IsTextDirectionChar(c)) continue; - buff += T::AppendToBuffer(buff, buffer_last, c); - if (buff >= buffer_last) break; - continue; + + if (IsTextDirectionChar(c)) { + /* Filter out text direction characters that shouldn't be drawn, and + * will not be handled in the fallback case because they are mostly + * needed for RTL languages which need more proper shaping support. */ + if constexpr (!T::SUPPORTS_RTL) continue; + + buff += T::AppendToBuffer(buff, buffer_last, c); + if (buff >= buffer_last) break; + continue; + } + + FontIndex font_index = FontCache::GetFontIndexForCharacter(state.fontsize, c); + + if (font_index == INVALID_FONT_INDEX) { + font_index = FontCache::GetDefaultFontIndex(state.fontsize); + } + + if (state.font_index == font_index) { + buff += T::AppendToBuffer(buff, buffer_last, c); + if (buff >= buffer_last) break; + continue; + } + + /* This character goes in the next run so don't advance. */ + state.font_index = font_index; + + it = cur; } - if (font_mapping.empty() || font_mapping.back().first != buff - buff_begin) { + if (buff - buff_begin > 0 && (font_mapping.empty() || font_mapping.back().first != buff - buff_begin)) { font_mapping.emplace_back(buff - buff_begin, f); } - f = Layouter::GetFont(state.fontsize, state.cur_colour); + f = {state.font_index, state.cur_colour}; } /* Better safe than sorry. */ @@ -116,6 +125,14 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s if (font_mapping.empty() || font_mapping.back().first != buff - buff_begin) { font_mapping.emplace_back(buff - buff_begin, f); } + + if constexpr (!std::is_same_v) { + /* Don't layout if all runs use a built-in font and we're not using the fallback layouter. */ + if (std::ranges::all_of(font_mapping, [](const auto &i) { return i.second.GetFontCache().IsBuiltInFont(); })) { + return; + } + } + line.layout = T::GetParagraphLayout(buff_begin, buff, font_mapping); line.state_after = state; } @@ -128,7 +145,7 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s */ Layouter::Layouter(std::string_view str, int maxw, FontSize fontsize) : string(str) { - FontState state(TC_INVALID, fontsize); + FontState state(TC_INVALID, fontsize, FontCache::GetDefaultFontIndex(fontsize)); while (true) { auto line_length = str.find_first_of('\n'); @@ -338,18 +355,6 @@ ptrdiff_t Layouter::GetCharAtPosition(int x, size_t line_index) const return -1; } -/** - * Get a static font instance. - */ -Font *Layouter::GetFont(FontSize size, TextColour colour) -{ - FontColourMap::iterator it = fonts[size].find(colour); - if (it != fonts[size].end()) return it->second.get(); - - fonts[size][colour] = std::make_unique(size, colour); - return fonts[size][colour].get(); -} - /** * Perform initialization of layout engine. */ @@ -362,12 +367,9 @@ void Layouter::Initialize() /** * Reset cached font information. - * @param size Font size to reset. */ -void Layouter::ResetFontCache(FontSize size) +void Layouter::ResetFontCache([[maybe_unused]] FontSize size) { - fonts[size].clear(); - /* We must reset the linecache since it references the just freed fonts */ ResetLineCache(); diff --git a/src/gfx_layout.h b/src/gfx_layout.h index b37741a59b..fa33c1f55c 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -12,8 +12,6 @@ #include "misc/lrucache.hpp" #include "fontcache.h" -#include "gfx_func.h" -#include "core/math_func.hpp" #include @@ -22,12 +20,13 @@ * of the same text, e.g. on line breaks. */ struct FontState { - FontSize fontsize; ///< Current font size. - TextColour cur_colour; ///< Current text colour. + FontSize fontsize; ///< Current font size. + FontIndex font_index; ///< Current font index. + TextColour cur_colour; ///< Current text colour. std::vector colour_stack; ///< Stack of colours to assist with colour switching. - FontState() : fontsize(FS_END), cur_colour(TC_INVALID) {} - FontState(TextColour colour, FontSize fontsize) : fontsize(fontsize), cur_colour(colour) {} + FontState() : fontsize(FS_END), font_index(INVALID_FONT_INDEX), cur_colour(TC_INVALID) {} + FontState(TextColour colour, FontSize fontsize, FontIndex font_index) : fontsize(fontsize), font_index(font_index), cur_colour(colour) {} auto operator<=>(const FontState &) const = default; @@ -67,6 +66,7 @@ struct FontState { inline void SetFontSize(FontSize f) { this->fontsize = f; + this->font_index = FontCache::GetDefaultFontIndex(this->fontsize); } }; @@ -85,9 +85,10 @@ template <> struct std::hash { std::size_t operator()(const FontState &state) const noexcept { size_t h1 = std::hash{}(state.fontsize); - size_t h2 = std::hash{}(state.cur_colour); - size_t h3 = std::hash>{}(state.colour_stack); - return h1 ^ (h2 << 1) ^ (h3 << 2); + size_t h2 = std::hash{}(state.font_index); + size_t h3 = std::hash{}(state.cur_colour); + size_t h4 = std::hash>{}(state.colour_stack); + return h1 ^ (h2 << 1) ^ (h3 << 2) ^ (h4 << 3); } }; @@ -96,14 +97,14 @@ template <> struct std::hash { */ class Font { public: - FontCache *fc; ///< The font we are using. - TextColour colour; ///< The colour this font has to be. + FontIndex font_index = INVALID_FONT_INDEX; ///< The font we are using. + TextColour colour = TC_INVALID; ///< The colour this font has to be. - Font(FontSize size, TextColour colour); + inline FontCache &GetFontCache() const { return *FontCache::Get(this->font_index); } }; /** Mapping from index to font. The pointer is owned by FontColourMap. */ -using FontMap = std::vector>; +using FontMap = std::vector>; /** * Interface to glue fallback and normal layouter into one. @@ -129,7 +130,7 @@ public: class VisualRun { public: virtual ~VisualRun() = default; - virtual const Font *GetFont() const = 0; + virtual const Font &GetFont() const = 0; virtual int GetGlyphCount() const = 0; virtual std::span GetGlyphs() const = 0; virtual std::span GetPositions() const = 0; @@ -205,18 +206,14 @@ private: static LineCacheItem &GetCachedParagraphLayout(std::string_view str, const FontState &state); - using FontColourMap = std::map>; - static FontColourMap fonts[FS_END]; public: - static Font *GetFont(FontSize size, TextColour colour); - Layouter(std::string_view str, int maxw = INT32_MAX, FontSize fontsize = FS_NORMAL); Dimension GetBounds(); ParagraphLayouter::Position GetCharPosition(std::string_view::const_iterator ch) const; ptrdiff_t GetCharAtPosition(int x, size_t line_index) const; static void Initialize(); - static void ResetFontCache(FontSize size); + static void ResetFontCache(FontSize fs); static void ResetLineCache(); }; diff --git a/src/gfx_layout_fallback.cpp b/src/gfx_layout_fallback.cpp index d2a43fb602..e24dd3de7b 100644 --- a/src/gfx_layout_fallback.cpp +++ b/src/gfx_layout_fallback.cpp @@ -10,6 +10,7 @@ #include "stdafx.h" #include "gfx_layout_fallback.h" +#include "gfx_func.h" #include "string_func.h" #include "zoom_func.h" @@ -43,15 +44,15 @@ public: std::vector positions; ///< The positions of the glyphs. std::vector glyph_to_char; ///< The char index of the glyphs. - Font *font; ///< The font used to layout these. + Font font; ///< The font used to layout these. public: - FallbackVisualRun(Font *font, const char32_t *chars, int glyph_count, int char_offset, int x); - const Font *GetFont() const override { return this->font; } + FallbackVisualRun(const Font &font, const char32_t *chars, int glyph_count, int char_offset, int x); + const Font &GetFont() const override { return this->font; } int GetGlyphCount() const override { return static_cast(this->glyphs.size()); } std::span GetGlyphs() const override { return this->glyphs; } std::span GetPositions() const override { return this->positions; } - int GetLeading() const override { return this->GetFont()->fc->GetHeight(); } + int GetLeading() const override { return GetCharacterHeight(this->GetFont().GetFontCache().GetSize()); } std::span GetGlyphToCharMap() const override { return this->glyph_to_char; } }; @@ -109,26 +110,20 @@ public: * @param char_offset This run's offset from the start of the layout input string. * @param x The initial x position for this run. */ -FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(Font *font, const char32_t *chars, int char_count, int char_offset, int x) : +FallbackParagraphLayout::FallbackVisualRun::FallbackVisualRun(const Font &font, const char32_t *chars, int char_count, int char_offset, int x) : font(font) { - const bool isbuiltin = font->fc->IsBuiltInFont(); - this->glyphs.reserve(char_count); this->glyph_to_char.reserve(char_count); this->positions.reserve(char_count); + FontCache &fc = this->font.GetFontCache(); + int y_offset = fc.GetGlyphYOffset();; int advance = x; for (int i = 0; i < char_count; i++) { - const GlyphID &glyph_id = this->glyphs.emplace_back(font->fc->MapCharToGlyph(chars[i])); - int x_advance = font->fc->GetGlyphWidth(glyph_id); - if (isbuiltin) { - this->positions.emplace_back(advance, advance + x_advance - 1, font->fc->GetAscender()); // Apply sprite font's ascender. - } else if (chars[i] >= SCC_SPRITE_START && chars[i] <= SCC_SPRITE_END) { - this->positions.emplace_back(advance, advance + x_advance - 1, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre - } else { - this->positions.emplace_back(advance, advance + x_advance - 1, 0); // No ascender adjustment. - } + const GlyphID &glyph_id = this->glyphs.emplace_back(fc.MapCharToGlyph(chars[i])); + int x_advance = fc.GetGlyphWidth(glyph_id); + this->positions.emplace_back(advance, advance + x_advance - 1, y_offset); // No ascender adjustment. advance += x_advance; this->glyph_to_char.push_back(char_offset + i); } @@ -233,7 +228,8 @@ std::unique_ptr FallbackParagraphLayout::NextLine assert(iter != this->runs.end()); } - const FontCache *fc = iter->second->fc; + const FontCache *fc = &iter->second.GetFontCache(); + assert(fc != nullptr); const char32_t *next_run = this->buffer_begin + iter->first; const char32_t *begin = this->buffer; @@ -251,6 +247,7 @@ std::unique_ptr FallbackParagraphLayout::NextLine if (this->buffer == next_run) { int w = l->GetWidth(); + assert(iter->second.font_index != INVALID_FONT_INDEX); l->emplace_back(iter->second, begin, this->buffer - begin, begin - this->buffer_begin, w); ++iter; assert(iter != this->runs.end()); diff --git a/src/gfx_layout_fallback.h b/src/gfx_layout_fallback.h index bd93ac0ab7..ad1858062c 100644 --- a/src/gfx_layout_fallback.h +++ b/src/gfx_layout_fallback.h @@ -26,5 +26,24 @@ public: static size_t AppendToBuffer(char32_t *buff, const char32_t *buffer_last, char32_t c); }; +/** + * Swap paired brackets for fallback RTL layouting. + * @param c Character to swap. + * @return Swapped character, or original character if it is not a paired bracket. + */ +inline char32_t SwapRtlPairedCharacters(char32_t c) +{ + /* There are many more paired brackets, but for fallback purposes we only handle ASCII brackets. */ + /* https://www.unicode.org/Public/UCD/latest/ucd/BidiBrackets.txt */ + switch (c) { + case U'(': return U')'; + case U')': return U'('; + case U'[': return U']'; + case U']': return U'['; + case U'{': return U'}'; + case U'}': return U'{'; + default: return c; + } +} #endif /* GFX_LAYOUT_FALLBACK_H */ diff --git a/src/gfx_layout_icu.cpp b/src/gfx_layout_icu.cpp index d7ee97e7ce..a5ec766972 100644 --- a/src/gfx_layout_icu.cpp +++ b/src/gfx_layout_icu.cpp @@ -11,6 +11,9 @@ #include "gfx_layout_icu.h" #include "debug.h" +#include "gfx_func.h" +#include "gfx_layout_fallback.h" +#include "string_func.h" #include "strings_func.h" #include "language.h" #include "table/control_codes.h" @@ -40,7 +43,7 @@ public: int length; ///< Length of the run in the buffer. UBiDiLevel level; ///< Embedding level of the run. UScriptCode script; ///< Script of the run. - Font *font; ///< Font of the run. + Font font; ///< Font of the run. std::vector glyphs; ///< The glyphs of the run. Valid after Shape() is called. std::vector advance; ///< The advance (width) of the glyphs. Valid after Shape() is called. @@ -48,9 +51,10 @@ public: std::vector positions; ///< The positions of the glyphs. Valid after Shape() is called. int total_advance = 0; ///< The total advance of the run. Valid after Shape() is called. - ICURun(int start, int length, UBiDiLevel level, UScriptCode script = USCRIPT_UNKNOWN, Font *font = nullptr) : start(start), length(length), level(level), script(script), font(font) {} + ICURun(int start, int length, UBiDiLevel level, UScriptCode script, const Font &font) : start(start), length(length), level(level), script(script), font(font) {} void Shape(UChar *buff, size_t length); + void FallbackShape(UChar *buff); }; /** @@ -66,7 +70,7 @@ public: std::vector glyph_to_char; int total_advance; - const Font *font; + Font font; public: ICUVisualRun(const ICURun &run, int x); @@ -75,8 +79,8 @@ public: std::span GetPositions() const override { return this->positions; } std::span GetGlyphToCharMap() const override { return this->glyph_to_char; } - const Font *GetFont() const override { return this->font; } - int GetLeading() const override { return this->font->fc->GetHeight(); } + const Font &GetFont() const override { return this->font; } + int GetLeading() const override { return GetCharacterHeight(this->font.GetFontCache().GetSize()); } int GetGlyphCount() const override { return this->glyphs.size(); } int GetAdvance() const { return this->total_advance; } }; @@ -141,6 +145,46 @@ ICUParagraphLayout::ICUVisualRun::ICUVisualRun(const ICURun &run, int x) : } } +/** + * Manually shape a run for built-in non-truetype fonts. + * Similar to but not quite the same as \a UniscribeRun::FallbackShape. + * @param buff The complete buffer of the run. + */ +void ICURun::FallbackShape(UChar *buff) +{ + FontCache &fc = this->font.GetFontCache(); + + this->glyphs.reserve(this->length); + this->glyph_to_char.reserve(this->length); + + /* Read each UTF-16 character, mapping to an appropriate glyph. */ + for (int i = this->start; i < this->start + this->length; i += Utf16IsLeadSurrogate(buff[i]) ? 2 : 1) { + char32_t c = Utf16DecodeChar(reinterpret_cast(buff + i)); + if (this->level & 1) c = SwapRtlPairedCharacters(c); + this->glyphs.emplace_back(fc.MapCharToGlyph(c)); + this->glyph_to_char.push_back(i); + } + + /* Reverse the sequence if this run is RTL. */ + if (this->level & 1) { + std::reverse(std::begin(this->glyphs), std::end(this->glyphs)); + std::reverse(std::begin(this->glyph_to_char), std::end(this->glyph_to_char)); + } + + this->positions.reserve(this->glyphs.size()); + + /* Set positions of each glyph. */ + int y_offset = fc.GetGlyphYOffset(); + int advance = 0; + for (const GlyphID glyph : this->glyphs) { + int x_advance = fc.GetGlyphWidth(glyph); + this->positions.emplace_back(advance, advance + x_advance - 1, y_offset); + this->advance.push_back(x_advance); + advance += x_advance; + } + this->total_advance = advance; +} + /** * Shape a single run. * @@ -149,7 +193,20 @@ ICUParagraphLayout::ICUVisualRun::ICUVisualRun(const ICURun &run, int x) : */ void ICURun::Shape(UChar *buff, size_t buff_length) { - auto hbfont = hb_ft_font_create_referenced(*(static_cast(font->fc->GetOSHandle()))); + FontCache &fc = this->font.GetFontCache(); + + /* Make sure any former run is lost. */ + this->glyphs.clear(); + this->glyph_to_char.clear(); + this->positions.clear(); + this->advance.clear(); + + if (fc.IsBuiltInFont()) { + this->FallbackShape(buff); + return; + } + + auto hbfont = hb_ft_font_create_referenced(*(static_cast(fc.GetOSHandle()))); /* Match the flags with how we render the glyphs. */ hb_ft_font_set_load_flags(hbfont, GetFontAAState() ? FT_LOAD_TARGET_NORMAL : FT_LOAD_TARGET_MONO); @@ -170,12 +227,6 @@ void ICURun::Shape(UChar *buff, size_t buff_length) auto glyph_info = hb_buffer_get_glyph_infos(hbbuf, &glyph_count); auto glyph_pos = hb_buffer_get_glyph_positions(hbbuf, &glyph_count); - /* Make sure any former run is lost. */ - this->glyphs.clear(); - this->glyph_to_char.clear(); - this->positions.clear(); - this->advance.clear(); - /* Reserve space, as we already know the size. */ this->glyphs.reserve(glyph_count); this->glyph_to_char.reserve(glyph_count); @@ -183,20 +234,12 @@ void ICURun::Shape(UChar *buff, size_t buff_length) this->advance.reserve(glyph_count); /* Prepare the glyphs/position. ICUVisualRun will give the position an offset if needed. */ + int y_offset = fc.GetGlyphYOffset(); hb_position_t advance = 0; for (unsigned int i = 0; i < glyph_count; i++) { - int x_advance; - - if (buff[glyph_info[i].cluster] >= SCC_SPRITE_START && buff[glyph_info[i].cluster] <= SCC_SPRITE_END && glyph_info[i].codepoint == 0) { - auto glyph = this->font->fc->MapCharToGlyph(buff[glyph_info[i].cluster]); - x_advance = this->font->fc->GetGlyphWidth(glyph); - this->glyphs.push_back(glyph); - this->positions.emplace_back(advance, advance + x_advance - 1, (this->font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(this->font->fc->GetSize()))) / 2); // Align sprite font to centre - } else { - x_advance = glyph_pos[i].x_advance / FONT_SCALE; - this->glyphs.push_back(glyph_info[i].codepoint); - this->positions.emplace_back(glyph_pos[i].x_offset / FONT_SCALE + advance, glyph_pos[i].x_offset / FONT_SCALE + advance + x_advance - 1, glyph_pos[i].y_offset / FONT_SCALE); - } + int x_advance = glyph_pos[i].x_advance / FONT_SCALE; + this->glyphs.push_back(glyph_info[i].codepoint); + this->positions.emplace_back(glyph_pos[i].x_offset / FONT_SCALE + advance, glyph_pos[i].x_offset / FONT_SCALE + advance + x_advance - 1, glyph_pos[i].y_offset / FONT_SCALE + y_offset); this->glyph_to_char.push_back(glyph_info[i].cluster); this->advance.push_back(x_advance); @@ -280,7 +323,7 @@ std::vector ItemizeBidi(UChar *buff, size_t length) UBiDiLevel level; ubidi_getLogicalRun(ubidi, start_pos, &logical_pos, &level); - runs.emplace_back(start_pos, logical_pos - start_pos, level); + runs.emplace_back(start_pos, logical_pos - start_pos, level, USCRIPT_UNKNOWN, Font{}); } assert(static_cast(count) == runs.size()); @@ -311,7 +354,7 @@ std::vector ItemizeScript(UChar *buff, size_t length, std::vectorstart + cur_run->length); assert(stop_pos - cur_pos > 0); - runs.emplace_back(cur_pos, stop_pos - cur_pos, cur_run->level, script_itemizer.getScriptCode()); + runs.emplace_back(cur_pos, stop_pos - cur_pos, cur_run->level, script_itemizer.getScriptCode(), Font{}); if (stop_pos == cur_run->start + cur_run->length) cur_run++; cur_pos = stop_pos; @@ -359,11 +402,6 @@ std::vector ItemizeStyle(std::vector &runs_current, FontMap &fon /* Can't layout an empty string. */ if (length == 0) return nullptr; - /* Can't layout our in-built sprite fonts. */ - for (auto const &[position, font] : font_mapping) { - if (font->fc->IsBuiltInFont()) return nullptr; - } - auto runs = ItemizeBidi(buff, length); runs = ItemizeScript(buff, length, runs); runs = ItemizeStyle(runs, font_mapping); diff --git a/src/lang/english.txt b/src/lang/english.txt index c95775c37d..3bcfc2b4a5 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1090,6 +1090,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Check this box STR_GAME_OPTIONS_GUI_FONT_SPRITE :Use traditional sprite font STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Check this box if you prefer to use the traditional fixed-size sprite font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Prefer default font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Check this box if you prefer to use the default font over discovered fallback fonts STR_GAME_OPTIONS_GUI_FONT_AA :Anti-alias fonts STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Check this box to anti-alias resizable fonts diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index e406a790b2..58e46fbd50 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -94,7 +94,7 @@ void CoreTextFontCache::SetFontSize(int pixels) Debug(fontcache, 2, "Loaded font '{}' with size {}", this->font_name, pixels); } -GlyphID CoreTextFontCache::MapCharToGlyph(char32_t key, bool allow_fallback) +GlyphID CoreTextFontCache::MapCharToGlyph(char32_t key) { assert(IsPrintable(key)); @@ -112,10 +112,6 @@ GlyphID CoreTextFontCache::MapCharToGlyph(char32_t key, bool allow_fallback) return glyph[0]; } - if (allow_fallback && key >= SCC_SPRITE_START && key <= SCC_SPRITE_END) { - return this->parent->MapCharToGlyph(key); - } - return 0; } @@ -211,29 +207,19 @@ public: * fallback search, use it. Otherwise, try to resolve it by font name. * @param fs The font size to load. */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override + std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font, std::span) const override { if (fonttype != FontType::TrueType) return nullptr; - FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - - std::string font = GetFontCacheFontName(fs); - if (font.empty()) return nullptr; - CFAutoRelease font_ref; - if (settings->os_handle != nullptr) { - font_ref.reset(static_cast(const_cast(settings->os_handle))); - CFRetain(font_ref.get()); // Increase ref count to match a later release. - } - - if (!font_ref && MacOSVersionIsAtLeast(10, 6, 0)) { + if (MacOSVersionIsAtLeast(10, 6, 0)) { /* Might be a font file name, try load it. */ font_ref.reset(LoadFontFromFile(font)); if (!font_ref) ShowInfo("Unable to load file '{}' for {} font, using default OS font selection instead", font, FontSizeToName(fs)); } - if (!font_ref) { + if (!font_ref && search) { CFAutoRelease name(CFStringCreateWithCString(kCFAllocatorDefault, font.c_str(), kCFStringEncodingUTF8)); /* Simply creating the font using CTFontCreateWithNameAndSize will *always* return @@ -259,7 +245,7 @@ public: return std::make_unique(fs, std::move(font_ref), GetFontCacheFontSize(fs)); } - bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) const override + bool FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback) const override { /* Determine fallback font using CoreText. This uses the language isocode * to find a suitable font. CoreText is available from 10.5 onwards. */ @@ -305,7 +291,7 @@ public: /* Skip bold fonts (especially Arial Bold, which looks worse than regular Arial). */ if (symbolic_traits & kCTFontBoldTrait) continue; /* Select monospaced fonts if asked for. */ - if (((symbolic_traits & kCTFontMonoSpaceTrait) == kCTFontMonoSpaceTrait) != callback->Monospace()) continue; + if (((symbolic_traits & kCTFontMonoSpaceTrait) == kCTFontMonoSpaceTrait) != fontsizes.Test(FS_MONO)) continue; /* Get font name. */ char buffer[128]; @@ -323,8 +309,9 @@ public: if (name.starts_with(".") || name.starts_with("LastResort")) continue; /* Save result. */ - callback->SetFontNames(settings, name); - if (!callback->FindMissingGlyphs()) { + FontCache::AddFallback(fontsizes, callback->GetLoadReason(), name); + + if (callback->FindMissingGlyphs().None()) { Debug(fontcache, 2, "CT-Font for {}: {}", language_isocode, name); result = true; break; @@ -335,8 +322,8 @@ public: if (!result) { /* For some OS versions, the font 'Arial Unicode MS' does not report all languages it * supports. If we didn't find any other font, just try it, maybe we get lucky. */ - callback->SetFontNames(settings, "Arial Unicode MS"); - result = !callback->FindMissingGlyphs(); + FontCache::AddFallback(fontsizes, callback->GetLoadReason(), "Arial Unicode MS"); + result = callback->FindMissingGlyphs().None(); } callback->FindMissingGlyphs(); diff --git a/src/os/macosx/font_osx.h b/src/os/macosx/font_osx.h index 2ba91d485d..48de29d62e 100644 --- a/src/os/macosx/font_osx.h +++ b/src/os/macosx/font_osx.h @@ -28,7 +28,7 @@ public: ~CoreTextFontCache() {} void ClearFontCache() override; - GlyphID MapCharToGlyph(char32_t key, bool allow_fallback = true) override; + GlyphID MapCharToGlyph(char32_t key) override; std::string GetFontName() override { return font_name; } bool IsBuiltInFont() override { return false; } const void *GetOSHandle() override { return font.get(); } diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index f142fb48b0..ed43d8cbba 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -9,6 +9,7 @@ #include "../../stdafx.h" #include "string_osx.h" +#include "../../gfx_func.h" #include "../../string_func.h" #include "../../strings_func.h" #include "../../core/utf8.hpp" @@ -52,7 +53,7 @@ extern "C" { /** Cached current locale. */ static CFAutoRelease _osx_locale; /** CoreText cache for font information, cleared when OTTD changes fonts. */ -static CFAutoRelease _font_cache[FS_END]; +static std::unordered_map> _font_cache; /** @@ -60,7 +61,6 @@ static CFAutoRelease _font_cache[FS_END]; */ class CoreTextParagraphLayout : public ParagraphLayouter { private: - const CoreTextParagraphLayoutFactory::CharType *text_buffer; ptrdiff_t length; const FontMap &font_map; @@ -77,18 +77,18 @@ public: std::vector glyph_to_char; int total_advance = 0; - Font *font; + Font font; public: - CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff); + CoreTextVisualRun(CTRunRef run, const Font &font); CoreTextVisualRun(CoreTextVisualRun &&other) = default; std::span GetGlyphs() const override { return this->glyphs; } std::span GetPositions() const override { return this->positions; } std::span GetGlyphToCharMap() const override { return this->glyph_to_char; } - const Font *GetFont() const override { return this->font; } - int GetLeading() const override { return this->font->fc->GetHeight(); } + const Font &GetFont() const override { return this->font; } + int GetLeading() const override { return GetCharacterHeight(this->font.GetFontCache().GetSize()); } int GetGlyphCount() const override { return (int)this->glyphs.size(); } int GetAdvance() const { return this->total_advance; } }; @@ -96,7 +96,7 @@ public: /** A single line worth of VisualRuns. */ class CoreTextLine : public std::vector, public ParagraphLayouter::Line { public: - CoreTextLine(CFAutoRelease line, const FontMap &font_mapping, const CoreTextParagraphLayoutFactory::CharType *buff) + CoreTextLine(CFAutoRelease line, const FontMap &font_mapping) { CFArrayRef runs = CTLineGetGlyphRuns(line.get()); for (CFIndex i = 0; i < CFArrayGetCount(runs); i++) { @@ -104,9 +104,9 @@ public: /* Extract font information for this run. */ CFRange chars = CTRunGetStringRange(run); - auto map = std::ranges::upper_bound(font_mapping, chars.location, std::less{}, &std::pair::first); + const auto &map = std::ranges::upper_bound(font_mapping, chars.location, std::less{}, &std::pair::first); - this->emplace_back(run, map->second, buff); + this->emplace_back(run, map->second); } } @@ -122,7 +122,7 @@ public: } }; - CoreTextParagraphLayout(CFAutoRelease typesetter, const CoreTextParagraphLayoutFactory::CharType *buffer, ptrdiff_t len, const FontMap &font_mapping) : text_buffer(buffer), length(len), font_map(font_mapping), typesetter(std::move(typesetter)) + CoreTextParagraphLayout(CFAutoRelease typesetter, ptrdiff_t len, const FontMap &font_mapping) : length(len), font_map(font_mapping), typesetter(std::move(typesetter)) { this->Reflow(); } @@ -137,17 +137,17 @@ public: /** Get the width of an encoded sprite font character. */ -static CGFloat SpriteFontGetWidth(void *ref_con) +static CGFloat CustomFontGetWidth(void *ref_con) { - FontSize fs = (FontSize)((size_t)ref_con >> 24); - char32_t c = (char32_t)((size_t)ref_con & 0xFFFFFF); + FontIndex fi = static_cast(reinterpret_cast(ref_con) >> 24); + char32_t c = static_cast(reinterpret_cast(ref_con) & 0xFFFFFF); - return GetGlyphWidth(fs, c); + return FontCache::Get(fi)->GetGlyphWidth(c); } static const CTRunDelegateCallbacks _sprite_font_callback = { kCTRunDelegateCurrentVersion, nullptr, nullptr, nullptr, - &SpriteFontGetWidth + &CustomFontGetWidth }; /* static */ std::unique_ptr CoreTextParagraphLayoutFactory::GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &font_mapping) @@ -158,11 +158,6 @@ static const CTRunDelegateCallbacks _sprite_font_callback = { ptrdiff_t length = buff_end - buff; if (length == 0) return nullptr; - /* Can't layout our in-built sprite fonts. */ - for (const auto &[position, font] : font_mapping) { - if (font->fc->IsBuiltInFont()) return nullptr; - } - /* Make attributed string with embedded font information. */ CFAutoRelease str(CFAttributedStringCreateMutable(kCFAllocatorDefault, 0)); CFAttributedStringBeginEditing(str.get()); @@ -179,25 +174,26 @@ static const CTRunDelegateCallbacks _sprite_font_callback = { for (const auto &[position, font] : font_mapping) { if (position - last == 0) continue; - CTFontRef font_handle = static_cast(font->fc->GetOSHandle()); + FontCache &fc = font.GetFontCache(); + CTFontRef font_handle = static_cast(fc.GetOSHandle()); if (font_handle == nullptr) { - if (!_font_cache[font->fc->GetSize()]) { + if (!_font_cache[fc.GetIndex()]) { /* Cache font information. */ - CFAutoRelease font_name(CFStringCreateWithCString(kCFAllocatorDefault, font->fc->GetFontName().c_str(), kCFStringEncodingUTF8)); - _font_cache[font->fc->GetSize()].reset(CTFontCreateWithName(font_name.get(), font->fc->GetFontSize(), nullptr)); + CFAutoRelease font_name(CFStringCreateWithCString(kCFAllocatorDefault, fc.GetFontName().c_str(), kCFStringEncodingUTF8)); + _font_cache[fc.GetIndex()].reset(CTFontCreateWithName(font_name.get(), fc.GetFontSize(), nullptr)); } - font_handle = _font_cache[font->fc->GetSize()].get(); + font_handle = _font_cache[fc.GetIndex()].get(); } CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTFontAttributeName, font_handle); - CGColorRef colour = CGColorCreateGenericGray((uint8_t)font->colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different. + CGColorRef colour = CGColorCreateGenericGray((uint8_t)font.colour / 255.0f, 1.0f); // We don't care about the real colours, just that they are different. CFAttributedStringSetAttribute(str.get(), CFRangeMake(last, position - last), kCTForegroundColorAttributeName, colour); CGColorRelease(colour); - /* Install a size callback for our special private-use sprite glyphs in case the font does not provide them. */ - for (ssize_t c = last; c < position; c++) { - if (buff[c] >= SCC_SPRITE_START && buff[c] <= SCC_SPRITE_END && font->fc->MapCharToGlyph(buff[c], false) == 0) { - CFAutoRelease del(CTRunDelegateCreate(&_sprite_font_callback, (void *)(size_t)(buff[c] | (font->fc->GetSize() << 24)))); + /* Install a size callback for our custom fonts. */ + if (fc.IsBuiltInFont()) { + for (ssize_t c = last; c < position; c++) { + CFAutoRelease del(CTRunDelegateCreate(&_sprite_font_callback, reinterpret_cast(static_cast(buff[c] | (fc.GetIndex() << 24))))); /* According to the official documentation, if a run delegate is used, the char should always be 0xFFFC. */ CFAttributedStringReplaceString(str.get(), CFRangeMake(c, 1), replacement_str.get()); CFAttributedStringSetAttribute(str.get(), CFRangeMake(c, 1), kCTRunDelegateAttributeName, del.get()); @@ -211,7 +207,7 @@ static const CTRunDelegateCallbacks _sprite_font_callback = { /* Create and return typesetter for the string. */ CFAutoRelease typesetter(CTTypesetterCreateWithAttributedString(str.get())); - return typesetter ? std::make_unique(std::move(typesetter), buff, length, font_mapping) : nullptr; + return typesetter ? std::make_unique(std::move(typesetter), length, font_mapping) : nullptr; } /* virtual */ std::unique_ptr CoreTextParagraphLayout::NextLine(int max_width) @@ -227,10 +223,10 @@ static const CTRunDelegateCallbacks _sprite_font_callback = { this->cur_offset += len; if (!line) return nullptr; - return std::make_unique(std::move(line), this->font_map, this->text_buffer); + return std::make_unique(std::move(line), this->font_map); } -CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font *font, const CoreTextParagraphLayoutFactory::CharType *buff) : font(font) +CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, const Font &font) : font(font) { this->glyphs.resize(CTRunGetGlyphCount(run)); @@ -247,19 +243,15 @@ CoreTextParagraphLayout::CoreTextVisualRun::CoreTextVisualRun(CTRunRef run, Font CTRunGetAdvances(run, CFRangeMake(0, 0), advs.get()); this->positions.reserve(this->glyphs.size()); + int y_offset = this->font.GetFontCache().GetGlyphYOffset(); + /* Convert glyph array to our data type. At the same time, substitute * the proper glyphs for our private sprite glyphs. */ auto gl = std::make_unique(this->glyphs.size()); CTRunGetGlyphs(run, CFRangeMake(0, 0), gl.get()); for (size_t i = 0; i < this->glyphs.size(); i++) { - if (buff[this->glyph_to_char[i]] >= SCC_SPRITE_START && buff[this->glyph_to_char[i]] <= SCC_SPRITE_END && (gl[i] == 0 || gl[i] == 3)) { - /* A glyph of 0 indicates not found, while apparently 3 is what char 0xFFFC maps to. */ - this->glyphs[i] = font->fc->MapCharToGlyph(buff[this->glyph_to_char[i]]); - this->positions.emplace_back(pts[i].x, pts[i].x + advs[i].width - 1, (font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(font->fc->GetSize()))) / 2); // Align sprite font to centre - } else { - this->glyphs[i] = gl[i]; - this->positions.emplace_back(pts[i].x, pts[i].x + advs[i].width - 1, pts[i].y); - } + this->glyphs[i] = gl[i]; + this->positions.emplace_back(pts[i].x, pts[i].x + advs[i].width - 1, pts[i].y + y_offset); } this->total_advance = (int)std::ceil(CTRunGetTypographicBounds(run, CFRangeMake(0, 0), nullptr, nullptr, nullptr)); } diff --git a/src/os/unix/font_unix.cpp b/src/os/unix/font_unix.cpp index 978695a853..3fa88cefc5 100644 --- a/src/os/unix/font_unix.cpp +++ b/src/os/unix/font_unix.cpp @@ -120,6 +120,10 @@ FT_Error GetFontByFaceName(std::string_view font_name, FT_Face *face) } } + if (err != FT_Err_Ok) { + ShowInfo("Unable to find '{}' font", font_name); + } + return err; } @@ -139,7 +143,7 @@ static int GetPreferredWeightDistance(int weight) return 0; } -bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) +bool FontConfigFindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback) { bool ret = false; @@ -148,22 +152,25 @@ bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string & auto fc_instance = AutoRelease(FcConfigReference(nullptr)); assert(fc_instance != nullptr); + /* Get set of required characters. */ + auto chars = callback->GetRequiredGlyphs(fontsizes); + /* Fontconfig doesn't handle full language isocodes, only the part * before the _ of e.g. en_GB is used, so "remove" everything after * the _. */ - std::string lang = fmt::format(":lang={}", language_isocode.substr(0, language_isocode.find('_'))); + std::string lang = language_isocode.empty() ? "" : fmt::format(":lang={}", language_isocode.substr(0, language_isocode.find('_'))); /* First create a pattern to match the wanted language. */ auto pat = AutoRelease(FcNameParse(ToFcString(lang))); /* We only want to know these attributes. */ - auto os = AutoRelease(FcObjectSetBuild(FC_FILE, FC_INDEX, FC_SPACING, FC_SLANT, FC_WEIGHT, nullptr)); + auto os = AutoRelease(FcObjectSetBuild(FC_FILE, FC_INDEX, FC_SPACING, FC_SLANT, FC_WEIGHT, FC_CHARSET, nullptr)); /* Get the list of filenames matching the wanted language. */ auto fs = AutoRelease(FcFontList(nullptr, pat.get(), os.get())); if (fs == nullptr) return ret; int best_weight = -1; - const char *best_font = nullptr; + std::string best_font; int best_index = 0; for (FcPattern *font : std::span(fs->fonts, fs->nfont)) { @@ -174,7 +181,7 @@ bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string & /* Get a font with the right spacing .*/ int value = 0; FcPatternGetInteger(font, FC_SPACING, 0, &value); - if (callback->Monospace() != (value == FC_MONO) && value != FC_DUAL) continue; + if (fontsizes.Test(FS_MONO) != (value == FC_MONO) && value != FC_DUAL) continue; /* Do not use those that explicitly say they're slanted. */ FcPatternGetInteger(font, FC_SLANT, 0, &value); @@ -185,26 +192,32 @@ bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string & int weight = GetPreferredWeightDistance(value); if (best_weight != -1 && weight > best_weight) continue; + size_t matching_chars = 0; + FcCharSet *charset; + FcPatternGetCharSet(font, FC_CHARSET, 0, &charset); + for (const char32_t &c : chars) { + if (FcCharSetHasChar(charset, c)) ++matching_chars; + } + + if (matching_chars < chars.size()) { + Debug(fontcache, 1, "Font \"{}\" misses {} glyphs", reinterpret_cast(file), chars.size() - matching_chars); + continue; + } + /* Possible match based on attributes, get index. */ int32_t index; res = FcPatternGetInteger(font, FC_INDEX, 0, &index); if (res != FcResultMatch) continue; - callback->SetFontNames(settings, FromFcString(file), &index); - - bool missing = callback->FindMissingGlyphs(); - Debug(fontcache, 1, "Font \"{}\" misses{} glyphs", FromFcString(file), missing ? "" : " no"); - - if (!missing) { - best_weight = weight; - best_font = FromFcString(file); - best_index = index; - } + best_weight = weight; + best_font = FromFcString(file); + best_index = index; } - if (best_font == nullptr) return false; + if (best_font.empty()) return false; + + FontCache::AddFallbackWithHandle(fontsizes, callback->GetLoadReason(), best_font, best_index); + FontCache::LoadFontCaches(fontsizes); - callback->SetFontNames(settings, best_font, &best_index); - FontCache::LoadFontCaches(callback->Monospace() ? FontSizes{FS_MONO} : FONTSIZES_REQUIRED); return true; } diff --git a/src/os/unix/font_unix.h b/src/os/unix/font_unix.h index bd1eea4416..37392d800d 100644 --- a/src/os/unix/font_unix.h +++ b/src/os/unix/font_unix.h @@ -19,7 +19,7 @@ FT_Error GetFontByFaceName(std::string_view font_name, FT_Face *face); -bool FontConfigFindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback); +bool FontConfigFindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback); #endif /* WITH_FONTCONFIG */ diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 24100a1704..d3a4c7be17 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -31,8 +31,8 @@ #include "../../safeguards.h" struct EFCParam { - FontCacheSettings *settings; - LOCALESIGNATURE locale; + LOCALESIGNATURE locale; + FontSizes fontsizes; MissingGlyphSearcher *callback; std::vector fonts; @@ -58,7 +58,7 @@ static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXT /* Don't use SYMBOL fonts */ if (logfont->elfLogFont.lfCharSet == SYMBOL_CHARSET) return 1; /* Use monospaced fonts when asked for it. */ - if (info->callback->Monospace() && (logfont->elfLogFont.lfPitchAndFamily & (FF_MODERN | FIXED_PITCH)) != (FF_MODERN | FIXED_PITCH)) return 1; + if (info->fontsizes.Test(FS_MONO) && (logfont->elfLogFont.lfPitchAndFamily & (FF_MODERN | FIXED_PITCH)) != (FF_MODERN | FIXED_PITCH)) return 1; /* The font has to have at least one of the supported locales to be usable. */ auto check_bitfields = [&]() { @@ -77,8 +77,8 @@ static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXT char font_name[MAX_PATH]; convert_from_fs(logfont->elfFullName, font_name); - info->callback->SetFontNames(info->settings, font_name, &logfont->elfLogFont); - if (info->callback->FindMissingGlyphs()) return 1; + FontCache::AddFallbackWithHandle(info->fontsizes, info->callback->GetLoadReason(), font_name, logfont->elfLogFont); + if (info->callback->FindMissingGlyphs().None()) return 1; Debug(fontcache, 1, "Fallback font: {}", font_name); return 0; // stop enumerating } @@ -158,7 +158,7 @@ void Win32FontCache::SetFontSize(int pixels) this->fontname = FS2OTTD((LPWSTR)((BYTE *)otm + (ptrdiff_t)otm->otmpFaceName)); - Debug(fontcache, 2, "Loaded font '{}' with size {}", this->fontname, pixels); + Debug(fontcache, 2, "Win32FontCache: Loaded font '{}' with size {}", this->fontname, pixels); delete[] (BYTE*)otm; } @@ -245,7 +245,7 @@ void Win32FontCache::ClearFontCache() return this->SetGlyphPtr(key, std::move(new_glyph)).GetSprite(); } -/* virtual */ GlyphID Win32FontCache::MapCharToGlyph(char32_t key, bool allow_fallback) +/* virtual */ GlyphID Win32FontCache::MapCharToGlyph(char32_t key) { assert(IsPrintable(key)); @@ -262,7 +262,7 @@ void Win32FontCache::ClearFontCache() GetGlyphIndicesW(this->dc, chars, key >= 0x010000U ? 2 : 1, glyphs, GGI_MARK_NONEXISTING_GLYPHS); if (glyphs[0] != 0xFFFF) return glyphs[0]; - return allow_fallback && key >= SCC_SPRITE_START && key <= SCC_SPRITE_END ? this->parent->MapCharToGlyph(key) : 0; + return 0; } class Win32FontCacheFactory : FontCacheFactory { @@ -270,32 +270,28 @@ public: Win32FontCacheFactory() : FontCacheFactory("win32", "Win32 font loader") {} /** - * Loads the GDI font. - * If a GDI font description is present, e.g. from the automatic font - * fallback search, use it. Otherwise, try to resolve it by font name. - * @param fs The font size to load. - */ - std::unique_ptr LoadFont(FontSize fs, FontType fonttype) const override + * Loads the GDI font. + * If a GDI font description is present, e.g. from the automatic font + * fallback search, use it. Otherwise, try to resolve it by font name. + * @param fs The font size to load. + */ + std::unique_ptr LoadFont(FontSize fs, FontType fonttype, bool search, const std::string &font, std::span os_handle) const override { if (fonttype != FontType::TrueType) return nullptr; - FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - - std::string font = GetFontCacheFontName(fs); - if (font.empty()) return nullptr; - LOGFONT logfont{}; logfont.lfPitchAndFamily = fs == FS_MONO ? FIXED_PITCH : VARIABLE_PITCH; logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfOutPrecision = OUT_OUTLINE_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; - if (settings->os_handle != nullptr) { - logfont = *(const LOGFONT *)settings->os_handle; + if (!os_handle.empty()) { + logfont = *reinterpret_cast(os_handle.data()); } else if (font.find('.') != std::string::npos) { /* Might be a font file name, try load it. */ if (!TryLoadFontFromFile(font, logfont)) { ShowInfo("Unable to load file '{}' for {} font, using default windows font selection instead", font, FontSizeToName(fs)); + if (!search) return nullptr; } } @@ -307,7 +303,7 @@ public: return LoadWin32Font(fs, logfont, GetFontCacheFontSize(fs), font); } - bool FindFallbackFont(FontCacheSettings *settings, const std::string &language_isocode, MissingGlyphSearcher *callback) const override + bool FindFallbackFont(const std::string &language_isocode, FontSizes fontsizes, MissingGlyphSearcher *callback) const override { Debug(fontcache, 1, "Trying fallback fonts"); EFCParam langInfo; @@ -317,7 +313,7 @@ public: Debug(fontcache, 1, "Can't get locale info for fallback font (isocode={})", language_isocode); return false; } - langInfo.settings = settings; + langInfo.fontsizes = fontsizes; langInfo.callback = callback; LOGFONT font; diff --git a/src/os/windows/font_win32.h b/src/os/windows/font_win32.h index 8aa0a42180..cf4d661f92 100644 --- a/src/os/windows/font_win32.h +++ b/src/os/windows/font_win32.h @@ -37,11 +37,11 @@ public: Win32FontCache(FontSize fs, const LOGFONT &logfont, int pixels); ~Win32FontCache(); void ClearFontCache() override; - GlyphID MapCharToGlyph(char32_t key, bool allow_fallback = true) override; + GlyphID MapCharToGlyph(char32_t key) override; std::string GetFontName() override { return this->fontname; } const void *GetOSHandle() override { return &this->logfont; } }; -void LoadWin32Font(FontSize fs); +void LoadWin32Font(FontSize fs, bool search, const std::string &font_name, std::span os_handle); #endif /* FONT_WIN32_H */ diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp index 210e7a17f0..9ad373cfa0 100644 --- a/src/os/windows/string_uniscribe.cpp +++ b/src/os/windows/string_uniscribe.cpp @@ -10,6 +10,8 @@ #include "../../stdafx.h" #include "../../debug.h" #include "string_uniscribe.h" +#include "../../gfx_func.h" +#include "../../gfx_layout_fallback.h" #include "../../language.h" #include "../../strings_func.h" #include "../../string_func.h" @@ -29,7 +31,7 @@ /** Uniscribe cache for internal font information, cleared when OTTD changes fonts. */ -static SCRIPT_CACHE _script_cache[FS_END]; +static std::map _script_cache; /** * Contains all information about a run of characters. A run are consecutive @@ -38,7 +40,7 @@ static SCRIPT_CACHE _script_cache[FS_END]; struct UniscribeRun { int pos; int len; - Font *font; + Font font; std::vector ft_glyphs; @@ -51,7 +53,9 @@ struct UniscribeRun { std::vector offsets; int total_advance; - UniscribeRun(int pos, int len, Font *font, SCRIPT_ANALYSIS &sa) : pos(pos), len(len), font(font), sa(sa) {} + UniscribeRun(int pos, int len, const Font &font, SCRIPT_ANALYSIS &sa) : pos(pos), len(len), font(font), sa(sa) {} + + void FallbackShape(const UniscribeParagraphLayoutFactory::CharType *buff); }; /** Break a string into language formatting ranges. */ @@ -81,7 +85,7 @@ public: int start_pos; int total_advance; int num_glyphs; - Font *font; + Font font; mutable std::vector glyph_to_char; @@ -93,8 +97,8 @@ public: std::span GetPositions() const override { return this->positions; } std::span GetGlyphToCharMap() const override; - const Font *GetFont() const override { return this->font; } - int GetLeading() const override { return this->font->fc->GetHeight(); } + const Font &GetFont() const override { return this->font; } + int GetLeading() const override { return GetCharacterHeight(this->font.GetFontCache().GetSize()); } int GetGlyphCount() const override { return this->num_glyphs; } int GetAdvance() const { return this->total_advance; } }; @@ -130,31 +134,71 @@ public: std::unique_ptr NextLine(int max_width) override; }; -void UniscribeResetScriptCache(FontSize size) +void UniscribeResetScriptCache(FontSize) { - if (_script_cache[size] != nullptr) { - ScriptFreeCache(&_script_cache[size]); - _script_cache[size] = nullptr; + for (auto &sc : _script_cache) { + ScriptFreeCache(&sc.second); } + _script_cache.clear(); } /** Load the matching native Windows font. */ -static HFONT HFontFromFont(Font *font) +static HFONT HFontFromFont(const Font &font) { - if (font->fc->GetOSHandle() != nullptr) return CreateFontIndirect(reinterpret_cast(const_cast(font->fc->GetOSHandle()))); + FontCache &fc = font.GetFontCache(); + + if (fc.GetOSHandle() != nullptr) return CreateFontIndirect(reinterpret_cast(const_cast(fc.GetOSHandle()))); LOGFONT logfont{}; - logfont.lfHeight = font->fc->GetHeight(); + logfont.lfHeight = fc.GetHeight(); logfont.lfWeight = FW_NORMAL; logfont.lfCharSet = DEFAULT_CHARSET; - convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName); + convert_to_fs(fc.GetFontName(), logfont.lfFaceName); return CreateFontIndirect(&logfont); } +/** + * Manually shape a run for built-in non-truetype fonts. + * Similar to but not quite the same as \a ICURun::FallbackShape. + * @param buff The complete buffer of the run. + */ +void UniscribeRun::FallbackShape(const UniscribeParagraphLayoutFactory::CharType *buff) +{ + FontCache &fc = this->font.GetFontCache(); + + this->glyphs.reserve(this->len); + + /* Read each UTF-16 character, mapping to an appropriate glyph. */ + for (int i = this->pos; i < this->pos + this->len; i += Utf16IsLeadSurrogate(buff[i]) ? 2 : 1) { + char32_t c = Utf16DecodeChar(reinterpret_cast(buff + i)); + if (this->sa.fRTL) c = SwapRtlPairedCharacters(c); + this->glyphs.emplace_back(fc.MapCharToGlyph(c)); + } + + /* Reverse the sequence if this run is RTL. */ + if (this->sa.fRTL) { + std::reverse(std::begin(this->glyphs), std::end(this->glyphs)); + } + + this->offsets.reserve(this->glyphs.size()); + + /* Set positions of each glyph. */ + int y_offset = fc.GetGlyphYOffset(); + int advance = 0; + for (const GlyphID glyph : this->glyphs) { + this->offsets.emplace_back(advance, y_offset); + int x_advance = fc.GetGlyphWidth(glyph); + this->advances.push_back(x_advance); + advance += x_advance; + } +} + /** Determine the glyph positions for a run. */ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *buff, UniscribeRun &range) { + FontCache &fc = range.font.GetFontCache(); + /* Initial size guess for the number of glyphs recommended by Uniscribe. */ range.glyphs.resize(range.len * 3 / 2 + 16); range.vis_attribs.resize(range.glyphs.size()); @@ -166,10 +210,15 @@ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *b HFONT old_font = nullptr; HFONT cur_font = nullptr; + if (fc.IsBuiltInFont()) { + range.FallbackShape(buff); + return true; + } + while (true) { /* Shape the text run by determining the glyphs needed for display. */ int glyphs_used = 0; - HRESULT hr = ScriptShape(temp_dc, &_script_cache[range.font->fc->GetSize()], buff + range.pos, range.len, (int)range.glyphs.size(), &range.sa, &range.glyphs[0], &range.char_to_glyph[0], &range.vis_attribs[0], &glyphs_used); + HRESULT hr = ScriptShape(temp_dc, &_script_cache[fc.GetIndex()], buff + range.pos, range.len, (int)range.glyphs.size(), &range.sa, &range.glyphs[0], &range.char_to_glyph[0], &range.vis_attribs[0], &glyphs_used); if (SUCCEEDED(hr)) { range.glyphs.resize(glyphs_used); @@ -179,7 +228,7 @@ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *b ABC abc; range.advances.resize(range.glyphs.size()); range.offsets.resize(range.glyphs.size()); - hr = ScriptPlace(temp_dc, &_script_cache[range.font->fc->GetSize()], &range.glyphs[0], (int)range.glyphs.size(), &range.vis_attribs[0], &range.sa, &range.advances[0], &range.offsets[0], &abc); + hr = ScriptPlace(temp_dc, &_script_cache[fc.GetIndex()], &range.glyphs[0], (int)range.glyphs.size(), &range.vis_attribs[0], &range.sa, &range.advances[0], &range.offsets[0], &abc); if (SUCCEEDED(hr)) { /* We map our special sprite chars to values that don't fit into a WORD. Copy the glyphs * into a new vector and query the real glyph to use for these special chars. */ @@ -187,22 +236,12 @@ static bool UniscribeShapeRun(const UniscribeParagraphLayoutFactory::CharType *b for (size_t g_id = 0; g_id < range.glyphs.size(); g_id++) { range.ft_glyphs[g_id] = range.glyphs[g_id]; } - for (int i = 0; i < range.len; i++) { - if (buff[range.pos + i] >= SCC_SPRITE_START && buff[range.pos + i] <= SCC_SPRITE_END) { - auto pos = range.char_to_glyph[i]; - if (range.ft_glyphs[pos] == 0) { // Font doesn't have our special glyph, so remap. - range.ft_glyphs[pos] = range.font->fc->MapCharToGlyph(buff[range.pos + i]); - range.offsets[pos].dv = (range.font->fc->GetHeight() - ScaleSpriteTrad(FontCache::GetDefaultFontHeight(range.font->fc->GetSize()))) / 2; // Align sprite font to centre - range.advances[pos] = range.font->fc->GetGlyphWidth(range.ft_glyphs[pos]); - } - } - } range.total_advance = 0; for (size_t i = 0; i < range.advances.size(); i++) { #ifdef WITH_FREETYPE /* FreeType and GDI/Uniscribe seems to occasionally disagree over the width of a glyph. */ - if (range.advances[i] > 0 && range.ft_glyphs[i] != 0xFFFF) range.advances[i] = range.font->fc->GetGlyphWidth(range.ft_glyphs[i]); + if (range.advances[i] > 0 && range.glyphs[i] != 0xFFFF) range.advances[i] = fc.GetGlyphWidth(range.glyphs[i]); #endif range.total_advance += range.advances[i]; } @@ -280,11 +319,6 @@ static std::vector UniscribeItemizeString(UniscribeParagraphLayoutF /* Can't layout an empty string. */ if (length == 0) return nullptr; - /* Can't layout our in-built sprite fonts. */ - for (auto const &[position, font] : font_mapping) { - if (font->fc->IsBuiltInFont()) return nullptr; - } - /* Itemize text. */ std::vector items = UniscribeItemizeString(buff, length); if (items.empty()) return nullptr; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 806d37b688..68268cd362 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -658,6 +658,9 @@ struct GameOptionsWindow : Window { case WID_GO_GUI_FONT_SPRITE_TEXT: return GetToggleString(STR_GAME_OPTIONS_GUI_FONT_SPRITE, WID_GO_GUI_FONT_SPRITE); + case WID_GO_GUI_FONT_DEFAULT_TEXT: + return GetToggleString(STR_GAME_OPTIONS_GUI_FONT_DEFAULT, WID_GO_GUI_FONT_DEFAULT); + case WID_GO_GUI_FONT_AA_TEXT: return GetToggleString(STR_GAME_OPTIONS_GUI_FONT_AA, WID_GO_GUI_FONT_AA); @@ -928,6 +931,18 @@ struct GameOptionsWindow : Window { } } +#ifdef HAS_TRUETYPE_FONT + static void ReloadFonts() + { + FontCache::LoadFontCaches(FONTSIZES_ALL); + FontCache::ClearFontCaches(FONTSIZES_ALL); + CheckForMissingGlyphs(); + SetupWidgetDimensions(); + UpdateAllVirtCoords(); + ReInitAllWindows(true); + } +#endif /* HAS_TRUETYPE_FONT */ + void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { if (widget >= WID_GO_BASE_GRF_TEXTFILE && widget < WID_GO_BASE_GRF_TEXTFILE + TFT_CONTENT_END) { @@ -1038,13 +1053,15 @@ struct GameOptionsWindow : Window { this->SetWidgetLoweredState(WID_GO_GUI_FONT_SPRITE, _fcsettings.prefer_sprite); this->SetWidgetDisabledState(WID_GO_GUI_FONT_AA, _fcsettings.prefer_sprite); this->SetDirty(); + ReloadFonts(); + break; - FontCache::LoadFontCaches(FONTSIZES_ALL); - FontCache::ClearFontCaches(FONTSIZES_ALL); - CheckForMissingGlyphs(); - SetupWidgetDimensions(); - UpdateAllVirtCoords(); - ReInitAllWindows(true); + case WID_GO_GUI_FONT_DEFAULT: + _fcsettings.prefer_default = !_fcsettings.prefer_default; + + this->SetWidgetLoweredState(WID_GO_GUI_FONT_DEFAULT, _fcsettings.prefer_default); + this->SetDirty(); + ReloadFonts(); break; case WID_GO_GUI_FONT_AA: @@ -1542,6 +1559,7 @@ struct GameOptionsWindow : Window { this->SetWidgetLoweredState(WID_GO_GUI_SCALE_BEVEL_BUTTON, _settings_client.gui.scale_bevels); #ifdef HAS_TRUETYPE_FONT this->SetWidgetLoweredState(WID_GO_GUI_FONT_SPRITE, _fcsettings.prefer_sprite); + this->SetWidgetLoweredState(WID_GO_GUI_FONT_DEFAULT, _fcsettings.prefer_default); this->SetWidgetLoweredState(WID_GO_GUI_FONT_AA, _fcsettings.global_aa); this->SetWidgetDisabledState(WID_GO_GUI_FONT_AA, _fcsettings.prefer_sprite); #endif /* HAS_TRUETYPE_FONT */ @@ -1672,6 +1690,10 @@ static constexpr std::initializer_list _nested_game_options_widgets NWidget(WWT_BOOLBTN, GAME_OPTIONS_BACKGROUND, WID_GO_GUI_FONT_SPRITE), SetAlternateColourTip(GAME_OPTIONS_BUTTON, STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP), NWidget(WWT_TEXT, INVALID_COLOUR, WID_GO_GUI_FONT_SPRITE_TEXT), SetFill(1, 0), SetResize(1, 0), SetTextStyle(GAME_OPTIONS_LABEL), EndContainer(), + NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), + NWidget(WWT_BOOLBTN, GAME_OPTIONS_BACKGROUND, WID_GO_GUI_FONT_DEFAULT), SetAlternateColourTip(GAME_OPTIONS_BUTTON, STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP), + NWidget(WWT_TEXT, INVALID_COLOUR, WID_GO_GUI_FONT_DEFAULT_TEXT), SetFill(1, 0), SetResize(1, 0), SetTextStyle(GAME_OPTIONS_LABEL), + EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0), NWidget(WWT_BOOLBTN, GAME_OPTIONS_BACKGROUND, WID_GO_GUI_FONT_AA), SetAlternateColourTip(GAME_OPTIONS_BUTTON, STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP), NWidget(WWT_TEXT, INVALID_COLOUR, WID_GO_GUI_FONT_AA_TEXT), SetFill(1, 0), SetResize(1, 0), SetTextStyle(GAME_OPTIONS_LABEL), diff --git a/src/strings.cpp b/src/strings.cpp index 141027f0b7..f99116c97b 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -2274,32 +2274,56 @@ std::string_view GetCurrentLanguageIsoCode() /** * Check whether there are glyphs missing in the current language. - * @return If glyphs are missing, return \c true, else return \c false. + * @return Bit mask of font sizes have any missing glyphs. */ -bool MissingGlyphSearcher::FindMissingGlyphs() +FontSizes MissingGlyphSearcher::FindMissingGlyphs() { - FontCache::LoadFontCaches(this->Monospace() ? FontSizes{FS_MONO} : FONTSIZES_REQUIRED); + FontCache::LoadFontCaches(this->fontsizes); + + FontSizes bad_fontsizes{}; + + for (FontSize size : this->fontsizes) { + auto set = this->GetRequiredGlyphs(size); + if (set.empty()) continue; + + Debug(fontcache, 1, "Missing {} glyphs in {} font size", set.size(), FontSizeToName(size)); + bad_fontsizes.Set(size); + } + + return bad_fontsizes; +} + +std::set BaseStringMissingGlyphSearcher::GetRequiredGlyphs(FontSizes fontsizes) +{ + std::set glyphs{}; this->Reset(); for (auto text = this->NextString(); text.has_value(); text = this->NextString()) { FontSize size = this->DefaultSize(); - FontCache *fc = FontCache::Get(size); for (char32_t c : Utf8View(*text)) { if (c >= SCC_FIRST_FONT && c <= SCC_LAST_FONT) { size = (FontSize)(c - SCC_FIRST_FONT); - fc = FontCache::Get(size); - } else if (!IsInsideMM(c, SCC_SPRITE_START, SCC_SPRITE_END) && IsPrintable(c) && !IsTextDirectionChar(c) && fc->MapCharToGlyph(c, false) == 0) { - /* The character is printable, but not in the normal font. This is the case we were testing for. */ - Debug(fontcache, 0, "Font is missing glyphs to display char 0x{:X} in {} font size", static_cast(c), FontSizeToName(size)); - return true; + continue; } + + if (IsInsideMM(c, SCC_SPRITE_START, SCC_SPRITE_END)) continue; + if (!IsPrintable(c) || IsTextDirectionChar(c)) continue; + if (fontsizes.Test(size)) continue; + if (FontCache::GetFontIndexForCharacter(size, c) != INVALID_FONT_INDEX) continue; + + glyphs.insert(c); } } - return false; + + return glyphs; } /** Helper for searching through the language pack. */ -class LanguagePackGlyphSearcher : public MissingGlyphSearcher { +class LanguagePackGlyphSearcher : public BaseStringMissingGlyphSearcher { +public: + LanguagePackGlyphSearcher() : BaseStringMissingGlyphSearcher({FS_NORMAL, FS_SMALL, FS_LARGE}) {} + +private: uint i; ///< Iterator for the primary language tables. uint j; ///< Iterator for the secondary language tables. @@ -2328,26 +2352,9 @@ class LanguagePackGlyphSearcher : public MissingGlyphSearcher { return ret; } - - bool Monospace() override - { - return false; - } - - void SetFontNames([[maybe_unused]] FontCacheSettings *settings, [[maybe_unused]] std::string_view font_name, [[maybe_unused]] const void *os_data) override - { -#if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) - settings->small.font = font_name; - settings->medium.font = font_name; - settings->large.font = font_name; - - settings->small.os_handle = os_data; - settings->medium.os_handle = os_data; - settings->large.os_handle = os_data; -#endif - } }; + /** * Check whether the currently loaded language pack * uses characters that the currently loaded font @@ -2364,20 +2371,21 @@ void CheckForMissingGlyphs(MissingGlyphSearcher *searcher) { static LanguagePackGlyphSearcher pack_searcher; if (searcher == nullptr) searcher = &pack_searcher; - bool bad_font = searcher->FindMissingGlyphs(); + + for (FontSize size : searcher->fontsizes) { + GetFontCacheSubSetting(size)->fallback_fonts.clear(); + } + + FontSizes fontsizes = searcher->FindMissingGlyphs(); + bool bad_font = fontsizes.Any(); + #if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) if (bad_font) { /* We found an unprintable character... lets try whether we can find * a fallback font that can print the characters in the current language. */ bool any_font_configured = !_fcsettings.medium.font.empty(); - FontCacheSettings backup = _fcsettings; - _fcsettings.mono.os_handle = nullptr; - _fcsettings.medium.os_handle = nullptr; - - bad_font = !FontProviderManager::FindFallbackFont(&_fcsettings, _langpack.langpack->isocode, searcher); - - _fcsettings = std::move(backup); + bad_font = !FontProviderManager::FindFallbackFont(_langpack.langpack->isocode, fontsizes, searcher); if (!bad_font && any_font_configured) { /* If the user configured a bad font, and we found a better one, @@ -2394,7 +2402,7 @@ void CheckForMissingGlyphs(MissingGlyphSearcher *searcher) /* Our fallback font does miss characters too, so keep the * user chosen font as that is more likely to be any good than * the wild guess we made */ - FontCache::LoadFontCaches(searcher->Monospace() ? FontSizes{FS_MONO} : FONTSIZES_REQUIRED); + FontCache::LoadFontCaches(fontsizes); } } #endif @@ -2411,12 +2419,12 @@ void CheckForMissingGlyphs(MissingGlyphSearcher *searcher) ShowErrorMessage(GetEncodedString(STR_JUST_RAW_STRING, std::move(err_str)), {}, WL_WARNING); /* Reset the font width */ - LoadStringWidthTable(searcher->Monospace() ? FontSizes{FS_MONO} : FONTSIZES_REQUIRED); + LoadStringWidthTable(fontsizes); return; } /* Update the font with cache */ - LoadStringWidthTable(searcher->Monospace() ? FontSizes{FS_MONO} : FONTSIZES_REQUIRED); + LoadStringWidthTable(searcher->fontsizes); #if !(defined(WITH_ICU_I18N) && defined(WITH_HARFBUZZ)) && !defined(WITH_UNISCRIBE) && !defined(WITH_COCOA) /* diff --git a/src/strings_func.h b/src/strings_func.h index e883504b41..e397a69197 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -10,6 +10,7 @@ #ifndef STRINGS_FUNC_H #define STRINGS_FUNC_H +#include "fontcache.h" #include "strings_type.h" #include "string_type.h" #include "gfx_type.h" @@ -158,9 +159,33 @@ EncodedString GetEncodedString(StringID string, const Args&... args) */ class MissingGlyphSearcher { public: + FontSizes fontsizes; ///< Font sizes to search for. + + MissingGlyphSearcher(FontSizes fontsizes) : fontsizes(fontsizes) {} + /** Make sure everything gets destructed right. */ virtual ~MissingGlyphSearcher() = default; + /** + * Test if any glyphs are missing. + * @return Font sizes which have missing glyphs. + */ + FontSizes FindMissingGlyphs(); + + virtual FontLoadReason GetLoadReason() = 0; + + /** + * Get set of glyphs required for the current language. + * @param fontsizes Font sizes to test. + * @return Set of required glyphs. + **/ + virtual std::set GetRequiredGlyphs(FontSizes fontsizes) = 0; +}; + +class BaseStringMissingGlyphSearcher : public MissingGlyphSearcher { +public: + BaseStringMissingGlyphSearcher(FontSizes fontsizes) : MissingGlyphSearcher(fontsizes) {} + /** * Get the next string to search through. * @return The next string or nullopt if there is none. @@ -178,23 +203,11 @@ public: */ virtual void Reset() = 0; - /** - * Whether to search for a monospace font or not. - * @return True if searching for monospace. - */ - virtual bool Monospace() = 0; + FontLoadReason GetLoadReason() override { return FontLoadReason::LanguageFallback; } - /** - * Set the right font names. - * @param settings The settings to modify. - * @param font_name The new font name. - * @param os_data Opaque pointer to OS-specific data. - */ - virtual void SetFontNames(struct FontCacheSettings *settings, std::string_view font_name, const void *os_data = nullptr) = 0; - - bool FindMissingGlyphs(); + std::set GetRequiredGlyphs(FontSizes fontsizes) override; }; -void CheckForMissingGlyphs(MissingGlyphSearcher *search = nullptr); +void CheckForMissingGlyphs(MissingGlyphSearcher *searcher = nullptr); #endif /* STRINGS_FUNC_H */ diff --git a/src/survey.cpp b/src/survey.cpp index 3d648b00e1..2c1a1e2428 100644 --- a/src/survey.cpp +++ b/src/survey.cpp @@ -298,10 +298,16 @@ void SurveyConfiguration(nlohmann::json &survey) */ void SurveyFont(nlohmann::json &survey) { - survey["small"] = FontCache::Get(FS_SMALL)->GetFontName(); - survey["medium"] = FontCache::Get(FS_NORMAL)->GetFontName(); - survey["large"] = FontCache::Get(FS_LARGE)->GetFontName(); - survey["mono"] = FontCache::Get(FS_MONO)->GetFontName(); + for (FontSize fs = FS_BEGIN; fs < FS_END; fs++) { + const FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); + auto &font = survey[std::string(FontSizeToName(fs))]; + font["configured"]["font"] = setting->font; + font["configured"]["size"] = setting->size; + } + for (const auto &fc : FontCache::Get()) { + auto &font = survey[std::string(FontSizeToName(fc->GetSize()))]; + font["active"].push_back(fc->GetFontName()); + } } /** diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index fd39ff102e..a9ad6d2add 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -259,6 +259,12 @@ name = ""prefer_sprite_font"" var = _fcsettings.prefer_sprite def = false +[SDTG_BOOL] +ifdef = HAS_TRUETYPE_FONT +name = ""prefer_default_font"" +var = _fcsettings.prefer_default +def = false + [SDTG_VAR] name = ""sprite_cache_size_px"" type = SLE_UINT diff --git a/src/tests/mock_fontcache.h b/src/tests/mock_fontcache.h index 5be357756d..7cd3a6cd04 100644 --- a/src/tests/mock_fontcache.h +++ b/src/tests/mock_fontcache.h @@ -25,15 +25,16 @@ public: const Sprite *GetGlyph(GlyphID) override { return nullptr; } uint GetGlyphWidth(GlyphID) override { return this->height / 2; } bool GetDrawGlyphShadow() override { return false; } - GlyphID MapCharToGlyph(char32_t key, [[maybe_unused]] bool allow_fallback = true) override { return key; } + GlyphID MapCharToGlyph(char32_t key) override { return key; } std::string GetFontName() override { return "mock"; } bool IsBuiltInFont() override { return true; } static void InitializeFontCaches() { + FontCache::caches.clear(); for (FontSize fs = FS_BEGIN; fs != FS_END; fs++) { - if (FontCache::Get(fs) != nullptr) continue; - FontCache::Register(std::make_unique(fs)); + FontCache::Register(std::make_unique(fs), FontLoadReason::Default); + FontCache::UpdateCharacterHeight(fs); } } }; diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 115467f397..91af774e39 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -83,7 +83,7 @@ static WindowDesc _textfile_desc( _nested_textfile_widgets ); -TextfileWindow::TextfileWindow(Window *parent, TextfileType file_type) : Window(_textfile_desc), file_type(file_type) +TextfileWindow::TextfileWindow(Window *parent, TextfileType file_type) : Window(_textfile_desc), BaseStringMissingGlyphSearcher(FS_MONO), file_type(file_type) { /* Init of nested tree is deferred. * TextfileWindow::ConstructWindow must be called by the inheriting window. */ @@ -754,19 +754,6 @@ bool TextfileWindow::IsTextWrapped() const return this->lines[this->search_iterator++].text; } -/* virtual */ bool TextfileWindow::Monospace() -{ - return true; -} - -/* virtual */ void TextfileWindow::SetFontNames([[maybe_unused]] FontCacheSettings *settings, [[maybe_unused]] std::string_view font_name, [[maybe_unused]] const void *os_data) -{ -#if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) - settings->mono.font = font_name; - settings->mono.os_handle = os_data; -#endif -} - #if defined(WITH_ZLIB) /** diff --git a/src/textfile_gui.h b/src/textfile_gui.h index 74034852bf..7a79bba557 100644 --- a/src/textfile_gui.h +++ b/src/textfile_gui.h @@ -19,7 +19,7 @@ std::optional GetTextfile(TextfileType type, Subdirectory dir, std::string_view filename); /** Window for displaying a textfile */ -struct TextfileWindow : public Window, MissingGlyphSearcher { +struct TextfileWindow : public Window, BaseStringMissingGlyphSearcher { TextfileType file_type{}; ///< Type of textfile to view. Scrollbar *vscroll = nullptr; ///< Vertical scrollbar. Scrollbar *hscroll = nullptr; ///< Horizontal scrollbar. @@ -38,8 +38,6 @@ struct TextfileWindow : public Window, MissingGlyphSearcher { void Reset() override; FontSize DefaultSize() override; std::optional NextString() override; - bool Monospace() override; - void SetFontNames(FontCacheSettings *settings, std::string_view font_name, const void *os_data) override; void ScrollToLine(size_t line); bool IsTextWrapped() const; diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index d7a3c069d8..74a68d91a4 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -32,6 +32,8 @@ enum GameOptionsWidgets : WidgetID { WID_GO_GUI_SCALE_BEVEL_TEXT, ///< Text for chunky bevels. WID_GO_GUI_FONT_SPRITE, ///< Toggle whether to prefer the sprite font over TTF fonts. WID_GO_GUI_FONT_SPRITE_TEXT, ///< Text for sprite font toggle. + WID_GO_GUI_FONT_DEFAULT, ///< Toggle whether to prefer the default font over fallback fonts. + WID_GO_GUI_FONT_DEFAULT_TEXT, ///< Text for default font toggle. WID_GO_GUI_FONT_AA, ///< Toggle whether to anti-alias fonts. WID_GO_GUI_FONT_AA_TEXT, ///< Text for anti-alias toggle. WID_GO_BASE_GRF_DROPDOWN, ///< Use to select a base GRF. diff --git a/src/zoom_func.h b/src/zoom_func.h index 6dfe0f1c51..df12a2382d 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -119,4 +119,14 @@ inline int ScaleGUITrad(int value) return value * _gui_scale / 100; } +/** + * Scale traditional pixel dimensions to font zoom level, for drawing sprite fonts. + * @param value Pixel amount at #ZOOM_BASE (traditional "normal" interface size). + * @return Pixel amount at _font_zoom (current interface size). + */ +inline int ScaleFontTrad(int value) +{ + return UnScaleByZoom(value * ZOOM_BASE, _font_zoom); +} + #endif /* ZOOM_FUNC_H */ From 1445aa954327e8c29dce3f28f32b0d599cdc2d0c Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 09:05:31 +0100 Subject: [PATCH 257/280] Codefix: some coding style improvements --- src/aircraft_cmd.cpp | 25 ++++++++++++++++++------- src/rail_cmd.cpp | 25 ++++++++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 94d976e112..20de291c7b 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -988,7 +988,7 @@ static bool AircraftController(Aircraft *v) } /* Get distance from destination pos to current pos. */ - uint dist = abs(x + amd.x - v->x_pos) + abs(y + amd.y - v->y_pos); + uint dist = abs(x + amd.x - v->x_pos) + abs(y + amd.y - v->y_pos); /* Need exact position? */ if (!amd.flags.Test(AirportMovingDataFlag::ExactPosition) && dist <= (amd.flags.Test(AirportMovingDataFlag::SlowTurn) ? 8U : 4U)) return true; @@ -1021,10 +1021,21 @@ static bool AircraftController(Aircraft *v) uint speed_limit = SPEED_LIMIT_TAXI; bool hard_limit = true; - if (amd.flags.Test(AirportMovingDataFlag::NoSpeedClamp)) speed_limit = SPEED_LIMIT_NONE; - if (amd.flags.Test(AirportMovingDataFlag::Hold)) { speed_limit = SPEED_LIMIT_HOLD; hard_limit = false; } - if (amd.flags.Test(AirportMovingDataFlag::Land)) { speed_limit = SPEED_LIMIT_APPROACH; hard_limit = false; } - if (amd.flags.Test(AirportMovingDataFlag::Brake)) { speed_limit = SPEED_LIMIT_TAXI; hard_limit = false; } + if (amd.flags.Test(AirportMovingDataFlag::NoSpeedClamp)) { + speed_limit = SPEED_LIMIT_NONE; + } + if (amd.flags.Test(AirportMovingDataFlag::Hold)) { + speed_limit = SPEED_LIMIT_HOLD; + hard_limit = false; + } + if (amd.flags.Test(AirportMovingDataFlag::Land)) { + speed_limit = SPEED_LIMIT_APPROACH; + hard_limit = false; + } + if (amd.flags.Test(AirportMovingDataFlag::Brake)) { + speed_limit = SPEED_LIMIT_TAXI; + hard_limit = false; + } int count = UpdateAircraftSpeed(v, speed_limit, hard_limit); if (count == 0) return false; @@ -1181,7 +1192,7 @@ static bool HandleCrashedAircraft(Aircraft *v) Station *st = GetTargetAirportIfValid(v); /* make aircraft crash down to the ground */ - if (v->crashed_counter < 500 && st == nullptr && ((v->crashed_counter % 3) == 0) ) { + if (v->crashed_counter < 500 && st == nullptr && ((v->crashed_counter % 3) == 0)) { int z = GetSlopePixelZ(Clamp(v->x_pos, 0, Map::MaxX() * TILE_SIZE), Clamp(v->y_pos, 0, Map::MaxY() * TILE_SIZE)); v->z_pos -= 1; if (v->z_pos <= z) { @@ -1814,7 +1825,7 @@ static bool AirportMove(Aircraft *v, const AirportFTAClass *apc) { /* error handling */ if (v->pos >= apc->nofelements) { - Debug(misc, 0, "[Ap] position {} is not valid for current airport. Max position is {}", v->pos, apc->nofelements-1); + Debug(misc, 0, "[Ap] position {} is not valid for current airport. Max position is {}", v->pos, apc->nofelements - 1); assert(v->pos < apc->nofelements); } diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index e98d5dd1a4..1edbe723c5 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -2214,6 +2214,25 @@ static void DrawTrackBitsOverlay(TileInfo *ti, TrackBits track, const RailTypeIn } } +/** + * Returns which of the 5 junction-'Rail underlays' to use for the given track bits. + * See https://newgrf-specs.tt-wiki.net/wiki/Action3/Railtypes for the cases. + * @pre The track bits describe a junction, so at least two bits are set. + * @param track The track bits to consider. + * @return The offset in the five junction ground sprites. + */ +static int GetJunctionGroundSpriteOffset(TrackBits track) +{ + /* If none of the tracks end up in the NE corner, return the ground sprite + * where the NE of the tile is not covered. Repeat for the other directions. + * What remains are junctions where all directions are covered. */ + if ((track & TRACK_BIT_3WAY_NE) == 0) return 0; + if ((track & TRACK_BIT_3WAY_SW) == 0) return 1; + if ((track & TRACK_BIT_3WAY_NW) == 0) return 2; + if ((track & TRACK_BIT_3WAY_SE) == 0) return 3; + return 4; +} + /** * Draw ground sprite and track bits * @param ti TileInfo @@ -2289,11 +2308,7 @@ static void DrawTrackBits(TileInfo *ti, TrackBits track) /* junction, select only ground sprite, handle track sprite later */ default: junction = true; - if ((track & TRACK_BIT_3WAY_NE) == 0) { image = rti->base_sprites.ground; break; } - if ((track & TRACK_BIT_3WAY_SW) == 0) { image = rti->base_sprites.ground + 1; break; } - if ((track & TRACK_BIT_3WAY_NW) == 0) { image = rti->base_sprites.ground + 2; break; } - if ((track & TRACK_BIT_3WAY_SE) == 0) { image = rti->base_sprites.ground + 3; break; } - image = rti->base_sprites.ground + 4; + image = rti->base_sprites.ground + GetJunctionGroundSpriteOffset(track); break; } } From 6e65b2387a04e8f98f57dbf303b74a64044ec3f7 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 09:58:25 +0100 Subject: [PATCH 258/280] Fix #14802: close NewGRF inspection window when overbuilding with default station/waypoint --- src/station_cmd.cpp | 1 + src/waypoint_cmd.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 4bc5e35091..9f1a2aa6c7 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1558,6 +1558,7 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy MakeRailStation(tile, st->owner, st->index, axis, *it, rt); /* Free the spec if we overbuild something */ DeallocateSpecFromStation(st, old_specindex); + if (statspec == nullptr) DeleteNewGRFInspectWindow(GSF_STATIONS, tile); SetCustomStationSpecIndex(tile, *specindex); SetStationTileRandomBits(tile, GB(Random(), 0, 4)); diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index aee8f9dbd0..60aee126bd 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -26,6 +26,7 @@ #include "vehicle_func.h" #include "string_func.h" #include "company_func.h" +#include "newgrf_debug.h" #include "newgrf_station.h" #include "newgrf_roadstop.h" #include "company_base.h" @@ -315,6 +316,7 @@ CommandCost CmdBuildRailWaypoint(DoCommandFlags flags, TileIndex start_tile, Axi MarkTileDirtyByTile(tile); DeallocateSpecFromStation(wp, old_specindex); + if (spec == nullptr) DeleteNewGRFInspectWindow(GSF_STATIONS, tile); YapfNotifyTrackLayoutChange(tile, AxisToTrack(axis)); } DirtyCompanyInfrastructureWindows(wp->owner); From 064f4df6cc3e267d61d776062e3eea427abe9826 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 11:59:49 +0100 Subject: [PATCH 259/280] Fix: always try to create at least one town --- src/town_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 67034fd2bf..fabd8deece 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2448,7 +2448,7 @@ bool GenerateTowns(TownLayout layout, std::optional number) total = Map::ScaleByLandProportion(GetDefaultTownsForMapSize() + (Random() & 7)); } - total = std::min(TownPool::MAX_SIZE, total); + total = Clamp(total, 1, TownPool::MAX_SIZE); uint32_t townnameparts; TownNames town_names; From c1d37d86999ec391d5830f16887024b719f9cd18 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 6 Dec 2025 12:22:25 +0000 Subject: [PATCH 260/280] Add: Automatically load fonts for missing glyphs. (#14856) --- src/console_cmds.cpp | 2 +- src/fontcache.cpp | 9 ++++++-- src/fontcache.h | 3 ++- src/gfx_layout.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index e0402b4454..69ddd40c0d 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2326,7 +2326,7 @@ static bool ConContent(std::span argv) */ static std::string_view FontLoadReasonToName(FontLoadReason load_reason) { - static const std::string_view LOAD_REASON_TO_NAME[] = { "default", "configured", "language" }; + static const std::string_view LOAD_REASON_TO_NAME[] = { "default", "configured", "language", "missing" }; static_assert(std::size(LOAD_REASON_TO_NAME) == to_underlying(FontLoadReason::End)); return LOAD_REASON_TO_NAME[to_underlying(load_reason)]; } diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 379516ca3d..8f380f71e0 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -75,6 +75,7 @@ int FontCache::GetDefaultFontHeight(FontSize fs) for (const auto &fc : FontCache::caches) { if (fc == nullptr || fc->fs != fs) continue; + if (fc->load_reason == FontLoadReason::MissingFallback) continue; // Avoid dynamically loaded fonts affecting widget sizes. ascender = std::max(ascender, fc->ascender); descender = std::min(descender, fc->descender); } @@ -269,10 +270,11 @@ std::string GetFontCacheFontName(FontSize fs) } } -/* static */ void FontCache::LoadFallbackFonts(FontSize fs) +/* static */ void FontCache::LoadFallbackFonts(FontSize fs, FontLoadReason load_reason) { const FontCacheSubSetting *setting = GetFontCacheSubSetting(fs); for (auto it = setting->fallback_fonts.rbegin(); it != setting->fallback_fonts.rend(); ++it) { + if (it->load_reason != load_reason) continue; FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType, false, it->name, it->os_handle), it->load_reason); } } @@ -318,12 +320,15 @@ std::string GetFontCacheFontName(FontSize fs) if (std::ranges::find(fontnames, extra_font) == std::end(fontnames)) fontnames.push_back(extra_font); } + /* First load fonts for missing glyphs discovered during string formatting. */ + FontCache::LoadFallbackFonts(fs, FontLoadReason::MissingFallback); + /* Load configured fonts in reverse order so that the first entry has priority. */ for (auto it = fontnames.rbegin(); it != fontnames.rend(); ++it) { if (*it == DEFAULT_FONT) { FontCache::LoadDefaultFonts(fs); } else if (*it == FALLBACK_FONT) { - FontCache::LoadFallbackFonts(fs); + FontCache::LoadFallbackFonts(fs, FontLoadReason::LanguageFallback); } else { FontCache::Register(FontProviderManager::LoadFont(fs, FontType::TrueType, true, std::string{*it}, {}), FontLoadReason::Configured); } diff --git a/src/fontcache.h b/src/fontcache.h index 0b2a054b28..98da64d00f 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -24,6 +24,7 @@ enum class FontLoadReason : uint8_t { Default, Configured, LanguageFallback, + MissingFallback, End, }; @@ -51,7 +52,7 @@ protected: FontCache(FontSize fs) : fs(fs) {} static void Register(std::unique_ptr &&fc, FontLoadReason load_reason); static void LoadDefaultFonts(FontSize fs); - static void LoadFallbackFonts(FontSize fs); + static void LoadFallbackFonts(FontSize fs, FontLoadReason load_reason); public: virtual ~FontCache() = default; diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index e39863bf39..a91f9d6ee5 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -10,10 +10,15 @@ #include "stdafx.h" #include "core/math_func.hpp" #include "gfx_layout.h" +#include "gfx_func.h" #include "string_func.h" #include "strings_func.h" #include "core/utf8.hpp" #include "debug.h" +#include "timer/timer.h" +#include "timer/timer_window.h" +#include "viewport_func.h" +#include "window_func.h" #include "table/control_codes.h" @@ -37,6 +42,50 @@ /** Cache of ParagraphLayout lines. */ std::unique_ptr Layouter::linecache; +class RuntimeMissingGlyphSearcher : public MissingGlyphSearcher { + std::array, FS_END> glyphs{}; +public: + RuntimeMissingGlyphSearcher() : MissingGlyphSearcher(FONTSIZES_ALL) {} + + FontLoadReason GetLoadReason() override { return FontLoadReason::MissingFallback; } + + inline void Insert(FontSize fs, char32_t c) + { + this->glyphs[fs].insert(c); + this->search_timeout.Reset(); + } + + std::set GetRequiredGlyphs(FontSizes fontsizes) override + { + std::set r; + for (FontSize fs : fontsizes) { + r.merge(this->glyphs[fs]); + } + return r; + } + + TimeoutTimer search_timeout{std::chrono::milliseconds(250), [this]() + { + FontSizes changed_fontsizes{}; + for (FontSize fs = FS_BEGIN; fs != FS_END; ++fs) { + auto &missing = this->glyphs[fs]; + if (missing.empty()) continue; + + if (FontProviderManager::FindFallbackFont({}, fs, this)) changed_fontsizes.Set(fs); + missing.clear(); + } + + if (!changed_fontsizes.Any()) return; + + FontCache::LoadFontCaches(changed_fontsizes); + LoadStringWidthTable(changed_fontsizes); + UpdateAllVirtCoords(); + ReInitAllWindows(true); + }}; +}; + +static RuntimeMissingGlyphSearcher _missing_glyphs; + /** * Helper for getting a ParagraphLayouter of the given type. * @@ -98,6 +147,7 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view s FontIndex font_index = FontCache::GetFontIndexForCharacter(state.fontsize, c); if (font_index == INVALID_FONT_INDEX) { + _missing_glyphs.Insert(state.fontsize, c); font_index = FontCache::GetDefaultFontIndex(state.fontsize); } From 046b0c626730b01ff0c0ef931d6d117a255990b0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 6 Dec 2025 12:29:11 +0000 Subject: [PATCH 261/280] Codechange: Use enum class and EnumBitSet for various order flags. (#14783) --- src/aircraft_cmd.cpp | 6 +- src/order_backup.cpp | 2 +- src/order_base.h | 26 +-- src/order_cmd.cpp | 223 ++++++++++++++------------ src/order_gui.cpp | 169 ++++++++++--------- src/order_type.h | 94 +++++------ src/pathfinder/yapf/yapf_destrail.hpp | 2 +- src/roadveh_cmd.cpp | 4 +- src/saveload/afterload.cpp | 8 +- src/saveload/order_sl.cpp | 17 +- src/script/api/script_order.cpp | 43 ++--- src/script/api/script_order.hpp | 32 ++-- src/settings_type.h | 2 +- src/ship_cmd.cpp | 2 +- src/timetable_cmd.cpp | 6 +- src/timetable_gui.cpp | 6 +- src/train_cmd.cpp | 18 +-- src/vehicle.cpp | 32 ++-- src/vehicle_gui.cpp | 4 +- src/vehiclelist.cpp | 2 +- 20 files changed, 358 insertions(+), 340 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 20de291c7b..eea0879dc0 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -130,7 +130,7 @@ static StationID FindNearestHangar(const Aircraft *v) const Station *next_dest = nullptr; if (max_range != 0) { if (v->current_order.IsType(OT_GOTO_STATION) || - (v->current_order.IsType(OT_GOTO_DEPOT) && (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) == 0)) { + (v->current_order.IsType(OT_GOTO_DEPOT) && !v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot))) { last_dest = Station::GetIfValid(v->last_station_visited); next_dest = Station::GetIfValid(v->current_order.GetDestination().ToStationID()); } else { @@ -428,7 +428,7 @@ static void CheckIfAircraftNeedsService(Aircraft *v) /* only goto depot if the target airport has a depot */ if (st->airport.HasHangar() && CanVehicleUseStation(v, st)) { - v->current_order.MakeGoToDepot(st->index, ODTFB_SERVICE); + v->current_order.MakeGoToDepot(st->index, OrderDepotTypeFlag::Service); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); } else if (v->current_order.IsType(OT_GOTO_DEPOT)) { v->current_order.MakeDummy(); @@ -2187,7 +2187,7 @@ void UpdateAirplanesOnNewStation(const Station *st) Order *o = &v->current_order; /* The aircraft is heading to a hangar, but the new station doesn't have one, * or the aircraft can't land on the new station. Cancel current order. */ - if (o->IsType(OT_GOTO_DEPOT) && !(o->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) && o->GetDestination() == st->index && + if (o->IsType(OT_GOTO_DEPOT) && !o->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders) && o->GetDestination() == st->index && (!st->airport.HasHangar() || !CanVehicleUseStation(v, st))) { o->MakeDummy(); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); diff --git a/src/order_backup.cpp b/src/order_backup.cpp index ae52f635c9..2bd2032956 100644 --- a/src/order_backup.cpp +++ b/src/order_backup.cpp @@ -233,7 +233,7 @@ CommandCost CmdClearOrderBackup(DoCommandFlags flags, TileIndex tile, ClientID u for (OrderBackup *ob : OrderBackup::Iterate()) { for (Order &order : ob->orders) { OrderType ot = order.GetType(); - if (ot == OT_GOTO_DEPOT && (order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) continue; + if (ot == OT_GOTO_DEPOT && order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) continue; if (ot == OT_GOTO_DEPOT && hangar && !IsHangarTile(ob->tile)) continue; // Not an aircraft? Can't have a hangar order. if (ot == OT_IMPLICIT || (IsHangarTile(ob->tile) && ot == OT_GOTO_DEPOT && !hangar)) ot = OT_GOTO_STATION; if (ot == type && order.GetDestination() == destination) { diff --git a/src/order_base.h b/src/order_base.h index 5dac764838..5697522bf8 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -74,7 +74,7 @@ public: void Free(); void MakeGoToStation(StationID destination); - void MakeGoToDepot(DestinationID destination, OrderDepotTypeFlags order, OrderNonStopFlags non_stop_type = ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, OrderDepotActionFlags action = ODATF_SERVICE_ONLY, CargoType cargo = CARGO_NO_REFIT); + void MakeGoToDepot(DestinationID destination, OrderDepotTypeFlags order, OrderNonStopFlags non_stop_type = OrderNonStopFlag::NoIntermediate, OrderDepotActionFlags action = {}, CargoType cargo = CARGO_NO_REFIT); void MakeGoToWaypoint(StationID destination); void MakeLoading(bool ordered); void MakeLeaveStation(); @@ -133,17 +133,17 @@ public: /** How must the consist be unloaded? */ inline OrderUnloadFlags GetUnloadType() const { return (OrderUnloadFlags)GB(this->flags, 0, 3); } /** At which stations must we stop? */ - inline OrderNonStopFlags GetNonStopType() const { return (OrderNonStopFlags)GB(this->type, 6, 2); } + inline OrderNonStopFlags GetNonStopType() const { return static_cast(GB(this->type, 6, 2)); } /** Where must we stop at the platform? */ - inline OrderStopLocation GetStopLocation() const { return (OrderStopLocation)GB(this->type, 4, 2); } + inline OrderStopLocation GetStopLocation() const { return static_cast(GB(this->type, 4, 2)); } /** What caused us going to the depot? */ - inline OrderDepotTypeFlags GetDepotOrderType() const { return (OrderDepotTypeFlags)GB(this->flags, 0, 3); } + inline OrderDepotTypeFlags GetDepotOrderType() const { return static_cast(GB(this->flags, 0, 3)); } /** What are we going to do when in the depot. */ - inline OrderDepotActionFlags GetDepotActionType() const { return (OrderDepotActionFlags)GB(this->flags, 3, 4); } + inline OrderDepotActionFlags GetDepotActionType() const { return static_cast(GB(this->flags, 3, 4)); } /** What variable do we have to compare? */ inline OrderConditionVariable GetConditionVariable() const { return static_cast(GB(this->dest.value, 11, 5)); } /** What is the comparator to use? */ - inline OrderConditionComparator GetConditionComparator() const { return (OrderConditionComparator)GB(this->type, 5, 3); } + inline OrderConditionComparator GetConditionComparator() const { return static_cast(GB(this->type, 5, 3)); } /** Get the order to skip to. */ inline VehicleOrderID GetConditionSkipToOrder() const { return this->flags; } /** Get the value to base the skip on. */ @@ -154,17 +154,17 @@ public: /** Set how the consist must be unloaded. */ inline void SetUnloadType(OrderUnloadFlags unload_type) { SB(this->flags, 0, 3, unload_type); } /** Set whether we must stop at stations or not. */ - inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->type, 6, 2, non_stop_type); } + inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->type, 6, 2, non_stop_type.base()); } /** Set where we must stop at the platform. */ - inline void SetStopLocation(OrderStopLocation stop_location) { SB(this->type, 4, 2, stop_location); } + inline void SetStopLocation(OrderStopLocation stop_location) { SB(this->type, 4, 2, to_underlying(stop_location)); } /** Set the cause to go to the depot. */ - inline void SetDepotOrderType(OrderDepotTypeFlags depot_order_type) { SB(this->flags, 0, 3, depot_order_type); } + inline void SetDepotOrderType(OrderDepotTypeFlags depot_order_type) { SB(this->flags, 0, 3, depot_order_type.base()); } /** Set what we are going to do in the depot. */ - inline void SetDepotActionType(OrderDepotActionFlags depot_service_type) { SB(this->flags, 3, 4, depot_service_type); } + inline void SetDepotActionType(OrderDepotActionFlags depot_service_type) { SB(this->flags, 3, 4, depot_service_type.base()); } /** Set variable we have to compare. */ - inline void SetConditionVariable(OrderConditionVariable condition_variable) { SB(this->dest.value, 11, 5, condition_variable); } + inline void SetConditionVariable(OrderConditionVariable condition_variable) { SB(this->dest.value, 11, 5, to_underlying(condition_variable)); } /** Set the comparator to use. */ - inline void SetConditionComparator(OrderConditionComparator condition_comparator) { SB(this->type, 5, 3, condition_comparator); } + inline void SetConditionComparator(OrderConditionComparator condition_comparator) { SB(this->type, 5, 3, to_underlying(condition_comparator)); } /** Get the order to skip to. */ inline void SetConditionSkipToOrder(VehicleOrderID order_id) { this->flags = order_id; } /** Set the value to base the skip on. */ @@ -231,7 +231,7 @@ public: { if (!this->IsTravelTimetabled() && !this->IsType(OT_CONDITIONAL)) return false; if (!this->IsWaitTimetabled() && this->IsType(OT_GOTO_STATION) && - !(this->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) { + !this->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { return false; } return true; diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 8754c96874..a6f604d123 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -164,10 +164,10 @@ bool Order::Equals(const Order &other) const * evaluation. If we do not do this the order will continuously be seen as * a different order and it will try to find a "nearest depot" every tick. */ if ((this->IsType(OT_GOTO_DEPOT) && this->type == other.type) && - ((this->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0 || - (other.GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0)) { + (this->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot) || + other.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot))) { return this->GetDepotOrderType() == other.GetDepotOrderType() && - (this->GetDepotActionType() & ~ODATFB_NEAREST_DEPOT) == (other.GetDepotActionType() & ~ODATFB_NEAREST_DEPOT); + this->GetDepotActionType().Reset(OrderDepotActionFlag::NearestDepot) == other.GetDepotActionType().Reset(OrderDepotActionFlag::NearestDepot); } return this->type == other.type && this->flags == other.flags && this->dest == other.dest; @@ -185,11 +185,11 @@ uint16_t Order::MapOldOrder() const case OT_GOTO_STATION: if (this->GetUnloadType() & OUFB_UNLOAD) SetBit(order, 5); if (this->GetLoadType() & OLFB_FULL_LOAD) SetBit(order, 6); - if (this->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) SetBit(order, 7); + if (this->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)) SetBit(order, 7); order |= GB(this->GetDestination().value, 0, 8) << 8; break; case OT_GOTO_DEPOT: - if (!(this->GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) SetBit(order, 6); + if (!this->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) SetBit(order, 6); SetBit(order, 7); order |= GB(this->GetDestination().value, 0, 8) << 8; break; @@ -331,7 +331,7 @@ VehicleOrderID OrderList::GetNextDecisionNode(VehicleOrderID next, uint hops) co const Order &order_next = this->orders[next]; if (order_next.IsType(OT_CONDITIONAL)) { - if (order_next.GetConditionVariable() != OCV_UNCONDITIONALLY) return next; + if (order_next.GetConditionVariable() != OrderConditionVariable::Unconditionally) return next; /* We can evaluate trivial conditions right away. They're conceptually * the same as regular order progression. */ @@ -341,7 +341,7 @@ VehicleOrderID OrderList::GetNextDecisionNode(VehicleOrderID next, uint hops) co } if (order_next.IsType(OT_GOTO_DEPOT)) { - if ((order_next.GetDepotActionType() & ODATFB_HALT) != 0) return INVALID_VEH_ORDER_ID; + if (order_next.GetDepotActionType().Test(OrderDepotActionFlag::Halt)) return INVALID_VEH_ORDER_ID; if (order_next.IsRefit()) return next; } @@ -648,7 +648,7 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s } /* Non stop only allowed for ground vehicles. */ - if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && !v->IsGroundVehicle()) return CMD_ERROR; + if (new_order.GetNonStopType().Any() && !v->IsGroundVehicle()) return CMD_ERROR; /* Filter invalid load/unload types. */ switch (new_order.GetLoadType()) { @@ -671,12 +671,12 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s /* Filter invalid stop locations */ switch (new_order.GetStopLocation()) { - case OSL_PLATFORM_NEAR_END: - case OSL_PLATFORM_MIDDLE: + case OrderStopLocation::NearEnd: + case OrderStopLocation::Middle: if (v->type != VEH_TRAIN) return CMD_ERROR; [[fallthrough]]; - case OSL_PLATFORM_FAR_END: + case OrderStopLocation::FarEnd: break; default: @@ -687,7 +687,7 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s } case OT_GOTO_DEPOT: { - if ((new_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) == 0) { + if (!new_order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) { if (v->type == VEH_AIRCRAFT) { const Station *st = Station::GetIfValid(new_order.GetDestination().ToStationID()); @@ -725,15 +725,22 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s } } - if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && !v->IsGroundVehicle()) return CMD_ERROR; - if (new_order.GetDepotOrderType() & ~(ODTFB_PART_OF_ORDERS | ((new_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0 ? ODTFB_SERVICE : 0))) return CMD_ERROR; - if (new_order.GetDepotActionType() & ~(ODATFB_HALT | ODATFB_NEAREST_DEPOT | ODATFB_UNBUNCH)) return CMD_ERROR; + if (new_order.GetNonStopType().Any() && !v->IsGroundVehicle()) return CMD_ERROR; + + /* Check depot order type is valid. */ + OrderDepotTypeFlags depot_order_type = new_order.GetDepotOrderType(); + if (depot_order_type.Test(OrderDepotTypeFlag::PartOfOrders)) depot_order_type.Reset(OrderDepotTypeFlag::Service); + depot_order_type.Reset(OrderDepotTypeFlag::PartOfOrders); + if (depot_order_type.Any()) return CMD_ERROR; + + /* Check depot action type is valid. */ + if (new_order.GetDepotActionType().Reset({OrderDepotActionFlag::Halt, OrderDepotActionFlag::NearestDepot, OrderDepotActionFlag::Unbunch}).Any()) return CMD_ERROR; /* Vehicles cannot have a "service if needed" order that also has a depot action. */ - if ((new_order.GetDepotOrderType() & ODTFB_SERVICE) && (new_order.GetDepotActionType() & (ODATFB_HALT | ODATFB_UNBUNCH))) return CMD_ERROR; + if (new_order.GetDepotOrderType().Test(OrderDepotTypeFlag::Service) && new_order.GetDepotActionType().Any({OrderDepotActionFlag::Halt, OrderDepotActionFlag::Unbunch})) return CMD_ERROR; /* Check if we're allowed to have a new unbunching order. */ - if ((new_order.GetDepotActionType() & ODATFB_UNBUNCH)) { + if (new_order.GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) { if (v->HasFullLoadOrder()) return CommandCost(STR_ERROR_CAN_T_ADD_ORDER, STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD); if (v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_CAN_T_ADD_ORDER, STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED); if (v->HasConditionalOrder()) return CommandCost(STR_ERROR_CAN_T_ADD_ORDER, STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL); @@ -776,35 +783,35 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s /* Order flags can be any of the following for waypoints: * [non-stop] * non-stop orders (if any) are only valid for trains and road vehicles */ - if (new_order.GetNonStopType() != ONSF_STOP_EVERYWHERE && !v->IsGroundVehicle()) return CMD_ERROR; + if (new_order.GetNonStopType().Any() && !v->IsGroundVehicle()) return CMD_ERROR; break; } case OT_CONDITIONAL: { VehicleOrderID skip_to = new_order.GetConditionSkipToOrder(); if (skip_to != 0 && skip_to >= v->GetNumOrders()) return CMD_ERROR; // Always allow jumping to the first (even when there is no order). - if (new_order.GetConditionVariable() >= OCV_END) return CMD_ERROR; + if (new_order.GetConditionVariable() >= OrderConditionVariable::End) return CMD_ERROR; if (v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_CONDITIONAL); OrderConditionComparator occ = new_order.GetConditionComparator(); - if (occ >= OCC_END) return CMD_ERROR; + if (occ >= OrderConditionComparator::End) return CMD_ERROR; switch (new_order.GetConditionVariable()) { - case OCV_REQUIRES_SERVICE: - if (occ != OCC_IS_TRUE && occ != OCC_IS_FALSE) return CMD_ERROR; + case OrderConditionVariable::RequiresService: + if (occ != OrderConditionComparator::IsTrue && occ != OrderConditionComparator::IsFalse) return CMD_ERROR; break; - case OCV_UNCONDITIONALLY: - if (occ != OCC_EQUALS) return CMD_ERROR; + case OrderConditionVariable::Unconditionally: + if (occ != OrderConditionComparator::Equal) return CMD_ERROR; if (new_order.GetConditionValue() != 0) return CMD_ERROR; break; - case OCV_LOAD_PERCENTAGE: - case OCV_RELIABILITY: + case OrderConditionVariable::LoadPercentage: + case OrderConditionVariable::Reliability: if (new_order.GetConditionValue() > 100) return CMD_ERROR; [[fallthrough]]; default: - if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) return CMD_ERROR; + if (occ == OrderConditionComparator::IsTrue || occ == OrderConditionComparator::IsFalse) return CMD_ERROR; break; } break; @@ -945,7 +952,7 @@ static void CancelLoadingDueToDeletedOrder(Vehicle *v) assert(v->current_order.IsType(OT_LOADING)); /* NON-stop flag is misused to see if a train is in a station that is * on its order list or not */ - v->current_order.SetNonStopType(ONSF_STOP_EVERYWHERE); + v->current_order.SetNonStopType({}); /* When full loading, "cancel" that order so the vehicle doesn't * stay indefinitely at this station anymore. */ if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) v->current_order.SetLoadType(OLF_LOAD_IF_POSSIBLE); @@ -1195,19 +1202,25 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s switch (mof) { default: NOT_REACHED(); - case MOF_NON_STOP: + case MOF_NON_STOP: { if (!v->IsGroundVehicle()) return CMD_ERROR; - if (data >= ONSF_END) return CMD_ERROR; - if (data == order->GetNonStopType()) return CMD_ERROR; + + OrderNonStopFlags nonstop_flags = static_cast(data); + if (nonstop_flags == order->GetNonStopType()) return CMD_ERROR; + + /* Test for invalid flags. */ + nonstop_flags.Reset({OrderNonStopFlag::NoIntermediate, OrderNonStopFlag::NoDestination}); + if (nonstop_flags.Any()) return CMD_ERROR; break; + } case MOF_STOP_LOCATION: if (v->type != VEH_TRAIN) return CMD_ERROR; - if (data >= OSL_END) return CMD_ERROR; + if (data >= to_underlying(OrderStopLocation::End)) return CMD_ERROR; break; case MOF_UNLOAD: - if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return CMD_ERROR; + if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CMD_ERROR; if ((data & ~(OUFB_UNLOAD | OUFB_TRANSFER | OUFB_NO_UNLOAD)) != 0) return CMD_ERROR; /* Unload and no-unload are mutual exclusive and so are transfer and no unload. */ if (data != 0 && ((data & (OUFB_UNLOAD | OUFB_TRANSFER)) != 0) == ((data & OUFB_NO_UNLOAD) != 0)) return CMD_ERROR; @@ -1215,52 +1228,58 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s break; case MOF_LOAD: - if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return CMD_ERROR; + if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CMD_ERROR; if (data > OLFB_NO_LOAD || data == 1) return CMD_ERROR; if (data == order->GetLoadType()) return CMD_ERROR; if ((data & (OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY)) && v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_FULL_LOAD); break; - case MOF_DEPOT_ACTION: - if (data >= DA_END) return CMD_ERROR; + case MOF_DEPOT_ACTION: { + OrderDepotAction depot_action = static_cast(data); + if (depot_action >= OrderDepotAction::End) return CMD_ERROR; /* Check if we are allowed to add unbunching. We are always allowed to remove it. */ - if (data == DA_UNBUNCH) { + if (depot_action == OrderDepotAction::Unbunch) { /* Only one unbunching order is allowed in a vehicle's orders. If this order already has an unbunching action, no error is needed. */ - if (v->HasUnbunchingOrder() && !(order->GetDepotActionType() & ODATFB_UNBUNCH)) return CommandCost(STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED); + if (v->HasUnbunchingOrder() && !order->GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) return CommandCost(STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED); /* We don't allow unbunching if the vehicle has a conditional order. */ if (v->HasConditionalOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL); /* We don't allow unbunching if the vehicle has a full load order. */ if (v->HasFullLoadOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD); } break; + } - case MOF_COND_VARIABLE: - if (data >= OCV_END) return CMD_ERROR; + case MOF_COND_VARIABLE: { + OrderConditionVariable cond_variable = static_cast(data); + if (cond_variable >= OrderConditionVariable::End) return CMD_ERROR; break; + } - case MOF_COND_COMPARATOR: - if (data >= OCC_END) return CMD_ERROR; + case MOF_COND_COMPARATOR: { + OrderConditionComparator cond_comparator = static_cast(data); + if (cond_comparator >= OrderConditionComparator::End) return CMD_ERROR; switch (order->GetConditionVariable()) { - case OCV_UNCONDITIONALLY: return CMD_ERROR; + case OrderConditionVariable::Unconditionally: return CMD_ERROR; - case OCV_REQUIRES_SERVICE: - if (data != OCC_IS_TRUE && data != OCC_IS_FALSE) return CMD_ERROR; + case OrderConditionVariable::RequiresService: + if (cond_comparator != OrderConditionComparator::IsTrue && cond_comparator != OrderConditionComparator::IsFalse) return CMD_ERROR; break; default: - if (data == OCC_IS_TRUE || data == OCC_IS_FALSE) return CMD_ERROR; + if (cond_comparator == OrderConditionComparator::IsTrue || cond_comparator == OrderConditionComparator::IsFalse) return CMD_ERROR; break; } break; + } case MOF_COND_VALUE: switch (order->GetConditionVariable()) { - case OCV_UNCONDITIONALLY: - case OCV_REQUIRES_SERVICE: + case OrderConditionVariable::Unconditionally: + case OrderConditionVariable::RequiresService: return CMD_ERROR; - case OCV_LOAD_PERCENTAGE: - case OCV_RELIABILITY: + case OrderConditionVariable::LoadPercentage: + case OrderConditionVariable::Reliability: if (data > 100) return CMD_ERROR; break; @@ -1278,8 +1297,8 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s if (flags.Test(DoCommandFlag::Execute)) { switch (mof) { case MOF_NON_STOP: - order->SetNonStopType((OrderNonStopFlags)data); - if (data & ONSF_NO_STOP_AT_DESTINATION_STATION) { + order->SetNonStopType(static_cast(data)); + if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { order->SetRefit(CARGO_NO_REFIT); order->SetLoadType(OLF_LOAD_IF_POSSIBLE); order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE); @@ -1287,7 +1306,7 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s break; case MOF_STOP_LOCATION: - order->SetStopLocation((OrderStopLocation)data); + order->SetStopLocation(static_cast(data)); break; case MOF_UNLOAD: @@ -1300,31 +1319,27 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s break; case MOF_DEPOT_ACTION: { - switch (data) { - case DA_ALWAYS_GO: - order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_HALT)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_UNBUNCH)); + switch (static_cast(data)) { + case OrderDepotAction::AlwaysGo: + order->SetDepotOrderType(order->GetDepotOrderType().Reset(OrderDepotTypeFlag::Service)); + order->SetDepotActionType(order->GetDepotActionType().Reset({OrderDepotActionFlag::Halt, OrderDepotActionFlag::Unbunch})); break; - case DA_SERVICE: - order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() | ODTFB_SERVICE)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_HALT)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_UNBUNCH)); + case OrderDepotAction::Service: + order->SetDepotOrderType(order->GetDepotOrderType().Set(OrderDepotTypeFlag::Service)); + order->SetDepotActionType(order->GetDepotActionType().Reset({OrderDepotActionFlag::Halt, OrderDepotActionFlag::Unbunch})); order->SetRefit(CARGO_NO_REFIT); break; - case DA_STOP: - order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() | ODATFB_HALT)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_UNBUNCH)); + case OrderDepotAction::Stop: + order->SetDepotOrderType(order->GetDepotOrderType().Reset(OrderDepotTypeFlag::Service)); + order->SetDepotActionType(order->GetDepotActionType().Set(OrderDepotActionFlag::Halt).Reset(OrderDepotActionFlag::Unbunch)); order->SetRefit(CARGO_NO_REFIT); break; - case DA_UNBUNCH: - order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_HALT)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() | ODATFB_UNBUNCH)); + case OrderDepotAction::Unbunch: + order->SetDepotOrderType(order->GetDepotOrderType().Reset(OrderDepotTypeFlag::Service)); + order->SetDepotActionType(order->GetDepotActionType().Reset(OrderDepotActionFlag::Halt).Set(OrderDepotActionFlag::Unbunch)); break; default: @@ -1338,23 +1353,23 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s OrderConditionComparator occ = order->GetConditionComparator(); switch (order->GetConditionVariable()) { - case OCV_UNCONDITIONALLY: - order->SetConditionComparator(OCC_EQUALS); + case OrderConditionVariable::Unconditionally: + order->SetConditionComparator(OrderConditionComparator::Equal); order->SetConditionValue(0); break; - case OCV_REQUIRES_SERVICE: - if (occ != OCC_IS_TRUE && occ != OCC_IS_FALSE) order->SetConditionComparator(OCC_IS_TRUE); + case OrderConditionVariable::RequiresService: + if (occ != OrderConditionComparator::IsTrue && occ != OrderConditionComparator::IsFalse) order->SetConditionComparator(OrderConditionComparator::IsTrue); order->SetConditionValue(0); break; - case OCV_LOAD_PERCENTAGE: - case OCV_RELIABILITY: + case OrderConditionVariable::LoadPercentage: + case OrderConditionVariable::Reliability: if (order->GetConditionValue() > 100) order->SetConditionValue(100); [[fallthrough]]; default: - if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS); + if (occ == OrderConditionComparator::IsTrue || occ == OrderConditionComparator::IsFalse) order->SetConditionComparator(OrderConditionComparator::Equal); break; } break; @@ -1605,8 +1620,8 @@ CommandCost CmdOrderRefit(DoCommandFlags flags, VehicleID veh, VehicleOrderID or /* Make the depot order an 'always go' order. */ if (cargo != CARGO_NO_REFIT && order->IsType(OT_GOTO_DEPOT)) { - order->SetDepotOrderType((OrderDepotTypeFlags)(order->GetDepotOrderType() & ~ODTFB_SERVICE)); - order->SetDepotActionType((OrderDepotActionFlags)(order->GetDepotActionType() & ~ODATFB_HALT)); + order->SetDepotOrderType(order->GetDepotOrderType().Reset(OrderDepotTypeFlag::Service)); + order->SetDepotActionType(order->GetDepotActionType().Reset(OrderDepotActionFlag::Halt)); } for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { @@ -1614,7 +1629,7 @@ CommandCost CmdOrderRefit(DoCommandFlags flags, VehicleID veh, VehicleOrderID or InvalidateVehicleOrder(u, VIWD_MODIFY_ORDERS); /* If the vehicle already got the current depot set as current order, then update current order as well */ - if (u->cur_real_order_index == order_number && (u->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) { + if (u->cur_real_order_index == order_number && u->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) { u->current_order.SetRefit(cargo); } } @@ -1725,7 +1740,7 @@ void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool next_id = id + 1; Order *order = v->orders->GetOrderAt(id); OrderType ot = order->GetType(); - if (ot == OT_GOTO_DEPOT && (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) continue; + if (ot == OT_GOTO_DEPOT && order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) continue; if (ot == OT_GOTO_DEPOT && hangar && v->type != VEH_AIRCRAFT) continue; // Not an aircraft? Can't have a hangar order. if (ot == OT_IMPLICIT || (v->type == VEH_AIRCRAFT && ot == OT_GOTO_DEPOT && !hangar)) ot = OT_GOTO_STATION; if (ot == type && order->GetDestination() == destination) { @@ -1844,14 +1859,14 @@ static bool CheckForValidOrders(const Vehicle *v) static bool OrderConditionCompare(OrderConditionComparator occ, int variable, int value) { switch (occ) { - case OCC_EQUALS: return variable == value; - case OCC_NOT_EQUALS: return variable != value; - case OCC_LESS_THAN: return variable < value; - case OCC_LESS_EQUALS: return variable <= value; - case OCC_MORE_THAN: return variable > value; - case OCC_MORE_EQUALS: return variable >= value; - case OCC_IS_TRUE: return variable != 0; - case OCC_IS_FALSE: return variable == 0; + case OrderConditionComparator::Equal: return variable == value; + case OrderConditionComparator::NotEqual: return variable != value; + case OrderConditionComparator::LessThan: return variable < value; + case OrderConditionComparator::LessThanOrEqual: return variable <= value; + case OrderConditionComparator::MoreThan: return variable > value; + case OrderConditionComparator::MoreThanOrEqual: return variable >= value; + case OrderConditionComparator::IsTrue: return variable != 0; + case OrderConditionComparator::IsFalse: return variable == 0; default: NOT_REACHED(); } } @@ -1876,14 +1891,14 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) uint16_t value = order->GetConditionValue(); switch (order->GetConditionVariable()) { - case OCV_LOAD_PERCENTAGE: skip_order = OrderConditionCompare(occ, CalcPercentVehicleFilled(v, nullptr), value); break; - 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, TimerGameCalendar::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(TimerGameCalendar::DateToYear(v->max_age - v->age + CalendarTime::DAYS_IN_LEAP_YEAR - 1), TimerGameCalendar::Year(0)), value); break; + case OrderConditionVariable::LoadPercentage: skip_order = OrderConditionCompare(occ, CalcPercentVehicleFilled(v, nullptr), value); break; + case OrderConditionVariable::Reliability: skip_order = OrderConditionCompare(occ, ToPercent16(v->reliability), value); break; + case OrderConditionVariable::MaxReliability: skip_order = OrderConditionCompare(occ, ToPercent16(v->GetEngine()->reliability), value); break; + case OrderConditionVariable::MaxSpeed: skip_order = OrderConditionCompare(occ, v->GetDisplayMaxSpeed() * 10 / 16, value); break; + case OrderConditionVariable::Age: skip_order = OrderConditionCompare(occ, TimerGameCalendar::DateToYear(v->age), value); break; + case OrderConditionVariable::RequiresService: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break; + case OrderConditionVariable::Unconditionally: skip_order = true; break; + case OrderConditionVariable::RemainingLifetime: skip_order = OrderConditionCompare(occ, std::max(TimerGameCalendar::DateToYear(v->max_age - v->age + CalendarTime::DAYS_IN_LEAP_YEAR - 1), TimerGameCalendar::Year(0)), value); break; default: NOT_REACHED(); } @@ -1911,14 +1926,14 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool return true; case OT_GOTO_DEPOT: - if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) { + if (order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service) && !v->NeedsServicing()) { assert(!pbs_look_ahead); UpdateVehicleTimetable(v, true); v->IncrementRealOrderIndex(); break; } - if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) { /* If the vehicle can't find its destination, delay its next search. * In case many vehicles are in this state, use the vehicle index to spread out pathfinder calls. */ if (v->dest_tile == 0 && TimerGameEconomy::date_fract != (v->index % Ticks::DAY_TICKS)) break; @@ -2031,7 +2046,7 @@ bool ProcessOrders(Vehicle *v) switch (v->current_order.GetType()) { case OT_GOTO_DEPOT: /* Let a depot order in the orderlist interrupt. */ - if (!(v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return false; + if (!v->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) return false; break; case OT_LOADING: @@ -2054,7 +2069,7 @@ bool ProcessOrders(Vehicle *v) bool may_reverse = v->current_order.IsType(OT_NOTHING); /* Check if we've reached a 'via' destination. */ - if (((v->current_order.IsType(OT_GOTO_STATION) && (v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) || v->current_order.IsType(OT_GOTO_WAYPOINT)) && + if (((v->current_order.IsType(OT_GOTO_STATION) && v->current_order.GetNonStopType().Test(OrderNonStopFlag::NoDestination)) || v->current_order.IsType(OT_GOTO_WAYPOINT)) && IsTileType(v->tile, MP_STATION) && v->current_order.GetDestination() == GetStationIndex(v->tile)) { v->DeleteUnreachedImplicitOrders(); @@ -2128,16 +2143,16 @@ bool Order::ShouldStopAtStation(const Vehicle *v, StationID station) const { bool is_dest_station = this->IsType(OT_GOTO_STATION) && this->dest == station; - return (!this->IsType(OT_GOTO_DEPOT) || (this->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0) && + return (!this->IsType(OT_GOTO_DEPOT) || this->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) && v->last_station_visited != station && // Do stop only when we've not just been there /* Finally do stop when there is no non-stop flag set for this type of station. */ - !(this->GetNonStopType() & (is_dest_station ? ONSF_NO_STOP_AT_DESTINATION_STATION : ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS)); + !this->GetNonStopType().Test(is_dest_station ? OrderNonStopFlag::NoDestination : OrderNonStopFlag::NoIntermediate); } bool Order::CanLoadOrUnload() const { return (this->IsType(OT_GOTO_STATION) || this->IsType(OT_IMPLICIT)) && - (this->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0 && + !this->GetNonStopType().Test(OrderNonStopFlag::NoDestination) && ((this->GetLoadType() & OLFB_NO_LOAD) == 0 || (this->GetUnloadType() & OUFB_NO_UNLOAD) == 0); } diff --git a/src/order_gui.cpp b/src/order_gui.cpp index d131681252..c9f6127a2b 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -155,14 +155,14 @@ static const StringID _order_goto_dropdown_aircraft[] = { /** Variables for conditional orders; this defines the order of appearance in the dropdown box */ static const OrderConditionVariable _order_conditional_variable[] = { - OCV_LOAD_PERCENTAGE, - OCV_RELIABILITY, - OCV_MAX_RELIABILITY, - OCV_MAX_SPEED, - OCV_AGE, - OCV_REMAINING_LIFETIME, - OCV_REQUIRES_SERVICE, - OCV_UNCONDITIONALLY, + OrderConditionVariable::LoadPercentage, + OrderConditionVariable::Reliability, + OrderConditionVariable::MaxReliability, + OrderConditionVariable::MaxSpeed, + OrderConditionVariable::Age, + OrderConditionVariable::RemainingLifetime, + OrderConditionVariable::RequiresService, + OrderConditionVariable::Unconditionally, }; static const StringID _order_conditional_condition[] = { @@ -186,17 +186,12 @@ static const StringID _order_depot_action_dropdown[] = { STR_ORDER_DROP_UNBUNCH, }; -static int DepotActionStringIndex(const Order *order) +static OrderDepotAction DepotActionStringIndex(const Order *order) { - if (order->GetDepotActionType() & ODATFB_HALT) { - return DA_STOP; - } else if (order->GetDepotOrderType() & ODTFB_SERVICE) { - return DA_SERVICE; - } else if (order->GetDepotActionType() & ODATFB_UNBUNCH) { - return DA_UNBUNCH; - } else { - return DA_ALWAYS_GO; - } + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Halt)) return OrderDepotAction::Stop; + if (order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service)) return OrderDepotAction::Service; + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) return OrderDepotAction::Unbunch; + return OrderDepotAction::AlwaysGo; } static const StringID _order_refit_action_dropdown[] = { @@ -206,10 +201,10 @@ static const StringID _order_refit_action_dropdown[] = { static StringID GetOrderGoToString(const Order &order) { - if (order.GetDepotOrderType() & ODTFB_SERVICE) { - return (order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_SERVICE_NON_STOP_AT : STR_ORDER_SERVICE_AT; + if (order.GetDepotOrderType().Test(OrderDepotTypeFlag::Service)) { + return order.GetNonStopType().Test(OrderNonStopFlag::NoIntermediate) ? STR_ORDER_SERVICE_NON_STOP_AT : STR_ORDER_SERVICE_AT; } else { - return (order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_GO_NON_STOP_TO : STR_ORDER_GO_TO; + return order.GetNonStopType().Test(OrderNonStopFlag::NoIntermediate) ? STR_ORDER_GO_NON_STOP_TO : STR_ORDER_GO_TO; } } @@ -266,7 +261,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ OrderUnloadFlags unload = order->GetUnloadType(); bool valid_station = CanVehicleUseStation(v, Station::Get(order->GetDestination().ToStationID())); - line = GetString(valid_station ? STR_ORDER_GO_TO_STATION : STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION, STR_ORDER_GO_TO + (v->IsGroundVehicle() ? order->GetNonStopType() : 0), order->GetDestination()); + line = GetString(valid_station ? STR_ORDER_GO_TO_STATION : STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION, STR_ORDER_GO_TO + (v->IsGroundVehicle() ? order->GetNonStopType() : OrderNonStopFlags{}).base(), order->GetDestination()); if (timetable) { /* Show only wait time in the timetable window. */ if (order->GetWaitTime() > 0) { @@ -275,7 +270,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ } } else { /* Show non-stop, refit and stop location only in the order window. */ - if (!(order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) { + if (!order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { StringID str = _station_load_types[order->IsRefit()][unload][load]; if (str != INVALID_STRING_ID) { if (order->IsRefit()) { @@ -286,10 +281,10 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ } } - if (v->type == VEH_TRAIN && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) { + if (v->type == VEH_TRAIN && !order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { /* Only show the stopping location if other than the default chosen by the player. */ - if (order->GetStopLocation() != (OrderStopLocation)(_settings_client.gui.stop_location)) { - line += GetString(STR_ORDER_STOP_LOCATION_NEAR_END + order->GetStopLocation()); + if (order->GetStopLocation() != _settings_client.gui.stop_location) { + line += GetString(STR_ORDER_STOP_LOCATION_NEAR_END + to_underlying(order->GetStopLocation())); } } } @@ -297,7 +292,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ } case OT_GOTO_DEPOT: - if (!(order->GetDepotActionType() & ODATFB_NEAREST_DEPOT)) { + if (!order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) { /* Going to a specific depot. */ line = GetString(STR_ORDER_GO_TO_DEPOT_FORMAT, GetOrderGoToString(*order), v->type, order->GetDestination()); } else if (v->type == VEH_AIRCRAFT) { @@ -309,38 +304,38 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ } /* Do not show stopping in the depot in the timetable window. */ - if (!timetable && (order->GetDepotActionType() & ODATFB_HALT)) { + if (!timetable && order->GetDepotActionType().Test(OrderDepotActionFlag::Halt)) { line += GetString(STR_ORDER_STOP_ORDER); } /* Do not show refitting in the depot in the timetable window. */ if (!timetable && order->IsRefit()) { - line += GetString((order->GetDepotActionType() & ODATFB_HALT) ? STR_ORDER_REFIT_STOP_ORDER : STR_ORDER_REFIT_ORDER, CargoSpec::Get(order->GetRefitCargo())->name); + line += GetString(order->GetDepotActionType().Test(OrderDepotActionFlag::Halt) ? STR_ORDER_REFIT_STOP_ORDER : STR_ORDER_REFIT_ORDER, CargoSpec::Get(order->GetRefitCargo())->name); } /* Show unbunching depot in both order and timetable windows. */ - if (order->GetDepotActionType() & ODATFB_UNBUNCH) { + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) { line += GetString(STR_ORDER_WAIT_TO_UNBUNCH); } break; case OT_GOTO_WAYPOINT: - line = GetString((order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS) ? STR_ORDER_GO_NON_STOP_TO_WAYPOINT : STR_ORDER_GO_TO_WAYPOINT, order->GetDestination()); + line = GetString(order->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate) ? STR_ORDER_GO_NON_STOP_TO_WAYPOINT : STR_ORDER_GO_TO_WAYPOINT, order->GetDestination()); break; case OT_CONDITIONAL: - if (order->GetConditionVariable() == OCV_UNCONDITIONALLY) { + if (order->GetConditionVariable() == OrderConditionVariable::Unconditionally) { line = GetString(STR_ORDER_CONDITIONAL_UNCONDITIONAL, order->GetConditionSkipToOrder() + 1); } else { OrderConditionComparator occ = order->GetConditionComparator(); uint value = order->GetConditionValue(); - if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value, v->type); + if (order->GetConditionVariable() == OrderConditionVariable::MaxSpeed) value = ConvertSpeedToDisplaySpeed(value, v->type); - line = GetString((occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_ORDER_CONDITIONAL_TRUE_FALSE : STR_ORDER_CONDITIONAL_NUM, + line = GetString((occ == OrderConditionComparator::IsTrue || occ == OrderConditionComparator::IsFalse) ? STR_ORDER_CONDITIONAL_TRUE_FALSE : STR_ORDER_CONDITIONAL_NUM, order->GetConditionSkipToOrder() + 1, - STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + order->GetConditionVariable(), - STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ, + STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + to_underlying(order->GetConditionVariable()), + STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + to_underlying(occ), value); } @@ -376,8 +371,8 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) /* check depot first */ if (IsDepotTypeTile(tile, (TransportType)(uint)v->type) && IsTileOwner(tile, _local_company)) { order.MakeGoToDepot(GetDepotDestinationIndex(tile), - ODTFB_PART_OF_ORDERS, - (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE); + OrderDepotTypeFlag::PartOfOrders, + (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) ? OrderNonStopFlag::NoIntermediate : OrderNonStopFlags{}); if (_ctrl_pressed) { /* Check to see if we are allowed to make this an unbunching order. */ @@ -403,7 +398,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) } /* Now we are allowed to set the action type. */ - order.SetDepotActionType(ODATFB_UNBUNCH); + order.SetDepotActionType(OrderDepotActionFlag::Unbunch); } return order; @@ -414,7 +409,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) v->type == VEH_TRAIN && IsTileOwner(tile, _local_company)) { order.MakeGoToWaypoint(GetStationIndex(tile)); - if (_settings_client.gui.new_nonstop != _ctrl_pressed) order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION); + if (_settings_client.gui.new_nonstop != _ctrl_pressed) order.SetNonStopType({}); return order; } @@ -423,7 +418,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) v->type == VEH_ROAD && IsTileOwner(tile, _local_company)) { order.MakeGoToWaypoint(GetStationIndex(tile)); - if (_settings_client.gui.new_nonstop != _ctrl_pressed) order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION); + if (_settings_client.gui.new_nonstop != _ctrl_pressed) order.SetNonStopType({}); return order; } @@ -455,8 +450,8 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) if (st->facilities.Any(facil)) { order.MakeGoToStation(st->index); if (_ctrl_pressed) order.SetLoadType(OLF_FULL_LOAD_ANY); - if (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) order.SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); - order.SetStopLocation(v->type == VEH_TRAIN ? (OrderStopLocation)(_settings_client.gui.stop_location) : OSL_PLATFORM_FAR_END); + if (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) order.SetNonStopType(OrderNonStopFlag::NoIntermediate); + order.SetStopLocation(v->type == VEH_TRAIN ? (OrderStopLocation)(_settings_client.gui.stop_location) : OrderStopLocation::FarEnd); return order; } } @@ -637,16 +632,16 @@ private: /** * Handle the click on the service. */ - void OrderClick_Service(int i) + void OrderClick_Service(std::optional i) { VehicleOrderID sel_ord = this->OrderGetSel(); - if (i < 0) { + if (!i.has_value()) { const Order *order = this->vehicle->GetOrder(sel_ord); if (order == nullptr) return; - i = (order->GetDepotOrderType() & ODTFB_SERVICE) ? DA_ALWAYS_GO : DA_SERVICE; + i = order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service) ? OrderDepotAction::AlwaysGo : OrderDepotAction::Service; } - Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_DEPOT_ACTION, i); + Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_DEPOT_ACTION, to_underlying(i.value())); } /** @@ -655,9 +650,9 @@ private: void OrderClick_NearestDepot() { Order order{}; - order.MakeGoToDepot(DepotID::Invalid(), ODTFB_PART_OF_ORDERS, - _settings_client.gui.new_nonstop && this->vehicle->IsGroundVehicle() ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE); - order.SetDepotActionType(ODATFB_NEAREST_DEPOT); + order.MakeGoToDepot(DepotID::Invalid(), OrderDepotTypeFlag::PartOfOrders, + _settings_client.gui.new_nonstop && this->vehicle->IsGroundVehicle() ? OrderNonStopFlag::NoIntermediate : OrderNonStopFlags{}); + order.SetDepotActionType(OrderDepotActionFlag::NearestDepot); Command::Post(STR_ERROR_CAN_T_INSERT_NEW_ORDER, this->vehicle->tile, this->vehicle->index, this->OrderGetSel(), order); } @@ -690,9 +685,9 @@ private: /** * Handle the click on the nonstop button. - * @param non_stop what non-stop type to use; -1 to use the 'next' one. + * @param non_stop what non-stop type to use; std::nullopt to use the 'next' one. */ - void OrderClick_Nonstop(int non_stop) + void OrderClick_Nonstop(std::optional non_stop) { if (!this->vehicle->IsGroundVehicle()) return; @@ -701,13 +696,13 @@ private: if (order == nullptr || order->GetNonStopType() == non_stop) return; - /* Keypress if negative, so 'toggle' to the next */ - if (non_stop < 0) { - non_stop = order->GetNonStopType() ^ ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS; + /* Keypress if no value, so 'toggle' to the next */ + if (!non_stop.has_value()) { + non_stop = order->GetNonStopType().Flip(OrderNonStopFlag::NoIntermediate); } this->SetWidgetDirty(WID_O_NON_STOP); - Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_NON_STOP, non_stop); + Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_NON_STOP, non_stop.value().base()); } /** @@ -829,7 +824,7 @@ public: case WID_O_COND_VARIABLE: { Dimension d = {0, 0}; for (const auto &ocv : _order_conditional_variable) { - d = maxdim(d, GetStringBoundingBox(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + ocv)); + d = maxdim(d, GetStringBoundingBox(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + to_underlying(ocv))); } d.width += padding.width; d.height += padding.height; @@ -985,8 +980,8 @@ public: this->DisableWidget(WID_O_UNLOAD); this->DisableWidget(WID_O_REFIT_DROPDOWN); } else { - this->SetWidgetDisabledState(WID_O_FULL_LOAD, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // full load - this->SetWidgetDisabledState(WID_O_UNLOAD, (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) != 0); // unload + this->SetWidgetDisabledState(WID_O_FULL_LOAD, order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)); // full load + this->SetWidgetDisabledState(WID_O_UNLOAD, order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)); // unload switch (order->GetType()) { case OT_GOTO_STATION: @@ -998,7 +993,7 @@ public: middle_sel->SetDisplayedPlane(DP_MIDDLE_UNLOAD); right_sel->SetDisplayedPlane(DP_RIGHT_REFIT); this->EnableWidget(WID_O_NON_STOP); - this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)); } this->SetWidgetLoweredState(WID_O_FULL_LOAD, order->GetLoadType() == OLF_FULL_LOAD_ANY); this->SetWidgetLoweredState(WID_O_UNLOAD, order->GetUnloadType() == OUFB_UNLOAD); @@ -1006,7 +1001,7 @@ public: /* Can only do refitting when stopping at the destination and loading cargo. * Also enable the button if a refit is already set to allow clearing it. */ this->SetWidgetDisabledState(WID_O_REFIT_DROPDOWN, - order->GetLoadType() == OLFB_NO_LOAD || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) || + order->GetLoadType() == OLFB_NO_LOAD || order->GetNonStopType().Test(OrderNonStopFlag::NoDestination) || ((!this->can_do_refit || !this->can_do_autorefit) && !order->IsRefit())); break; @@ -1020,7 +1015,7 @@ public: middle_sel->SetDisplayedPlane(DP_MIDDLE_UNLOAD); right_sel->SetDisplayedPlane(DP_RIGHT_EMPTY); this->EnableWidget(WID_O_NON_STOP); - this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)); } this->DisableWidget(WID_O_FULL_LOAD); this->DisableWidget(WID_O_UNLOAD); @@ -1036,12 +1031,12 @@ public: middle_sel->SetDisplayedPlane(DP_MIDDLE_SERVICE); right_sel->SetDisplayedPlane(DP_RIGHT_EMPTY); this->EnableWidget(WID_O_NON_STOP); - this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)); } /* Disable refit button if the order is no 'always go' order. * However, keep the service button enabled for refit-orders to allow clearing refits (without knowing about ctrl). */ this->SetWidgetDisabledState(WID_O_REFIT, - (order->GetDepotOrderType() & ODTFB_SERVICE) || (order->GetDepotActionType() & ODATFB_HALT) || + order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service) || order->GetDepotActionType().Test(OrderDepotActionFlag::Halt) || (!this->can_do_refit && !order->IsRefit())); break; @@ -1053,10 +1048,10 @@ public: } OrderConditionVariable ocv = order->GetConditionVariable(); /* Set the strings for the dropdown boxes. */ - this->GetWidget(WID_O_COND_VARIABLE)->SetString(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + ocv); - this->GetWidget(WID_O_COND_COMPARATOR)->SetString(_order_conditional_condition[order->GetConditionComparator()]); - this->SetWidgetDisabledState(WID_O_COND_COMPARATOR, ocv == OCV_UNCONDITIONALLY); - this->SetWidgetDisabledState(WID_O_COND_VALUE, ocv == OCV_REQUIRES_SERVICE || ocv == OCV_UNCONDITIONALLY); + this->GetWidget(WID_O_COND_VARIABLE)->SetString(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + to_underlying(ocv)); + this->GetWidget(WID_O_COND_COMPARATOR)->SetString(_order_conditional_condition[to_underlying(order->GetConditionComparator())]); + this->SetWidgetDisabledState(WID_O_COND_COMPARATOR, ocv == OrderConditionVariable::Unconditionally); + this->SetWidgetDisabledState(WID_O_COND_VALUE, ocv == OrderConditionVariable::RequiresService || ocv == OrderConditionVariable::Unconditionally); break; } @@ -1159,7 +1154,7 @@ public: if (order != nullptr && order->IsType(OT_CONDITIONAL)) { uint value = order->GetConditionValue(); - if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value, this->vehicle->type); + if (order->GetConditionVariable() == OrderConditionVariable::MaxSpeed) value = ConvertSpeedToDisplaySpeed(value, this->vehicle->type); return GetString(STR_JUST_COMMA, value); } return {}; @@ -1174,9 +1169,9 @@ public: if (order == nullptr || !order->IsType(OT_GOTO_DEPOT)) return {}; /* Select the current action selected in the dropdown. The flags don't match the dropdown so we can't just use an index. */ - if (order->GetDepotOrderType() & ODTFB_SERVICE) return GetString(STR_ORDER_DROP_SERVICE_DEPOT); - if (order->GetDepotActionType() & ODATFB_HALT) return GetString(STR_ORDER_DROP_HALT_DEPOT); - if (order->GetDepotActionType() & ODATFB_UNBUNCH) return GetString(STR_ORDER_DROP_UNBUNCH); + if (order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service)) return GetString(STR_ORDER_DROP_SERVICE_DEPOT); + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Halt)) return GetString(STR_ORDER_DROP_HALT_DEPOT); + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) return GetString(STR_ORDER_DROP_UNBUNCH); return GetString(STR_ORDER_DROP_GO_ALWAYS_DEPOT); } @@ -1220,7 +1215,7 @@ public: if (this->vehicle->type == VEH_TRAIN && sel < this->vehicle->GetNumOrders()) { Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel, - MOF_STOP_LOCATION, (this->vehicle->GetOrder(sel)->GetStopLocation() + 1) % OSL_END); + MOF_STOP_LOCATION, (to_underlying(this->vehicle->GetOrder(sel)->GetStopLocation()) + 1) % to_underlying(OrderStopLocation::End)); } } else { /* Select clicked order */ @@ -1250,11 +1245,11 @@ public: case WID_O_NON_STOP: if (this->GetWidget(widget)->ButtonHit(pt)) { - this->OrderClick_Nonstop(-1); + this->OrderClick_Nonstop(std::nullopt); } else { const Order *o = this->vehicle->GetOrder(this->OrderGetSel()); assert(o != nullptr); - ShowDropDownMenu(this, _order_non_stop_dropdown, o->GetNonStopType(), WID_O_NON_STOP, 0, + ShowDropDownMenu(this, _order_non_stop_dropdown, o->GetNonStopType().base(), WID_O_NON_STOP, 0, o->IsType(OT_GOTO_STATION) ? 0 : (o->IsType(OT_GOTO_WAYPOINT) ? 3 : 12)); } break; @@ -1300,7 +1295,7 @@ public: break; case WID_O_DEPOT_ACTION: - ShowDropDownMenu(this, _order_depot_action_dropdown, DepotActionStringIndex(this->vehicle->GetOrder(this->OrderGetSel())), WID_O_DEPOT_ACTION, 0, 0); + ShowDropDownMenu(this, _order_depot_action_dropdown, to_underlying(DepotActionStringIndex(this->vehicle->GetOrder(this->OrderGetSel()))), WID_O_DEPOT_ACTION, 0, 0); break; case WID_O_REFIT_DROPDOWN: @@ -1318,16 +1313,16 @@ public: case WID_O_COND_VARIABLE: { DropDownList list; for (const auto &ocv : _order_conditional_variable) { - list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + ocv, ocv)); + list.push_back(MakeDropDownListStringItem(STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + to_underlying(ocv), to_underlying(ocv))); } - ShowDropDownList(this, std::move(list), this->vehicle->GetOrder(this->OrderGetSel())->GetConditionVariable(), WID_O_COND_VARIABLE); + ShowDropDownList(this, std::move(list), to_underlying(this->vehicle->GetOrder(this->OrderGetSel())->GetConditionVariable()), WID_O_COND_VARIABLE); break; } case WID_O_COND_COMPARATOR: { const Order *o = this->vehicle->GetOrder(this->OrderGetSel()); assert(o != nullptr); - ShowDropDownMenu(this, _order_conditional_condition, o->GetConditionComparator(), WID_O_COND_COMPARATOR, 0, (o->GetConditionVariable() == OCV_REQUIRES_SERVICE) ? 0x3F : 0xC0); + ShowDropDownMenu(this, _order_conditional_condition, to_underlying(o->GetConditionComparator()), WID_O_COND_COMPARATOR, 0, (o->GetConditionVariable() == OrderConditionVariable::RequiresService) ? 0x3F : 0xC0); break; } @@ -1335,7 +1330,7 @@ public: const Order *order = this->vehicle->GetOrder(this->OrderGetSel()); assert(order != nullptr); uint value = order->GetConditionValue(); - if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value, this->vehicle->type); + if (order->GetConditionVariable() == OrderConditionVariable::MaxSpeed) value = ConvertSpeedToDisplaySpeed(value, this->vehicle->type); ShowQueryString(GetString(STR_JUST_INT, value), STR_ORDER_CONDITIONAL_VALUE_CAPT, 5, this, CS_NUMERAL, {}); break; } @@ -1355,12 +1350,12 @@ public: if (!value.has_value()) return; switch (this->vehicle->GetOrder(sel)->GetConditionVariable()) { - case OCV_MAX_SPEED: + case OrderConditionVariable::MaxSpeed: value = ConvertDisplaySpeedToSpeed(*value, this->vehicle->type); break; - case OCV_RELIABILITY: - case OCV_LOAD_PERCENTAGE: + case OrderConditionVariable::Reliability: + case OrderConditionVariable::LoadPercentage: value = Clamp(*value, 0, 100); break; @@ -1374,7 +1369,7 @@ public: { switch (widget) { case WID_O_NON_STOP: - this->OrderClick_Nonstop(index); + this->OrderClick_Nonstop(static_cast(index)); break; case WID_O_FULL_LOAD: @@ -1396,7 +1391,7 @@ public: break; case WID_O_DEPOT_ACTION: - this->OrderClick_Service(index); + this->OrderClick_Service(static_cast(index)); break; case WID_O_REFIT_DROPDOWN: @@ -1454,11 +1449,11 @@ public: case OHK_SKIP: this->OrderClick_Skip(); break; case OHK_DELETE: this->OrderClick_Delete(); break; case OHK_GOTO: this->OrderClick_Goto(OPOS_GOTO); break; - case OHK_NONSTOP: this->OrderClick_Nonstop(-1); break; + case OHK_NONSTOP: this->OrderClick_Nonstop(std::nullopt); break; case OHK_FULLLOAD: this->OrderClick_FullLoad(OLF_FULL_LOAD_ANY, true); break; case OHK_UNLOAD: this->OrderClick_Unload(OUFB_UNLOAD, true); break; case OHK_NEAREST_DEPOT: this->OrderClick_NearestDepot(); break; - case OHK_ALWAYS_SERVICE: this->OrderClick_Service(-1); break; + case OHK_ALWAYS_SERVICE: this->OrderClick_Service(std::nullopt); break; case OHK_TRANSFER: this->OrderClick_Unload(OUFB_TRANSFER, true); break; case OHK_NO_UNLOAD: this->OrderClick_Unload(OUFB_NO_UNLOAD, true); break; case OHK_NO_LOAD: this->OrderClick_FullLoad(OLFB_NO_LOAD, true); break; diff --git a/src/order_type.h b/src/order_type.h index d52b33599b..fda91c9d59 100644 --- a/src/order_type.h +++ b/src/order_type.h @@ -84,72 +84,72 @@ enum OrderLoadFlags : uint8_t { /** * Non-stop order flags. */ -enum OrderNonStopFlags : uint8_t { - ONSF_STOP_EVERYWHERE = 0, ///< The vehicle will stop at any station it passes and the destination. - ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS = 1, ///< The vehicle will not stop at any stations it passes except the destination. - ONSF_NO_STOP_AT_DESTINATION_STATION = 2, ///< The vehicle will stop at any station it passes except the destination. - ONSF_NO_STOP_AT_ANY_STATION = 3, ///< The vehicle will not stop at any stations it passes including the destination. - ONSF_END +enum class OrderNonStopFlag : uint8_t { + NoIntermediate = 0, ///< The vehicle will not stop at any stations it passes except the destination, aka non-stop. + NoDestination = 1, ///< The vehicle will stop at any station it passes except the destination, aka via. }; +using OrderNonStopFlags = EnumBitSet; + /** * Where to stop the trains. */ -enum OrderStopLocation : uint8_t { - OSL_PLATFORM_NEAR_END = 0, ///< Stop at the near end of the platform - OSL_PLATFORM_MIDDLE = 1, ///< Stop at the middle of the platform - OSL_PLATFORM_FAR_END = 2, ///< Stop at the far end of the platform - OSL_END +enum class OrderStopLocation : uint8_t { + NearEnd = 0, ///< Stop at the near end of the platform + Middle = 1, ///< Stop at the middle of the platform + FarEnd = 2, ///< Stop at the far end of the platform + End, }; /** * Reasons that could cause us to go to the depot. */ -enum OrderDepotTypeFlags : uint8_t { - ODTF_MANUAL = 0, ///< Manually initiated order. - ODTFB_SERVICE = 1 << 0, ///< This depot order is because of the servicing limit. - ODTFB_PART_OF_ORDERS = 1 << 1, ///< This depot order is because of a regular order. +enum class OrderDepotTypeFlag : uint8_t { + Service = 0, ///< This depot order is because of the servicing limit. + PartOfOrders = 1, ///< This depot order is because of a regular order. }; +using OrderDepotTypeFlags = EnumBitSet; + /** * Actions that can be performed when the vehicle enters the depot. */ -enum OrderDepotActionFlags : uint8_t { - ODATF_SERVICE_ONLY = 0, ///< Only service the vehicle. - ODATFB_HALT = 1 << 0, ///< Service the vehicle and then halt it. - ODATFB_NEAREST_DEPOT = 1 << 1, ///< Send the vehicle to the nearest depot. - ODATFB_UNBUNCH = 1 << 2, ///< Service the vehicle and then unbunch it. +enum class OrderDepotActionFlag : uint8_t { + Halt = 0, ///< Service the vehicle and then halt it. + NearestDepot = 1, ///< Send the vehicle to the nearest depot. + Unbunch = 2, ///< Service the vehicle and then unbunch it. }; -DECLARE_ENUM_AS_BIT_SET(OrderDepotActionFlags) + +using OrderDepotActionFlags = EnumBitSet; /** * Variables (of a vehicle) to 'cause' skipping on. */ -enum OrderConditionVariable : uint8_t { - OCV_LOAD_PERCENTAGE, ///< Skip based on the amount of load - OCV_RELIABILITY, ///< Skip based on the reliability - OCV_MAX_SPEED, ///< Skip based on the maximum speed - OCV_AGE, ///< Skip based on the age - OCV_REQUIRES_SERVICE, ///< Skip when the vehicle requires service - OCV_UNCONDITIONALLY, ///< Always skip - OCV_REMAINING_LIFETIME, ///< Skip based on the remaining lifetime - OCV_MAX_RELIABILITY, ///< Skip based on the maximum reliability - OCV_END +enum class OrderConditionVariable : uint8_t { + LoadPercentage = 0, ///< Skip based on the amount of load + Reliability = 1, ///< Skip based on the reliability + MaxSpeed = 2, ///< Skip based on the maximum speed + Age = 3, ///< Skip based on the age + RequiresService = 4, ///< Skip when the vehicle requires service + Unconditionally = 5, ///< Always skip + RemainingLifetime = 6, ///< Skip based on the remaining lifetime + MaxReliability = 7, ///< Skip based on the maximum reliability + End, }; /** * Comparator for the skip reasoning. */ -enum OrderConditionComparator : uint8_t { - OCC_EQUALS, ///< Skip if both values are equal - OCC_NOT_EQUALS, ///< Skip if both values are not equal - OCC_LESS_THAN, ///< Skip if the value is less than the limit - OCC_LESS_EQUALS, ///< Skip if the value is less or equal to the limit - OCC_MORE_THAN, ///< Skip if the value is more than the limit - OCC_MORE_EQUALS, ///< Skip if the value is more or equal to the limit - OCC_IS_TRUE, ///< Skip if the variable is true - OCC_IS_FALSE, ///< Skip if the variable is false - OCC_END +enum class OrderConditionComparator : uint8_t { + Equal = 0, ///< Skip if both values are equal + NotEqual = 1, ///< Skip if both values are not equal + LessThan = 2, ///< Skip if the value is less than the limit + LessThanOrEqual = 3, ///< Skip if the value is less or equal to the limit + MoreThan = 4, ///< Skip if the value is more than the limit + MoreThanOrEqual = 5, ///< Skip if the value is more or equal to the limit + IsTrue = 6, ///< Skip if the variable is true + IsFalse = 7, ///< Skip if the variable is false + End, }; @@ -172,12 +172,12 @@ enum ModifyOrderFlags : uint8_t { /** * Depot action to switch to when doing a #MOF_DEPOT_ACTION. */ -enum OrderDepotAction : uint8_t { - DA_ALWAYS_GO, ///< Always go to the depot - DA_SERVICE, ///< Service only if needed - DA_STOP, ///< Go to the depot and stop there - DA_UNBUNCH, ///< Go to the depot and unbunch - DA_END +enum class OrderDepotAction : uint8_t { + AlwaysGo = 0, ///< Always go to the depot + Service = 1, ///< Service only if needed + Stop = 2, ///< Go to the depot and stop there + Unbunch = 3, ///< Go to the depot and unbunch + End }; /** diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 55a3f2bc62..21dc517848 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -152,7 +152,7 @@ public: break; case OT_GOTO_DEPOT: - if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) { this->any_depot = true; } [[fallthrough]]; diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 060ec3694b..79ef10c9c5 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -1700,13 +1700,13 @@ static void CheckIfRoadVehNeedsService(RoadVehicle *v) DepotID depot = GetDepotIndex(rfdd.tile); if (v->current_order.IsType(OT_GOTO_DEPOT) && - v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS && + v->current_order.GetNonStopType().Test(OrderNonStopFlag::NoIntermediate) && !Chance16(1, 20)) { return; } SetBit(v->gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS); - v->current_order.MakeGoToDepot(depot, ODTFB_SERVICE); + v->current_order.MakeGoToDepot(depot, OrderDepotTypeFlag::Service); v->SetDestTile(rfdd.tile); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 388b30f564..8487f304b1 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1823,7 +1823,7 @@ bool AfterLoadGame() v->current_order.ConvertFromOldSavegame(); if (v->type == VEH_ROAD && v->IsPrimaryVehicle() && v->FirstShared() == v) { - for (Order &order : v->Orders()) order.SetNonStopType(ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + for (Order &order : v->Orders()) order.SetNonStopType(OrderNonStopFlag::NoIntermediate); } } } else if (IsSavegameVersionBefore(SLV_94)) { @@ -1848,13 +1848,13 @@ bool AfterLoadGame() for (OrderList *orderlist : OrderList::Iterate()) { for (Order &order : orderlist->GetOrders()) { if (!order.IsType(OT_GOTO_DEPOT)) continue; - order.SetDepotActionType((OrderDepotActionFlags)(order.GetDepotActionType() >> 1)); + order.SetDepotActionType(static_cast(order.GetDepotActionType().base() >> 1)); } } for (Vehicle *v : Vehicle::Iterate()) { if (!v->current_order.IsType(OT_GOTO_DEPOT)) continue; - v->current_order.SetDepotActionType((OrderDepotActionFlags)(v->current_order.GetDepotActionType() >> 1)); + v->current_order.SetDepotActionType(static_cast(v->current_order.GetDepotActionType().base() >> 1)); } } @@ -2213,7 +2213,7 @@ bool AfterLoadGame() if (IsSavegameVersionBefore(SLV_117)) { for (OrderList *orderlist : OrderList::Iterate()) { for (Order &o : orderlist->GetOrders()) { - if (o.IsType(OT_GOTO_STATION)) o.SetStopLocation(OSL_PLATFORM_FAR_END); + if (o.IsType(OT_GOTO_STATION)) o.SetStopLocation(OrderStopLocation::FarEnd); } } } diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index da1c0983e1..89427c2fdb 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -31,9 +31,9 @@ void Order::ConvertFromOldSavegame() /* First handle non-stop - use value from savegame if possible, else use value from config file */ if (_settings_client.gui.sg_new_nonstop || (IsSavegameVersionBefore(SLV_22) && _savegame_type != SGT_TTO && _savegame_type != SGT_TTD && _settings_client.gui.new_nonstop)) { /* OFB_NON_STOP */ - this->SetNonStopType((old_flags & 8) ? ONSF_NO_STOP_AT_ANY_STATION : ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS); + this->SetNonStopType((old_flags & 8) ? OrderNonStopFlags{OrderNonStopFlag::NoIntermediate, OrderNonStopFlag::NoDestination} : OrderNonStopFlag::NoIntermediate); } else { - this->SetNonStopType((old_flags & 8) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE); + this->SetNonStopType((old_flags & 8) ? OrderNonStopFlag::NoIntermediate : OrderNonStopFlags{}); } switch (this->GetType()) { @@ -53,7 +53,7 @@ void Order::ConvertFromOldSavegame() this->SetLoadType(_settings_client.gui.sg_full_load_any || IsSavegameVersionBefore(SLV_22) ? OLF_FULL_LOAD_ANY : OLFB_FULL_LOAD); } - if (this->IsType(OT_GOTO_STATION)) this->SetStopLocation(OSL_PLATFORM_FAR_END); + if (this->IsType(OT_GOTO_STATION)) this->SetStopLocation(OrderStopLocation::FarEnd); /* Finally fix the unload flags */ if ((old_flags & 1) != 0) { // OFB_TRANSFER @@ -65,12 +65,15 @@ void Order::ConvertFromOldSavegame() } } else { /* Then the depot action flags */ - this->SetDepotActionType(((old_flags & 6) == 4) ? ODATFB_HALT : ODATF_SERVICE_ONLY); + OrderDepotActionFlags action_flags{}; + if ((old_flags & 6) == 4) action_flags.Set(OrderDepotActionFlag::Halt); + this->SetDepotActionType(action_flags); /* Finally fix the depot type flags */ - uint t = ((old_flags & 6) == 6) ? ODTFB_SERVICE : ODTF_MANUAL; - if ((old_flags & 2) != 0) t |= ODTFB_PART_OF_ORDERS; - this->SetDepotOrderType((OrderDepotTypeFlags)t); + OrderDepotTypeFlags type_flags{}; + if ((old_flags & 6) == 6) type_flags.Set(OrderDepotTypeFlag::Service); + if ((old_flags & 2) != 0) type_flags.Set(OrderDepotTypeFlag::PartOfOrders); + this->SetDepotOrderType(type_flags); } } diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index fbd98e2189..abe76d3f29 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -64,7 +64,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, ScriptOrder::OrderPositio const Vehicle *v = ::Vehicle::Get(vehicle_id); if (order_position == ScriptOrder::ORDER_CURRENT) { const Order *order = &v->current_order; - if (order->GetType() == OT_GOTO_DEPOT && !(order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return order; + if (order->GetType() == OT_GOTO_DEPOT && !order->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) return order; order_position = ScriptOrder::ResolveOrderPosition(vehicle_id, order_position); if (order_position == ScriptOrder::ORDER_INVALID) return nullptr; } @@ -170,7 +170,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle const Order *order = &::Vehicle::Get(vehicle_id)->current_order; if (order->GetType() != OT_GOTO_DEPOT) return true; - return (order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0; + return order->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders); } /* static */ ScriptOrder::OrderPosition ScriptOrder::ResolveOrderPosition(VehicleID vehicle_id, OrderPosition order_position) @@ -249,7 +249,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle switch (order->GetType()) { case OT_GOTO_DEPOT: { /* We don't know where the nearest depot is... (yet) */ - if (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) return INVALID_TILE; + if (order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) return INVALID_TILE; if (v->type != VEH_AIRCRAFT) return ::Depot::Get(order->GetDestination().ToDepotID())->xy; /* Aircraft's hangars are referenced by StationID, not DepotID */ @@ -306,12 +306,12 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle if (order == nullptr || order->GetType() == OT_CONDITIONAL || order->GetType() == OT_DUMMY) return OF_INVALID; ScriptOrderFlags order_flags = OF_NONE; - order_flags |= (ScriptOrderFlags)order->GetNonStopType(); + order_flags |= static_cast(order->GetNonStopType().base()); switch (order->GetType()) { case OT_GOTO_DEPOT: - if (order->GetDepotOrderType() & ODTFB_SERVICE) order_flags |= OF_SERVICE_IF_NEEDED; - if (order->GetDepotActionType() & ODATFB_HALT) order_flags |= OF_STOP_IN_DEPOT; - if (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) order_flags |= OF_GOTO_NEAREST_DEPOT; + if (order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service)) order_flags |= OF_SERVICE_IF_NEEDED; + if (order->GetDepotActionType().Test(OrderDepotActionFlag::Halt)) order_flags |= OF_STOP_IN_DEPOT; + if (order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot)) order_flags |= OF_GOTO_NEAREST_DEPOT; break; case OT_GOTO_STATION: @@ -359,7 +359,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle const Order *order = ::ResolveOrder(vehicle_id, order_position); SQInteger value = order->GetConditionValue(); - if (order->GetConditionVariable() == OCV_MAX_SPEED) value = value * 16 / 10; + if (order->GetConditionVariable() == OrderConditionVariable::MaxSpeed) value = value * 16 / 10; return value; } @@ -484,11 +484,16 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle OrderType ot = (order_flags & OF_GOTO_NEAREST_DEPOT) ? OT_GOTO_DEPOT : ::GetOrderTypeByTile(destination); switch (ot) { case OT_GOTO_DEPOT: { - OrderDepotTypeFlags odtf = (OrderDepotTypeFlags)(ODTFB_PART_OF_ORDERS | ((order_flags & OF_SERVICE_IF_NEEDED) ? ODTFB_SERVICE : 0)); - OrderDepotActionFlags odaf = (OrderDepotActionFlags)(ODATF_SERVICE_ONLY | ((order_flags & OF_STOP_IN_DEPOT) ? ODATFB_HALT : 0)); - if (order_flags & OF_GOTO_NEAREST_DEPOT) odaf |= ODATFB_NEAREST_DEPOT; - OrderNonStopFlags onsf = (OrderNonStopFlags)((order_flags & OF_NON_STOP_INTERMEDIATE) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE); - if (order_flags & OF_GOTO_NEAREST_DEPOT) { + OrderDepotTypeFlags odtf = OrderDepotTypeFlag::PartOfOrders; + if ((order_flags & OF_SERVICE_IF_NEEDED) != 0) odtf.Set(OrderDepotTypeFlag::Service); + + OrderDepotActionFlags odaf{}; + if ((order_flags & OF_STOP_IN_DEPOT) != 0) odaf.Set(OrderDepotActionFlag::Halt); + if ((order_flags & OF_GOTO_NEAREST_DEPOT) != 0) odaf.Set(OrderDepotActionFlag::NearestDepot); + + OrderNonStopFlags onsf{}; + if ((order_flags & OF_NON_STOP_INTERMEDIATE) != 0) onsf.Set(OrderNonStopFlag::NoIntermediate); + if ((order_flags & OF_GOTO_NEAREST_DEPOT) != 0) { order.MakeGoToDepot(DepotID::Invalid(), odtf, onsf, odaf); } else { /* Check explicitly if the order is to a station (for aircraft) or @@ -508,7 +513,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle order.MakeGoToStation(::GetStationIndex(destination)); order.SetLoadType((OrderLoadFlags)GB(order_flags, 5, 3)); order.SetUnloadType((OrderUnloadFlags)GB(order_flags, 2, 3)); - order.SetStopLocation(OSL_PLATFORM_FAR_END); + order.SetStopLocation(OrderStopLocation::FarEnd); break; case OT_GOTO_WAYPOINT: @@ -519,7 +524,7 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle return false; } - order.SetNonStopType((OrderNonStopFlags)GB(order_flags, 0, 2)); + order.SetNonStopType(static_cast(GB(order_flags, 0, 2))); int order_pos = ScriptOrderPositionToRealOrderPosition(vehicle_id, order_position); return ScriptObject::Command::Do(0, vehicle_id, order_pos, order); @@ -613,10 +618,10 @@ static void _DoCommandReturnSetOrderFlags(class ScriptInstance &instance) switch (order->GetType()) { case OT_GOTO_DEPOT: if ((current & OF_DEPOT_FLAGS) != (order_flags & OF_DEPOT_FLAGS)) { - uint data = DA_ALWAYS_GO; - if (order_flags & OF_SERVICE_IF_NEEDED) data = DA_SERVICE; - if (order_flags & OF_STOP_IN_DEPOT) data = DA_STOP; - return ScriptObject::Command::Do(&::_DoCommandReturnSetOrderFlags, vehicle_id, order_pos, MOF_DEPOT_ACTION, data); + OrderDepotAction data = OrderDepotAction::AlwaysGo; + if ((order_flags & OF_SERVICE_IF_NEEDED) != 0) data = OrderDepotAction::Service; + if ((order_flags & OF_STOP_IN_DEPOT) != 0) data = OrderDepotAction::Stop; + return ScriptObject::Command::Do(&::_DoCommandReturnSetOrderFlags, vehicle_id, order_pos, MOF_DEPOT_ACTION, to_underlying(data)); } break; diff --git a/src/script/api/script_order.hpp b/src/script/api/script_order.hpp index e373e1e562..534e0b92b5 100644 --- a/src/script/api/script_order.hpp +++ b/src/script/api/script_order.hpp @@ -89,14 +89,14 @@ public: */ enum OrderCondition { /* Note: these values represent part of the in-game OrderConditionVariable enum */ - OC_LOAD_PERCENTAGE = ::OCV_LOAD_PERCENTAGE, ///< Skip based on the amount of load, value is in tons. - OC_RELIABILITY = ::OCV_RELIABILITY, ///< Skip based on the reliability, value is percent (0..100). - OC_MAX_RELIABILITY = ::OCV_MAX_RELIABILITY, ///< Skip based on the maximum reliability. Value in percent - OC_MAX_SPEED = ::OCV_MAX_SPEED, ///< Skip based on the maximum speed, value is in OpenTTD's internal speed unit, see ScriptEngine::GetMaxSpeed. - OC_AGE = ::OCV_AGE, ///< Skip based on the age, value is in calendar-years. @see \ref ScriptCalendarTime - OC_REQUIRES_SERVICE = ::OCV_REQUIRES_SERVICE, ///< Skip when the vehicle requires service, no value. - OC_UNCONDITIONALLY = ::OCV_UNCONDITIONALLY, ///< Always skip, no compare function, no value. - OC_REMAINING_LIFETIME = ::OCV_REMAINING_LIFETIME, ///< Skip based on the remaining lifetime in calendar-years. @see \ref ScriptCalendarTime + OC_LOAD_PERCENTAGE = to_underlying(::OrderConditionVariable::LoadPercentage), ///< Skip based on the amount of load, value is in tons. + OC_RELIABILITY = to_underlying(::OrderConditionVariable::Reliability), ///< Skip based on the reliability, value is percent (0..100). + OC_MAX_RELIABILITY = to_underlying(::OrderConditionVariable::MaxReliability), ///< Skip based on the maximum reliability. Value in percent + OC_MAX_SPEED = to_underlying(::OrderConditionVariable::MaxSpeed), ///< Skip based on the maximum speed, value is in OpenTTD's internal speed unit, see ScriptEngine::GetMaxSpeed. + OC_AGE = to_underlying(::OrderConditionVariable::Age), ///< Skip based on the age, value is in calendar-years. @see \ref ScriptCalendarTime + OC_REQUIRES_SERVICE = to_underlying(::OrderConditionVariable::RequiresService), ///< Skip when the vehicle requires service, no value. + OC_UNCONDITIONALLY = to_underlying(::OrderConditionVariable::Unconditionally), ///< Always skip, no compare function, no value. + OC_REMAINING_LIFETIME = to_underlying(::OrderConditionVariable::RemainingLifetime), ///< Skip based on the remaining lifetime in calendar-years. @see \ref ScriptCalendarTime /* Custom added value, only valid for this API */ OC_INVALID = -1, ///< An invalid condition, do not use. @@ -107,14 +107,14 @@ public: */ enum CompareFunction { /* Note: these values represent part of the in-game OrderConditionComparator enum */ - CF_EQUALS = ::OCC_EQUALS, ///< Skip if both values are equal - CF_NOT_EQUALS = ::OCC_NOT_EQUALS, ///< Skip if both values are not equal - CF_LESS_THAN = ::OCC_LESS_THAN, ///< Skip if the value is less than the limit - CF_LESS_EQUALS = ::OCC_LESS_EQUALS, ///< Skip if the value is less or equal to the limit - CF_MORE_THAN = ::OCC_MORE_THAN, ///< Skip if the value is more than the limit - CF_MORE_EQUALS = ::OCC_MORE_EQUALS, ///< Skip if the value is more or equal to the limit - CF_IS_TRUE = ::OCC_IS_TRUE, ///< Skip if the variable is true - CF_IS_FALSE = ::OCC_IS_FALSE, ///< Skip if the variable is false + CF_EQUALS = to_underlying(::OrderConditionComparator::Equal), ///< Skip if both values are equal + CF_NOT_EQUALS = to_underlying(::OrderConditionComparator::NotEqual), ///< Skip if both values are not equal + CF_LESS_THAN = to_underlying(::OrderConditionComparator::LessThan), ///< Skip if the value is less than the limit + CF_LESS_EQUALS = to_underlying(::OrderConditionComparator::LessThanOrEqual), ///< Skip if the value is less or equal to the limit + CF_MORE_THAN = to_underlying(::OrderConditionComparator::MoreThan), ///< Skip if the value is more than the limit + CF_MORE_EQUALS = to_underlying(::OrderConditionComparator::MoreThanOrEqual), ///< Skip if the value is more or equal to the limit + CF_IS_TRUE = to_underlying(::OrderConditionComparator::IsTrue), ///< Skip if the variable is true + CF_IS_FALSE = to_underlying(::OrderConditionComparator::IsFalse), ///< Skip if the variable is false /* Custom added value, only valid for this API */ CF_INVALID = -1, ///< Invalid compare function, do not use. diff --git a/src/settings_type.h b/src/settings_type.h index eeef3aac22..83a5f828d3 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -169,7 +169,7 @@ struct GUISettings { bool show_finances; ///< show finances at end of year bool sg_new_nonstop; ///< ttdpatch compatible nonstop handling read from pre v93 savegames bool new_nonstop; ///< ttdpatch compatible nonstop handling - uint8_t stop_location; ///< what is the default stop location of trains? + OrderStopLocation stop_location; ///< what is the default stop location of trains? uint8_t auto_scrolling; ///< scroll when moving mouse to the edge (see #ViewportAutoscrolling) uint8_t errmsg_duration; ///< duration of error message uint16_t hover_delay_ms; ///< time required to activate a hover event, in milliseconds diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 8300b03c15..777e983b4e 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -220,7 +220,7 @@ static void CheckIfShipNeedsService(Vehicle *v) return; } - v->current_order.MakeGoToDepot(depot->index, ODTFB_SERVICE); + v->current_order.MakeGoToDepot(depot->index, OrderDepotTypeFlag::Service); v->SetDestTile(depot->xy); SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); } diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 8022137ba6..8b548f5228 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -167,7 +167,7 @@ CommandCost CmdChangeTimetable(DoCommandFlags flags, VehicleID veh, VehicleOrder if (wait_time != order->GetWaitTime()) { switch (order->GetType()) { case OT_GOTO_STATION: - if (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) return CommandCost(STR_ERROR_TIMETABLE_NOT_STOPPING_HERE); + if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CommandCost(STR_ERROR_TIMETABLE_NOT_STOPPING_HERE); break; case OT_CONDITIONAL: @@ -317,8 +317,8 @@ static bool VehicleTimetableSorter(Vehicle * const &a, Vehicle * const &b) int j = (int)b_order - (int)a_order; /* Are we currently at an ordered station (un)loading? */ - bool a_load = a->current_order.IsType(OT_LOADING) && a->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE; - bool b_load = b->current_order.IsType(OT_LOADING) && b->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE; + bool a_load = a->current_order.IsType(OT_LOADING) && a->current_order.GetNonStopType().Any(); + bool b_load = b->current_order.IsType(OT_LOADING) && b->current_order.GetNonStopType().Any(); /* If the current order is not loading at the ordered station, decrease the order index by one since we have * not yet arrived at the station (and thus the timetable entry; still in the travelling of the previous one). diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index f7413e6678..a380b37779 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -110,7 +110,7 @@ static bool CanDetermineTimeTaken(const Order &order, bool travelling) if (travelling && !order.IsTravelTimetabled()) return false; /* No wait time but we are loading at this timetabled station */ if (!travelling && !order.IsWaitTimetabled() && order.IsType(OT_GOTO_STATION) && - !(order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) { + !order.GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { return false; } @@ -208,7 +208,7 @@ struct TimetableWindow : Window { { assert(v->vehicle_flags.Test(VehicleFlag::TimetableStarted)); - bool travelling = (!v->current_order.IsType(OT_LOADING) || v->current_order.GetNonStopType() == ONSF_STOP_EVERYWHERE); + bool travelling = (!v->current_order.IsType(OT_LOADING) || v->current_order.GetNonStopType().None()); TimerGameTick::Ticks start_time = -v->current_order_time; /* If arrival and departure times are in days, compensate for the current date_fract. */ @@ -348,7 +348,7 @@ struct TimetableWindow : Window { if (selected % 2 != 0) { disable = order != nullptr && (order->IsType(OT_CONDITIONAL) || order->IsType(OT_IMPLICIT)); } else { - disable = order == nullptr || ((!order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL)); + disable = order == nullptr || ((!order->IsType(OT_GOTO_STATION) || order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) && !order->IsType(OT_CONDITIONAL)); } } bool disable_speed = disable || selected % 2 == 0 || v->type == VEH_AIRCRAFT; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 6f143f5112..d17584491a 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -265,10 +265,10 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, i /* Default to the middle of the station for stations stops that are not in * the order list like intermediate stations when non-stop is disabled */ - OrderStopLocation osl = OSL_PLATFORM_MIDDLE; + OrderStopLocation osl = OrderStopLocation::Middle; if (v->gcache.cached_total_length >= *station_length) { /* The train is longer than the station, make it stop at the far end of the platform */ - osl = OSL_PLATFORM_FAR_END; + osl = OrderStopLocation::FarEnd; } else if (v->current_order.IsType(OT_GOTO_STATION) && v->current_order.GetDestination() == station_id) { osl = v->current_order.GetStopLocation(); } @@ -278,15 +278,15 @@ int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, i switch (osl) { default: NOT_REACHED(); - case OSL_PLATFORM_NEAR_END: + case OrderStopLocation::NearEnd: stop = v->gcache.cached_total_length; break; - case OSL_PLATFORM_MIDDLE: + case OrderStopLocation::Middle: stop = *station_length - (*station_length - v->gcache.cached_total_length) / 2; break; - case OSL_PLATFORM_FAR_END: + case OrderStopLocation::FarEnd: stop = *station_length; break; } @@ -2675,7 +2675,7 @@ public: switch (order->GetType()) { case OT_GOTO_DEPOT: /* Skip service in depot orders when the train doesn't need service. */ - if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !this->v->NeedsServicing()) break; + if (order->GetDepotOrderType().Test(OrderDepotTypeFlag::Service) && !this->v->NeedsServicing()) break; [[fallthrough]]; case OT_GOTO_STATION: case OT_GOTO_WAYPOINT: @@ -2859,7 +2859,7 @@ static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir, orders.Restore(); if (v->current_order.IsType(OT_GOTO_DEPOT) && - (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) && + v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot) && final_dest != INVALID_TILE && IsRailDepotTile(final_dest)) { v->current_order.SetDestination(GetDepotIndex(final_dest)); v->dest_tile = final_dest; @@ -4042,7 +4042,7 @@ static bool TrainLocoHandler(Train *v, bool mode) OrderType order_type = v->current_order.GetType(); /* Do not skip waypoints (incl. 'via' stations) when passing through at full speed. */ if ((order_type == OT_GOTO_WAYPOINT || order_type == OT_GOTO_STATION) && - (v->current_order.GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) && + v->current_order.GetNonStopType().Test(OrderNonStopFlag::NoDestination) && IsTileType(v->tile, MP_STATION) && v->current_order.GetDestination() == GetStationIndex(v->tile)) { ProcessOrders(v); @@ -4152,7 +4152,7 @@ static void CheckIfTrainNeedsService(Train *v) } SetBit(v->gv_flags, GVF_SUPPRESS_IMPLICIT_ORDERS); - v->current_order.MakeGoToDepot(depot, ODTFB_SERVICE, ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS, ODATFB_NEAREST_DEPOT); + v->current_order.MakeGoToDepot(depot, OrderDepotTypeFlag::Service, OrderNonStopFlag::NoIntermediate, OrderDepotActionFlag::NearestDepot); v->dest_tile = tfdd.tile; SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 95764752d2..849f09338b 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -284,7 +284,7 @@ bool Vehicle::NeedsAutomaticServicing() const { if (this->HasDepotOrder()) return false; if (this->current_order.IsType(OT_LOADING)) return false; - if (this->current_order.IsType(OT_GOTO_DEPOT) && (this->current_order.GetDepotOrderType() & ODTFB_SERVICE) == 0) return false; + if (this->current_order.IsType(OT_GOTO_DEPOT) && !this->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::Service)) return false; return NeedsServicing(); } @@ -1588,8 +1588,8 @@ void VehicleEnterDepot(Vehicle *v) /* Test whether we are heading for this depot. If not, do nothing. * Note: The target depot for nearest-/manual-depot-orders is only updated on junctions, but we want to accept every depot. */ - if ((v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) && - real_order != nullptr && !(real_order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) && + if (v->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders) && + real_order != nullptr && !real_order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot) && (v->type == VEH_AIRCRAFT ? v->current_order.GetDestination() != GetStationIndex(v->tile) : v->dest_tile != v->tile)) { /* We are heading for another depot, keep driving. */ return; @@ -1614,13 +1614,13 @@ void VehicleEnterDepot(Vehicle *v) } } - if (v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) { + if (v->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) { /* Part of orders */ v->DeleteUnreachedImplicitOrders(); UpdateVehicleTimetable(v, true); v->IncrementImplicitOrderIndex(); } - if (v->current_order.GetDepotActionType() & ODATFB_HALT) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::Halt)) { /* Vehicles are always stopped on entering depots. Do not restart this one. */ _vehicles_to_autoreplace[v->index] = false; /* Invalidate last_loading_station. As the link from the station @@ -1639,7 +1639,7 @@ void VehicleEnterDepot(Vehicle *v) } /* If we've entered our unbunching depot, record the round trip duration. */ - if (v->current_order.GetDepotActionType() & ODATFB_UNBUNCH && v->depot_unbunching_last_departure > 0) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::Unbunch) && v->depot_unbunching_last_departure > 0) { TimerGameTick::Ticks measured_round_trip = TimerGameTick::counter - v->depot_unbunching_last_departure; if (v->round_trip_time == 0) { /* This might be our first round trip. */ @@ -2198,7 +2198,7 @@ void Vehicle::BeginLoading() * necessary to be known for HandleTrainLoading to determine * whether the train is lost or not; not marking a train lost * that arrives at random stations is bad. */ - this->current_order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION); + this->current_order.SetNonStopType({OrderNonStopFlag::NoIntermediate, OrderNonStopFlag::NoDestination}); } else { /* We weren't scheduled to stop here. Insert an implicit order @@ -2332,7 +2332,7 @@ void Vehicle::LeaveStation() assert(this->cargo_payment == nullptr); // cleared by ~CargoPayment /* Only update the timetable if the vehicle was supposed to stop here. */ - if (this->current_order.GetNonStopType() != ONSF_STOP_EVERYWHERE) UpdateVehicleTimetable(this, false); + if (this->current_order.GetNonStopType().Any()) UpdateVehicleTimetable(this, false); if ((this->current_order.GetLoadType() & OLFB_NO_LOAD) == 0 || (this->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { @@ -2462,7 +2462,7 @@ bool Vehicle::HasConditionalOrder() const bool Vehicle::HasUnbunchingOrder() const { return std::ranges::any_of(this->Orders(), [](const Order &o) { - return o.IsType(OT_GOTO_DEPOT) && (o.GetDepotActionType() & ODATFB_UNBUNCH); + return o.IsType(OT_GOTO_DEPOT) && o.GetDepotActionType().Test(OrderDepotActionFlag::Unbunch); }); } @@ -2477,7 +2477,7 @@ static bool PreviousOrderIsUnbunching(const Vehicle *v) const Order *previous_order = (is_first_order) ? v->GetLastOrder() : v->GetOrder(v->cur_implicit_order_index - 1); if (previous_order == nullptr || !previous_order->IsType(OT_GOTO_DEPOT)) return false; - return (previous_order->GetDepotActionType() & ODATFB_UNBUNCH) != 0; + return previous_order->GetDepotActionType().Test(OrderDepotActionFlag::Unbunch); } /** @@ -2564,14 +2564,14 @@ CommandCost Vehicle::SendToDepot(DoCommandFlags flags, DepotCommandFlags command if (flags.Test(DoCommandFlag::Execute)) this->ResetDepotUnbunching(); if (this->current_order.IsType(OT_GOTO_DEPOT)) { - bool halt_in_depot = (this->current_order.GetDepotActionType() & ODATFB_HALT) != 0; + bool halt_in_depot = this->current_order.GetDepotActionType().Test(OrderDepotActionFlag::Halt); if (command.Test(DepotCommandFlag::Service) == halt_in_depot) { /* We called with a different DEPOT_SERVICE setting. * Now we change the setting to apply the new one and let the vehicle head for the same depot. * Note: the if is (true for requesting service == true for ordered to stop in depot) */ if (flags.Test(DoCommandFlag::Execute)) { - this->current_order.SetDepotOrderType(ODTF_MANUAL); - this->current_order.SetDepotActionType(halt_in_depot ? ODATF_SERVICE_ONLY : ODATFB_HALT); + this->current_order.SetDepotOrderType({}); + this->current_order.SetDepotActionType(halt_in_depot ? OrderDepotActionFlags{} : OrderDepotActionFlag::Halt); SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, WID_VV_START_STOP); } return CommandCost(); @@ -2581,7 +2581,7 @@ CommandCost Vehicle::SendToDepot(DoCommandFlags flags, DepotCommandFlags command if (flags.Test(DoCommandFlag::Execute)) { /* If the orders to 'goto depot' are in the orders list (forced servicing), * then skip to the next order; effectively cancelling this forced service */ - if (this->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS) this->IncrementRealOrderIndex(); + if (this->current_order.GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders)) this->IncrementRealOrderIndex(); if (this->IsGroundVehicle()) { uint16_t &gv_flags = this->GetGroundVehicleFlags(); @@ -2607,8 +2607,8 @@ CommandCost Vehicle::SendToDepot(DoCommandFlags flags, DepotCommandFlags command } this->SetDestTile(closest_depot.location); - this->current_order.MakeGoToDepot(closest_depot.destination.ToDepotID(), ODTF_MANUAL); - if (!command.Test(DepotCommandFlag::Service)) this->current_order.SetDepotActionType(ODATFB_HALT); + this->current_order.MakeGoToDepot(closest_depot.destination.ToDepotID(), {}); + if (!command.Test(DepotCommandFlag::Service)) this->current_order.SetDepotActionType(OrderDepotActionFlag::Halt); SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, WID_VV_START_STOP); /* If there is no depot in front and the train is not already reversing, reverse automatically (trains only) */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 9b0e0af438..49a7087c98 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -3164,11 +3164,11 @@ public: if (v->current_order.GetDestination() == DepotID::Invalid()) return {}; auto params = MakeParameters(v->type, v->current_order.GetDestination(), PackVelocity(v->GetDisplaySpeed(), v->type)); - if (v->current_order.GetDepotActionType() & ODATFB_HALT) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::Halt)) { return GetStringWithArgs(v->vehicle_flags.Test(VehicleFlag::PathfinderLost) ? STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL : STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL, params); } - if (v->current_order.GetDepotActionType() & ODATFB_UNBUNCH) { + if (v->current_order.GetDepotActionType().Test(OrderDepotActionFlag::Unbunch)) { return GetStringWithArgs(v->vehicle_flags.Test(VehicleFlag::PathfinderLost) ? STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL : STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL, params); } diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp index bf5ac560b8..da4e36e7a9 100644 --- a/src/vehiclelist.cpp +++ b/src/vehiclelist.cpp @@ -114,7 +114,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli case VL_DEPOT_LIST: FindVehiclesWithOrder( [&vli](const Vehicle *v) { return v->type == vli.vtype; }, - [&vli](const Order *order) { return order->IsType(OT_GOTO_DEPOT) && !(order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) && order->GetDestination() == vli.ToDestinationID(); }, + [&vli](const Order *order) { return order->IsType(OT_GOTO_DEPOT) && !order->GetDepotActionType().Test(OrderDepotActionFlag::NearestDepot) && order->GetDestination() == vli.ToDestinationID(); }, [&list](const Vehicle *v) { list->push_back(v); } ); break; From 92e895a37ac06e0ac36b88ffba8a4bd63a8b4289 Mon Sep 17 00:00:00 2001 From: Cyprian Klimaszewski <111280526+Rito13@users.noreply.github.com> Date: Sat, 6 Dec 2025 18:12:03 +0100 Subject: [PATCH 262/280] Fix #14723: Set force proceed to TFP_SIGNAL if next tile has signals. (#14724) --- src/train_cmd.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index d17584491a..670a60853b 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2137,6 +2137,27 @@ CommandCost CmdReverseTrainDirection(DoCommandFlags flags, VehicleID veh_id, boo return CommandCost(); } +/** + * Determine to what force_proceed should be changed. + * If we are forced to proceed, cancel that order. + * If we are marked stuck we would want to force the train to + * proceed to the next signal unless we are stuck just before + * the next signal. In the other cases we would like to pass + * the signal at danger and run till the next signal we encounter. + * @param t The train to determine the new value of force_proceed for. + * @return The next state of force_proceed. + */ +static TrainForceProceeding DetermineNextTrainForceProceeding(const Train *t) +{ + if (t->force_proceed == TFP_SIGNAL) return TFP_NONE; + if (!t->flags.Test(VehicleRailFlag::Stuck)) return t->IsChainInDepot() ? TFP_STUCK : TFP_SIGNAL; + + TileIndex next_tile = TileAddByDiagDir(t->tile, TrackdirToExitdir(t->GetVehicleTrackdir())); + if (next_tile == INVALID_TILE || !IsTileType(next_tile, MP_RAILWAY) || !HasSignals(next_tile)) return TFP_STUCK; + TrackBits new_tracks = DiagdirReachesTracks(TrackdirToExitdir(t->GetVehicleTrackdir())) & GetTrackBits(next_tile); + return new_tracks != TRACK_BIT_NONE && HasSignalOnTrack(next_tile, FindFirstTrack(new_tracks)) ? TFP_SIGNAL : TFP_STUCK; +} + /** * Force a train through a red signal * @param flags type of operation @@ -2155,12 +2176,7 @@ CommandCost CmdForceTrainProceed(DoCommandFlags flags, VehicleID veh_id) if (flags.Test(DoCommandFlag::Execute)) { - /* If we are forced to proceed, cancel that order. - * If we are marked stuck we would want to force the train - * to proceed to the next signal. In the other cases we - * would like to pass the signal at danger and run till the - * next signal we encounter. */ - t->force_proceed = t->force_proceed == TFP_SIGNAL ? TFP_NONE : t->flags.Test(VehicleRailFlag::Stuck) || t->IsChainInDepot() ? TFP_STUCK : TFP_SIGNAL; + t->force_proceed = DetermineNextTrainForceProceeding(t); SetWindowDirty(WC_VEHICLE_VIEW, t->index); /* Unbunching data is no longer valid. */ From abf8438a1bf433a3876e39a7530a250976416e7e Mon Sep 17 00:00:00 2001 From: Cyprian Klimaszewski <111280526+Rito13@users.noreply.github.com> Date: Sat, 6 Dec 2025 18:52:44 +0100 Subject: [PATCH 263/280] Fix #14756: Invalidate nested focus before widget container is cleared. (#14809) --- src/build_vehicle_gui.cpp | 3 +-- src/newgrf_badge_gui.cpp | 11 +++++++---- src/newgrf_badge_gui.h | 2 +- src/picker_gui.cpp | 4 +--- src/widget.cpp | 17 +++++++++++++++++ src/widget_type.h | 12 +++++++++++- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index d8912bc89c..00cc734ee1 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1334,8 +1334,7 @@ struct BuildVehicleWindow : Window { this->badge_classes = GUIBadgeClasses(static_cast(GSF_TRAINS + this->vehicle_type)); this->SetCargoFilterArray(); - auto container = this->GetWidget(WID_BV_BADGE_FILTER); - this->badge_filters = AddBadgeDropdownFilters(*container, WID_BV_BADGE_FILTER, COLOUR_GREY, static_cast(GSF_TRAINS + this->vehicle_type)); + this->badge_filters = AddBadgeDropdownFilters(this, WID_BV_BADGE_FILTER, WID_BV_BADGE_FILTER, COLOUR_GREY, static_cast(GSF_TRAINS + this->vehicle_type)); this->widget_lookup.clear(); this->nested_root->FillWidgetLookup(this->widget_lookup); diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index c2d0dba8f2..f2cf6f45ca 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -21,6 +21,7 @@ #include "strings_func.h" #include "timer/timer_game_calendar.h" #include "window_gui.h" +#include "window_type.h" #include "zoom_func.h" #include "table/strings.h" @@ -550,15 +551,17 @@ DropDownList NWidgetBadgeFilter::GetDropDownList(PaletteID palette) const /** * Add badge drop down filter widgets. - * @param container Container widget to hold filter widgets. + * @param window Window that holds the container. + * @param container Container widget index to hold filter widgets. * @param widget Widget index to apply to first filter. * @param colour Background colour of widgets. * @param feature GRF feature for filters. * @return First and last widget indexes of filter widgets. */ -std::pair AddBadgeDropdownFilters(NWidgetContainer &container, WidgetID widget, Colours colour, GrfSpecFeature feature) +std::pair AddBadgeDropdownFilters(Window *window, WidgetID container_id, WidgetID widget, Colours colour, GrfSpecFeature feature) { - container.Clear(); + auto container = window->GetWidget(container_id); + container->Clear(window); WidgetID first = ++widget; /* Get list of classes used by feature. */ @@ -568,7 +571,7 @@ std::pair AddBadgeDropdownFilters(NWidgetContainer &containe const auto [config, _] = GetBadgeClassConfigItem(feature, GetClassBadge(class_index)->label); if (!config.show_filter) continue; - container.Add(std::make_unique(colour, widget, feature, class_index)); + container->Add(std::make_unique(colour, widget, feature, class_index)); ++widget; } diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index 868cdf86d6..2ac8ba66a2 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -57,7 +57,7 @@ std::unique_ptr MakeDropDownListBadgeIconItem(const std::share DropDownList BuildBadgeClassConfigurationList(const class GUIBadgeClasses &badge_class, uint columns, std::span column_separators, Colours bg_colour); bool HandleBadgeConfigurationDropDownClick(GrfSpecFeature feature, uint columns, int result, int click_result, BadgeFilterChoices &choices); -std::pair AddBadgeDropdownFilters(NWidgetContainer &container, WidgetID widget, Colours colour, GrfSpecFeature feature); +std::pair AddBadgeDropdownFilters(Window *window, WidgetID container_id, WidgetID widget, Colours colour, GrfSpecFeature feature); class NWidgetBadgeFilter : public NWidgetLeaf { public: diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index a594b7c37b..7a85be0d0a 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -251,9 +251,7 @@ void PickerWindow::ConstructWindow() void PickerWindow::OnInit() { this->badge_classes = GUIBadgeClasses(this->callbacks.GetFeature()); - - auto container = this->GetWidget(WID_PW_BADGE_FILTER); - this->badge_filters = AddBadgeDropdownFilters(*container, WID_PW_BADGE_FILTER, COLOUR_DARK_GREEN, this->callbacks.GetFeature()); + this->badge_filters = AddBadgeDropdownFilters(this, WID_PW_BADGE_FILTER, WID_PW_BADGE_FILTER, COLOUR_DARK_GREEN, this->callbacks.GetFeature()); this->widget_lookup.clear(); this->nested_root->FillWidgetLookup(this->widget_lookup); diff --git a/src/widget.cpp b/src/widget.cpp index b99da3d4bf..bb0c5d2a09 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -3476,3 +3476,20 @@ std::unique_ptr MakeCompanyButtonRows(WidgetID widget_first, Widget if (hor != nullptr) vert->Add(std::move(hor)); return vert; } + +/** + * Unfocuses the focused widget of the window, + * if the focused widget is contained inside the container. + * @param parent_window Window which contains this container. + */ +void NWidgetContainer::UnfocusWidgets(Window *parent_window) +{ + assert(parent_window != nullptr); + if (parent_window->nested_focus != nullptr) { + for (auto &widget : this->children) { + if (parent_window->nested_focus == widget.get()) { + parent_window->UnfocusFocusedWidget(); + } + } + } +} diff --git a/src/widget_type.h b/src/widget_type.h index 072d56365e..12deb5ff4e 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -484,7 +484,17 @@ public: inline bool IsEmpty() { return this->children.empty(); } NWidgetBase *GetWidgetOfType(WidgetType tp) override; - void Clear() { this->children.clear(); } + void UnfocusWidgets(Window *parent_window); + + /** + * Clears the container, deleting all widgets that were contained. + * @param parent_window Window that contains the container. + */ + inline void Clear(Window *parent_window) + { + this->UnfocusWidgets(parent_window); + this->children.clear(); + } protected: std::vector> children{}; ///< Child widgets in container. From 9adc4bfc0f92515a9c4b6c132fe964549f92b3a1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sat, 6 Dec 2025 18:30:31 +0000 Subject: [PATCH 264/280] Codechange: Make order load/unload flags value types. (#14861) Order Load and Unload flags have complex logic to ensure that invalid combinations aren't used. In fact, apart from FullLoad and FullLoadAny, all mixed combinations are invalid. Simplify logic by removing the use of bit values and treat each option as a value. --- src/cargopacket.cpp | 10 ++-- src/cargopacket.h | 2 +- src/economy.cpp | 18 +++--- src/industry_cmd.cpp | 4 +- src/linkgraph/refresh.cpp | 2 +- src/newgrf_engine.cpp | 2 +- src/order_base.h | 18 ++++-- src/order_cmd.cpp | 99 ++++++++++++++++++++++----------- src/order_gui.cpp | 52 ++++++++--------- src/order_type.h | 24 ++++---- src/saveload/afterload.cpp | 12 ++-- src/saveload/order_sl.cpp | 12 ++-- src/script/api/script_order.cpp | 8 +-- src/vehicle.cpp | 14 ++--- 14 files changed, 160 insertions(+), 117 deletions(-) diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index 8be991034e..c0436e96c0 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -425,14 +425,14 @@ void VehicleCargoList::AgeCargo() * @param accepted If the cargo will be accepted at the station. * @param current_station ID of the station. * @param next_station ID of the station the vehicle will go to next. - * @param order_flags OrderUnloadFlags that will apply to the unload operation. + * @param unload_type OrderUnloadType that will apply to the unload operation. * @param ge GoodsEntry for getting the flows. * @param cargo The cargo type of the cargo. * @param payment Payment object for registering transfers. * @param current_tile Current tile the cargo handling is happening on. * return If any cargo will be unloaded. */ -bool VehicleCargoList::Stage(bool accepted, StationID current_station, std::span next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile) +bool VehicleCargoList::Stage(bool accepted, StationID current_station, std::span next_station, OrderUnloadType unload_type, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile) { this->AssertCountConsistency(); assert(this->action_counts[MTA_LOAD] == 0); @@ -444,9 +444,9 @@ bool VehicleCargoList::Stage(bool accepted, StationID current_station, std::span static const FlowStatMap EMPTY_FLOW_STAT_MAP = {}; const FlowStatMap &flows = ge->HasData() ? ge->GetData().flows : EMPTY_FLOW_STAT_MAP; - bool force_keep = (order_flags & OUFB_NO_UNLOAD) != 0; - bool force_unload = (order_flags & OUFB_UNLOAD) != 0; - bool force_transfer = (order_flags & (OUFB_TRANSFER | OUFB_UNLOAD)) != 0; + bool force_keep = unload_type == OrderUnloadType::NoUnload; + bool force_unload = unload_type == OrderUnloadType::Unload; + bool force_transfer = unload_type == OrderUnloadType::Transfer || unload_type == OrderUnloadType::Unload; assert(this->count > 0 || it == this->packets.end()); while (sum < this->count) { CargoPacket *cp = *it; diff --git a/src/cargopacket.h b/src/cargopacket.h index 35cfd2cce4..5b7842e939 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -469,7 +469,7 @@ public: void InvalidateCache(); - bool Stage(bool accepted, StationID current_station, std::span next_station, uint8_t order_flags, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile); + bool Stage(bool accepted, StationID current_station, std::span next_station, OrderUnloadType unload_type, const GoodsEntry *ge, CargoType cargo, CargoPayment *payment, TileIndex current_tile); /** * Marks all cargo in the vehicle as to be kept. This is mostly useful for diff --git a/src/economy.cpp b/src/economy.cpp index 67d9873c28..69cf062bf9 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1272,7 +1272,7 @@ void PrepareUnload(Vehicle *front_v) std::vector next_station; front_v->GetNextStoppingStation(next_station); - if (front_v->orders == nullptr || (front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { + if (front_v->orders == nullptr || front_v->current_order.GetUnloadType() != OrderUnloadType::NoUnload) { Station *st = Station::Get(front_v->last_station_visited); for (Vehicle *v = front_v; v != nullptr; v = v->Next()) { const GoodsEntry *ge = &st->goods[v->cargo_type]; @@ -1521,7 +1521,7 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station /* Add new capacity to consist capacity and reserve cargo */ IterateVehicleParts(v_start, FinalizeRefitAction(consist_capleft, st, next_station, - is_auto_refit || (v->First()->current_order.GetLoadType() & OLFB_FULL_LOAD) != 0)); + is_auto_refit || v->First()->current_order.IsFullLoadOrder())); cur_company.Restore(); } @@ -1624,7 +1624,7 @@ static void LoadUnloadVehicle(Vehicle *front) bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CARGO_AUTO_REFIT; CargoArray consist_capleft{}; if (_settings_game.order.improved_load && use_autorefit ? - front->cargo_payment == nullptr : (front->current_order.GetLoadType() & OLFB_FULL_LOAD) != 0) { + front->cargo_payment == nullptr : (front->current_order.IsFullLoadOrder())) { ReserveConsist(st, front, (use_autorefit && front->load_unload_ticks != 0) ? &consist_capleft : nullptr, next_station); @@ -1665,14 +1665,14 @@ static void LoadUnloadVehicle(Vehicle *front) GoodsEntry *ge = &st->goods[v->cargo_type]; - if (v->vehicle_flags.Test(VehicleFlag::CargoUnloading) && (front->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { + if (v->vehicle_flags.Test(VehicleFlag::CargoUnloading) && front->current_order.GetUnloadType() != OrderUnloadType::NoUnload) { uint cargo_count = v->cargo.UnloadCount(); uint amount_unloaded = _settings_game.order.gradual_loading ? std::min(cargo_count, GetLoadAmount(v)) : cargo_count; bool remaining = false; // Are there cargo entities in this vehicle that can still be unloaded here? if (!ge->status.Test(GoodsEntry::State::Acceptance) && v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER) > 0) { /* The station does not accept our goods anymore. */ - if (front->current_order.GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) { + if (front->current_order.GetUnloadType() == OrderUnloadType::Transfer || front->current_order.GetUnloadType() == OrderUnloadType::Unload) { /* Transfer instead of delivering. */ v->cargo.Reassign( v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER)); @@ -1730,7 +1730,7 @@ static void LoadUnloadVehicle(Vehicle *front) } /* Do not pick up goods when we have no-load set or loading is stopped. */ - if (front->current_order.GetLoadType() & OLFB_NO_LOAD || front->vehicle_flags.Test(VehicleFlag::StopLoading)) continue; + if (front->current_order.GetLoadType() == OrderLoadType::NoLoad || front->vehicle_flags.Test(VehicleFlag::StopLoading)) continue; /* This order has a refit, if this is the first vehicle part carrying cargo and the whole vehicle is empty, try refitting. */ if (front->current_order.IsRefit() && artic_part == 1) { @@ -1854,7 +1854,7 @@ static void LoadUnloadVehicle(Vehicle *front) } /* We loaded less cargo than possible for all cargo types and it's not full * load and we're not supposed to wait any longer: stop loading. */ - if (!anything_unloaded && full_load_amount == 0 && reservation_left == 0 && !(front->current_order.GetLoadType() & OLFB_FULL_LOAD) && + if (!anything_unloaded && full_load_amount == 0 && reservation_left == 0 && !front->current_order.IsFullLoadOrder() && front->current_order_time >= std::max(front->current_order.GetTimetabledWait() - front->lateness_counter, 0)) { front->vehicle_flags.Set(VehicleFlag::StopLoading); } @@ -1863,8 +1863,8 @@ static void LoadUnloadVehicle(Vehicle *front) } else { UpdateLoadUnloadTicks(front, st, 20); // We need the ticks for link refreshing. bool finished_loading = true; - if (front->current_order.GetLoadType() & OLFB_FULL_LOAD) { - if (front->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) { + if (front->current_order.IsFullLoadOrder()) { + if (front->current_order.GetLoadType() == OrderLoadType::FullLoadAny) { /* if the aircraft carries passengers and is NOT full, then * continue loading, no matter how much mail is in */ if ((front->type == VEH_AIRCRAFT && IsCargoInClass(front->cargo_type, CargoClass::Passengers) && front->cargo_cap > front->cargo.StoredCount()) || diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 2abdc1aecb..75dea21975 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2816,13 +2816,13 @@ int WhoCanServiceIndustry(Industry *ind) * may have a different cargo type. */ for (const Order &o : v->Orders()) { - if (o.IsType(OT_GOTO_STATION) && !(o.GetUnloadType() & OUFB_TRANSFER)) { + if (o.IsType(OT_GOTO_STATION) && o.GetUnloadType() != OrderUnloadType::Transfer) { /* Vehicle visits a station to load or unload */ Station *st = Station::Get(o.GetDestination().ToStationID()); assert(st != nullptr); /* Same cargo produced by industry is dropped here => not serviced by vehicle v */ - if ((o.GetUnloadType() & OUFB_UNLOAD) && !c_accepts) break; + if (o.GetUnloadType() == OrderUnloadType::Unload && !c_accepts) break; if (ind->stations_near.find(st) != ind->stations_near.end()) { if (v->owner == _local_company) return 2; // Company services industry diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index 25e5f47fb1..e1d1c96c68 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -203,7 +203,7 @@ void LinkRefresher::RefreshStats(VehicleOrderID cur, VehicleOrderID next) } /* A link is at least partly restricted if a vehicle can't load at its source. */ - EdgeUpdateMode restricted_mode = (orders[cur].GetLoadType() & OLFB_NO_LOAD) == 0 ? + EdgeUpdateMode restricted_mode = orders[cur].GetLoadType() != OrderLoadType::NoLoad ? EdgeUpdateMode::Unrestricted : EdgeUpdateMode::Restricted; /* This estimates the travel time of the link as the time needed * to travel between the stations at half the max speed of the consist. diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index c1f355fe1c..4e2fda03e6 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -1020,7 +1020,7 @@ static uint32_t VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *objec } const Order &order = v->First()->current_order; - bool not_loading = (order.GetUnloadType() & OUFB_NO_UNLOAD) && (order.GetLoadType() & OLFB_NO_LOAD); + bool not_loading = order.GetUnloadType() == OrderUnloadType::NoUnload && order.GetLoadType() == OrderLoadType::NoLoad; bool in_motion = !order.IsType(OT_LOADING) || not_loading; uint totalsets = static_cast(in_motion ? group.loaded.size() : group.loading.size()); diff --git a/src/order_base.h b/src/order_base.h index 5697522bf8..ad138fd947 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -128,10 +128,20 @@ public: void SetRefit(CargoType cargo); + /** + * Is this order a OrderLoadType::FullLoad or OrderLoadType::FullLoadAny? + * @return true iff the order is a full load or full load any order. + */ + inline bool IsFullLoadOrder() const + { + OrderLoadType type = GetLoadType(); + return type == OrderLoadType::FullLoad || type == OrderLoadType::FullLoadAny; + } + /** How must the consist be loaded? */ - inline OrderLoadFlags GetLoadType() const { return (OrderLoadFlags)GB(this->flags, 4, 3); } + inline OrderLoadType GetLoadType() const { return static_cast(GB(this->flags, 4, 3)); } /** How must the consist be unloaded? */ - inline OrderUnloadFlags GetUnloadType() const { return (OrderUnloadFlags)GB(this->flags, 0, 3); } + inline OrderUnloadType GetUnloadType() const { return static_cast(GB(this->flags, 0, 3)); } /** At which stations must we stop? */ inline OrderNonStopFlags GetNonStopType() const { return static_cast(GB(this->type, 6, 2)); } /** Where must we stop at the platform? */ @@ -150,9 +160,9 @@ public: inline uint16_t GetConditionValue() const { return GB(this->dest.value, 0, 11); } /** Set how the consist must be loaded. */ - inline void SetLoadType(OrderLoadFlags load_type) { SB(this->flags, 4, 3, load_type); } + inline void SetLoadType(OrderLoadType load_type) { SB(this->flags, 4, 3, to_underlying(load_type)); } /** Set how the consist must be unloaded. */ - inline void SetUnloadType(OrderUnloadFlags unload_type) { SB(this->flags, 0, 3, unload_type); } + inline void SetUnloadType(OrderUnloadType unload_type) { SB(this->flags, 0, 3, to_underlying(unload_type)); } /** Set whether we must stop at stations or not. */ inline void SetNonStopType(OrderNonStopFlags non_stop_type) { SB(this->type, 6, 2, non_stop_type.base()); } /** Set where we must stop at the platform. */ diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index a6f604d123..d13fb407f7 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -183,8 +183,8 @@ uint16_t Order::MapOldOrder() const uint16_t order = this->GetType(); switch (this->GetType()) { case OT_GOTO_STATION: - if (this->GetUnloadType() & OUFB_UNLOAD) SetBit(order, 5); - if (this->GetLoadType() & OLFB_FULL_LOAD) SetBit(order, 6); + if (this->GetUnloadType() == OrderUnloadType::Unload) SetBit(order, 5); + if (this->IsFullLoadOrder()) SetBit(order, 6); if (this->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)) SetBit(order, 7); order |= GB(this->GetDestination().value, 0, 8) << 8; break; @@ -194,9 +194,9 @@ uint16_t Order::MapOldOrder() const order |= GB(this->GetDestination().value, 0, 8) << 8; break; case OT_LOADING: - if (this->GetLoadType() & OLFB_FULL_LOAD) SetBit(order, 6); + if (this->IsFullLoadOrder()) SetBit(order, 6); /* If both "no load" and "no unload" are set, return nothing order instead */ - if ((this->GetLoadType() & OLFB_NO_LOAD) && (this->GetUnloadType() & OUFB_NO_UNLOAD)) { + if (this->GetLoadType() == OrderLoadType::NoLoad && this->GetUnloadType() == OrderUnloadType::NoUnload) { order = OT_NOTHING; } break; @@ -402,7 +402,7 @@ void OrderList::GetNextStoppingStation(std::vector &next_station, con /* Don't return a next stop if the vehicle has to unload everything. */ if (next == INVALID_VEH_ORDER_ID || ((orders[next].IsType(OT_GOTO_STATION) || orders[next].IsType(OT_IMPLICIT)) && orders[next].GetDestination() == v->last_station_visited && - (orders[next].GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) != 0)) { + (orders[next].GetUnloadType() == OrderUnloadType::Transfer || orders[next].GetUnloadType() == OrderUnloadType::Unload))) { return; } } while (orders[next].IsType(OT_GOTO_DEPOT) || orders[next].GetDestination() == v->last_station_visited); @@ -652,12 +652,12 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s /* Filter invalid load/unload types. */ switch (new_order.GetLoadType()) { - case OLF_LOAD_IF_POSSIBLE: - case OLFB_NO_LOAD: + case OrderLoadType::LoadIfPossible: + case OrderLoadType::NoLoad: break; - case OLFB_FULL_LOAD: - case OLF_FULL_LOAD_ANY: + case OrderLoadType::FullLoad: + case OrderLoadType::FullLoadAny: if (v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_FULL_LOAD); break; @@ -665,8 +665,14 @@ CommandCost CmdInsertOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s return CMD_ERROR; } switch (new_order.GetUnloadType()) { - case OUF_UNLOAD_IF_POSSIBLE: case OUFB_UNLOAD: case OUFB_TRANSFER: case OUFB_NO_UNLOAD: break; - default: return CMD_ERROR; + case OrderUnloadType::UnloadIfPossible: + case OrderUnloadType::Unload: + case OrderUnloadType::Transfer: + case OrderUnloadType::NoUnload: + break; + + default: + return CMD_ERROR; } /* Filter invalid stop locations */ @@ -955,7 +961,7 @@ static void CancelLoadingDueToDeletedOrder(Vehicle *v) v->current_order.SetNonStopType({}); /* When full loading, "cancel" that order so the vehicle doesn't * stay indefinitely at this station anymore. */ - if (v->current_order.GetLoadType() & OLFB_FULL_LOAD) v->current_order.SetLoadType(OLF_LOAD_IF_POSSIBLE); + if (v->current_order.IsFullLoadOrder()) v->current_order.SetLoadType(OrderLoadType::LoadIfPossible); } /** @@ -1219,20 +1225,46 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s if (data >= to_underlying(OrderStopLocation::End)) return CMD_ERROR; break; - case MOF_UNLOAD: + case MOF_UNLOAD: { if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CMD_ERROR; - if ((data & ~(OUFB_UNLOAD | OUFB_TRANSFER | OUFB_NO_UNLOAD)) != 0) return CMD_ERROR; - /* Unload and no-unload are mutual exclusive and so are transfer and no unload. */ - if (data != 0 && ((data & (OUFB_UNLOAD | OUFB_TRANSFER)) != 0) == ((data & OUFB_NO_UNLOAD) != 0)) return CMD_ERROR; - if (data == order->GetUnloadType()) return CMD_ERROR; - break; - case MOF_LOAD: - if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CMD_ERROR; - if (data > OLFB_NO_LOAD || data == 1) return CMD_ERROR; - if (data == order->GetLoadType()) return CMD_ERROR; - if ((data & (OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY)) && v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_FULL_LOAD); + OrderUnloadType unload_type = static_cast(data); + if (unload_type == order->GetUnloadType()) return CMD_ERROR; + + /* Test for invalid types. */ + switch (unload_type) { + case OrderUnloadType::UnloadIfPossible: + case OrderUnloadType::Unload: + case OrderUnloadType::Transfer: + case OrderUnloadType::NoUnload: + break; + + default: return CMD_ERROR; + } break; + } + + case MOF_LOAD: { + if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) return CMD_ERROR; + + OrderLoadType load_type = static_cast(data); + if (load_type == order->GetLoadType()) return CMD_ERROR; + + /* Test for invalid types. */ + switch (load_type) { + case OrderLoadType::LoadIfPossible: + case OrderLoadType::NoLoad: + break; + + case OrderLoadType::FullLoad: + case OrderLoadType::FullLoadAny: + if (v->HasUnbunchingOrder()) return CommandCost(STR_ERROR_UNBUNCHING_NO_FULL_LOAD); + break; + + default: return CMD_ERROR; + } + break; + } case MOF_DEPOT_ACTION: { OrderDepotAction depot_action = static_cast(data); @@ -1300,8 +1332,8 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s order->SetNonStopType(static_cast(data)); if (order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { order->SetRefit(CARGO_NO_REFIT); - order->SetLoadType(OLF_LOAD_IF_POSSIBLE); - order->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE); + order->SetLoadType(OrderLoadType::LoadIfPossible); + order->SetUnloadType(OrderUnloadType::UnloadIfPossible); } break; @@ -1310,12 +1342,12 @@ CommandCost CmdModifyOrder(DoCommandFlags flags, VehicleID veh, VehicleOrderID s break; case MOF_UNLOAD: - order->SetUnloadType((OrderUnloadFlags)data); + order->SetUnloadType(static_cast(data)); break; case MOF_LOAD: - order->SetLoadType((OrderLoadFlags)data); - if (data & OLFB_NO_LOAD) order->SetRefit(CARGO_NO_REFIT); + order->SetLoadType(static_cast(data)); + if (order->GetLoadType() == OrderLoadType::NoLoad) order->SetRefit(CARGO_NO_REFIT); break; case MOF_DEPOT_ACTION: { @@ -1613,7 +1645,7 @@ CommandCost CmdOrderRefit(DoCommandFlags flags, VehicleID veh, VehicleOrderID or /* Automatic refit cargo is only supported for goto station orders. */ if (cargo == CARGO_AUTO_REFIT && !order->IsType(OT_GOTO_STATION)) return CMD_ERROR; - if (order->GetLoadType() & OLFB_NO_LOAD) return CMD_ERROR; + if (order->GetLoadType() == OrderLoadType::NoLoad) return CMD_ERROR; if (flags.Test(DoCommandFlag::Execute)) { order->SetRefit(cargo); @@ -2153,8 +2185,8 @@ bool Order::CanLoadOrUnload() const { return (this->IsType(OT_GOTO_STATION) || this->IsType(OT_IMPLICIT)) && !this->GetNonStopType().Test(OrderNonStopFlag::NoDestination) && - ((this->GetLoadType() & OLFB_NO_LOAD) == 0 || - (this->GetUnloadType() & OUFB_NO_UNLOAD) == 0); + (this->GetLoadType() != OrderLoadType::NoLoad || + this->GetUnloadType() != OrderUnloadType::NoUnload); } /** @@ -2165,6 +2197,7 @@ bool Order::CanLoadOrUnload() const */ bool Order::CanLeaveWithCargo(bool has_cargo) const { - return (this->GetLoadType() & OLFB_NO_LOAD) == 0 || (has_cargo && - (this->GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == 0); + return this->GetLoadType() != OrderLoadType::NoLoad || (has_cargo && + this->GetUnloadType() != OrderUnloadType::Unload && + this->GetUnloadType() != OrderUnloadType::Transfer); } diff --git a/src/order_gui.cpp b/src/order_gui.cpp index c9f6127a2b..97b8a77fb0 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -257,8 +257,8 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ break; case OT_GOTO_STATION: { - OrderLoadFlags load = order->GetLoadType(); - OrderUnloadFlags unload = order->GetUnloadType(); + OrderLoadType load = order->GetLoadType(); + OrderUnloadType unload = order->GetUnloadType(); bool valid_station = CanVehicleUseStation(v, Station::Get(order->GetDestination().ToStationID())); line = GetString(valid_station ? STR_ORDER_GO_TO_STATION : STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION, STR_ORDER_GO_TO + (v->IsGroundVehicle() ? order->GetNonStopType() : OrderNonStopFlags{}).base(), order->GetDestination()); @@ -271,7 +271,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, VehicleOrderID order_ } else { /* Show non-stop, refit and stop location only in the order window. */ if (!order->GetNonStopType().Test(OrderNonStopFlag::NoDestination)) { - StringID str = _station_load_types[order->IsRefit()][unload][load]; + StringID str = _station_load_types[order->IsRefit()][to_underlying(unload)][to_underlying(load)]; if (str != INVALID_STRING_ID) { if (order->IsRefit()) { line += GetString(str, order->IsAutoRefit() ? STR_ORDER_AUTO_REFIT_ANY : CargoSpec::Get(order->GetRefitCargo())->name); @@ -449,7 +449,7 @@ static Order GetOrderCmdFromTile(const Vehicle *v, TileIndex tile) } if (st->facilities.Any(facil)) { order.MakeGoToStation(st->index); - if (_ctrl_pressed) order.SetLoadType(OLF_FULL_LOAD_ANY); + if (_ctrl_pressed) order.SetLoadType(OrderLoadType::FullLoadAny); if (_settings_client.gui.new_nonstop && v->IsGroundVehicle()) order.SetNonStopType(OrderNonStopFlag::NoIntermediate); order.SetStopLocation(v->type == VEH_TRAIN ? (OrderStopLocation)(_settings_client.gui.stop_location) : OrderStopLocation::FarEnd); return order; @@ -614,7 +614,7 @@ private: * @param load_type Load flag to apply. If matches existing load type, toggles to default of 'load if possible'. * @param toggle If we toggle or not (used for hotkey behavior) */ - void OrderClick_FullLoad(OrderLoadFlags load_type, bool toggle = false) + void OrderClick_FullLoad(OrderLoadType load_type, bool toggle = false) { VehicleOrderID sel_ord = this->OrderGetSel(); const Order *order = this->vehicle->GetOrder(sel_ord); @@ -622,11 +622,11 @@ private: if (order == nullptr) return; if (toggle && order->GetLoadType() == load_type) { - load_type = OLF_LOAD_IF_POSSIBLE; // reset to 'default' + load_type = OrderLoadType::LoadIfPossible; // reset to 'default' } if (order->GetLoadType() == load_type) return; // If we still match, do nothing - Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_LOAD, load_type); + Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_LOAD, to_underlying(load_type)); } /** @@ -662,7 +662,7 @@ private: * @param unload_type Unload flag to apply. If matches existing unload type, toggles to default of 'unload if possible'. * @param toggle If we toggle or not (used for hotkey behavior) */ - void OrderClick_Unload(OrderUnloadFlags unload_type, bool toggle = false) + void OrderClick_Unload(OrderUnloadType unload_type, bool toggle = false) { VehicleOrderID sel_ord = this->OrderGetSel(); const Order *order = this->vehicle->GetOrder(sel_ord); @@ -670,15 +670,15 @@ private: if (order == nullptr) return; if (toggle && order->GetUnloadType() == unload_type) { - unload_type = OUF_UNLOAD_IF_POSSIBLE; + unload_type = OrderUnloadType::UnloadIfPossible; } if (order->GetUnloadType() == unload_type) return; // If we still match, do nothing - Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_UNLOAD, unload_type); + Command::Post(STR_ERROR_CAN_T_MODIFY_THIS_ORDER, this->vehicle->tile, this->vehicle->index, sel_ord, MOF_UNLOAD, to_underlying(unload_type)); /* Transfer and unload orders with leave empty as default */ - if (unload_type == OUFB_TRANSFER || unload_type == OUFB_UNLOAD) { - Command::Post(this->vehicle->tile, this->vehicle->index, sel_ord, MOF_LOAD, OLFB_NO_LOAD); + if (unload_type == OrderUnloadType::Transfer || unload_type == OrderUnloadType::Unload) { + Command::Post(this->vehicle->tile, this->vehicle->index, sel_ord, MOF_LOAD, to_underlying(OrderLoadType::NoLoad)); this->SetWidgetDirty(WID_O_FULL_LOAD); } } @@ -995,13 +995,13 @@ public: this->EnableWidget(WID_O_NON_STOP); this->SetWidgetLoweredState(WID_O_NON_STOP, order->GetNonStopType().Test(OrderNonStopFlag::NoIntermediate)); } - this->SetWidgetLoweredState(WID_O_FULL_LOAD, order->GetLoadType() == OLF_FULL_LOAD_ANY); - this->SetWidgetLoweredState(WID_O_UNLOAD, order->GetUnloadType() == OUFB_UNLOAD); + this->SetWidgetLoweredState(WID_O_FULL_LOAD, order->GetLoadType() == OrderLoadType::FullLoadAny); + this->SetWidgetLoweredState(WID_O_UNLOAD, order->GetUnloadType() == OrderUnloadType::Unload); /* Can only do refitting when stopping at the destination and loading cargo. * Also enable the button if a refit is already set to allow clearing it. */ this->SetWidgetDisabledState(WID_O_REFIT_DROPDOWN, - order->GetLoadType() == OLFB_NO_LOAD || order->GetNonStopType().Test(OrderNonStopFlag::NoDestination) || + order->GetLoadType() == OrderLoadType::NoLoad || order->GetNonStopType().Test(OrderNonStopFlag::NoDestination) || ((!this->can_do_refit || !this->can_do_autorefit) && !order->IsRefit())); break; @@ -1276,17 +1276,17 @@ public: case WID_O_FULL_LOAD: if (this->GetWidget(widget)->ButtonHit(pt)) { - this->OrderClick_FullLoad(OLF_FULL_LOAD_ANY, true); + this->OrderClick_FullLoad(OrderLoadType::FullLoadAny, true); } else { - ShowDropDownMenu(this, _order_full_load_dropdown, this->vehicle->GetOrder(this->OrderGetSel())->GetLoadType(), WID_O_FULL_LOAD, 0, 2); + ShowDropDownMenu(this, _order_full_load_dropdown, to_underlying(this->vehicle->GetOrder(this->OrderGetSel())->GetLoadType()), WID_O_FULL_LOAD, 0, 2); } break; case WID_O_UNLOAD: if (this->GetWidget(widget)->ButtonHit(pt)) { - this->OrderClick_Unload(OUFB_UNLOAD, true); + this->OrderClick_Unload(OrderUnloadType::Unload, true); } else { - ShowDropDownMenu(this, _order_unload_dropdown, this->vehicle->GetOrder(this->OrderGetSel())->GetUnloadType(), WID_O_UNLOAD, 0, 8); + ShowDropDownMenu(this, _order_unload_dropdown, to_underlying(this->vehicle->GetOrder(this->OrderGetSel())->GetUnloadType()), WID_O_UNLOAD, 0, 8); } break; @@ -1373,11 +1373,11 @@ public: break; case WID_O_FULL_LOAD: - this->OrderClick_FullLoad((OrderLoadFlags)index); + this->OrderClick_FullLoad(static_cast(index)); break; case WID_O_UNLOAD: - this->OrderClick_Unload((OrderUnloadFlags)index); + this->OrderClick_Unload(static_cast(index)); break; case WID_O_GOTO: @@ -1450,13 +1450,13 @@ public: case OHK_DELETE: this->OrderClick_Delete(); break; case OHK_GOTO: this->OrderClick_Goto(OPOS_GOTO); break; case OHK_NONSTOP: this->OrderClick_Nonstop(std::nullopt); break; - case OHK_FULLLOAD: this->OrderClick_FullLoad(OLF_FULL_LOAD_ANY, true); break; - case OHK_UNLOAD: this->OrderClick_Unload(OUFB_UNLOAD, true); break; + case OHK_FULLLOAD: this->OrderClick_FullLoad(OrderLoadType::FullLoadAny, true); break; + case OHK_UNLOAD: this->OrderClick_Unload(OrderUnloadType::Unload, true); break; case OHK_NEAREST_DEPOT: this->OrderClick_NearestDepot(); break; case OHK_ALWAYS_SERVICE: this->OrderClick_Service(std::nullopt); break; - case OHK_TRANSFER: this->OrderClick_Unload(OUFB_TRANSFER, true); break; - case OHK_NO_UNLOAD: this->OrderClick_Unload(OUFB_NO_UNLOAD, true); break; - case OHK_NO_LOAD: this->OrderClick_FullLoad(OLFB_NO_LOAD, true); break; + case OHK_TRANSFER: this->OrderClick_Unload(OrderUnloadType::Transfer, true); break; + case OHK_NO_UNLOAD: this->OrderClick_Unload(OrderUnloadType::NoUnload, true); break; + case OHK_NO_LOAD: this->OrderClick_FullLoad(OrderLoadType::NoLoad, true); break; default: return ES_NOT_HANDLED; } return ES_HANDLED; diff --git a/src/order_type.h b/src/order_type.h index fda91c9d59..ddfef37749 100644 --- a/src/order_type.h +++ b/src/order_type.h @@ -62,23 +62,23 @@ enum OrderType : uint8_t { }; /** - * Flags related to the unloading order. + * Unloading order types. */ -enum OrderUnloadFlags : uint8_t { - OUF_UNLOAD_IF_POSSIBLE = 0, ///< Unload all cargo that the station accepts. - OUFB_UNLOAD = 1 << 0, ///< Force unloading all cargo onto the platform, possibly not getting paid. - OUFB_TRANSFER = 1 << 1, ///< Transfer all cargo onto the platform. - OUFB_NO_UNLOAD = 1 << 2, ///< Totally no unloading will be done. +enum class OrderUnloadType : uint8_t { + UnloadIfPossible = 0, ///< Unload all cargo that the station accepts. + Unload = 1, ///< Force unloading all cargo onto the platform, possibly not getting paid. + Transfer = 2, ///< Transfer all cargo onto the platform. + NoUnload = 4, ///< Totally no unloading will be done. }; /** - * Flags related to the loading order. + * Loading order types. */ -enum OrderLoadFlags : uint8_t { - OLF_LOAD_IF_POSSIBLE = 0, ///< Load as long as there is cargo that fits in the train. - OLFB_FULL_LOAD = 1 << 1, ///< Full load all cargoes of the consist. - OLF_FULL_LOAD_ANY = 3, ///< Full load a single cargo of the consist. - OLFB_NO_LOAD = 4, ///< Do not load anything. +enum class OrderLoadType : uint8_t { + LoadIfPossible = 0, ///< Load as long as there is cargo that fits in the train. + FullLoad = 2, ///< Full load all cargoes of the consist. + FullLoadAny = 3, ///< Full load a single cargo of the consist. + NoLoad = 4, ///< Do not load anything. }; /** diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 8487f304b1..955377d669 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1830,17 +1830,17 @@ bool AfterLoadGame() /* Unload and transfer are now mutual exclusive. */ for (OrderList *orderlist : OrderList::Iterate()) { for (Order &order : orderlist->GetOrders()) { - if ((order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { - order.SetUnloadType(OUFB_TRANSFER); - order.SetLoadType(OLFB_NO_LOAD); + if (order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load. + order.SetUnloadType(OrderUnloadType::Transfer); + order.SetLoadType(OrderLoadType::NoLoad); } } } for (Vehicle *v : Vehicle::Iterate()) { - if ((v->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) == (OUFB_UNLOAD | OUFB_TRANSFER)) { - v->current_order.SetUnloadType(OUFB_TRANSFER); - v->current_order.SetLoadType(OLFB_NO_LOAD); + if (v->current_order.GetUnloadType() == OrderUnloadType{3}) { // 3 used to mean transfer and don't load. + v->current_order.SetUnloadType(OrderUnloadType::Transfer); + v->current_order.SetLoadType(OrderLoadType::NoLoad); } } } else if (IsSavegameVersionBefore(SLV_DEPOT_UNBUNCHING)) { diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 89427c2fdb..6106e0ed61 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -45,23 +45,23 @@ void Order::ConvertFromOldSavegame() if (this->GetType() != OT_GOTO_DEPOT) { /* Then the load flags */ if ((old_flags & 2) != 0) { // OFB_UNLOAD - this->SetLoadType(OLFB_NO_LOAD); + this->SetLoadType(OrderLoadType::NoLoad); } else if ((old_flags & 4) == 0) { // !OFB_FULL_LOAD - this->SetLoadType(OLF_LOAD_IF_POSSIBLE); + this->SetLoadType(OrderLoadType::LoadIfPossible); } else { /* old OTTD versions stored full_load_any in config file - assume it was enabled when loading */ - this->SetLoadType(_settings_client.gui.sg_full_load_any || IsSavegameVersionBefore(SLV_22) ? OLF_FULL_LOAD_ANY : OLFB_FULL_LOAD); + this->SetLoadType(_settings_client.gui.sg_full_load_any || IsSavegameVersionBefore(SLV_22) ? OrderLoadType::FullLoadAny : OrderLoadType::FullLoad); } if (this->IsType(OT_GOTO_STATION)) this->SetStopLocation(OrderStopLocation::FarEnd); /* Finally fix the unload flags */ if ((old_flags & 1) != 0) { // OFB_TRANSFER - this->SetUnloadType(OUFB_TRANSFER); + this->SetUnloadType(OrderUnloadType::Transfer); } else if ((old_flags & 2) != 0) { // OFB_UNLOAD - this->SetUnloadType(OUFB_UNLOAD); + this->SetUnloadType(OrderUnloadType::Unload); } else { - this->SetUnloadType(OUF_UNLOAD_IF_POSSIBLE); + this->SetUnloadType(OrderUnloadType::UnloadIfPossible); } } else { /* Then the depot action flags */ diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index abe76d3f29..c8fd4f6553 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -315,8 +315,8 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle break; case OT_GOTO_STATION: - order_flags |= (ScriptOrderFlags)(order->GetLoadType() << 5); - order_flags |= (ScriptOrderFlags)(order->GetUnloadType() << 2); + order_flags |= static_cast(to_underlying(order->GetLoadType()) << 5); + order_flags |= static_cast(to_underlying(order->GetUnloadType()) << 2); break; default: break; @@ -511,8 +511,8 @@ static ScriptOrder::OrderPosition RealOrderPositionToScriptOrderPosition(Vehicle case OT_GOTO_STATION: order.MakeGoToStation(::GetStationIndex(destination)); - order.SetLoadType((OrderLoadFlags)GB(order_flags, 5, 3)); - order.SetUnloadType((OrderUnloadFlags)GB(order_flags, 2, 3)); + order.SetLoadType(static_cast(GB(order_flags, 5, 3))); + order.SetUnloadType(static_cast(GB(order_flags, 2, 3))); order.SetStopLocation(OrderStopLocation::FarEnd); break; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 849f09338b..848c2f3fd6 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1472,8 +1472,8 @@ uint8_t CalcPercentVehicleFilled(const Vehicle *front, StringID *colour) const Station *st = Station::GetIfValid(front->last_station_visited); assert(colour == nullptr || (st != nullptr && is_loading)); - bool order_no_load = is_loading && (front->current_order.GetLoadType() & OLFB_NO_LOAD); - bool order_full_load = is_loading && (front->current_order.GetLoadType() & OLFB_FULL_LOAD); + bool order_no_load = is_loading && front->current_order.GetLoadType() == OrderLoadType::NoLoad; + bool order_full_load = is_loading && front->current_order.IsFullLoadOrder(); /* Count up max and used */ for (const Vehicle *v = front; v != nullptr; v = v->Next()) { @@ -2286,8 +2286,8 @@ void Vehicle::BeginLoading() if (this->last_loading_station != StationID::Invalid() && this->last_loading_station != this->last_station_visited && - ((this->current_order.GetLoadType() & OLFB_NO_LOAD) == 0 || - (this->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0)) { + (this->current_order.GetLoadType() != OrderLoadType::NoLoad || + this->current_order.GetUnloadType() != OrderUnloadType::NoUnload)) { IncreaseStats(Station::Get(this->last_loading_station), this, this->last_station_visited, travel_time); } @@ -2334,8 +2334,8 @@ void Vehicle::LeaveStation() /* Only update the timetable if the vehicle was supposed to stop here. */ if (this->current_order.GetNonStopType().Any()) UpdateVehicleTimetable(this, false); - if ((this->current_order.GetLoadType() & OLFB_NO_LOAD) == 0 || - (this->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { + if (this->current_order.GetLoadType() != OrderLoadType::NoLoad || + this->current_order.GetUnloadType() != OrderUnloadType::NoUnload) { if (this->current_order.CanLeaveWithCargo(this->last_loading_station != StationID::Invalid())) { /* Refresh next hop stats to make sure we've done that at least once * during the stop and that refit_cap == cargo_cap for each vehicle in @@ -2442,7 +2442,7 @@ void Vehicle::HandleLoading(bool mode) bool Vehicle::HasFullLoadOrder() const { return std::ranges::any_of(this->Orders(), [](const Order &o) { - return o.IsType(OT_GOTO_STATION) && o.GetLoadType() & (OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY); + return o.IsType(OT_GOTO_STATION) && o.IsFullLoadOrder(); }); } From 55157f6df26e15bbc59fea7ab164ca7987cc2486 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 15:33:31 +0100 Subject: [PATCH 265/280] Doc: update contact information for Free Software Foundation --- COPYING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/COPYING.md b/COPYING.md index 27885642ba..c77dfc079b 100644 --- a/COPYING.md +++ b/COPYING.md @@ -6,7 +6,7 @@ GNU General Public License _Version 2, June 1991_ _Copyright © 1989, 1991 Free Software Foundation, Inc.,_ -_51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA_ +_[https://fsf.org/](https://fsf.org/)_ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. From bc6a656debf271ecea07a28f43f0803d2f8c35c9 Mon Sep 17 00:00:00 2001 From: Richard Wheeler <2762690+zephyris@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:31:30 +0000 Subject: [PATCH 266/280] Change: Package OpenGFX2 for Windows Store and GOG --- .github/workflows/release-windows-store.yml | 12 ++++++------ .github/workflows/upload-gog.yml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release-windows-store.yml b/.github/workflows/release-windows-store.yml index 7ed434561e..b024514afe 100644 --- a/.github/workflows/release-windows-store.yml +++ b/.github/workflows/release-windows-store.yml @@ -74,16 +74,16 @@ jobs: mkdir -p builds/common-binaries/baseset cd builds/common-binaries/baseset - echo "::group::Download OpenGFX" - curl -L https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip -o opengfx-all.zip + echo "::group::Download OpenGFX2" + curl -L https://cdn.openttd.org/opengfx2_classic-releases/0.8/opengfx2_classic-0.8-all.zip -o opengfx2_classic.zip echo "::endgroup::" - echo "::group::Unpack OpenGFX" - unzip opengfx-all.zip - tar xf opengfx-*.tar + echo "::group::Unpack OpenGFX2" + unzip opengfx2_classic.zip + tar xf OpenGFX2_Classic-0.8.tar echo "::endgroup::" - rm -f opengfx-all.zip opengfx-*.tar + rm -f opengfx2_classic.zip OpenGFX2_Classic-0.8.tar - name: Install OpenMSX shell: bash diff --git a/.github/workflows/upload-gog.yml b/.github/workflows/upload-gog.yml index 94da233878..4e0c888edb 100644 --- a/.github/workflows/upload-gog.yml +++ b/.github/workflows/upload-gog.yml @@ -56,16 +56,16 @@ jobs: mkdir -p gog/opengfx/baseset cd gog/opengfx/baseset - echo "::group::Download OpenGFX" - curl -L https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip -o opengfx-all.zip + echo "::group::Download OpenGFX2" + curl -L https://cdn.openttd.org/opengfx2_classic-releases/0.8/opengfx2_classic-0.8-all.zip -o opengfx2_classic.zip echo "::endgroup::" - echo "::group::Unpack OpenGFX" - unzip opengfx-all.zip - tar xf opengfx-*.tar + echo "::group::Unpack OpenGFX2" + unzip opengfx2_classic.zip + tar xf OpenGFX2_Classic-0.8.tar echo "::endgroup::" - rm -f opengfx-all.zip opengfx-*.tar + rm -f opengfx2_classic.zip OpenGFX2_Classic-0.8.tar - name: Install OpenMSX shell: bash From 9e52df87ad5baef9092591bfe73209c65b0801fe Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 7 Dec 2025 04:43:11 +0000 Subject: [PATCH 267/280] Update: Translations from eints chinese (traditional): 22 changes by KogentaSan --- src/lang/traditional_chinese.txt | 33 +++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 3f190c1bf1..e856ec5e5c 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -312,6 +312,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}如啟 STR_BUTTON_DEFAULT :{BLACK}預設值 STR_BUTTON_CANCEL :{BLACK}取消 STR_BUTTON_OK :{BLACK}確定 +STR_BUTTON_MOVE :{BLACK}移動 # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -2861,15 +2862,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的 STR_PICKER_HOUSE_TYPE_TOOLTIP :選擇建設的房屋類型。按住 點選可在儲存項目中新增或刪除 STR_HOUSE_PICKER_CAPTION :房屋選擇 -STR_HOUSE_PICKER_NAME :{BLACK}名稱:{ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}人口:{ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}可用年份:{ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}可用年份:{ORANGE}不限 -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}可用年份:{ORANGE}自 {NUM} 年起可用 -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}可用年份:{ORANGE}至 {NUM} 年前可用 -STR_HOUSE_PICKER_SIZE :{BLACK}大小:{ORANGE}{NUM}x{NUM} 格 -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}接受貨物:{ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}產出的貨物:{ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}名稱:{GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}人口:{GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}可用年份:{GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}可用年份:{GOLD}不限 +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}可用年份:{GOLD}自 {NUM} 年起可用 +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}可用年份:{GOLD}至 {NUM} 年前可用 +STR_HOUSE_PICKER_SIZE :{BLACK}大小:{GOLD}{NUM}x{NUM} 格 +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}接受貨物:{GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}產出貨物:{GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :市鎮邊緣 STR_HOUSE_PICKER_CLASS_ZONE2 :郊區邊緣 @@ -3427,6 +3428,10 @@ STR_MAPGEN_NORTHWEST :{BLACK}西北 STR_MAPGEN_NORTHEAST :{BLACK}東北方 STR_MAPGEN_SOUTHEAST :{BLACK}東南方 STR_MAPGEN_SOUTHWEST :{BLACK}西南方 +STR_MAPGEN_NORTHWEST_TOOLTIP :切換地圖西北邊界方向為水域或自由邊界 +STR_MAPGEN_NORTHEAST_TOOLTIP :切換地圖東北邊界方向為水域或自由邊界 +STR_MAPGEN_SOUTHEAST_TOOLTIP :切換地圖東南邊界方向為水域或自由邊界 +STR_MAPGEN_SOUTHWEST_TOOLTIP :切換地圖西南邊界方向為水域或自由邊界 STR_MAPGEN_BORDER_FREEFORM :{BLACK}自由地形 STR_MAPGEN_BORDER_WATER :{BLACK}水域 STR_MAPGEN_BORDER_RANDOM :{BLACK}隨機 @@ -3683,7 +3688,7 @@ STR_SIGN_LIST_MATCH_CASE :{BLACK}符合 STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}切換比對標誌名稱是否與篩選字串相符時是否要符合大小寫 # Sign window -STR_EDIT_SIGN_CAPTION :{WHITE}編輯標誌文字 +STR_EDIT_SIGN_CAPTION :{WHITE}編輯標誌 STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}將號誌置於畫面正中央。按住 點選可於號誌位置開啟新檢視視窗 STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}前往下個標誌 STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}前往上個標誌 @@ -3900,12 +3905,14 @@ STR_CARGO_RATING_EXCELLENT :極佳 STR_CARGO_RATING_OUTSTANDING :傑出 STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}將車站置於畫面正中央。按住 點選可於車站位置開啟新檢視視窗 +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}重新命名車站或移動車站標誌 STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}顯示所有指令內包含這個車站的列車 STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}顯示所有指令內包含這個車站的車輛 STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}顯示所有指令內包含這座機場的飛機 STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}顯示所有指令內包含這個碼頭的船舶 +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}編輯車站標誌 STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}關閉機場 STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}防止飛機在此機場降落 @@ -3913,9 +3920,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}防止 # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}將中途站置於畫面正中央。按住 點選可於中途站位置開啟新檢視視窗 +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}重新命名中途站或移動中途站標誌 STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}將浮標置於畫面正中央。按住 點選可於浮標位置開啟新檢視視窗 STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}修改浮標名稱 +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}編輯中途站標誌 # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} 財務狀況 {BLACK}{COMPANY_NUM} @@ -4038,7 +4047,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}、{STRING}、{STRING}……(尚有 {NUM} 個未顯示) STR_INDUSTRY_DIRECTORY_LIST_TOOLTIP :{BLACK}工業名稱 - 點選名稱可將工業置於畫面正中央。按住 點選可於工業位置開啟新檢視視窗 STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}接受貨物:{SILVER}{STRING} -STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}產出的貨物:{SILVER}{STRING} +STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}產出貨物:{SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :所有貨物種類 STR_INDUSTRY_DIRECTORY_FILTER_NONE :無 @@ -5129,6 +5138,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_CAN_T_MOVE_STATION_NAME :{WHITE}無法移動車站標誌…… STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}… 市鎮擁有的路段 STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... 此道路面向錯誤的方向 STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... 路邊車站不能建在轉角處 @@ -5160,6 +5170,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}無法 STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}無法在此道路興建中途站…… STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}無法在此放置浮標... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}無法修改中途站名稱…… +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}無法移動中途站標誌…… STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}無法移除此鐵道的中途站…… STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}無法移除此道路的中途站…… From 4b7a3241bf9873bf7b4dec6dcbefb362d7cba32e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Dec 2025 08:36:58 +0000 Subject: [PATCH 268/280] Codechange: Remove unnecessary 'core' includes. (#14867) --- src/autoreplace.cpp | 1 - src/blitter/8bpp_optimized.cpp | 1 - src/blitter/common.hpp | 1 - src/cargo_type.h | 2 -- src/cheat_gui.cpp | 1 - src/company_type.h | 2 +- src/core/random_func.cpp | 1 - src/core/string_consumer.cpp | 1 - src/gfx.cpp | 1 - src/goal_type.h | 1 - src/group_gui.cpp | 1 - src/house_type.h | 2 ++ src/intro_gui.cpp | 1 - src/misc/hashtable.hpp | 2 -- src/network/core/network_game_info.cpp | 1 - src/network/core/tcp_admin.h | 1 - src/network/core/tcp_game.h | 1 - src/network/core/tcp_listen.h | 1 - src/network/network.cpp | 1 - src/network/network_chat_gui.cpp | 1 - src/network/network_client.cpp | 1 - src/newgrf.h | 1 - src/newgrf/newgrf_bytereader.cpp | 1 - src/newgrf_commons.h | 1 - src/newgrf_industrytiles.h | 1 - src/newgrf_storage.cpp | 1 - src/newgrf_text.cpp | 1 - src/order_cmd.cpp | 1 - src/rail.h | 1 - src/road.h | 1 - src/roadstop_base.h | 1 - src/script/api/script_error.cpp | 1 - src/script/api/script_industrytype.cpp | 1 - src/script/script_config.cpp | 1 - src/script/squirrel_std.cpp | 1 - src/spriteloader/grf.cpp | 3 --- src/spriteloader/makeindexed.cpp | 1 - src/station_kdtree.h | 1 - src/story_type.h | 1 - src/strgen/strgen.cpp | 1 - src/string.cpp | 1 - src/string_func.h | 1 - src/strings_func.h | 3 --- src/tests/mock_spritecache.cpp | 1 - src/timer/timer_game_calendar.h | 1 - src/timer/timer_game_economy.h | 1 - src/transport_type.h | 2 -- src/video/dedicated_v.cpp | 1 - src/video/sdl2_default_v.cpp | 2 -- src/video/sdl2_opengl_v.cpp | 3 --- src/video/sdl2_v.cpp | 1 - src/widget_type.h | 1 - 52 files changed, 3 insertions(+), 61 deletions(-) diff --git a/src/autoreplace.cpp b/src/autoreplace.cpp index 865266ecd4..cca3be399d 100644 --- a/src/autoreplace.cpp +++ b/src/autoreplace.cpp @@ -11,7 +11,6 @@ #include "command_func.h" #include "group.h" #include "autoreplace_base.h" -#include "core/bitmath_func.hpp" #include "core/pool_func.hpp" #include "safeguards.h" diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index 5cc16d975a..20947dc2fb 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -10,7 +10,6 @@ #include "../stdafx.h" #include "../zoom_func.h" #include "../settings_type.h" -#include "../core/math_func.hpp" #include "8bpp_optimized.hpp" #include "../safeguards.h" diff --git a/src/blitter/common.hpp b/src/blitter/common.hpp index af94dadbdd..db57f65fb6 100644 --- a/src/blitter/common.hpp +++ b/src/blitter/common.hpp @@ -11,7 +11,6 @@ #define BLITTER_COMMON_HPP #include "base.hpp" -#include "../core/math_func.hpp" #include diff --git a/src/cargo_type.h b/src/cargo_type.h index 7bc0552f98..6957e8f286 100644 --- a/src/cargo_type.h +++ b/src/cargo_type.h @@ -10,9 +10,7 @@ #ifndef CARGO_TYPE_H #define CARGO_TYPE_H -#include "core/enum_type.hpp" #include "core/strong_typedef_type.hpp" -#include "core/convertible_through_base.hpp" /** Globally unique label of a cargo type. */ using CargoLabel = StrongType::Typedef; diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index af45b55ac7..d35df796da 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -29,7 +29,6 @@ #include "newgrf.h" #include "error.h" #include "misc_cmd.h" -#include "core/geometry_func.hpp" #include "settings_type.h" #include "settings_internal.h" #include "timer/timer.h" diff --git a/src/company_type.h b/src/company_type.h index fe984a245d..8a81553020 100644 --- a/src/company_type.h +++ b/src/company_type.h @@ -10,7 +10,7 @@ #ifndef COMPANY_TYPE_H #define COMPANY_TYPE_H -#include "core/enum_type.hpp" +#include "core/base_bitset_type.hpp" #include "core/pool_type.hpp" using CompanyID = PoolID; diff --git a/src/core/random_func.cpp b/src/core/random_func.cpp index 6960bac154..dcd32ef983 100644 --- a/src/core/random_func.cpp +++ b/src/core/random_func.cpp @@ -9,7 +9,6 @@ #include "../stdafx.h" #include "random_func.hpp" -#include "bitmath_func.hpp" #include "../debug.h" #ifdef RANDOM_DEBUG diff --git a/src/core/string_consumer.cpp b/src/core/string_consumer.cpp index c878388939..a9282a50c2 100644 --- a/src/core/string_consumer.cpp +++ b/src/core/string_consumer.cpp @@ -10,7 +10,6 @@ #include "../stdafx.h" #include "string_consumer.hpp" -#include "bitmath_func.hpp" #include "utf8.hpp" #include "string_builder.hpp" diff --git a/src/gfx.cpp b/src/gfx.cpp index 8ad6de81cc..02bfbfd554 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -22,7 +22,6 @@ #include "window_func.h" #include "newgrf_debug.h" #include "core/backup_type.hpp" -#include "core/container_func.hpp" #include "core/geometry_func.hpp" #include "viewport_func.h" diff --git a/src/goal_type.h b/src/goal_type.h index 0ea1e96200..debfc2de2e 100644 --- a/src/goal_type.h +++ b/src/goal_type.h @@ -10,7 +10,6 @@ #ifndef GOAL_TYPE_H #define GOAL_TYPE_H -#include "core/enum_type.hpp" #include "core/pool_type.hpp" static const uint32_t GOAL_QUESTION_BUTTON_COUNT = 18; ///< Amount of buttons available. diff --git a/src/group_gui.cpp b/src/group_gui.cpp index c123176165..d0a259a026 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -22,7 +22,6 @@ #include "tilehighlight_func.h" #include "vehicle_gui_base.h" #include "core/geometry_func.hpp" -#include "core/container_func.hpp" #include "company_base.h" #include "company_gui.h" #include "gui.h" diff --git a/src/house_type.h b/src/house_type.h index bac5d01712..9b9ea1d4b0 100644 --- a/src/house_type.h +++ b/src/house_type.h @@ -10,6 +10,8 @@ #ifndef HOUSE_TYPE_H #define HOUSE_TYPE_H +#include "core/enum_type.hpp" + typedef uint16_t HouseID; ///< OpenTTD ID of house types. typedef uint16_t HouseClassID; ///< Classes of houses. diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index 2d84c1ec6c..9ecb1e94b1 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -26,7 +26,6 @@ #include "ai/ai_gui.hpp" #include "game/game_gui.hpp" #include "gfx_func.h" -#include "core/geometry_func.hpp" #include "core/string_consumer.hpp" #include "language.h" #include "rev.h" diff --git a/src/misc/hashtable.hpp b/src/misc/hashtable.hpp index 52a06462c9..e357528d78 100644 --- a/src/misc/hashtable.hpp +++ b/src/misc/hashtable.hpp @@ -10,8 +10,6 @@ #ifndef HASHTABLE_HPP #define HASHTABLE_HPP -#include "../core/math_func.hpp" - template struct HashTableSlot { diff --git a/src/network/core/network_game_info.cpp b/src/network/core/network_game_info.cpp index fb7c2fed49..1fe1c2df1e 100644 --- a/src/network/core/network_game_info.cpp +++ b/src/network/core/network_game_info.cpp @@ -11,7 +11,6 @@ #include "../../stdafx.h" #include "network_game_info.h" -#include "../../core/bitmath_func.hpp" #include "../../company_base.h" #include "../../timer/timer_game_calendar.h" #include "../../timer/timer_game_tick.h" diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 92d0d1781e..c5b9180f03 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -15,7 +15,6 @@ #include "os_abstraction.h" #include "tcp.h" #include "../network_type.h" -#include "../../core/pool_type.hpp" /** * Enum with types of TCP packets specific to the admin network. diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 9e03a7be8d..871a2009fa 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -15,7 +15,6 @@ #include "os_abstraction.h" #include "tcp.h" #include "../network_type.h" -#include "../../core/pool_type.hpp" #include /** diff --git a/src/network/core/tcp_listen.h b/src/network/core/tcp_listen.h index 7e38734e6d..55ca79cecf 100644 --- a/src/network/core/tcp_listen.h +++ b/src/network/core/tcp_listen.h @@ -16,7 +16,6 @@ #include "../network.h" #include "../network_func.h" #include "../network_internal.h" -#include "../../core/pool_type.hpp" #include "../../debug.h" #include "table/strings.h" diff --git a/src/network/network.cpp b/src/network/network.cpp index 29cbcf7acf..7a95f91fac 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -9,7 +9,6 @@ #include "../stdafx.h" -#include "../core/string_consumer.hpp" #include "../strings_func.h" #include "../command_func.h" #include "../timer/timer_game_tick.h" diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index 865036b424..d55fede4f9 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -17,7 +17,6 @@ #include "../town.h" #include "../window_func.h" #include "../toolbar_gui.h" -#include "../core/geometry_func.hpp" #include "../zoom_func.h" #include "../timer/timer.h" #include "../timer/timer_window.h" diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 4313a9de0a..53c73a7f11 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -9,7 +9,6 @@ #include "../stdafx.h" #include "network_gui.h" -#include "../core/string_consumer.hpp" #include "../saveload/saveload.h" #include "../saveload/saveload_filter.h" #include "../command_func.h" diff --git a/src/newgrf.h b/src/newgrf.h index beb5a0ed4f..fd89853c6d 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -17,7 +17,6 @@ #include "newgrf_badge_type.h" #include "newgrf_callbacks.h" #include "newgrf_text_type.h" -#include "core/bitmath_func.hpp" /** * List of different canal 'features'. diff --git a/src/newgrf/newgrf_bytereader.cpp b/src/newgrf/newgrf_bytereader.cpp index a1a9585ff2..cd1a5098aa 100644 --- a/src/newgrf/newgrf_bytereader.cpp +++ b/src/newgrf/newgrf_bytereader.cpp @@ -8,7 +8,6 @@ /** @file newgrf_bytereader.cpp NewGRF byte buffer reader implementation. */ #include "../stdafx.h" -#include "../core/backup_type.hpp" #include "../string_func.h" #include "newgrf_bytereader.h" diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index fb44120a60..4c23d5c1fc 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -14,7 +14,6 @@ #define NEWGRF_COMMONS_H #include "sprite.h" -#include "core/alloc_type.hpp" #include "command_type.h" #include "direction_type.h" #include "company_type.h" diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h index 358b12eb13..273e61e507 100644 --- a/src/newgrf_industrytiles.h +++ b/src/newgrf_industrytiles.h @@ -12,7 +12,6 @@ #include "newgrf_animation_type.h" #include "newgrf_industries.h" -#include "core/random_func.hpp" /** Resolver for the industry tiles scope. */ struct IndustryTileScopeResolver : public ScopeResolver { diff --git a/src/newgrf_storage.cpp b/src/newgrf_storage.cpp index ae90bfd555..6c224c447f 100644 --- a/src/newgrf_storage.cpp +++ b/src/newgrf_storage.cpp @@ -10,7 +10,6 @@ #include "stdafx.h" #include "newgrf_storage.h" #include "core/pool_func.hpp" -#include "core/endian_func.hpp" #include "debug.h" #include "safeguards.h" diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp index 6ac6909d62..b62a7d872f 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -26,7 +26,6 @@ #include "string_func.h" #include "timer/timer_game_calendar.h" #include "debug.h" -#include "core/alloc_type.hpp" #include "core/string_builder.hpp" #include "core/string_consumer.hpp" #include "language.h" diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index d13fb407f7..09f1bb680e 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -17,7 +17,6 @@ #include "vehicle_func.h" #include "depot_base.h" #include "core/pool_func.hpp" -#include "core/random_func.hpp" #include "aircraft.h" #include "roadveh.h" #include "station_base.h" diff --git a/src/rail.h b/src/rail.h index 9865f81003..a8ced13681 100644 --- a/src/rail.h +++ b/src/rail.h @@ -13,7 +13,6 @@ #include "rail_type.h" #include "track_type.h" #include "gfx_type.h" -#include "core/bitmath_func.hpp" #include "core/enum_type.hpp" #include "core/flatset_type.hpp" #include "economy_func.h" diff --git a/src/road.h b/src/road.h index 4918d7cc80..01f333ffdb 100644 --- a/src/road.h +++ b/src/road.h @@ -12,7 +12,6 @@ #include "road_type.h" #include "gfx_type.h" -#include "core/bitmath_func.hpp" #include "core/flatset_type.hpp" #include "strings_type.h" #include "timer/timer_game_calendar.h" diff --git a/src/roadstop_base.h b/src/roadstop_base.h index dc48ae527e..c5b14ce12d 100644 --- a/src/roadstop_base.h +++ b/src/roadstop_base.h @@ -12,7 +12,6 @@ #include "station_type.h" #include "core/pool_type.hpp" -#include "core/bitmath_func.hpp" #include "vehicle_type.h" using RoadStopPool = Pool; diff --git a/src/script/api/script_error.cpp b/src/script/api/script_error.cpp index 34c1dfb9d5..ee410eb65d 100644 --- a/src/script/api/script_error.cpp +++ b/src/script/api/script_error.cpp @@ -9,7 +9,6 @@ #include "../../stdafx.h" #include "script_error.hpp" -#include "../../core/bitmath_func.hpp" #include "../../string_func.h" #include "../../strings_func.h" diff --git a/src/script/api/script_industrytype.cpp b/src/script/api/script_industrytype.cpp index 5a6929deec..e945128b2e 100644 --- a/src/script/api/script_industrytype.cpp +++ b/src/script/api/script_industrytype.cpp @@ -15,7 +15,6 @@ #include "../../strings_func.h" #include "../../industry.h" #include "../../newgrf_industries.h" -#include "../../core/random_func.hpp" #include "../../industry_cmd.h" #include "../../safeguards.h" diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index 7243af22af..9d9dbe85b6 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -9,7 +9,6 @@ #include "../stdafx.h" #include "../settings_type.h" -#include "../core/random_func.hpp" #include "script_info.hpp" #include "api/script_object.hpp" #include "../textfile_gui.h" diff --git a/src/script/squirrel_std.cpp b/src/script/squirrel_std.cpp index d400597586..0ee1dea873 100644 --- a/src/script/squirrel_std.cpp +++ b/src/script/squirrel_std.cpp @@ -12,7 +12,6 @@ #include #include "../debug.h" #include "squirrel_std.hpp" -#include "../core/math_func.hpp" #include "../string_func.h" #include "../safeguards.h" diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index 121a4c4700..905e830eca 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -13,9 +13,6 @@ #include "../settings_type.h" #include "../strings_func.h" #include "../error.h" -#include "../core/math_func.hpp" -#include "../core/alloc_type.hpp" -#include "../core/bitmath_func.hpp" #include "../spritecache.h" #include "grf.hpp" diff --git a/src/spriteloader/makeindexed.cpp b/src/spriteloader/makeindexed.cpp index 9e110f5069..629f738614 100644 --- a/src/spriteloader/makeindexed.cpp +++ b/src/spriteloader/makeindexed.cpp @@ -8,7 +8,6 @@ /** @file makeindexed.cpp Implementation for converting sprites from another source from 32bpp RGBA to indexed 8bpp. */ #include "../stdafx.h" -#include "../core/bitmath_func.hpp" #include "../core/math_func.hpp" #include "../gfx_func.h" #include "../palette_func.h" diff --git a/src/station_kdtree.h b/src/station_kdtree.h index 084876a6fd..ffd9f4a906 100644 --- a/src/station_kdtree.h +++ b/src/station_kdtree.h @@ -11,7 +11,6 @@ #define STATION_KDTREE_H #include "core/kdtree.hpp" -#include "core/math_func.hpp" #include "station_base.h" #include "map_func.h" diff --git a/src/story_type.h b/src/story_type.h index 3c6ad0a1a7..7786a7e601 100644 --- a/src/story_type.h +++ b/src/story_type.h @@ -10,7 +10,6 @@ #ifndef STORY_TYPE_H #define STORY_TYPE_H -#include "core/enum_type.hpp" #include "core/pool_type.hpp" using StoryPageElementID = PoolID; ///< ID of a story page element diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index 06ead4ec0b..85ac7a334d 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -8,7 +8,6 @@ /** @file strgen.cpp Tool to create computer readable (stand-alone) translation files. */ #include "../stdafx.h" -#include "../core/endian_func.hpp" #include "../error_func.h" #include "../string_func.h" #include "../strings_type.h" diff --git a/src/string.cpp b/src/string.cpp index 09b3f7250d..d87f14615f 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -9,7 +9,6 @@ #include "stdafx.h" #include "debug.h" -#include "core/math_func.hpp" #include "error_func.h" #include "string_func.h" #include "string_base.h" diff --git a/src/string_func.h b/src/string_func.h index 828d123505..aeab9f2e79 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -14,7 +14,6 @@ #include -#include "core/bitmath_func.hpp" #include "string_type.h" void strecpy(std::span dst, std::string_view src); diff --git a/src/strings_func.h b/src/strings_func.h index e397a69197..e132830977 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -12,10 +12,7 @@ #include "fontcache.h" #include "strings_type.h" -#include "string_type.h" #include "gfx_type.h" -#include "core/bitmath_func.hpp" -#include "core/convertible_through_base.hpp" #include "vehicle_type.h" /** diff --git a/src/tests/mock_spritecache.cpp b/src/tests/mock_spritecache.cpp index 6d59e9efcb..d0a57985b6 100644 --- a/src/tests/mock_spritecache.cpp +++ b/src/tests/mock_spritecache.cpp @@ -10,7 +10,6 @@ #include "../stdafx.h" #include "../blitter/factory.hpp" -#include "../core/math_func.hpp" #include "../spritecache.h" #include "../spritecache_internal.h" #include "../table/sprites.h" diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index 19eb1b1d93..0af6e8654e 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -10,7 +10,6 @@ #ifndef TIMER_GAME_CALENDAR_H #define TIMER_GAME_CALENDAR_H -#include "../core/strong_typedef_type.hpp" #include "timer_game_common.h" /** diff --git a/src/timer/timer_game_economy.h b/src/timer/timer_game_economy.h index 9c51086e9e..162181fbeb 100644 --- a/src/timer/timer_game_economy.h +++ b/src/timer/timer_game_economy.h @@ -10,7 +10,6 @@ #ifndef TIMER_GAME_ECONOMY_H #define TIMER_GAME_ECONOMY_H -#include "../core/strong_typedef_type.hpp" #include "timer_game_common.h" /** diff --git a/src/transport_type.h b/src/transport_type.h index c3b8705176..2352afe276 100644 --- a/src/transport_type.h +++ b/src/transport_type.h @@ -10,8 +10,6 @@ #ifndef TRANSPORT_TYPE_H #define TRANSPORT_TYPE_H -#include "core/enum_type.hpp" - /** Type for the company global vehicle unit number. */ typedef uint16_t UnitID; diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp index 0c3144d003..3fd875b0bd 100644 --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -19,7 +19,6 @@ #include "../fios.h" #include "../blitter/factory.hpp" #include "../company_func.h" -#include "../core/random_func.hpp" #include "../saveload/saveload.h" #include "../thread.h" #include "../window_func.h" diff --git a/src/video/sdl2_default_v.cpp b/src/video/sdl2_default_v.cpp index 6ad0ad42eb..044251047d 100644 --- a/src/video/sdl2_default_v.cpp +++ b/src/video/sdl2_default_v.cpp @@ -16,8 +16,6 @@ #include "../network/network.h" #include "../thread.h" #include "../progress.h" -#include "../core/random_func.hpp" -#include "../core/math_func.hpp" #include "../core/geometry_func.hpp" #include "../fileio_func.h" #include "../framerate_type.h" diff --git a/src/video/sdl2_opengl_v.cpp b/src/video/sdl2_opengl_v.cpp index de99ead058..08edc8b3a6 100644 --- a/src/video/sdl2_opengl_v.cpp +++ b/src/video/sdl2_opengl_v.cpp @@ -19,9 +19,6 @@ #include "../network/network.h" #include "../thread.h" #include "../progress.h" -#include "../core/random_func.hpp" -#include "../core/math_func.hpp" -#include "../core/geometry_func.hpp" #include "../fileio_func.h" #include "../framerate_type.h" #include "../window_func.h" diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 7f4312a289..46f5e2db01 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -13,7 +13,6 @@ #include "../blitter/factory.hpp" #include "../thread.h" #include "../progress.h" -#include "../core/random_func.hpp" #include "../core/math_func.hpp" #include "../core/geometry_func.hpp" #include "../core/utf8.hpp" diff --git a/src/widget_type.h b/src/widget_type.h index 12deb5ff4e..26cf34125b 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -10,7 +10,6 @@ #ifndef WIDGET_TYPE_H #define WIDGET_TYPE_H -#include "core/bitmath_func.hpp" #include "core/math_func.hpp" #include "strings_type.h" #include "gfx_type.h" From 99f04f27ded8e26feda084a0c73a73022e376747 Mon Sep 17 00:00:00 2001 From: Cyprian Klimaszewski <111280526+Rito13@users.noreply.github.com> Date: Sun, 7 Dec 2025 12:25:08 +0100 Subject: [PATCH 269/280] Doc: Update information for receiving a copy of GPL. (#14869) --- COPYING.md | 3 +-- Doxyfile.in | 2 +- bin/ai/compat_0.7.nut | 2 +- bin/ai/compat_1.0.nut | 2 +- bin/ai/compat_1.1.nut | 2 +- bin/ai/compat_1.10.nut | 2 +- bin/ai/compat_1.11.nut | 2 +- bin/ai/compat_1.2.nut | 2 +- bin/ai/compat_1.3.nut | 2 +- bin/ai/compat_1.4.nut | 2 +- bin/ai/compat_1.5.nut | 2 +- bin/ai/compat_1.6.nut | 2 +- bin/ai/compat_1.7.nut | 2 +- bin/ai/compat_1.8.nut | 2 +- bin/ai/compat_1.9.nut | 2 +- bin/ai/compat_12.nut | 2 +- bin/ai/compat_13.nut | 2 +- bin/ai/compat_14.nut | 2 +- bin/game/compat_1.10.nut | 2 +- bin/game/compat_1.11.nut | 2 +- bin/game/compat_1.2.nut | 2 +- bin/game/compat_1.3.nut | 2 +- bin/game/compat_1.4.nut | 2 +- bin/game/compat_1.5.nut | 2 +- bin/game/compat_1.6.nut | 2 +- bin/game/compat_1.7.nut | 2 +- bin/game/compat_1.8.nut | 2 +- bin/game/compat_1.9.nut | 2 +- bin/game/compat_12.nut | 2 +- bin/game/compat_13.nut | 2 +- bin/game/compat_14.nut | 2 +- media/baseset/openttd/2ccmap.nfo | 2 +- media/baseset/openttd/airport_preview.nfo | 2 +- media/baseset/openttd/airports.nfo | 2 +- media/baseset/openttd/aqueduct.nfo | 2 +- media/baseset/openttd/autorail.nfo | 2 +- media/baseset/openttd/bridge_decks.nfo | 2 +- media/baseset/openttd/canals.nfo | 2 +- media/baseset/openttd/chars.nfo | 2 +- media/baseset/openttd/elrails.nfo | 2 +- media/baseset/openttd/foundations.nfo | 2 +- media/baseset/openttd/mono.nfo | 2 +- media/baseset/openttd/oneway.nfo | 2 +- media/baseset/openttd/openttd.nfo | 2 +- media/baseset/openttd/openttdgui.nfo | 2 +- media/baseset/openttd/overlay_rocks.nfo | 2 +- media/baseset/openttd/palette.nfo | 2 +- media/baseset/openttd/road_waypoints.nfo | 2 +- media/baseset/openttd/roadstops.nfo | 2 +- media/baseset/openttd/signals.nfo | 2 +- media/baseset/openttd/sloped_tracks.nfo | 2 +- media/baseset/openttd/tramtracks.nfo | 2 +- media/baseset/openttd/tunnel_portals.nfo | 2 +- media/baseset/orig_extra/airports_orig_extra.nfo | 2 +- media/baseset/orig_extra/canals_extra.nfo | 2 +- media/baseset/orig_extra/chars_orig_extra.nfo | 2 +- media/baseset/orig_extra/fix_graphics.nfo | 2 +- media/baseset/orig_extra/fix_gui_icons.nfo | 2 +- media/baseset/orig_extra/orig_extra.nfo | 2 +- media/baseset/orig_extra/rivers/arctic.nfo | 2 +- media/baseset/orig_extra/rivers/rapids.nfo | 2 +- media/baseset/orig_extra/rivers/temperate.nfo | 2 +- media/baseset/orig_extra/rivers/toyland.nfo | 2 +- media/baseset/orig_extra/rivers/toyland_rapids.nfo | 2 +- media/baseset/orig_extra/rivers/tropic.nfo | 2 +- media/baseset/orig_extra/shore.nfo | 2 +- src/ai/ai.hpp | 2 +- src/ai/ai_config.cpp | 2 +- src/ai/ai_config.hpp | 2 +- src/ai/ai_core.cpp | 2 +- src/ai/ai_gui.cpp | 2 +- src/ai/ai_gui.hpp | 2 +- src/ai/ai_info.cpp | 2 +- src/ai/ai_info.hpp | 2 +- src/ai/ai_instance.cpp | 2 +- src/ai/ai_instance.hpp | 2 +- src/ai/ai_scanner.cpp | 2 +- src/ai/ai_scanner.hpp | 2 +- src/aircraft.h | 2 +- src/aircraft_cmd.cpp | 2 +- src/aircraft_cmd.h | 2 +- src/aircraft_gui.cpp | 2 +- src/airport.cpp | 2 +- src/airport.h | 2 +- src/airport_cmd.h | 2 +- src/airport_gui.cpp | 2 +- src/animated_tile.cpp | 2 +- src/animated_tile_func.h | 2 +- src/animated_tile_map.h | 2 +- src/articulated_vehicles.cpp | 2 +- src/articulated_vehicles.h | 2 +- src/autocompletion.cpp | 2 +- src/autocompletion.h | 2 +- src/autoreplace.cpp | 2 +- src/autoreplace_base.h | 2 +- src/autoreplace_cmd.cpp | 2 +- src/autoreplace_cmd.h | 2 +- src/autoreplace_func.h | 2 +- src/autoreplace_gui.cpp | 2 +- src/autoreplace_gui.h | 2 +- src/autoreplace_type.h | 2 +- src/autoslope.h | 2 +- src/base_consist.cpp | 2 +- src/base_consist.h | 2 +- src/base_media_base.h | 2 +- src/base_media_func.h | 2 +- src/base_media_graphics.h | 2 +- src/base_media_music.h | 2 +- src/base_media_sounds.h | 2 +- src/base_station_base.h | 2 +- src/bitmap_type.h | 2 +- src/blitter/32bpp_anim.cpp | 2 +- src/blitter/32bpp_anim.hpp | 2 +- src/blitter/32bpp_anim_sse2.cpp | 2 +- src/blitter/32bpp_anim_sse2.hpp | 2 +- src/blitter/32bpp_anim_sse4.cpp | 2 +- src/blitter/32bpp_anim_sse4.hpp | 2 +- src/blitter/32bpp_base.cpp | 2 +- src/blitter/32bpp_base.hpp | 2 +- src/blitter/32bpp_optimized.cpp | 2 +- src/blitter/32bpp_optimized.hpp | 2 +- src/blitter/32bpp_simple.cpp | 2 +- src/blitter/32bpp_simple.hpp | 2 +- src/blitter/32bpp_sse2.cpp | 2 +- src/blitter/32bpp_sse2.hpp | 2 +- src/blitter/32bpp_sse4.cpp | 2 +- src/blitter/32bpp_sse4.hpp | 2 +- src/blitter/32bpp_sse_func.hpp | 2 +- src/blitter/32bpp_sse_type.h | 2 +- src/blitter/32bpp_ssse3.cpp | 2 +- src/blitter/32bpp_ssse3.hpp | 2 +- src/blitter/40bpp_anim.cpp | 2 +- src/blitter/40bpp_anim.hpp | 2 +- src/blitter/8bpp_base.cpp | 2 +- src/blitter/8bpp_base.hpp | 2 +- src/blitter/8bpp_optimized.cpp | 2 +- src/blitter/8bpp_optimized.hpp | 2 +- src/blitter/8bpp_simple.cpp | 2 +- src/blitter/8bpp_simple.hpp | 2 +- src/blitter/base.hpp | 2 +- src/blitter/common.hpp | 2 +- src/blitter/factory.hpp | 2 +- src/blitter/null.cpp | 2 +- src/blitter/null.hpp | 2 +- src/bmp.cpp | 2 +- src/bmp.h | 2 +- src/bootstrap_gui.cpp | 2 +- src/bridge.h | 2 +- src/bridge_gui.cpp | 2 +- src/bridge_map.cpp | 2 +- src/bridge_map.h | 2 +- src/bridge_type.h | 2 +- src/build_vehicle_gui.cpp | 2 +- src/cachecheck.cpp | 2 +- src/cargo_type.h | 2 +- src/cargoaction.cpp | 2 +- src/cargoaction.h | 2 +- src/cargomonitor.cpp | 2 +- src/cargomonitor.h | 2 +- src/cargopacket.cpp | 2 +- src/cargopacket.h | 2 +- src/cargotype.cpp | 2 +- src/cargotype.h | 2 +- src/cheat.cpp | 2 +- src/cheat_func.h | 2 +- src/cheat_gui.cpp | 2 +- src/cheat_type.h | 2 +- src/clear_cmd.cpp | 2 +- src/clear_func.h | 2 +- src/clear_map.h | 2 +- src/command.cpp | 2 +- src/command_func.h | 2 +- src/command_type.h | 2 +- src/company_base.h | 2 +- src/company_cmd.cpp | 2 +- src/company_cmd.h | 2 +- src/company_func.h | 2 +- src/company_gui.cpp | 2 +- src/company_gui.h | 2 +- src/company_manager_face.h | 2 +- src/company_type.h | 2 +- src/console.cpp | 2 +- src/console_cmds.cpp | 2 +- src/console_func.h | 2 +- src/console_gui.cpp | 2 +- src/console_gui.h | 2 +- src/console_internal.h | 2 +- src/console_type.h | 2 +- src/core/alloc_type.hpp | 2 +- src/core/backup_type.hpp | 2 +- src/core/base_bitset_type.hpp | 2 +- src/core/bitmath_func.hpp | 2 +- src/core/container_func.hpp | 2 +- src/core/convertible_through_base.hpp | 2 +- src/core/endian_func.hpp | 2 +- src/core/enum_type.hpp | 2 +- src/core/flatset_type.hpp | 2 +- src/core/format.hpp | 2 +- src/core/geometry_func.cpp | 2 +- src/core/geometry_func.hpp | 2 +- src/core/geometry_type.hpp | 2 +- src/core/kdtree.hpp | 2 +- src/core/math_func.cpp | 2 +- src/core/math_func.hpp | 2 +- src/core/multimap.hpp | 2 +- src/core/overflowsafe_type.hpp | 2 +- src/core/pool_func.cpp | 2 +- src/core/pool_func.hpp | 2 +- src/core/pool_type.hpp | 2 +- src/core/random_func.cpp | 2 +- src/core/random_func.hpp | 2 +- src/core/string_builder.cpp | 2 +- src/core/string_builder.hpp | 2 +- src/core/string_consumer.cpp | 2 +- src/core/string_consumer.hpp | 2 +- src/core/string_inplace.cpp | 2 +- src/core/string_inplace.hpp | 2 +- src/core/strong_typedef_type.hpp | 2 +- src/core/utf8.cpp | 2 +- src/core/utf8.hpp | 2 +- src/cpu.cpp | 2 +- src/cpu.h | 2 +- src/crashlog.cpp | 2 +- src/crashlog.h | 2 +- src/currency.cpp | 2 +- src/currency.h | 2 +- src/date_gui.cpp | 2 +- src/date_gui.h | 2 +- src/debug.cpp | 2 +- src/debug.h | 2 +- src/dedicated.cpp | 2 +- src/depot.cpp | 2 +- src/depot_base.h | 2 +- src/depot_cmd.cpp | 2 +- src/depot_cmd.h | 2 +- src/depot_func.h | 2 +- src/depot_gui.cpp | 2 +- src/depot_map.h | 2 +- src/depot_type.h | 2 +- src/direction_func.h | 2 +- src/direction_type.h | 2 +- src/disaster_vehicle.cpp | 2 +- src/disaster_vehicle.h | 2 +- src/dock_cmd.h | 2 +- src/dock_gui.cpp | 2 +- src/driver.cpp | 2 +- src/driver.h | 2 +- src/dropdown.cpp | 2 +- src/dropdown_common_type.h | 2 +- src/dropdown_func.h | 2 +- src/dropdown_type.h | 2 +- src/economy.cpp | 2 +- src/economy_base.h | 2 +- src/economy_cmd.h | 2 +- src/economy_func.h | 2 +- src/economy_type.h | 2 +- src/effectvehicle.cpp | 2 +- src/effectvehicle_base.h | 2 +- src/effectvehicle_func.h | 2 +- src/elrail.cpp | 2 +- src/elrail_func.h | 2 +- src/engine.cpp | 2 +- src/engine_base.h | 2 +- src/engine_cmd.h | 2 +- src/engine_func.h | 2 +- src/engine_gui.cpp | 2 +- src/engine_gui.h | 2 +- src/engine_type.h | 2 +- src/error.cpp | 2 +- src/error.h | 2 +- src/error_func.h | 2 +- src/error_gui.cpp | 2 +- src/fileio.cpp | 2 +- src/fileio_func.h | 2 +- src/fileio_type.h | 2 +- src/fios.cpp | 2 +- src/fios.h | 2 +- src/fios_gui.cpp | 2 +- src/fontcache.cpp | 2 +- src/fontcache.h | 2 +- src/fontcache/freetypefontcache.cpp | 2 +- src/fontcache/spritefontcache.cpp | 2 +- src/fontcache/spritefontcache.h | 2 +- src/fontcache/truetypefontcache.cpp | 2 +- src/fontcache/truetypefontcache.h | 2 +- src/framerate_gui.cpp | 2 +- src/framerate_type.h | 2 +- src/game/game.hpp | 2 +- src/game/game_config.cpp | 2 +- src/game/game_config.hpp | 2 +- src/game/game_core.cpp | 2 +- src/game/game_gui.cpp | 2 +- src/game/game_gui.hpp | 4 ++-- src/game/game_info.cpp | 2 +- src/game/game_info.hpp | 2 +- src/game/game_instance.cpp | 2 +- src/game/game_instance.hpp | 2 +- src/game/game_scanner.cpp | 2 +- src/game/game_scanner.hpp | 2 +- src/game/game_text.cpp | 2 +- src/game/game_text.hpp | 2 +- src/gamelog.cpp | 2 +- src/gamelog.h | 2 +- src/gamelog_internal.h | 2 +- src/genworld.cpp | 2 +- src/genworld.h | 2 +- src/genworld_gui.cpp | 2 +- src/gfx.cpp | 2 +- src/gfx_func.h | 2 +- src/gfx_layout.cpp | 2 +- src/gfx_layout.h | 2 +- src/gfx_layout_fallback.cpp | 2 +- src/gfx_layout_fallback.h | 2 +- src/gfx_layout_icu.cpp | 2 +- src/gfx_layout_icu.h | 2 +- src/gfx_type.h | 2 +- src/gfxinit.cpp | 2 +- src/gfxinit.h | 2 +- src/goal.cpp | 2 +- src/goal_base.h | 2 +- src/goal_cmd.h | 2 +- src/goal_gui.cpp | 2 +- src/goal_type.h | 2 +- src/graph_gui.cpp | 2 +- src/graph_gui.h | 2 +- src/ground_vehicle.cpp | 2 +- src/ground_vehicle.hpp | 2 +- src/group.h | 2 +- src/group_cmd.cpp | 2 +- src/group_cmd.h | 2 +- src/group_gui.cpp | 2 +- src/group_gui.h | 2 +- src/group_type.h | 2 +- src/gui.h | 2 +- src/heightmap.cpp | 2 +- src/heightmap.h | 2 +- src/help_gui.cpp | 2 +- src/help_gui.h | 2 +- src/highscore.cpp | 2 +- src/highscore.h | 2 +- src/highscore_gui.cpp | 2 +- src/hotkeys.cpp | 2 +- src/hotkeys.h | 2 +- src/house.h | 2 +- src/house_type.h | 2 +- src/industry.h | 2 +- src/industry_cmd.cpp | 2 +- src/industry_cmd.h | 2 +- src/industry_gui.cpp | 2 +- src/industry_map.h | 2 +- src/industry_type.h | 2 +- src/industrytype.h | 2 +- src/ini.cpp | 2 +- src/ini_load.cpp | 2 +- src/ini_type.h | 2 +- src/intro_gui.cpp | 2 +- src/landscape.cpp | 2 +- src/landscape.h | 2 +- src/landscape_cmd.h | 2 +- src/landscape_type.h | 2 +- src/lang/afrikaans.txt | 2 +- src/lang/arabic_egypt.txt | 2 +- src/lang/basque.txt | 2 +- src/lang/belarusian.txt | 2 +- src/lang/brazilian_portuguese.txt | 2 +- src/lang/bulgarian.txt | 2 +- src/lang/catalan.txt | 2 +- src/lang/chuvash.txt | 2 +- src/lang/croatian.txt | 2 +- src/lang/czech.txt | 2 +- src/lang/danish.txt | 2 +- src/lang/dutch.txt | 2 +- src/lang/english.txt | 2 +- src/lang/english_AU.txt | 2 +- src/lang/english_US.txt | 2 +- src/lang/esperanto.txt | 2 +- src/lang/estonian.txt | 2 +- src/lang/faroese.txt | 2 +- src/lang/finnish.txt | 2 +- src/lang/french.txt | 2 +- src/lang/frisian.txt | 2 +- src/lang/gaelic.txt | 2 +- src/lang/galician.txt | 2 +- src/lang/german.txt | 2 +- src/lang/greek.txt | 2 +- src/lang/hebrew.txt | 2 +- src/lang/hindi.txt | 2 +- src/lang/hungarian.txt | 2 +- src/lang/icelandic.txt | 2 +- src/lang/ido.txt | 2 +- src/lang/indonesian.txt | 2 +- src/lang/irish.txt | 2 +- src/lang/italian.txt | 2 +- src/lang/japanese.txt | 2 +- src/lang/korean.txt | 2 +- src/lang/latin.txt | 2 +- src/lang/latvian.txt | 2 +- src/lang/lithuanian.txt | 2 +- src/lang/luxembourgish.txt | 2 +- src/lang/macedonian.txt | 2 +- src/lang/malay.txt | 2 +- src/lang/maltese.txt | 2 +- src/lang/maori.txt | 2 +- src/lang/marathi.txt | 2 +- src/lang/norwegian_bokmal.txt | 2 +- src/lang/norwegian_nynorsk.txt | 2 +- src/lang/persian.txt | 2 +- src/lang/polish.txt | 2 +- src/lang/portuguese.txt | 2 +- src/lang/romanian.txt | 2 +- src/lang/russian.txt | 2 +- src/lang/serbian.txt | 2 +- src/lang/simplified_chinese.txt | 2 +- src/lang/slovak.txt | 2 +- src/lang/slovenian.txt | 2 +- src/lang/spanish.txt | 2 +- src/lang/spanish_MX.txt | 2 +- src/lang/swedish.txt | 2 +- src/lang/tamil.txt | 2 +- src/lang/thai.txt | 2 +- src/lang/traditional_chinese.txt | 2 +- src/lang/turkish.txt | 2 +- src/lang/ukrainian.txt | 2 +- src/lang/urdu.txt | 2 +- src/lang/vietnamese.txt | 2 +- src/lang/welsh.txt | 2 +- src/language.h | 2 +- src/league_base.h | 2 +- src/league_cmd.cpp | 2 +- src/league_cmd.h | 2 +- src/league_gui.cpp | 2 +- src/league_gui.h | 2 +- src/league_type.h | 2 +- src/library_loader.h | 2 +- src/linkgraph/flowmapper.cpp | 2 +- src/linkgraph/flowmapper.h | 2 +- src/linkgraph/linkgraph.cpp | 2 +- src/linkgraph/linkgraph.h | 2 +- src/linkgraph/linkgraph_base.h | 2 +- src/linkgraph/linkgraph_gui.cpp | 2 +- src/linkgraph/linkgraph_gui.h | 2 +- src/linkgraph/linkgraph_type.h | 2 +- src/linkgraph/linkgraphjob.cpp | 2 +- src/linkgraph/linkgraphjob.h | 2 +- src/linkgraph/linkgraphjob_base.h | 2 +- src/linkgraph/linkgraphschedule.cpp | 2 +- src/linkgraph/linkgraphschedule.h | 2 +- src/linkgraph/refresh.cpp | 2 +- src/linkgraph/refresh.h | 2 +- src/livery.h | 2 +- src/main_gui.cpp | 2 +- src/map.cpp | 2 +- src/map_func.h | 2 +- src/map_type.h | 2 +- src/misc.cpp | 2 +- src/misc/alternating_iterator.hpp | 2 +- src/misc/autorelease.hpp | 2 +- src/misc/binaryheap.hpp | 2 +- src/misc/dbg_helpers.cpp | 2 +- src/misc/dbg_helpers.h | 2 +- src/misc/endian_buffer.hpp | 2 +- src/misc/getoptdata.cpp | 2 +- src/misc/getoptdata.h | 2 +- src/misc/hashtable.hpp | 2 +- src/misc/history.cpp | 2 +- src/misc/history_func.hpp | 2 +- src/misc/history_type.hpp | 2 +- src/misc/lrucache.hpp | 2 +- src/misc_cmd.cpp | 2 +- src/misc_cmd.h | 2 +- src/misc_gui.cpp | 2 +- src/mixer.cpp | 2 +- src/mixer.h | 2 +- src/music.cpp | 2 +- src/music/allegro_m.cpp | 2 +- src/music/allegro_m.h | 2 +- src/music/bemidi.cpp | 2 +- src/music/bemidi.h | 2 +- src/music/cocoa_m.cpp | 2 +- src/music/cocoa_m.h | 2 +- src/music/dmusic.cpp | 2 +- src/music/dmusic.h | 2 +- src/music/extmidi.cpp | 2 +- src/music/extmidi.h | 2 +- src/music/fluidsynth.cpp | 2 +- src/music/fluidsynth.h | 2 +- src/music/midi.h | 2 +- src/music/midifile.cpp | 2 +- src/music/midifile.hpp | 2 +- src/music/music_driver.hpp | 2 +- src/music/null_m.cpp | 2 +- src/music/null_m.h | 2 +- src/music/win32_m.cpp | 2 +- src/music/win32_m.h | 2 +- src/music_gui.cpp | 2 +- src/network/core/address.cpp | 2 +- src/network/core/address.h | 2 +- src/network/core/config.cpp | 2 +- src/network/core/config.h | 2 +- src/network/core/core.cpp | 2 +- src/network/core/core.h | 2 +- src/network/core/host.cpp | 2 +- src/network/core/host.h | 2 +- src/network/core/http.h | 2 +- src/network/core/http_curl.cpp | 2 +- src/network/core/http_none.cpp | 2 +- src/network/core/http_shared.h | 2 +- src/network/core/http_winhttp.cpp | 2 +- src/network/core/network_game_info.cpp | 2 +- src/network/core/network_game_info.h | 2 +- src/network/core/os_abstraction.cpp | 2 +- src/network/core/os_abstraction.h | 2 +- src/network/core/packet.cpp | 2 +- src/network/core/packet.h | 2 +- src/network/core/tcp.cpp | 2 +- src/network/core/tcp.h | 2 +- src/network/core/tcp_admin.cpp | 2 +- src/network/core/tcp_admin.h | 2 +- src/network/core/tcp_connect.cpp | 2 +- src/network/core/tcp_content.cpp | 2 +- src/network/core/tcp_content.h | 2 +- src/network/core/tcp_content_type.h | 2 +- src/network/core/tcp_coordinator.cpp | 2 +- src/network/core/tcp_coordinator.h | 2 +- src/network/core/tcp_game.cpp | 2 +- src/network/core/tcp_game.h | 2 +- src/network/core/tcp_listen.h | 2 +- src/network/core/tcp_stun.cpp | 2 +- src/network/core/tcp_stun.h | 2 +- src/network/core/tcp_turn.cpp | 2 +- src/network/core/tcp_turn.h | 2 +- src/network/core/udp.cpp | 2 +- src/network/core/udp.h | 2 +- src/network/network.cpp | 2 +- src/network/network.h | 2 +- src/network/network_admin.cpp | 2 +- src/network/network_admin.h | 2 +- src/network/network_base.h | 2 +- src/network/network_chat_gui.cpp | 2 +- src/network/network_client.cpp | 2 +- src/network/network_client.h | 2 +- src/network/network_command.cpp | 2 +- src/network/network_content.cpp | 2 +- src/network/network_content.h | 2 +- src/network/network_content_gui.cpp | 2 +- src/network/network_content_gui.h | 2 +- src/network/network_coordinator.cpp | 2 +- src/network/network_coordinator.h | 2 +- src/network/network_crypto.cpp | 2 +- src/network/network_crypto.h | 2 +- src/network/network_crypto_internal.h | 2 +- src/network/network_func.h | 2 +- src/network/network_gamelist.cpp | 2 +- src/network/network_gamelist.h | 2 +- src/network/network_gui.cpp | 2 +- src/network/network_gui.h | 2 +- src/network/network_internal.h | 2 +- src/network/network_query.cpp | 2 +- src/network/network_query.h | 2 +- src/network/network_server.cpp | 2 +- src/network/network_server.h | 2 +- src/network/network_stun.cpp | 2 +- src/network/network_stun.h | 2 +- src/network/network_survey.cpp | 2 +- src/network/network_survey.h | 2 +- src/network/network_turn.cpp | 2 +- src/network/network_turn.h | 2 +- src/network/network_type.h | 2 +- src/network/network_udp.cpp | 2 +- src/network/network_udp.h | 2 +- src/newgrf.cpp | 2 +- src/newgrf.h | 2 +- src/newgrf/newgrf_act0.cpp | 2 +- src/newgrf/newgrf_act0_aircraft.cpp | 2 +- src/newgrf/newgrf_act0_airports.cpp | 2 +- src/newgrf/newgrf_act0_badges.cpp | 2 +- src/newgrf/newgrf_act0_bridges.cpp | 2 +- src/newgrf/newgrf_act0_canals.cpp | 2 +- src/newgrf/newgrf_act0_cargo.cpp | 2 +- src/newgrf/newgrf_act0_globalvar.cpp | 2 +- src/newgrf/newgrf_act0_houses.cpp | 2 +- src/newgrf/newgrf_act0_industries.cpp | 2 +- src/newgrf/newgrf_act0_objects.cpp | 2 +- src/newgrf/newgrf_act0_railtypes.cpp | 2 +- src/newgrf/newgrf_act0_roadstops.cpp | 2 +- src/newgrf/newgrf_act0_roadtypes.cpp | 2 +- src/newgrf/newgrf_act0_roadvehs.cpp | 2 +- src/newgrf/newgrf_act0_ships.cpp | 2 +- src/newgrf/newgrf_act0_sounds.cpp | 2 +- src/newgrf/newgrf_act0_stations.cpp | 2 +- src/newgrf/newgrf_act0_trains.cpp | 2 +- src/newgrf/newgrf_act1.cpp | 2 +- src/newgrf/newgrf_act10.cpp | 2 +- src/newgrf/newgrf_act11.cpp | 2 +- src/newgrf/newgrf_act12.cpp | 2 +- src/newgrf/newgrf_act13.cpp | 2 +- src/newgrf/newgrf_act14.cpp | 2 +- src/newgrf/newgrf_act2.cpp | 2 +- src/newgrf/newgrf_act3.cpp | 2 +- src/newgrf/newgrf_act4.cpp | 2 +- src/newgrf/newgrf_act5.cpp | 2 +- src/newgrf/newgrf_act6.cpp | 2 +- src/newgrf/newgrf_act7_9.cpp | 2 +- src/newgrf/newgrf_act8.cpp | 2 +- src/newgrf/newgrf_acta.cpp | 2 +- src/newgrf/newgrf_actb.cpp | 2 +- src/newgrf/newgrf_actc.cpp | 2 +- src/newgrf/newgrf_actd.cpp | 2 +- src/newgrf/newgrf_acte.cpp | 2 +- src/newgrf/newgrf_actf.cpp | 2 +- src/newgrf/newgrf_bytereader.cpp | 2 +- src/newgrf/newgrf_bytereader.h | 2 +- src/newgrf/newgrf_internal.h | 2 +- src/newgrf/newgrf_internal_vehicle.h | 2 +- src/newgrf/newgrf_stringmapping.cpp | 2 +- src/newgrf/newgrf_stringmapping.h | 2 +- src/newgrf_act5.h | 2 +- src/newgrf_airport.cpp | 2 +- src/newgrf_airport.h | 2 +- src/newgrf_airporttiles.cpp | 2 +- src/newgrf_airporttiles.h | 2 +- src/newgrf_animation_base.h | 2 +- src/newgrf_animation_type.h | 2 +- src/newgrf_badge.cpp | 2 +- src/newgrf_badge.h | 2 +- src/newgrf_badge_config.cpp | 2 +- src/newgrf_badge_config.h | 2 +- src/newgrf_badge_gui.cpp | 2 +- src/newgrf_badge_gui.h | 2 +- src/newgrf_badge_type.h | 2 +- src/newgrf_callbacks.h | 2 +- src/newgrf_canal.cpp | 2 +- src/newgrf_canal.h | 2 +- src/newgrf_cargo.cpp | 2 +- src/newgrf_cargo.h | 2 +- src/newgrf_class.h | 2 +- src/newgrf_class_func.h | 2 +- src/newgrf_commons.cpp | 2 +- src/newgrf_commons.h | 2 +- src/newgrf_config.cpp | 2 +- src/newgrf_config.h | 2 +- src/newgrf_debug.h | 2 +- src/newgrf_debug_gui.cpp | 2 +- src/newgrf_engine.cpp | 2 +- src/newgrf_engine.h | 2 +- src/newgrf_generic.cpp | 2 +- src/newgrf_generic.h | 2 +- src/newgrf_gui.cpp | 2 +- src/newgrf_house.cpp | 2 +- src/newgrf_house.h | 2 +- src/newgrf_industries.cpp | 2 +- src/newgrf_industries.h | 2 +- src/newgrf_industrytiles.cpp | 2 +- src/newgrf_industrytiles.h | 2 +- src/newgrf_object.cpp | 2 +- src/newgrf_object.h | 2 +- src/newgrf_profiling.cpp | 2 +- src/newgrf_profiling.h | 2 +- src/newgrf_properties.h | 2 +- src/newgrf_railtype.cpp | 2 +- src/newgrf_railtype.h | 2 +- src/newgrf_roadstop.cpp | 2 +- src/newgrf_roadstop.h | 2 +- src/newgrf_roadtype.cpp | 2 +- src/newgrf_roadtype.h | 2 +- src/newgrf_sound.cpp | 2 +- src/newgrf_sound.h | 2 +- src/newgrf_spritegroup.cpp | 2 +- src/newgrf_spritegroup.h | 2 +- src/newgrf_station.cpp | 2 +- src/newgrf_station.h | 2 +- src/newgrf_storage.cpp | 2 +- src/newgrf_storage.h | 2 +- src/newgrf_text.cpp | 2 +- src/newgrf_text.h | 2 +- src/newgrf_text_type.h | 2 +- src/newgrf_town.cpp | 2 +- src/newgrf_town.h | 2 +- src/newgrf_townname.cpp | 2 +- src/newgrf_townname.h | 2 +- src/news_cmd.h | 2 +- src/news_func.h | 2 +- src/news_gui.cpp | 2 +- src/news_gui.h | 2 +- src/news_type.h | 2 +- src/object.h | 2 +- src/object_base.h | 2 +- src/object_cmd.cpp | 2 +- src/object_cmd.h | 2 +- src/object_gui.cpp | 2 +- src/object_map.h | 2 +- src/object_type.h | 2 +- src/openttd.cpp | 2 +- src/openttd.h | 2 +- src/order_backup.cpp | 2 +- src/order_backup.h | 2 +- src/order_base.h | 2 +- src/order_cmd.cpp | 2 +- src/order_cmd.h | 2 +- src/order_func.h | 2 +- src/order_gui.cpp | 2 +- src/order_type.h | 2 +- src/os/macosx/crashlog_osx.cpp | 2 +- src/os/macosx/font_osx.cpp | 2 +- src/os/macosx/font_osx.h | 2 +- src/os/macosx/macos.h | 2 +- src/os/macosx/macos.mm | 2 +- src/os/macosx/osx_main.cpp | 2 +- src/os/macosx/osx_stdafx.h | 2 +- src/os/macosx/string_osx.cpp | 2 +- src/os/macosx/string_osx.h | 2 +- src/os/macosx/survey_osx.cpp | 2 +- src/os/unix/crashlog_unix.cpp | 2 +- src/os/unix/font_unix.cpp | 2 +- src/os/unix/font_unix.h | 2 +- src/os/unix/library_loader_unix.cpp | 2 +- src/os/unix/survey_unix.cpp | 2 +- src/os/unix/unix.cpp | 2 +- src/os/unix/unix_main.cpp | 2 +- src/os/windows/crashlog_win.cpp | 2 +- src/os/windows/font_win32.cpp | 2 +- src/os/windows/font_win32.h | 2 +- src/os/windows/library_loader_win.cpp | 2 +- src/os/windows/ottdres.rc.in | 2 +- src/os/windows/string_uniscribe.cpp | 2 +- src/os/windows/string_uniscribe.h | 2 +- src/os/windows/survey_win.cpp | 2 +- src/os/windows/win32.cpp | 2 +- src/os/windows/win32.h | 2 +- src/os/windows/win32_main.cpp | 2 +- src/osk_gui.cpp | 2 +- src/palette.cpp | 2 +- src/palette_func.h | 2 +- src/pathfinder/follow_track.hpp | 2 +- src/pathfinder/pathfinder_func.h | 2 +- src/pathfinder/pathfinder_type.h | 2 +- src/pathfinder/water_regions.cpp | 2 +- src/pathfinder/water_regions.h | 2 +- src/pathfinder/yapf/nodelist.hpp | 2 +- src/pathfinder/yapf/yapf.h | 2 +- src/pathfinder/yapf/yapf.hpp | 2 +- src/pathfinder/yapf/yapf_base.hpp | 2 +- src/pathfinder/yapf/yapf_cache.h | 2 +- src/pathfinder/yapf/yapf_common.hpp | 2 +- src/pathfinder/yapf/yapf_costbase.hpp | 2 +- src/pathfinder/yapf/yapf_costcache.hpp | 2 +- src/pathfinder/yapf/yapf_costrail.hpp | 2 +- src/pathfinder/yapf/yapf_destrail.hpp | 2 +- src/pathfinder/yapf/yapf_node.hpp | 2 +- src/pathfinder/yapf/yapf_node_rail.hpp | 2 +- src/pathfinder/yapf/yapf_node_road.hpp | 2 +- src/pathfinder/yapf/yapf_node_ship.hpp | 2 +- src/pathfinder/yapf/yapf_rail.cpp | 2 +- src/pathfinder/yapf/yapf_river_builder.cpp | 2 +- src/pathfinder/yapf/yapf_river_builder.h | 2 +- src/pathfinder/yapf/yapf_road.cpp | 2 +- src/pathfinder/yapf/yapf_ship.cpp | 2 +- src/pathfinder/yapf/yapf_ship_regions.cpp | 2 +- src/pathfinder/yapf/yapf_ship_regions.h | 2 +- src/pathfinder/yapf/yapf_type.hpp | 2 +- src/pbs.cpp | 2 +- src/pbs.h | 2 +- src/picker_func.h | 2 +- src/picker_gui.cpp | 2 +- src/picker_gui.h | 2 +- src/progress.cpp | 2 +- src/progress.h | 2 +- src/provider_manager.h | 2 +- src/querystring_gui.h | 2 +- src/rail.cpp | 2 +- src/rail.h | 2 +- src/rail_cmd.cpp | 2 +- src/rail_cmd.h | 2 +- src/rail_gui.cpp | 2 +- src/rail_gui.h | 2 +- src/rail_map.h | 2 +- src/rail_type.h | 2 +- src/random_access_file.cpp | 2 +- src/random_access_file_type.h | 2 +- src/rev.cpp.in | 2 +- src/rev.h | 2 +- src/road.cpp | 2 +- src/road.h | 2 +- src/road_cmd.cpp | 2 +- src/road_cmd.h | 2 +- src/road_func.h | 2 +- src/road_gui.cpp | 2 +- src/road_gui.h | 2 +- src/road_internal.h | 2 +- src/road_map.cpp | 2 +- src/road_map.h | 2 +- src/road_type.h | 2 +- src/roadstop.cpp | 2 +- src/roadstop_base.h | 2 +- src/roadveh.h | 2 +- src/roadveh_cmd.cpp | 2 +- src/roadveh_cmd.h | 2 +- src/roadveh_gui.cpp | 2 +- src/safeguards.h | 2 +- src/saveload/afterload.cpp | 2 +- src/saveload/ai_sl.cpp | 2 +- src/saveload/airport_sl.cpp | 2 +- src/saveload/animated_tile_sl.cpp | 2 +- src/saveload/autoreplace_sl.cpp | 2 +- src/saveload/cargomonitor_sl.cpp | 2 +- src/saveload/cargopacket_sl.cpp | 2 +- src/saveload/cheat_sl.cpp | 2 +- src/saveload/company_sl.cpp | 2 +- src/saveload/compat/ai_sl_compat.h | 2 +- src/saveload/compat/animated_tile_sl_compat.h | 2 +- src/saveload/compat/autoreplace_sl_compat.h | 2 +- src/saveload/compat/cargomonitor_sl_compat.h | 2 +- src/saveload/compat/cargopacket_sl_compat.h | 2 +- src/saveload/compat/cheat_sl_compat.h | 2 +- src/saveload/compat/company_sl_compat.h | 2 +- src/saveload/compat/depot_sl_compat.h | 2 +- src/saveload/compat/economy_sl_compat.h | 2 +- src/saveload/compat/engine_sl_compat.h | 2 +- src/saveload/compat/game_sl_compat.h | 2 +- src/saveload/compat/gamelog_sl_compat.h | 2 +- src/saveload/compat/goal_sl_compat.h | 2 +- src/saveload/compat/group_sl_compat.h | 2 +- src/saveload/compat/industry_sl_compat.h | 2 +- src/saveload/compat/labelmaps_sl_compat.h | 2 +- src/saveload/compat/linkgraph_sl_compat.h | 2 +- src/saveload/compat/map_sl_compat.h | 2 +- src/saveload/compat/misc_sl_compat.h | 2 +- src/saveload/compat/newgrf_sl_compat.h | 2 +- src/saveload/compat/object_sl_compat.h | 2 +- src/saveload/compat/order_sl_compat.h | 2 +- src/saveload/compat/settings_sl_compat.h | 2 +- src/saveload/compat/signs_sl_compat.h | 2 +- src/saveload/compat/station_sl_compat.h | 2 +- src/saveload/compat/storage_sl_compat.h | 2 +- src/saveload/compat/story_sl_compat.h | 2 +- src/saveload/compat/subsidy_sl_compat.h | 2 +- src/saveload/compat/town_sl_compat.h | 2 +- src/saveload/compat/vehicle_sl_compat.h | 2 +- src/saveload/depot_sl.cpp | 2 +- src/saveload/economy_sl.cpp | 2 +- src/saveload/engine_sl.cpp | 2 +- src/saveload/game_sl.cpp | 2 +- src/saveload/gamelog_sl.cpp | 2 +- src/saveload/goal_sl.cpp | 2 +- src/saveload/group_sl.cpp | 2 +- src/saveload/industry_sl.cpp | 2 +- src/saveload/labelmaps_sl.cpp | 2 +- src/saveload/league_sl.cpp | 2 +- src/saveload/linkgraph_sl.cpp | 2 +- src/saveload/map_sl.cpp | 2 +- src/saveload/misc_sl.cpp | 2 +- src/saveload/newgrf_sl.cpp | 2 +- src/saveload/newgrf_sl.h | 2 +- src/saveload/object_sl.cpp | 2 +- src/saveload/oldloader.cpp | 2 +- src/saveload/oldloader.h | 2 +- src/saveload/oldloader_sl.cpp | 2 +- src/saveload/order_sl.cpp | 2 +- src/saveload/randomizer_sl.cpp | 2 +- src/saveload/saveload.cpp | 2 +- src/saveload/saveload.h | 2 +- src/saveload/saveload_error.hpp | 2 +- src/saveload/saveload_filter.h | 2 +- src/saveload/saveload_internal.h | 2 +- src/saveload/settings_sl.cpp | 2 +- src/saveload/signs_sl.cpp | 2 +- src/saveload/station_sl.cpp | 2 +- src/saveload/storage_sl.cpp | 2 +- src/saveload/story_sl.cpp | 2 +- src/saveload/strings_sl.cpp | 2 +- src/saveload/subsidy_sl.cpp | 2 +- src/saveload/town_sl.cpp | 2 +- src/saveload/vehicle_sl.cpp | 2 +- src/saveload/water_regions_sl.cpp | 2 +- src/saveload/waypoint_sl.cpp | 2 +- src/screenshot.cpp | 2 +- src/screenshot.h | 2 +- src/screenshot_bmp.cpp | 2 +- src/screenshot_gui.cpp | 2 +- src/screenshot_gui.h | 2 +- src/screenshot_pcx.cpp | 2 +- src/screenshot_png.cpp | 2 +- src/screenshot_type.h | 2 +- src/script/api/Doxyfile_AI.in | 2 +- src/script/api/Doxyfile_GS.in | 2 +- src/script/api/ai/ai_controller.sq.hpp | 2 +- src/script/api/ai_changelog.hpp | 2 +- src/script/api/doxygen_filter.awk | 2 +- src/script/api/doxygen_filter.sh | 2 +- src/script/api/game/game_controller.sq.hpp | 2 +- src/script/api/game_changelog.hpp | 2 +- src/script/api/script_accounting.cpp | 2 +- src/script/api/script_accounting.hpp | 2 +- src/script/api/script_admin.cpp | 2 +- src/script/api/script_admin.hpp | 2 +- src/script/api/script_airport.cpp | 2 +- src/script/api/script_airport.hpp | 2 +- src/script/api/script_asyncmode.cpp | 2 +- src/script/api/script_asyncmode.hpp | 2 +- src/script/api/script_base.cpp | 2 +- src/script/api/script_base.hpp | 2 +- src/script/api/script_basestation.cpp | 2 +- src/script/api/script_basestation.hpp | 2 +- src/script/api/script_bridge.cpp | 2 +- src/script/api/script_bridge.hpp | 2 +- src/script/api/script_bridgelist.cpp | 2 +- src/script/api/script_bridgelist.hpp | 2 +- src/script/api/script_cargo.cpp | 2 +- src/script/api/script_cargo.hpp | 2 +- src/script/api/script_cargolist.cpp | 2 +- src/script/api/script_cargolist.hpp | 2 +- src/script/api/script_cargomonitor.cpp | 2 +- src/script/api/script_cargomonitor.hpp | 2 +- src/script/api/script_client.cpp | 2 +- src/script/api/script_client.hpp | 2 +- src/script/api/script_clientlist.cpp | 2 +- src/script/api/script_clientlist.hpp | 2 +- src/script/api/script_company.cpp | 2 +- src/script/api/script_company.hpp | 2 +- src/script/api/script_companymode.cpp | 2 +- src/script/api/script_companymode.hpp | 2 +- src/script/api/script_controller.cpp | 2 +- src/script/api/script_controller.hpp | 2 +- src/script/api/script_date.cpp | 2 +- src/script/api/script_date.hpp | 2 +- src/script/api/script_depotlist.cpp | 2 +- src/script/api/script_depotlist.hpp | 2 +- src/script/api/script_engine.cpp | 2 +- src/script/api/script_engine.hpp | 2 +- src/script/api/script_enginelist.cpp | 2 +- src/script/api/script_enginelist.hpp | 2 +- src/script/api/script_error.cpp | 2 +- src/script/api/script_error.hpp | 2 +- src/script/api/script_event.cpp | 2 +- src/script/api/script_event.hpp | 2 +- src/script/api/script_event_types.cpp | 2 +- src/script/api/script_event_types.hpp | 2 +- src/script/api/script_execmode.cpp | 2 +- src/script/api/script_execmode.hpp | 2 +- src/script/api/script_game.cpp | 2 +- src/script/api/script_game.hpp | 2 +- src/script/api/script_gamesettings.cpp | 2 +- src/script/api/script_gamesettings.hpp | 2 +- src/script/api/script_goal.cpp | 2 +- src/script/api/script_goal.hpp | 2 +- src/script/api/script_group.cpp | 2 +- src/script/api/script_group.hpp | 2 +- src/script/api/script_grouplist.cpp | 2 +- src/script/api/script_grouplist.hpp | 2 +- src/script/api/script_includes.hpp.in | 2 +- src/script/api/script_industry.cpp | 2 +- src/script/api/script_industry.hpp | 2 +- src/script/api/script_industrylist.cpp | 2 +- src/script/api/script_industrylist.hpp | 2 +- src/script/api/script_industrytype.cpp | 2 +- src/script/api/script_industrytype.hpp | 2 +- src/script/api/script_industrytypelist.cpp | 2 +- src/script/api/script_industrytypelist.hpp | 2 +- src/script/api/script_info_docs.hpp | 2 +- src/script/api/script_infrastructure.cpp | 2 +- src/script/api/script_infrastructure.hpp | 2 +- src/script/api/script_league.cpp | 2 +- src/script/api/script_league.hpp | 2 +- src/script/api/script_list.cpp | 2 +- src/script/api/script_list.hpp | 2 +- src/script/api/script_log.cpp | 2 +- src/script/api/script_log.hpp | 2 +- src/script/api/script_log_types.hpp | 2 +- src/script/api/script_map.cpp | 2 +- src/script/api/script_map.hpp | 2 +- src/script/api/script_marine.cpp | 2 +- src/script/api/script_marine.hpp | 2 +- src/script/api/script_newgrf.cpp | 2 +- src/script/api/script_newgrf.hpp | 2 +- src/script/api/script_news.cpp | 2 +- src/script/api/script_news.hpp | 2 +- src/script/api/script_object.cpp | 2 +- src/script/api/script_object.hpp | 2 +- src/script/api/script_objecttype.cpp | 2 +- src/script/api/script_objecttype.hpp | 2 +- src/script/api/script_objecttypelist.cpp | 2 +- src/script/api/script_objecttypelist.hpp | 2 +- src/script/api/script_order.cpp | 2 +- src/script/api/script_order.hpp | 2 +- src/script/api/script_priorityqueue.cpp | 2 +- src/script/api/script_priorityqueue.hpp | 2 +- src/script/api/script_rail.cpp | 2 +- src/script/api/script_rail.hpp | 2 +- src/script/api/script_railtypelist.cpp | 2 +- src/script/api/script_railtypelist.hpp | 2 +- src/script/api/script_road.cpp | 2 +- src/script/api/script_road.hpp | 2 +- src/script/api/script_roadtypelist.cpp | 2 +- src/script/api/script_roadtypelist.hpp | 2 +- src/script/api/script_sign.cpp | 2 +- src/script/api/script_sign.hpp | 2 +- src/script/api/script_signlist.cpp | 2 +- src/script/api/script_signlist.hpp | 2 +- src/script/api/script_station.cpp | 2 +- src/script/api/script_station.hpp | 2 +- src/script/api/script_stationlist.cpp | 2 +- src/script/api/script_stationlist.hpp | 2 +- src/script/api/script_story_page.cpp | 2 +- src/script/api/script_story_page.hpp | 2 +- src/script/api/script_storypageelementlist.cpp | 2 +- src/script/api/script_storypageelementlist.hpp | 2 +- src/script/api/script_storypagelist.cpp | 2 +- src/script/api/script_storypagelist.hpp | 2 +- src/script/api/script_subsidy.cpp | 2 +- src/script/api/script_subsidy.hpp | 2 +- src/script/api/script_subsidylist.cpp | 2 +- src/script/api/script_subsidylist.hpp | 2 +- src/script/api/script_testmode.cpp | 2 +- src/script/api/script_testmode.hpp | 2 +- src/script/api/script_text.cpp | 2 +- src/script/api/script_text.hpp | 2 +- src/script/api/script_tile.cpp | 2 +- src/script/api/script_tile.hpp | 2 +- src/script/api/script_tilelist.cpp | 2 +- src/script/api/script_tilelist.hpp | 2 +- src/script/api/script_town.cpp | 2 +- src/script/api/script_town.hpp | 2 +- src/script/api/script_townlist.cpp | 2 +- src/script/api/script_townlist.hpp | 2 +- src/script/api/script_tunnel.cpp | 2 +- src/script/api/script_tunnel.hpp | 2 +- src/script/api/script_types.hpp | 2 +- src/script/api/script_vehicle.cpp | 2 +- src/script/api/script_vehicle.hpp | 2 +- src/script/api/script_vehiclelist.cpp | 2 +- src/script/api/script_vehiclelist.hpp | 2 +- src/script/api/script_viewport.cpp | 2 +- src/script/api/script_viewport.hpp | 2 +- src/script/api/script_waypoint.cpp | 2 +- src/script/api/script_waypoint.hpp | 2 +- src/script/api/script_waypointlist.cpp | 2 +- src/script/api/script_waypointlist.hpp | 2 +- src/script/api/script_window.cpp | 2 +- src/script/api/script_window.hpp.in | 2 +- src/script/api/squirrel_export.sq.hpp.in | 2 +- src/script/script_cmd.h | 2 +- src/script/script_config.cpp | 2 +- src/script/script_config.hpp | 2 +- src/script/script_fatalerror.hpp | 2 +- src/script/script_gui.cpp | 2 +- src/script/script_gui.h | 2 +- src/script/script_info.cpp | 2 +- src/script/script_info.hpp | 2 +- src/script/script_info_dummy.cpp | 2 +- src/script/script_instance.cpp | 2 +- src/script/script_instance.hpp | 2 +- src/script/script_scanner.cpp | 2 +- src/script/script_scanner.hpp | 2 +- src/script/script_storage.hpp | 2 +- src/script/script_suspend.hpp | 2 +- src/script/squirrel.cpp | 2 +- src/script/squirrel.hpp | 2 +- src/script/squirrel_class.hpp | 2 +- src/script/squirrel_helper.hpp | 2 +- src/script/squirrel_helper_type.hpp | 2 +- src/script/squirrel_std.cpp | 2 +- src/script/squirrel_std.hpp | 2 +- src/settingentry_gui.cpp | 2 +- src/settingentry_gui.h | 2 +- src/settings.cpp | 2 +- src/settings_cmd.h | 2 +- src/settings_func.h | 2 +- src/settings_gui.cpp | 2 +- src/settings_gui.h | 2 +- src/settings_internal.h | 2 +- src/settings_table.cpp | 2 +- src/settings_table.h | 2 +- src/settings_type.h | 2 +- src/settingsgen/settingsgen.cpp | 2 +- src/ship.h | 2 +- src/ship_cmd.cpp | 2 +- src/ship_cmd.h | 2 +- src/ship_gui.cpp | 2 +- src/signal.cpp | 2 +- src/signal_func.h | 2 +- src/signal_type.h | 2 +- src/signature.cpp | 2 +- src/signature.h | 2 +- src/signs.cpp | 2 +- src/signs_base.h | 2 +- src/signs_cmd.cpp | 2 +- src/signs_cmd.h | 2 +- src/signs_func.h | 2 +- src/signs_gui.cpp | 2 +- src/signs_type.h | 2 +- src/slider.cpp | 2 +- src/slider_func.h | 2 +- src/slope_func.h | 2 +- src/slope_type.h | 2 +- src/smallmap_gui.cpp | 2 +- src/smallmap_gui.h | 2 +- src/social_integration.cpp | 2 +- src/social_integration.h | 2 +- src/sortlist_type.h | 2 +- src/sound.cpp | 2 +- src/sound/allegro_s.cpp | 2 +- src/sound/allegro_s.h | 2 +- src/sound/cocoa_s.cpp | 2 +- src/sound/cocoa_s.h | 2 +- src/sound/null_s.cpp | 2 +- src/sound/null_s.h | 2 +- src/sound/sdl2_s.cpp | 2 +- src/sound/sdl_s.h | 2 +- src/sound/sound_driver.hpp | 2 +- src/sound/win32_s.cpp | 2 +- src/sound/win32_s.h | 2 +- src/sound/xaudio2_s.cpp | 2 +- src/sound/xaudio2_s.h | 2 +- src/sound_func.h | 2 +- src/sound_type.h | 2 +- src/soundloader.cpp | 2 +- src/soundloader_func.h | 2 +- src/soundloader_opus.cpp | 2 +- src/soundloader_raw.cpp | 2 +- src/soundloader_type.h | 2 +- src/soundloader_wav.cpp | 2 +- src/source_type.h | 2 +- src/sprite.cpp | 2 +- src/sprite.h | 2 +- src/spritecache.cpp | 2 +- src/spritecache.h | 2 +- src/spritecache_internal.h | 2 +- src/spritecache_type.h | 2 +- src/spriteloader/grf.cpp | 2 +- src/spriteloader/grf.hpp | 2 +- src/spriteloader/makeindexed.cpp | 2 +- src/spriteloader/makeindexed.h | 2 +- src/spriteloader/sprite_file.cpp | 2 +- src/spriteloader/sprite_file_type.hpp | 2 +- src/spriteloader/spriteloader.hpp | 2 +- src/station.cpp | 2 +- src/station_base.h | 2 +- src/station_cmd.cpp | 2 +- src/station_cmd.h | 2 +- src/station_func.h | 2 +- src/station_gui.cpp | 2 +- src/station_gui.h | 2 +- src/station_kdtree.h | 2 +- src/station_layout_type.h | 2 +- src/station_map.h | 2 +- src/station_type.h | 2 +- src/statusbar_gui.cpp | 2 +- src/statusbar_gui.h | 2 +- src/stdafx.h | 2 +- src/story.cpp | 2 +- src/story_base.h | 2 +- src/story_cmd.h | 2 +- src/story_gui.cpp | 2 +- src/story_type.h | 2 +- src/strgen/strgen.cpp | 2 +- src/strgen/strgen.h | 2 +- src/strgen/strgen_base.cpp | 2 +- src/string.cpp | 2 +- src/string_base.h | 2 +- src/string_func.h | 2 +- src/string_type.h | 2 +- src/stringfilter.cpp | 2 +- src/stringfilter_type.h | 2 +- src/strings.cpp | 2 +- src/strings_func.h | 2 +- src/strings_internal.h | 2 +- src/strings_type.h | 2 +- src/subsidy.cpp | 2 +- src/subsidy_base.h | 2 +- src/subsidy_cmd.h | 2 +- src/subsidy_func.h | 2 +- src/subsidy_gui.cpp | 2 +- src/subsidy_type.h | 2 +- src/survey.cpp | 2 +- src/survey.h | 2 +- src/table/airport_defaults.h | 2 +- src/table/airport_movement.h | 2 +- src/table/airporttile_ids.h | 2 +- src/table/airporttiles.h | 2 +- src/table/animcursors.h | 2 +- src/table/autorail.h | 2 +- src/table/bridge_land.h | 2 +- src/table/build_industry.h | 2 +- src/table/cargo_const.h | 2 +- src/table/clear_land.h | 2 +- src/table/company_face.h | 2 +- src/table/control_codes.h | 2 +- src/table/elrail_data.h | 2 +- src/table/engines.h | 2 +- src/table/genland.h | 2 +- src/table/heightmap_colours.h | 2 +- src/table/industry_land.h | 2 +- src/table/landscape_sprite.h | 2 +- src/table/newgrf_debug_data.h | 2 +- src/table/object_land.h | 2 +- src/table/opengl_shader.h | 2 +- src/table/palette_convert.h | 2 +- src/table/palettes.h | 2 +- src/table/pricebase.h | 2 +- src/table/railtypes.h | 2 +- src/table/road_land.h | 2 +- src/table/roadtypes.h | 2 +- src/table/roadveh_movement.h | 2 +- src/table/settings.h.preamble | 2 +- src/table/settings/company_settings.ini | 2 +- src/table/settings/currency_settings.ini | 2 +- src/table/settings/difficulty_settings.ini | 2 +- src/table/settings/economy_settings.ini | 2 +- src/table/settings/game_settings.ini | 2 +- src/table/settings/gui_settings.ini | 2 +- src/table/settings/linkgraph_settings.ini | 2 +- src/table/settings/locale_settings.ini | 2 +- src/table/settings/misc_settings.ini | 2 +- src/table/settings/multimedia_settings.ini | 2 +- src/table/settings/network_private_settings.ini | 2 +- src/table/settings/network_secrets_settings.ini | 2 +- src/table/settings/network_settings.ini | 2 +- src/table/settings/news_display_settings.ini | 2 +- src/table/settings/old_gameopt_settings.ini | 2 +- src/table/settings/pathfinding_settings.ini | 2 +- src/table/settings/script_settings.ini | 2 +- src/table/settings/win32_settings.ini | 2 +- src/table/settings/window_settings.ini | 2 +- src/table/settings/world_settings.ini | 2 +- src/table/signal_data.h | 2 +- src/table/sprites.h | 2 +- src/table/station_land.h | 2 +- src/table/strgen_tables.h | 2 +- src/table/string_colours.h | 2 +- src/table/town_land.h | 2 +- src/table/townname.h | 2 +- src/table/track_data.h | 2 +- src/table/track_land.h | 2 +- src/table/train_sprites.h | 2 +- src/table/tree_land.h | 2 +- src/table/unicode.h | 2 +- src/table/water_land.h | 2 +- src/tar_type.h | 2 +- src/terraform_cmd.cpp | 2 +- src/terraform_cmd.h | 2 +- src/terraform_gui.cpp | 2 +- src/terraform_gui.h | 2 +- src/tests/alternating_iterator.cpp | 2 +- src/tests/bitmath_func.cpp | 2 +- src/tests/enum_over_optimisation.cpp | 2 +- src/tests/flatset_type.cpp | 2 +- src/tests/history_func.cpp | 2 +- src/tests/landscape_partial_pixel_z.cpp | 2 +- src/tests/math_func.cpp | 2 +- src/tests/mock_environment.h | 2 +- src/tests/mock_fontcache.h | 2 +- src/tests/mock_spritecache.cpp | 2 +- src/tests/mock_spritecache.h | 2 +- src/tests/string_builder.cpp | 2 +- src/tests/string_consumer.cpp | 2 +- src/tests/string_func.cpp | 2 +- src/tests/string_inplace.cpp | 2 +- src/tests/test_main.cpp | 2 +- src/tests/test_network_crypto.cpp | 2 +- src/tests/test_script_admin.cpp | 2 +- src/tests/test_window_desc.cpp | 2 +- src/tests/tilearea.cpp | 2 +- src/tests/utf8.cpp | 2 +- src/textbuf.cpp | 2 +- src/textbuf_gui.h | 2 +- src/textbuf_type.h | 2 +- src/texteff.cpp | 2 +- src/texteff.hpp | 2 +- src/textfile_gui.cpp | 2 +- src/textfile_gui.h | 2 +- src/textfile_type.h | 2 +- src/tgp.cpp | 2 +- src/tgp.h | 2 +- src/thread.h | 2 +- src/tile_cmd.h | 2 +- src/tile_map.cpp | 2 +- src/tile_map.h | 2 +- src/tile_type.h | 2 +- src/tilearea.cpp | 2 +- src/tilearea_type.h | 2 +- src/tilehighlight_func.h | 2 +- src/tilehighlight_type.h | 2 +- src/timer/timer.h | 2 +- src/timer/timer_game_calendar.cpp | 2 +- src/timer/timer_game_calendar.h | 2 +- src/timer/timer_game_common.cpp | 2 +- src/timer/timer_game_common.h | 2 +- src/timer/timer_game_economy.cpp | 2 +- src/timer/timer_game_economy.h | 2 +- src/timer/timer_game_realtime.cpp | 2 +- src/timer/timer_game_realtime.h | 2 +- src/timer/timer_game_tick.cpp | 2 +- src/timer/timer_game_tick.h | 2 +- src/timer/timer_manager.h | 2 +- src/timer/timer_window.cpp | 2 +- src/timer/timer_window.h | 2 +- src/timetable.h | 2 +- src/timetable_cmd.cpp | 2 +- src/timetable_cmd.h | 2 +- src/timetable_gui.cpp | 2 +- src/toolbar_gui.cpp | 2 +- src/toolbar_gui.h | 2 +- src/town.h | 2 +- src/town_cmd.cpp | 2 +- src/town_cmd.h | 2 +- src/town_gui.cpp | 2 +- src/town_kdtree.h | 2 +- src/town_map.h | 2 +- src/town_type.h | 2 +- src/townname.cpp | 2 +- src/townname_func.h | 2 +- src/townname_type.h | 2 +- src/track_func.h | 2 +- src/track_type.h | 2 +- src/train.h | 2 +- src/train_cmd.cpp | 2 +- src/train_cmd.h | 2 +- src/train_gui.cpp | 2 +- src/transparency.h | 2 +- src/transparency_gui.cpp | 2 +- src/transparency_gui.h | 2 +- src/transport_type.h | 2 +- src/tree_cmd.cpp | 2 +- src/tree_cmd.h | 2 +- src/tree_gui.cpp | 2 +- src/tree_map.h | 2 +- src/tunnel_map.cpp | 2 +- src/tunnel_map.h | 2 +- src/tunnelbridge.h | 2 +- src/tunnelbridge_cmd.cpp | 2 +- src/tunnelbridge_cmd.h | 2 +- src/tunnelbridge_map.h | 2 +- src/vehicle.cpp | 2 +- src/vehicle_base.h | 2 +- src/vehicle_cmd.cpp | 2 +- src/vehicle_cmd.h | 2 +- src/vehicle_func.h | 2 +- src/vehicle_gui.cpp | 2 +- src/vehicle_gui.h | 2 +- src/vehicle_gui_base.h | 2 +- src/vehicle_type.h | 2 +- src/vehiclelist.cpp | 2 +- src/vehiclelist.h | 2 +- src/vehiclelist_cmd.h | 2 +- src/vehiclelist_func.h | 2 +- src/video/allegro_v.cpp | 2 +- src/video/allegro_v.h | 2 +- src/video/cocoa/cocoa_keys.h | 2 +- src/video/cocoa/cocoa_ogl.h | 2 +- src/video/cocoa/cocoa_ogl.mm | 2 +- src/video/cocoa/cocoa_v.h | 2 +- src/video/cocoa/cocoa_v.mm | 2 +- src/video/cocoa/cocoa_wnd.h | 2 +- src/video/cocoa/cocoa_wnd.mm | 2 +- src/video/dedicated_v.cpp | 2 +- src/video/dedicated_v.h | 2 +- src/video/null_v.cpp | 2 +- src/video/null_v.h | 2 +- src/video/opengl.cpp | 2 +- src/video/opengl.h | 2 +- src/video/sdl2_default_v.cpp | 2 +- src/video/sdl2_default_v.h | 2 +- src/video/sdl2_opengl_v.cpp | 2 +- src/video/sdl2_opengl_v.h | 2 +- src/video/sdl2_v.cpp | 2 +- src/video/sdl2_v.h | 2 +- src/video/video_driver.cpp | 2 +- src/video/video_driver.hpp | 2 +- src/video/win32_v.cpp | 2 +- src/video/win32_v.h | 2 +- src/viewport.cpp | 2 +- src/viewport_cmd.h | 2 +- src/viewport_func.h | 2 +- src/viewport_gui.cpp | 2 +- src/viewport_kdtree.h | 2 +- src/viewport_sprite_sorter.h | 2 +- src/viewport_sprite_sorter_sse4.cpp | 2 +- src/viewport_type.h | 2 +- src/void_cmd.cpp | 2 +- src/void_map.h | 2 +- src/water.h | 2 +- src/water_cmd.cpp | 2 +- src/water_cmd.h | 2 +- src/water_map.h | 2 +- src/waypoint.cpp | 2 +- src/waypoint_base.h | 2 +- src/waypoint_cmd.cpp | 2 +- src/waypoint_cmd.h | 2 +- src/waypoint_func.h | 2 +- src/waypoint_gui.cpp | 2 +- src/widget.cpp | 2 +- src/widget_type.h | 2 +- src/widgets/ai_widget.h | 2 +- src/widgets/airport_widget.h | 2 +- src/widgets/autoreplace_widget.h | 2 +- src/widgets/bootstrap_widget.h | 2 +- src/widgets/bridge_widget.h | 2 +- src/widgets/build_vehicle_widget.h | 2 +- src/widgets/cheat_widget.h | 2 +- src/widgets/company_widget.h | 2 +- src/widgets/console_widget.h | 2 +- src/widgets/date_widget.h | 2 +- src/widgets/depot_widget.h | 2 +- src/widgets/dock_widget.h | 2 +- src/widgets/dropdown_widget.h | 2 +- src/widgets/engine_widget.h | 2 +- src/widgets/error_widget.h | 2 +- src/widgets/fios_widget.h | 2 +- src/widgets/framerate_widget.h | 2 +- src/widgets/game_widget.h | 2 +- src/widgets/genworld_widget.h | 2 +- src/widgets/goal_widget.h | 2 +- src/widgets/graph_widget.h | 2 +- src/widgets/group_widget.h | 2 +- src/widgets/help_widget.h | 2 +- src/widgets/highscore_widget.h | 2 +- src/widgets/industry_widget.h | 2 +- src/widgets/intro_widget.h | 2 +- src/widgets/league_widget.h | 2 +- src/widgets/link_graph_legend_widget.h | 2 +- src/widgets/main_widget.h | 2 +- src/widgets/misc_widget.h | 2 +- src/widgets/music_widget.h | 2 +- src/widgets/network_chat_widget.h | 2 +- src/widgets/network_content_widget.h | 2 +- src/widgets/network_widget.h | 2 +- src/widgets/newgrf_debug_widget.h | 2 +- src/widgets/newgrf_widget.h | 2 +- src/widgets/news_widget.h | 2 +- src/widgets/object_widget.h | 2 +- src/widgets/order_widget.h | 2 +- src/widgets/osk_widget.h | 2 +- src/widgets/picker_widget.h | 2 +- src/widgets/rail_widget.h | 2 +- src/widgets/road_widget.h | 2 +- src/widgets/screenshot_widget.h | 2 +- src/widgets/script_widget.h | 2 +- src/widgets/settings_widget.h | 2 +- src/widgets/sign_widget.h | 2 +- src/widgets/smallmap_widget.h | 2 +- src/widgets/station_widget.h | 2 +- src/widgets/statusbar_widget.h | 2 +- src/widgets/story_widget.h | 2 +- src/widgets/subsidy_widget.h | 2 +- src/widgets/terraform_widget.h | 2 +- src/widgets/timetable_widget.h | 2 +- src/widgets/toolbar_widget.h | 2 +- src/widgets/town_widget.h | 2 +- src/widgets/transparency_widget.h | 2 +- src/widgets/tree_widget.h | 2 +- src/widgets/vehicle_widget.h | 2 +- src/widgets/viewport_widget.h | 2 +- src/widgets/waypoint_widget.h | 2 +- src/window.cpp | 2 +- src/window_func.h | 2 +- src/window_gui.h | 2 +- src/window_type.h | 2 +- src/zoom_func.h | 2 +- src/zoom_type.h | 2 +- 1459 files changed, 1460 insertions(+), 1461 deletions(-) diff --git a/COPYING.md b/COPYING.md index c77dfc079b..089f86e973 100644 --- a/COPYING.md +++ b/COPYING.md @@ -304,8 +304,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + with this program. If not, see . Also add information on how to contact you by electronic and paper mail. diff --git a/Doxyfile.in b/Doxyfile.in index e126b5ae82..7a744549e2 100644 --- a/Doxyfile.in +++ b/Doxyfile.in @@ -1,7 +1,7 @@ # 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 . +# 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 . # Doxyfile 1.9.4 diff --git a/bin/ai/compat_0.7.nut b/bin/ai/compat_0.7.nut index 974a1d684b..94bde5e557 100644 --- a/bin/ai/compat_0.7.nut +++ b/bin/ai/compat_0.7.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.0 to 0.7. */ diff --git a/bin/ai/compat_1.0.nut b/bin/ai/compat_1.0.nut index e6c616a5c8..899dbe0584 100644 --- a/bin/ai/compat_1.0.nut +++ b/bin/ai/compat_1.0.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.1 to 1.0. */ diff --git a/bin/ai/compat_1.1.nut b/bin/ai/compat_1.1.nut index eed756e1e3..d0f90ca601 100644 --- a/bin/ai/compat_1.1.nut +++ b/bin/ai/compat_1.1.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.2 to 1.1. */ diff --git a/bin/ai/compat_1.10.nut b/bin/ai/compat_1.10.nut index 0a7c37c638..853375f79a 100644 --- a/bin/ai/compat_1.10.nut +++ b/bin/ai/compat_1.10.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.11 to 1.10. */ diff --git a/bin/ai/compat_1.11.nut b/bin/ai/compat_1.11.nut index ca44c2d9fe..5898d371f6 100644 --- a/bin/ai/compat_1.11.nut +++ b/bin/ai/compat_1.11.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 12 to 1.11. */ diff --git a/bin/ai/compat_1.2.nut b/bin/ai/compat_1.2.nut index 23bf995eff..855cdea4a3 100644 --- a/bin/ai/compat_1.2.nut +++ b/bin/ai/compat_1.2.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.3 to 1.2. */ diff --git a/bin/ai/compat_1.3.nut b/bin/ai/compat_1.3.nut index 6ebdb7350c..8f420b30de 100644 --- a/bin/ai/compat_1.3.nut +++ b/bin/ai/compat_1.3.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.4 to 1.3. */ diff --git a/bin/ai/compat_1.4.nut b/bin/ai/compat_1.4.nut index ab752521a6..89697be2b8 100644 --- a/bin/ai/compat_1.4.nut +++ b/bin/ai/compat_1.4.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.5 to 1.4. */ diff --git a/bin/ai/compat_1.5.nut b/bin/ai/compat_1.5.nut index 5113c41b87..4acf361a2a 100644 --- a/bin/ai/compat_1.5.nut +++ b/bin/ai/compat_1.5.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.6 to 1.5. */ diff --git a/bin/ai/compat_1.6.nut b/bin/ai/compat_1.6.nut index c320c9db66..78030501e5 100644 --- a/bin/ai/compat_1.6.nut +++ b/bin/ai/compat_1.6.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.7 to 1.6. */ diff --git a/bin/ai/compat_1.7.nut b/bin/ai/compat_1.7.nut index 1e8814c5e2..b90667dbe6 100644 --- a/bin/ai/compat_1.7.nut +++ b/bin/ai/compat_1.7.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.8 to 1.7. */ diff --git a/bin/ai/compat_1.8.nut b/bin/ai/compat_1.8.nut index 5d7539f7d9..7d36a281bc 100644 --- a/bin/ai/compat_1.8.nut +++ b/bin/ai/compat_1.8.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.9 to 1.8. */ diff --git a/bin/ai/compat_1.9.nut b/bin/ai/compat_1.9.nut index 76da9d2c39..8d20646ed4 100644 --- a/bin/ai/compat_1.9.nut +++ b/bin/ai/compat_1.9.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.10 to 1.9. */ diff --git a/bin/ai/compat_12.nut b/bin/ai/compat_12.nut index 298d765228..904271ba5a 100644 --- a/bin/ai/compat_12.nut +++ b/bin/ai/compat_12.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 13 to 12. */ diff --git a/bin/ai/compat_13.nut b/bin/ai/compat_13.nut index a5e69f706a..1d54b81ddf 100644 --- a/bin/ai/compat_13.nut +++ b/bin/ai/compat_13.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 14 to 13. */ diff --git a/bin/ai/compat_14.nut b/bin/ai/compat_14.nut index 721278c24e..bd949af2aa 100644 --- a/bin/ai/compat_14.nut +++ b/bin/ai/compat_14.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 15 to 14. */ diff --git a/bin/game/compat_1.10.nut b/bin/game/compat_1.10.nut index d3dad84eb3..ad6953c637 100644 --- a/bin/game/compat_1.10.nut +++ b/bin/game/compat_1.10.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.11 to 1.10. */ diff --git a/bin/game/compat_1.11.nut b/bin/game/compat_1.11.nut index 471a2a402f..e6940e5383 100644 --- a/bin/game/compat_1.11.nut +++ b/bin/game/compat_1.11.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 12 to 1.11. */ diff --git a/bin/game/compat_1.2.nut b/bin/game/compat_1.2.nut index 23bf995eff..855cdea4a3 100644 --- a/bin/game/compat_1.2.nut +++ b/bin/game/compat_1.2.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.3 to 1.2. */ diff --git a/bin/game/compat_1.3.nut b/bin/game/compat_1.3.nut index 184a5f8a12..d8a5376843 100644 --- a/bin/game/compat_1.3.nut +++ b/bin/game/compat_1.3.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.4 to 1.3. */ diff --git a/bin/game/compat_1.4.nut b/bin/game/compat_1.4.nut index befc109e24..ed6736b3f3 100644 --- a/bin/game/compat_1.4.nut +++ b/bin/game/compat_1.4.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.5 to 1.4 */ diff --git a/bin/game/compat_1.5.nut b/bin/game/compat_1.5.nut index 5113c41b87..4acf361a2a 100644 --- a/bin/game/compat_1.5.nut +++ b/bin/game/compat_1.5.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.6 to 1.5. */ diff --git a/bin/game/compat_1.6.nut b/bin/game/compat_1.6.nut index c320c9db66..78030501e5 100644 --- a/bin/game/compat_1.6.nut +++ b/bin/game/compat_1.6.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.7 to 1.6. */ diff --git a/bin/game/compat_1.7.nut b/bin/game/compat_1.7.nut index 1e8814c5e2..b90667dbe6 100644 --- a/bin/game/compat_1.7.nut +++ b/bin/game/compat_1.7.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.8 to 1.7. */ diff --git a/bin/game/compat_1.8.nut b/bin/game/compat_1.8.nut index fc6021073a..7373f83351 100644 --- a/bin/game/compat_1.8.nut +++ b/bin/game/compat_1.8.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.9 to 1.8. */ diff --git a/bin/game/compat_1.9.nut b/bin/game/compat_1.9.nut index 76da9d2c39..8d20646ed4 100644 --- a/bin/game/compat_1.9.nut +++ b/bin/game/compat_1.9.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 1.10 to 1.9. */ diff --git a/bin/game/compat_12.nut b/bin/game/compat_12.nut index 46cb452443..468268b9eb 100644 --- a/bin/game/compat_12.nut +++ b/bin/game/compat_12.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 13 to 12. */ diff --git a/bin/game/compat_13.nut b/bin/game/compat_13.nut index a5e69f706a..1d54b81ddf 100644 --- a/bin/game/compat_13.nut +++ b/bin/game/compat_13.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 14 to 13. */ diff --git a/bin/game/compat_14.nut b/bin/game/compat_14.nut index 652f6724ca..9fb5d9b58d 100644 --- a/bin/game/compat_14.nut +++ b/bin/game/compat_14.nut @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* This file contains code to downgrade the API from 15 to 14. */ diff --git a/media/baseset/openttd/2ccmap.nfo b/media/baseset/openttd/2ccmap.nfo index 39f3fe4947..4a1e178471 100644 --- a/media/baseset/openttd/2ccmap.nfo +++ b/media/baseset/openttd/2ccmap.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // // This is the DOS 2CC translation map which OpenTTD translates if needed upon loading. // diff --git a/media/baseset/openttd/airport_preview.nfo b/media/baseset/openttd/airport_preview.nfo index 6efac6e910..fbcc7cf544 100644 --- a/media/baseset/openttd/airport_preview.nfo +++ b/media/baseset/openttd/airport_preview.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Airport previews" -1 * 0 05 16 09 diff --git a/media/baseset/openttd/airports.nfo b/media/baseset/openttd/airports.nfo index fc03f1d7f3..8fb9ef47f5 100644 --- a/media/baseset/openttd/airports.nfo +++ b/media/baseset/openttd/airports.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Extra airport graphics" -1 * 3 05 10 0F diff --git a/media/baseset/openttd/aqueduct.nfo b/media/baseset/openttd/aqueduct.nfo index 3f9bb97f3d..29c5921b02 100644 --- a/media/baseset/openttd/aqueduct.nfo +++ b/media/baseset/openttd/aqueduct.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Aqueduct graphics by Jonathan G. Rennison / PaulC" // temperate aqueduct diff --git a/media/baseset/openttd/autorail.nfo b/media/baseset/openttd/autorail.nfo index 9633064c8a..dcefeab2c0 100644 --- a/media/baseset/openttd/autorail.nfo +++ b/media/baseset/openttd/autorail.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Autorail graphics" -1 * 3 05 13 37 diff --git a/media/baseset/openttd/bridge_decks.nfo b/media/baseset/openttd/bridge_decks.nfo index b7edf0f143..b81e0c9d96 100644 --- a/media/baseset/openttd/bridge_decks.nfo +++ b/media/baseset/openttd/bridge_decks.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Bridge decks" -1 * 0 07 83 01 \7= 03 19 diff --git a/media/baseset/openttd/canals.nfo b/media/baseset/openttd/canals.nfo index 7bf8e5ae49..3377bd8e3f 100644 --- a/media/baseset/openttd/canals.nfo +++ b/media/baseset/openttd/canals.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Canal graphics by George" -1 * 3 05 08 41 diff --git a/media/baseset/openttd/chars.nfo b/media/baseset/openttd/chars.nfo index 43544a841b..588f6d6c5e 100644 --- a/media/baseset/openttd/chars.nfo +++ b/media/baseset/openttd/chars.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Font characters by PaulC, Bilbo and Jasper Vries" diff --git a/media/baseset/openttd/elrails.nfo b/media/baseset/openttd/elrails.nfo index 93456ecb30..ba68e6b6df 100644 --- a/media/baseset/openttd/elrails.nfo +++ b/media/baseset/openttd/elrails.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Electrified rail by Michael Blunck" -1 * 3 05 05 30 diff --git a/media/baseset/openttd/foundations.nfo b/media/baseset/openttd/foundations.nfo index 7cb4e5e400..cfedc2a6cb 100644 --- a/media/baseset/openttd/foundations.nfo +++ b/media/baseset/openttd/foundations.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Foundations. Non-halftile ones by Marcin Grzegorczyk" -1 * 6 07 83 01 \7! 00 5B diff --git a/media/baseset/openttd/mono.nfo b/media/baseset/openttd/mono.nfo index e17b6aae14..7be2d4c10e 100644 --- a/media/baseset/openttd/mono.nfo +++ b/media/baseset/openttd/mono.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Monospaced characters (Liberation Mono)" -1 * 0 12 01 03 60 20 00 diff --git a/media/baseset/openttd/oneway.nfo b/media/baseset/openttd/oneway.nfo index 56d2e2809a..a48b55efd3 100644 --- a/media/baseset/openttd/oneway.nfo +++ b/media/baseset/openttd/oneway.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "One way road graphics" -1 * 3 05 09 12 diff --git a/media/baseset/openttd/openttd.nfo b/media/baseset/openttd/openttd.nfo index 862345d11e..b42ba6afd2 100644 --- a/media/baseset/openttd/openttd.nfo +++ b/media/baseset/openttd/openttd.nfo @@ -5,7 +5,7 @@ // 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 . +// 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 . // // Sources for OpenTTD's required base graphics. // Checks whether the correct version of OpenTTD is used before diff --git a/media/baseset/openttd/openttdgui.nfo b/media/baseset/openttd/openttdgui.nfo index b6466f98b6..50acd318e2 100644 --- a/media/baseset/openttd/openttdgui.nfo +++ b/media/baseset/openttd/openttdgui.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "OpenTTD GUI graphics" -1 * 3 05 15 \b 192 // OPENTTD_SPRITE_COUNT diff --git a/media/baseset/openttd/overlay_rocks.nfo b/media/baseset/openttd/overlay_rocks.nfo index b5256b2bfe..d586b57443 100644 --- a/media/baseset/openttd/overlay_rocks.nfo +++ b/media/baseset/openttd/overlay_rocks.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Overlay rocks" -1 * 3 05 1A 5F diff --git a/media/baseset/openttd/palette.nfo b/media/baseset/openttd/palette.nfo index 2a5b8400fc..108e95e5be 100644 --- a/media/baseset/openttd/palette.nfo +++ b/media/baseset/openttd/palette.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "All black palette" diff --git a/media/baseset/openttd/road_waypoints.nfo b/media/baseset/openttd/road_waypoints.nfo index 4e7a27019b..8e8a0999b2 100644 --- a/media/baseset/openttd/road_waypoints.nfo +++ b/media/baseset/openttd/road_waypoints.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Road waypoints" diff --git a/media/baseset/openttd/roadstops.nfo b/media/baseset/openttd/roadstops.nfo index 15ede7027a..94b88b66a6 100644 --- a/media/baseset/openttd/roadstops.nfo +++ b/media/baseset/openttd/roadstops.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Road stop graphics" -1 * 3 05 11 08 diff --git a/media/baseset/openttd/signals.nfo b/media/baseset/openttd/signals.nfo index 8e612ae66c..e40befe73d 100644 --- a/media/baseset/openttd/signals.nfo +++ b/media/baseset/openttd/signals.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Pre-signal, semaphore, and PBS graphics by Michael Blunck" -1 * 3 05 04 F0 diff --git a/media/baseset/openttd/sloped_tracks.nfo b/media/baseset/openttd/sloped_tracks.nfo index 42c257d316..dc29d4bf51 100644 --- a/media/baseset/openttd/sloped_tracks.nfo +++ b/media/baseset/openttd/sloped_tracks.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Sloped tracks" -1 * 3 05 0F 0C diff --git a/media/baseset/openttd/tramtracks.nfo b/media/baseset/openttd/tramtracks.nfo index f9a190bd75..0879588b30 100644 --- a/media/baseset/openttd/tramtracks.nfo +++ b/media/baseset/openttd/tramtracks.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Tram track graphics by PikkaBird" -1 * 3 05 0B 77 diff --git a/media/baseset/openttd/tunnel_portals.nfo b/media/baseset/openttd/tunnel_portals.nfo index ce09308ef6..9588ce56c3 100644 --- a/media/baseset/openttd/tunnel_portals.nfo +++ b/media/baseset/openttd/tunnel_portals.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 63 0C "Tunnel portal overlays for railtypes by Snail (Jacopo Coletto)" diff --git a/media/baseset/orig_extra/airports_orig_extra.nfo b/media/baseset/orig_extra/airports_orig_extra.nfo index 2d649fbd10..f02eb81b5f 100644 --- a/media/baseset/orig_extra/airports_orig_extra.nfo +++ b/media/baseset/orig_extra/airports_orig_extra.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Climate specific airport sprite by PaulC" -1 * 0 07 83 01 \7! 03 02 diff --git a/media/baseset/orig_extra/canals_extra.nfo b/media/baseset/orig_extra/canals_extra.nfo index e412e2da47..14671f9093 100644 --- a/media/baseset/orig_extra/canals_extra.nfo +++ b/media/baseset/orig_extra/canals_extra.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Extra canal graphics by PaulC" diff --git a/media/baseset/orig_extra/chars_orig_extra.nfo b/media/baseset/orig_extra/chars_orig_extra.nfo index c5e3efe269..850a5d21f3 100644 --- a/media/baseset/orig_extra/chars_orig_extra.nfo +++ b/media/baseset/orig_extra/chars_orig_extra.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Font characters by PaulC, Bilbo and Jasper Vries" diff --git a/media/baseset/orig_extra/fix_graphics.nfo b/media/baseset/orig_extra/fix_graphics.nfo index aaad79c0a9..94ecd33d34 100644 --- a/media/baseset/orig_extra/fix_graphics.nfo +++ b/media/baseset/orig_extra/fix_graphics.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Fix bugs in the original graphics. By Addi and PaulC." diff --git a/media/baseset/orig_extra/fix_gui_icons.nfo b/media/baseset/orig_extra/fix_gui_icons.nfo index 2fdb8880bd..13a0fcbf32 100644 --- a/media/baseset/orig_extra/fix_gui_icons.nfo +++ b/media/baseset/orig_extra/fix_gui_icons.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Fix alignment of button icons." diff --git a/media/baseset/orig_extra/orig_extra.nfo b/media/baseset/orig_extra/orig_extra.nfo index ad1c7b72fb..162b8be3ed 100644 --- a/media/baseset/orig_extra/orig_extra.nfo +++ b/media/baseset/orig_extra/orig_extra.nfo @@ -5,7 +5,7 @@ // 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 . +// 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 . // // Sources for extra graphics to complement the original graphics. // Checks whether the correct version of OpenTTD is used before diff --git a/media/baseset/orig_extra/rivers/arctic.nfo b/media/baseset/orig_extra/rivers/arctic.nfo index 375946fa5f..56f3773072 100644 --- a/media/baseset/orig_extra/rivers/arctic.nfo +++ b/media/baseset/orig_extra/rivers/arctic.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Arctic river graphics by andythenorth (Andrew Parkhouse)" -1 * 4 01 05 01 3C diff --git a/media/baseset/orig_extra/rivers/rapids.nfo b/media/baseset/orig_extra/rivers/rapids.nfo index b4ed88cd9e..6e9ba44681 100644 --- a/media/baseset/orig_extra/rivers/rapids.nfo +++ b/media/baseset/orig_extra/rivers/rapids.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Rapid graphics" -1 * 4 01 05 01 04 diff --git a/media/baseset/orig_extra/rivers/temperate.nfo b/media/baseset/orig_extra/rivers/temperate.nfo index 261f727be8..037aa0a52f 100644 --- a/media/baseset/orig_extra/rivers/temperate.nfo +++ b/media/baseset/orig_extra/rivers/temperate.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Temperate river graphics by andythenorth (Andrew Parkhouse)" -1 * 4 01 05 01 3C diff --git a/media/baseset/orig_extra/rivers/toyland.nfo b/media/baseset/orig_extra/rivers/toyland.nfo index 41d6ff5666..ee3396bdf4 100644 --- a/media/baseset/orig_extra/rivers/toyland.nfo +++ b/media/baseset/orig_extra/rivers/toyland.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Toyland river graphics by zephyris (Richard Wheeler)" -1 * 4 01 05 01 3C diff --git a/media/baseset/orig_extra/rivers/toyland_rapids.nfo b/media/baseset/orig_extra/rivers/toyland_rapids.nfo index fc61bcb239..541036bd28 100644 --- a/media/baseset/orig_extra/rivers/toyland_rapids.nfo +++ b/media/baseset/orig_extra/rivers/toyland_rapids.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Toyland rapid graphics by zephyris (Richard Wheeler)" -1 * 4 01 05 01 04 diff --git a/media/baseset/orig_extra/rivers/tropic.nfo b/media/baseset/orig_extra/rivers/tropic.nfo index 1041bff54c..8e4098cf2b 100644 --- a/media/baseset/orig_extra/rivers/tropic.nfo +++ b/media/baseset/orig_extra/rivers/tropic.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 0 0C "Tropic river graphics by andythenorth (Andrew Parkhouse)" -1 * 4 01 05 01 3C diff --git a/media/baseset/orig_extra/shore.nfo b/media/baseset/orig_extra/shore.nfo index 6dccb8487e..8a739c6fd6 100644 --- a/media/baseset/orig_extra/shore.nfo +++ b/media/baseset/orig_extra/shore.nfo @@ -1,7 +1,7 @@ // 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 . +// 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 . // -1 * 6 07 83 01 \7! 00 0C diff --git a/src/ai/ai.hpp b/src/ai/ai.hpp index 7a2d9fcb3d..5d11056029 100644 --- a/src/ai/ai.hpp +++ b/src/ai/ai.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai.hpp Base functions for all AIs. */ diff --git a/src/ai/ai_config.cpp b/src/ai/ai_config.cpp index e7b8f2a8b0..9fc94af387 100644 --- a/src/ai/ai_config.cpp +++ b/src/ai/ai_config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_config.cpp Implementation of AIConfig. */ diff --git a/src/ai/ai_config.hpp b/src/ai/ai_config.hpp index 6a3723fc85..9db75fd506 100644 --- a/src/ai/ai_config.hpp +++ b/src/ai/ai_config.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_config.hpp AIConfig stores the configuration settings of every AI. */ diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index 0283b38f66..4a8e01a27d 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_core.cpp Implementation of AI. */ diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index 4dd4a8c671..bdea793bef 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_gui.cpp %Window for configuring the AIs */ diff --git a/src/ai/ai_gui.hpp b/src/ai/ai_gui.hpp index 6eb28c3841..ad23656e27 100644 --- a/src/ai/ai_gui.hpp +++ b/src/ai/ai_gui.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_gui.hpp %Window for configuring the AIs */ diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index e2d71aec1e..3e8a1bcfed 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_info.cpp Implementation of AIInfo and AILibrary */ diff --git a/src/ai/ai_info.hpp b/src/ai/ai_info.hpp index 3928588114..88da5b1ca5 100644 --- a/src/ai/ai_info.hpp +++ b/src/ai/ai_info.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_info.hpp AIInfo keeps track of all information of an AI, like Author, Description, ... */ diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp index 03d0f89792..b22da6b668 100644 --- a/src/ai/ai_instance.cpp +++ b/src/ai/ai_instance.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_instance.cpp Implementation of AIInstance. */ diff --git a/src/ai/ai_instance.hpp b/src/ai/ai_instance.hpp index 015f966ed5..8da4e3f56f 100644 --- a/src/ai/ai_instance.hpp +++ b/src/ai/ai_instance.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_instance.hpp The AIInstance tracks an AI. */ diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index f4b0552684..d82573f658 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_scanner.cpp allows scanning AI scripts */ diff --git a/src/ai/ai_scanner.hpp b/src/ai/ai_scanner.hpp index 364e5642a9..f2a26227e7 100644 --- a/src/ai/ai_scanner.hpp +++ b/src/ai/ai_scanner.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_scanner.hpp declarations of the class for AI scanner */ diff --git a/src/aircraft.h b/src/aircraft.h index d3b9336f1f..002fa48a23 100644 --- a/src/aircraft.h +++ b/src/aircraft.h @@ -2,7 +2,7 @@ * 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 . + * 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 aircraft.h Base for aircraft. */ diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index eea0879dc0..94c930ebae 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/aircraft_cmd.h b/src/aircraft_cmd.h index 7f8c372cff..d17f802c54 100644 --- a/src/aircraft_cmd.h +++ b/src/aircraft_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 aircraft_cmd.h Command definitions related to aircraft. */ diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp index 3709dfb721..f56da5ac3b 100644 --- a/src/aircraft_gui.cpp +++ b/src/aircraft_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 aircraft_gui.cpp The GUI of aircraft. */ diff --git a/src/airport.cpp b/src/airport.cpp index 1f40a2a9d6..573e0988f4 100644 --- a/src/airport.cpp +++ b/src/airport.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 airport.cpp Functions related to airports. */ diff --git a/src/airport.h b/src/airport.h index 224a9e92ae..027aca5453 100644 --- a/src/airport.h +++ b/src/airport.h @@ -2,7 +2,7 @@ * 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 . + * 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 airport.h Various declarations for airports */ diff --git a/src/airport_cmd.h b/src/airport_cmd.h index 2e27057d8c..7763342f48 100644 --- a/src/airport_cmd.h +++ b/src/airport_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 airport_cmd.h Command definitions related to airports. */ diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index b0bdd7cbb8..948fd06ed7 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 airport_gui.cpp The GUI for airports. */ diff --git a/src/animated_tile.cpp b/src/animated_tile.cpp index 6705e83dca..c5d74b5c3d 100644 --- a/src/animated_tile.cpp +++ b/src/animated_tile.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 animated_tile.cpp Everything related to animated tiles. */ diff --git a/src/animated_tile_func.h b/src/animated_tile_func.h index 95fedbb038..47b324c9ba 100644 --- a/src/animated_tile_func.h +++ b/src/animated_tile_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 animated_tile_func.h %Tile animation! */ diff --git a/src/animated_tile_map.h b/src/animated_tile_map.h index 4103a948e4..2cc6907bb4 100644 --- a/src/animated_tile_map.h +++ b/src/animated_tile_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 animated_tile_map.h Maps accessors for animated tiles. */ diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 08c3c4416c..64bc1a333f 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 articulated_vehicles.cpp Implementation of articulated vehicles. */ diff --git a/src/articulated_vehicles.h b/src/articulated_vehicles.h index 54d2a78f0a..8eb5cbc9e1 100644 --- a/src/articulated_vehicles.h +++ b/src/articulated_vehicles.h @@ -2,7 +2,7 @@ * 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 . + * 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 articulated_vehicles.h Functions related to articulated vehicles. */ diff --git a/src/autocompletion.cpp b/src/autocompletion.cpp index e8d36406f3..5356d556db 100644 --- a/src/autocompletion.cpp +++ b/src/autocompletion.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 autocompletion.cpp Generic auto-completion engine. */ diff --git a/src/autocompletion.h b/src/autocompletion.h index 03c08f5c77..2971a87ee3 100644 --- a/src/autocompletion.h +++ b/src/autocompletion.h @@ -2,7 +2,7 @@ * 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 . + * 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 autocompletion.h Generic auto-completion engine. */ diff --git a/src/autoreplace.cpp b/src/autoreplace.cpp index cca3be399d..e4ad64815f 100644 --- a/src/autoreplace.cpp +++ b/src/autoreplace.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace.cpp Management of replacement lists. */ diff --git a/src/autoreplace_base.h b/src/autoreplace_base.h index 07fc1a6a70..50bdc9c8b9 100644 --- a/src/autoreplace_base.h +++ b/src/autoreplace_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_base.h Base class for autoreplaces/autorenews. */ diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 454450c642..5b675be55d 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_cmd.cpp Deals with autoreplace execution but not the setup */ diff --git a/src/autoreplace_cmd.h b/src/autoreplace_cmd.h index df4c268255..994f766cf4 100644 --- a/src/autoreplace_cmd.h +++ b/src/autoreplace_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_cmd.h Command definitions related to autoreplace. */ diff --git a/src/autoreplace_func.h b/src/autoreplace_func.h index 3c332ed9bd..fb96adc5da 100644 --- a/src/autoreplace_func.h +++ b/src/autoreplace_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_func.h Functions related to autoreplacing. */ diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index d38708ce6b..c302ee9bd7 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_gui.cpp GUI for autoreplace handling. */ diff --git a/src/autoreplace_gui.h b/src/autoreplace_gui.h index 634629ec4c..8264efb9b1 100644 --- a/src/autoreplace_gui.h +++ b/src/autoreplace_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_gui.h Functions related to the autoreplace GUIs*/ diff --git a/src/autoreplace_type.h b/src/autoreplace_type.h index 458ee571b7..de3d1bfee7 100644 --- a/src/autoreplace_type.h +++ b/src/autoreplace_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_type.h Types related to autoreplacing. */ diff --git a/src/autoslope.h b/src/autoslope.h index 1c66604425..3c15c5794d 100644 --- a/src/autoslope.h +++ b/src/autoslope.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoslope.h Functions related to autoslope. */ diff --git a/src/base_consist.cpp b/src/base_consist.cpp index 3374619ca7..dcda4b4b19 100644 --- a/src/base_consist.cpp +++ b/src/base_consist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 base_consist.cpp Properties for front vehicles/consists. */ diff --git a/src/base_consist.h b/src/base_consist.h index 0c488a10bd..17637bce6f 100644 --- a/src/base_consist.h +++ b/src/base_consist.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_consist.h Properties for front vehicles/consists. */ diff --git a/src/base_media_base.h b/src/base_media_base.h index 6286455b2d..edb3fe1d5c 100644 --- a/src/base_media_base.h +++ b/src/base_media_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_media_base.h Generic functions for replacing base data (graphics, sounds). */ diff --git a/src/base_media_func.h b/src/base_media_func.h index d5a96bcc93..4ffa4615d5 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/base_media_graphics.h b/src/base_media_graphics.h index 7340cc1ee9..b455d180a3 100644 --- a/src/base_media_graphics.h +++ b/src/base_media_graphics.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_media_graphics.h Generic functions for replacing base graphics data. */ diff --git a/src/base_media_music.h b/src/base_media_music.h index 9907ca4ecd..4aed1832f5 100644 --- a/src/base_media_music.h +++ b/src/base_media_music.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_media_music.h Generic functions for replacing base music data. */ diff --git a/src/base_media_sounds.h b/src/base_media_sounds.h index d7a5cd0ffa..45baaf0dc1 100644 --- a/src/base_media_sounds.h +++ b/src/base_media_sounds.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_media_sounds.h Generic functions for replacing base sounds data. */ diff --git a/src/base_station_base.h b/src/base_station_base.h index 229c7f90aa..75bdfb5471 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 base_station_base.h Base classes/functions for base stations. */ diff --git a/src/bitmap_type.h b/src/bitmap_type.h index acf3b3d22b..227e5fd9e1 100644 --- a/src/bitmap_type.h +++ b/src/bitmap_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 bitmap_type.hpp Bitmap functions. */ diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp index 797b0db738..c633d3af04 100644 --- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim.cpp Implementation of the optimized 32 bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_anim.hpp b/src/blitter/32bpp_anim.hpp index b8b89e6106..e96eb1c92c 100644 --- a/src/blitter/32bpp_anim.hpp +++ b/src/blitter/32bpp_anim.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim.hpp A 32 bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_anim_sse2.cpp b/src/blitter/32bpp_anim_sse2.cpp index 14e9856a53..a2aea4ad85 100644 --- a/src/blitter/32bpp_anim_sse2.cpp +++ b/src/blitter/32bpp_anim_sse2.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim.cpp Implementation of a partially SSSE2 32bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_anim_sse2.hpp b/src/blitter/32bpp_anim_sse2.hpp index 623bf2bd5d..89dd5806d8 100644 --- a/src/blitter/32bpp_anim_sse2.hpp +++ b/src/blitter/32bpp_anim_sse2.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim.hpp A partially SSE2 32 bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp index 4ed29b33c1..79e99c2aec 100644 --- a/src/blitter/32bpp_anim_sse4.cpp +++ b/src/blitter/32bpp_anim_sse4.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim_sse4.cpp Implementation of the SSE4 32 bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_anim_sse4.hpp b/src/blitter/32bpp_anim_sse4.hpp index c325fb806c..cd564f3d7e 100644 --- a/src/blitter/32bpp_anim_sse4.hpp +++ b/src/blitter/32bpp_anim_sse4.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_anim_sse4.hpp A SSE4 32 bpp blitter with animation support. */ diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp index fdf780b982..214aade0ef 100644 --- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_base.cpp Implementation of base for 32 bpp blitters. */ diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp index 4b7e8c7c5b..9b4d1e63b4 100644 --- a/src/blitter/32bpp_base.hpp +++ b/src/blitter/32bpp_base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_base.hpp Base for all 32 bits blitters. */ diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 7667597636..3fc7270d11 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_optimized.cpp Implementation of the optimized 32 bpp blitter. */ diff --git a/src/blitter/32bpp_optimized.hpp b/src/blitter/32bpp_optimized.hpp index c1a8a37cd2..c44a342123 100644 --- a/src/blitter/32bpp_optimized.hpp +++ b/src/blitter/32bpp_optimized.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_optimized.hpp Optimized 32 bpp blitter. */ diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp index d3fe2f98ca..59aa72698d 100644 --- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_simple.cpp Implementation of the simple 32 bpp blitter. */ diff --git a/src/blitter/32bpp_simple.hpp b/src/blitter/32bpp_simple.hpp index 4bacba345f..8c3ed2fb58 100644 --- a/src/blitter/32bpp_simple.hpp +++ b/src/blitter/32bpp_simple.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_simple.hpp Simple 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse2.cpp b/src/blitter/32bpp_sse2.cpp index 791952a095..28021196cc 100644 --- a/src/blitter/32bpp_sse2.cpp +++ b/src/blitter/32bpp_sse2.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse2.cpp Implementation of the SSE2 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse2.hpp b/src/blitter/32bpp_sse2.hpp index 383ef41c39..a1f5c15e9d 100644 --- a/src/blitter/32bpp_sse2.hpp +++ b/src/blitter/32bpp_sse2.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse2.hpp SSE2 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse4.cpp b/src/blitter/32bpp_sse4.cpp index aab9edb65d..8459c5813c 100644 --- a/src/blitter/32bpp_sse4.cpp +++ b/src/blitter/32bpp_sse4.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse4.cpp Implementation of the SSE4 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse4.hpp b/src/blitter/32bpp_sse4.hpp index a46e624b02..33a31b8374 100644 --- a/src/blitter/32bpp_sse4.hpp +++ b/src/blitter/32bpp_sse4.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse4.hpp SSE4 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse_func.hpp b/src/blitter/32bpp_sse_func.hpp index bed92686cc..fd7e8b3f61 100644 --- a/src/blitter/32bpp_sse_func.hpp +++ b/src/blitter/32bpp_sse_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse_func.hpp Functions related to SSE 32 bpp blitter. */ diff --git a/src/blitter/32bpp_sse_type.h b/src/blitter/32bpp_sse_type.h index 78d05e67e3..01ba4a055d 100644 --- a/src/blitter/32bpp_sse_type.h +++ b/src/blitter/32bpp_sse_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_sse_type.h Types related to SSE 32 bpp blitter. */ diff --git a/src/blitter/32bpp_ssse3.cpp b/src/blitter/32bpp_ssse3.cpp index 7d38272c00..9a6afd794c 100644 --- a/src/blitter/32bpp_ssse3.cpp +++ b/src/blitter/32bpp_ssse3.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_ssse3.cpp Implementation of the SSSE3 32 bpp blitter. */ diff --git a/src/blitter/32bpp_ssse3.hpp b/src/blitter/32bpp_ssse3.hpp index 323b77d825..7ef9b2872a 100644 --- a/src/blitter/32bpp_ssse3.hpp +++ b/src/blitter/32bpp_ssse3.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 32bpp_ssse3.hpp SSSE3 32 bpp blitter. */ diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index 48f09c8c4d..37890d9bb1 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 40bpp_optimized.cpp Implementation of the optimized 40 bpp blitter. */ diff --git a/src/blitter/40bpp_anim.hpp b/src/blitter/40bpp_anim.hpp index 55e3a0664b..e14ac59f82 100644 --- a/src/blitter/40bpp_anim.hpp +++ b/src/blitter/40bpp_anim.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 40bpp_optimized.hpp Optimized 40 bpp blitter. */ diff --git a/src/blitter/8bpp_base.cpp b/src/blitter/8bpp_base.cpp index ae7858a17f..b32f98b8fe 100644 --- a/src/blitter/8bpp_base.cpp +++ b/src/blitter/8bpp_base.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_base.cpp Implementation of the base for all 8 bpp blitters. */ diff --git a/src/blitter/8bpp_base.hpp b/src/blitter/8bpp_base.hpp index 197b1f3a49..bfe4261294 100644 --- a/src/blitter/8bpp_base.hpp +++ b/src/blitter/8bpp_base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_base.hpp Base for all 8 bpp blitters. */ diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index 20947dc2fb..d1148b7018 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_optimized.cpp Implementation of the optimized 8 bpp blitter. */ diff --git a/src/blitter/8bpp_optimized.hpp b/src/blitter/8bpp_optimized.hpp index 240b6dbdd9..0804584c91 100644 --- a/src/blitter/8bpp_optimized.hpp +++ b/src/blitter/8bpp_optimized.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_optimized.hpp An optimized 8 bpp blitter. */ diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index 54cb9ee404..0274db4022 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_simple.cpp Implementation of the simple 8 bpp blitter. */ diff --git a/src/blitter/8bpp_simple.hpp b/src/blitter/8bpp_simple.hpp index 9398456737..9bebe3d066 100644 --- a/src/blitter/8bpp_simple.hpp +++ b/src/blitter/8bpp_simple.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 8bpp_simple.hpp Simple (and slow) 8 bpp blitter. */ diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp index 361cee3642..56fcf8e71e 100644 --- a/src/blitter/base.hpp +++ b/src/blitter/base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 base.hpp Base for all blitters. */ diff --git a/src/blitter/common.hpp b/src/blitter/common.hpp index db57f65fb6..76c01424e1 100644 --- a/src/blitter/common.hpp +++ b/src/blitter/common.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 common.hpp Common functionality for all blitter implementations. */ diff --git a/src/blitter/factory.hpp b/src/blitter/factory.hpp index a1dffdcd4a..b586d787ce 100644 --- a/src/blitter/factory.hpp +++ b/src/blitter/factory.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 factory.hpp Factory to 'query' all available blitters. */ diff --git a/src/blitter/null.cpp b/src/blitter/null.cpp index 41b8a719b1..25aeebe1fc 100644 --- a/src/blitter/null.cpp +++ b/src/blitter/null.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 null.cpp A blitter that doesn't blit. */ diff --git a/src/blitter/null.hpp b/src/blitter/null.hpp index 336cb7c770..631c38b97c 100644 --- a/src/blitter/null.hpp +++ b/src/blitter/null.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 null.hpp The blitter that doesn't blit. */ diff --git a/src/bmp.cpp b/src/bmp.cpp index 202dce7a39..62af690922 100644 --- a/src/bmp.cpp +++ b/src/bmp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bmp.cpp Read and write support for bmps. */ diff --git a/src/bmp.h b/src/bmp.h index 0e82aff004..8bce451631 100644 --- a/src/bmp.h +++ b/src/bmp.h @@ -2,7 +2,7 @@ * 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 . + * 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 bmp.h Read and write support for bmps. */ diff --git a/src/bootstrap_gui.cpp b/src/bootstrap_gui.cpp index 3dcdeae43a..3c62d3bd1c 100644 --- a/src/bootstrap_gui.cpp +++ b/src/bootstrap_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bootstrap_gui.cpp Barely used user interface for bootstrapping OpenTTD, i.e. downloading the required content. */ diff --git a/src/bridge.h b/src/bridge.h index 03485327f2..d012fe696a 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -2,7 +2,7 @@ * 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 . + * 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 bridge.h Header file for bridges */ diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index ca4cc5161c..5b708abd1d 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bridge_gui.cpp Graphical user interface for bridge construction */ diff --git a/src/bridge_map.cpp b/src/bridge_map.cpp index f5825bf504..33eed4b2f5 100644 --- a/src/bridge_map.cpp +++ b/src/bridge_map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bridge_map.cpp Map accessor functions for bridges. */ diff --git a/src/bridge_map.h b/src/bridge_map.h index 452e439329..dab1ec14e9 100644 --- a/src/bridge_map.h +++ b/src/bridge_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 bridge_map.h Map accessor functions for bridges. */ diff --git a/src/bridge_type.h b/src/bridge_type.h index 82b42b51d1..9359ee7b34 100644 --- a/src/bridge_type.h +++ b/src/bridge_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 bridge_type.h Header file for bridge types. */ diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 00cc734ee1..a2f185f85c 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 build_vehicle_gui.cpp GUI for building vehicles. */ diff --git a/src/cachecheck.cpp b/src/cachecheck.cpp index fb0872802b..75fb3319de 100644 --- a/src/cachecheck.cpp +++ b/src/cachecheck.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cachecheck.cpp Check caches. */ diff --git a/src/cargo_type.h b/src/cargo_type.h index 6957e8f286..2a17e9a2a3 100644 --- a/src/cargo_type.h +++ b/src/cargo_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargo_type.h Types related to cargoes... */ diff --git a/src/cargoaction.cpp b/src/cargoaction.cpp index b5ff2273d9..12a3c4dfa1 100644 --- a/src/cargoaction.cpp +++ b/src/cargoaction.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargoaction.cpp Implementation of cargo actions. */ diff --git a/src/cargoaction.h b/src/cargoaction.h index 3a886381c3..16b9b65861 100644 --- a/src/cargoaction.h +++ b/src/cargoaction.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargoaction.h Actions to be applied to cargo packets. */ diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp index 046e0b2e0b..291da983bc 100644 --- a/src/cargomonitor.cpp +++ b/src/cargomonitor.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargomonitor.cpp Implementation of the cargo transport monitoring. */ diff --git a/src/cargomonitor.h b/src/cargomonitor.h index 8d015f024e..3da6257a0a 100644 --- a/src/cargomonitor.h +++ b/src/cargomonitor.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargomonitor.h Cargo transport monitoring declarations. */ diff --git a/src/cargopacket.cpp b/src/cargopacket.cpp index c0436e96c0..2fbd3f2f29 100644 --- a/src/cargopacket.cpp +++ b/src/cargopacket.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargopacket.cpp Implementation of the cargo packets. */ diff --git a/src/cargopacket.h b/src/cargopacket.h index 5b7842e939..39174cdb95 100644 --- a/src/cargopacket.h +++ b/src/cargopacket.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargopacket.h Base class for cargo packets. */ diff --git a/src/cargotype.cpp b/src/cargotype.cpp index f65e6f9186..2ed881223f 100644 --- a/src/cargotype.cpp +++ b/src/cargotype.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargotype.cpp Implementation of cargoes. */ diff --git a/src/cargotype.h b/src/cargotype.h index 444f1f5b76..945bc9bd4e 100644 --- a/src/cargotype.h +++ b/src/cargotype.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargotype.h Types/functions related to cargoes. */ diff --git a/src/cheat.cpp b/src/cheat.cpp index 71546382de..675c580287 100644 --- a/src/cheat.cpp +++ b/src/cheat.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cheat.cpp Handling (loading/saving/initializing) of cheats. */ diff --git a/src/cheat_func.h b/src/cheat_func.h index 8585a589e2..95248d796f 100644 --- a/src/cheat_func.h +++ b/src/cheat_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_func.h Functions related to cheating. */ diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index d35df796da..61df946d7d 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_gui.cpp GUI related to cheating. */ diff --git a/src/cheat_type.h b/src/cheat_type.h index a13cab7eb2..dc9926e313 100644 --- a/src/cheat_type.h +++ b/src/cheat_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_type.h Types related to cheating. */ diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 89ec6a34cc..f86e67e032 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 clear_cmd.cpp Commands related to clear tiles. */ diff --git a/src/clear_func.h b/src/clear_func.h index 28fd7d4a85..3a3fddcf08 100644 --- a/src/clear_func.h +++ b/src/clear_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 clear_func.h Functions related to clear (MP_CLEAR) land. */ diff --git a/src/clear_map.h b/src/clear_map.h index 6f24800f99..06a386c2ca 100644 --- a/src/clear_map.h +++ b/src/clear_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 clear_map.h Map accessors for 'clear' tiles */ diff --git a/src/command.cpp b/src/command.cpp index 2cdc9ed3ad..ce4a9482c9 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 command.cpp Handling of commands. */ diff --git a/src/command_func.h b/src/command_func.h index cb3ba95610..ab102c0811 100644 --- a/src/command_func.h +++ b/src/command_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 command_func.h Functions related to commands. */ diff --git a/src/command_type.h b/src/command_type.h index 6445913bc6..d77274cfeb 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 command_type.h Types related to commands. */ diff --git a/src/company_base.h b/src/company_base.h index c77f642389..2896c8be3a 100644 --- a/src/company_base.h +++ b/src/company_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_base.h Definition of stuff that is very close to a company, like the company struct itself. */ diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index dd744314e8..501cee2a4a 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 company_cmd.cpp Handling of companies. */ diff --git a/src/company_cmd.h b/src/company_cmd.h index a18af2f8cb..fd763c10b8 100644 --- a/src/company_cmd.h +++ b/src/company_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_cmd.h Command definitions related to companies. */ diff --git a/src/company_func.h b/src/company_func.h index 3a68556f37..e0e13f8613 100644 --- a/src/company_func.h +++ b/src/company_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_func.h Functions related to companies. */ diff --git a/src/company_gui.cpp b/src/company_gui.cpp index ca56d03a36..5063110da5 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 company_gui.cpp %Company related GUIs. */ diff --git a/src/company_gui.h b/src/company_gui.h index f6149b05fb..6a90f0b375 100644 --- a/src/company_gui.h +++ b/src/company_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_gui.h GUI Functions related to companies. */ diff --git a/src/company_manager_face.h b/src/company_manager_face.h index 663da09a11..53a6d24931 100644 --- a/src/company_manager_face.h +++ b/src/company_manager_face.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_manager_face.h Functionality related to the company manager's face */ diff --git a/src/company_type.h b/src/company_type.h index 8a81553020..74c99bf890 100644 --- a/src/company_type.h +++ b/src/company_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_type.h Types related to companies. */ diff --git a/src/console.cpp b/src/console.cpp index e94f2acb9d..814ec8b1c7 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 console.cpp Handling of the in-game console. */ diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 69ddd40c0d..b0c691dbd1 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 console_cmds.cpp Implementation of the console hooks. */ diff --git a/src/console_func.h b/src/console_func.h index 296f7fc7fa..f75ef18fc1 100644 --- a/src/console_func.h +++ b/src/console_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 console_func.h Console functions used outside of the console code. */ diff --git a/src/console_gui.cpp b/src/console_gui.cpp index 1dba122e92..bdeafc56cd 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 console_gui.cpp Handling the GUI of the in-game console. */ diff --git a/src/console_gui.h b/src/console_gui.h index 96a3a1a5d3..6416206249 100644 --- a/src/console_gui.h +++ b/src/console_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 console_gui.h GUI related functions in the console. */ diff --git a/src/console_internal.h b/src/console_internal.h index f9124b45fa..d17a7e24a7 100644 --- a/src/console_internal.h +++ b/src/console_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 console_internal.h Internally used functions for the console. */ diff --git a/src/console_type.h b/src/console_type.h index 705f58e5fe..2a00d2ffca 100644 --- a/src/console_type.h +++ b/src/console_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 console_type.h Globally used console related types. */ diff --git a/src/core/alloc_type.hpp b/src/core/alloc_type.hpp index 4ed7f2be4d..8f778e6c26 100644 --- a/src/core/alloc_type.hpp +++ b/src/core/alloc_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 alloc_type.hpp Helper types related to the allocation of memory */ diff --git a/src/core/backup_type.hpp b/src/core/backup_type.hpp index b6b5de558d..a8ea91fa7c 100644 --- a/src/core/backup_type.hpp +++ b/src/core/backup_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 backup_type.hpp Class for backupping variables and making sure they are restored later. */ diff --git a/src/core/base_bitset_type.hpp b/src/core/base_bitset_type.hpp index 3b50d4e033..91f401fab5 100644 --- a/src/core/base_bitset_type.hpp +++ b/src/core/base_bitset_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/bitmath_func.hpp b/src/core/bitmath_func.hpp index 4e9a2cd933..d698578c4f 100644 --- a/src/core/bitmath_func.hpp +++ b/src/core/bitmath_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 bitmath_func.hpp Functions related to bit mathematics. */ diff --git a/src/core/container_func.hpp b/src/core/container_func.hpp index 6b459cdd08..6d4ce3273c 100644 --- a/src/core/container_func.hpp +++ b/src/core/container_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 container_func.hpp Some simple functions to help with accessing containers. */ diff --git a/src/core/convertible_through_base.hpp b/src/core/convertible_through_base.hpp index 813b691341..60f40732cb 100644 --- a/src/core/convertible_through_base.hpp +++ b/src/core/convertible_through_base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 convertible_through_base.hpp Concept for unifying the convert through 'base()' behaviour of several 'strong' types. */ diff --git a/src/core/endian_func.hpp b/src/core/endian_func.hpp index c48c0f024b..9e737bbeff 100644 --- a/src/core/endian_func.hpp +++ b/src/core/endian_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 endian_func.hpp Function to handling different endian machines. */ diff --git a/src/core/enum_type.hpp b/src/core/enum_type.hpp index 6c30f7a39b..26a8078871 100644 --- a/src/core/enum_type.hpp +++ b/src/core/enum_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 enum_type.hpp Type (helpers) for enums */ diff --git a/src/core/flatset_type.hpp b/src/core/flatset_type.hpp index b69f1daebf..c3852771a1 100644 --- a/src/core/flatset_type.hpp +++ b/src/core/flatset_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 flatset_type.hpp Flat set container implementation. */ diff --git a/src/core/format.hpp b/src/core/format.hpp index f6454e73fb..ddec8771b3 100644 --- a/src/core/format.hpp +++ b/src/core/format.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 format.hpp String formatting functions and helpers. */ diff --git a/src/core/geometry_func.cpp b/src/core/geometry_func.cpp index dccef72ecc..b4912e1041 100644 --- a/src/core/geometry_func.cpp +++ b/src/core/geometry_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 geometry_func.cpp Geometry functions. */ diff --git a/src/core/geometry_func.hpp b/src/core/geometry_func.hpp index 58ebd316ab..186939cdfe 100644 --- a/src/core/geometry_func.hpp +++ b/src/core/geometry_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 geometry_func.hpp Geometry functions. */ diff --git a/src/core/geometry_type.hpp b/src/core/geometry_type.hpp index e46315899e..efab749d83 100644 --- a/src/core/geometry_type.hpp +++ b/src/core/geometry_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 geometry_type.hpp All geometry types in OpenTTD. */ diff --git a/src/core/kdtree.hpp b/src/core/kdtree.hpp index de9dc233cf..fe26bc3dca 100644 --- a/src/core/kdtree.hpp +++ b/src/core/kdtree.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 kdtree.hpp K-d tree template specialised for 2-dimensional Manhattan geometry */ diff --git a/src/core/math_func.cpp b/src/core/math_func.cpp index f094e9ece8..0e36de235e 100644 --- a/src/core/math_func.cpp +++ b/src/core/math_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 math_func.cpp Math functions. */ diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 3b9b406e02..954d0450e0 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 math_func.hpp Integer math functions */ diff --git a/src/core/multimap.hpp b/src/core/multimap.hpp index 50cd0a38a3..fce722787b 100644 --- a/src/core/multimap.hpp +++ b/src/core/multimap.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 multimap.hpp Multimap with deterministic ordering of items with equal keys. */ diff --git a/src/core/overflowsafe_type.hpp b/src/core/overflowsafe_type.hpp index 24e6718b8c..d13828a0f5 100644 --- a/src/core/overflowsafe_type.hpp +++ b/src/core/overflowsafe_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 overflowsafe_type.hpp An overflow safe integer-like type. */ diff --git a/src/core/pool_func.cpp b/src/core/pool_func.cpp index c021596a89..fd1109cfd2 100644 --- a/src/core/pool_func.cpp +++ b/src/core/pool_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 pool_func.cpp Implementation of PoolBase methods. */ diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp index 9e2567693a..9f6720110e 100644 --- a/src/core/pool_func.hpp +++ b/src/core/pool_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 pool_func.hpp Some methods of Pool are placed here in order to reduce compilation time and binary size. */ diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index bf16959bef..dd76abc3a5 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 pool_type.hpp Definition of Pool, structure used to access PoolItems, and PoolItem, base structure for Vehicle, Town, and other indexed items. */ diff --git a/src/core/random_func.cpp b/src/core/random_func.cpp index dcd32ef983..cbf8cc93ec 100644 --- a/src/core/random_func.cpp +++ b/src/core/random_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 random_func.cpp Implementation of the pseudo random generator. */ diff --git a/src/core/random_func.hpp b/src/core/random_func.hpp index d24c4e12d0..9a41f0f492 100644 --- a/src/core/random_func.hpp +++ b/src/core/random_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 random_func.hpp Pseudo random number generator. */ diff --git a/src/core/string_builder.cpp b/src/core/string_builder.cpp index 6ded799c30..aa9154690e 100644 --- a/src/core/string_builder.cpp +++ b/src/core/string_builder.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_builder.cpp Implementation of string composing. */ diff --git a/src/core/string_builder.hpp b/src/core/string_builder.hpp index 24247c0c4a..aad0bf880d 100644 --- a/src/core/string_builder.hpp +++ b/src/core/string_builder.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/string_consumer.cpp b/src/core/string_consumer.cpp index a9282a50c2..b65b725087 100644 --- a/src/core/string_consumer.cpp +++ b/src/core/string_consumer.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_consumer.cpp Implementation of string parsing. */ diff --git a/src/core/string_consumer.hpp b/src/core/string_consumer.hpp index 1201602ae1..b0f048f2fd 100644 --- a/src/core/string_consumer.hpp +++ b/src/core/string_consumer.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/string_inplace.cpp b/src/core/string_inplace.cpp index 1c3a5c8485..6533e2f4c1 100644 --- a/src/core/string_inplace.cpp +++ b/src/core/string_inplace.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/string_inplace.hpp b/src/core/string_inplace.hpp index 5b97735291..f74c8bc892 100644 --- a/src/core/string_inplace.hpp +++ b/src/core/string_inplace.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/strong_typedef_type.hpp b/src/core/strong_typedef_type.hpp index e818228d50..222b0f8933 100644 --- a/src/core/strong_typedef_type.hpp +++ b/src/core/strong_typedef_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 strong_typedef_type.hpp Type (helpers) for making a strong typedef that is a distinct type. */ diff --git a/src/core/utf8.cpp b/src/core/utf8.cpp index 8a4157bfd5..5bb9effe07 100644 --- a/src/core/utf8.cpp +++ b/src/core/utf8.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/core/utf8.hpp b/src/core/utf8.hpp index 26e6305ba9..999376d905 100644 --- a/src/core/utf8.hpp +++ b/src/core/utf8.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/cpu.cpp b/src/cpu.cpp index f1b498b6c1..bf26246458 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cpu.cpp OS/CPU/compiler dependent CPU specific calls. */ diff --git a/src/cpu.h b/src/cpu.h index 116ec8b0ea..7682132c22 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -2,7 +2,7 @@ * 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 . + * 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 cpu.h Functions related to CPU specific instructions. */ diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 815c31e32e..f214a3423f 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 crashlog.cpp Implementation of generic function to be called to log a crash */ diff --git a/src/crashlog.h b/src/crashlog.h index 4dbc2ebce0..15ab3455d4 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -2,7 +2,7 @@ * 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 . + * 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 crashlog.h Functions to be called to log a crash */ diff --git a/src/currency.cpp b/src/currency.cpp index fc71a6c337..bab4e10209 100644 --- a/src/currency.cpp +++ b/src/currency.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 currency.cpp Support for different currencies. */ diff --git a/src/currency.h b/src/currency.h index a1f2a76268..88488160b1 100644 --- a/src/currency.h +++ b/src/currency.h @@ -2,7 +2,7 @@ * 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 . + * 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 currency.h Functions to handle different currencies. */ diff --git a/src/date_gui.cpp b/src/date_gui.cpp index 81dbbd5ffc..0ca74f16a1 100644 --- a/src/date_gui.cpp +++ b/src/date_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 date_gui.cpp Graphical selection of a date. */ diff --git a/src/date_gui.h b/src/date_gui.h index 8434f4cfd1..71643e5a94 100644 --- a/src/date_gui.h +++ b/src/date_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 date_gui.h Functions related to the graphical selection of a date. */ diff --git a/src/debug.cpp b/src/debug.cpp index 9d9f28db64..6d1e2aae2b 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 debug.cpp Handling of printing debug messages. */ diff --git a/src/debug.h b/src/debug.h index 161d4a3922..18055d94c3 100644 --- a/src/debug.h +++ b/src/debug.h @@ -2,7 +2,7 @@ * 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 . + * 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 debug.h Functions related to debugging. */ diff --git a/src/dedicated.cpp b/src/dedicated.cpp index 1e5ad657df..cb63acd339 100644 --- a/src/dedicated.cpp +++ b/src/dedicated.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dedicated.cpp Forking support for dedicated servers. */ diff --git a/src/depot.cpp b/src/depot.cpp index 16656ae300..a69be5fe59 100644 --- a/src/depot.cpp +++ b/src/depot.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 depot.cpp Handling of depots. */ diff --git a/src/depot_base.h b/src/depot_base.h index ededafae02..acf5fee791 100644 --- a/src/depot_base.h +++ b/src/depot_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_base.h Base for all depots (except hangars) */ diff --git a/src/depot_cmd.cpp b/src/depot_cmd.cpp index 29277df88c..7d09a2bfca 100644 --- a/src/depot_cmd.cpp +++ b/src/depot_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 depot_cmd.cpp %Command Handling for depots. */ diff --git a/src/depot_cmd.h b/src/depot_cmd.h index 69f558f6c5..361d9efb0f 100644 --- a/src/depot_cmd.h +++ b/src/depot_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_cmd.h Command definitions related to depots. */ diff --git a/src/depot_func.h b/src/depot_func.h index 208e02110c..26ed75a375 100644 --- a/src/depot_func.h +++ b/src/depot_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_func.h Functions related to depots. */ diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index bfec17d9aa..6d1bf1a509 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 depot_gui.cpp The GUI for depots. */ diff --git a/src/depot_map.h b/src/depot_map.h index 793047ada2..3bb86ec940 100644 --- a/src/depot_map.h +++ b/src/depot_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_map.h Map related accessors for depots. */ diff --git a/src/depot_type.h b/src/depot_type.h index c99e732ae4..ddd42fce6e 100644 --- a/src/depot_type.h +++ b/src/depot_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_type.h Header files for depots (not hangars) */ diff --git a/src/direction_func.h b/src/direction_func.h index 79132fbaf8..03f461cdcb 100644 --- a/src/direction_func.h +++ b/src/direction_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 direction_func.h Different functions related to conversions between directions. */ diff --git a/src/direction_type.h b/src/direction_type.h index 6d220afa2b..e1775647ac 100644 --- a/src/direction_type.h +++ b/src/direction_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 direction_type.h Different types to 'show' directions. */ diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index 8f3cd135c4..7d67e023e4 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/disaster_vehicle.h b/src/disaster_vehicle.h index 4aa0f83581..bf0cce2c1a 100644 --- a/src/disaster_vehicle.h +++ b/src/disaster_vehicle.h @@ -2,7 +2,7 @@ * 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 . + * 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 disaster_vehicle.h All disaster vehicles. */ diff --git a/src/dock_cmd.h b/src/dock_cmd.h index d1c1324707..a315065349 100644 --- a/src/dock_cmd.h +++ b/src/dock_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 dock_cmd.h Command definitions related to docks. */ diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index 01c72e6255..c2d9f46ec4 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dock_gui.cpp GUI to create amazing water objects. */ diff --git a/src/driver.cpp b/src/driver.cpp index 10b0f890b4..2f6027726a 100644 --- a/src/driver.cpp +++ b/src/driver.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 driver.cpp Base for all driver handling. */ diff --git a/src/driver.h b/src/driver.h index 2850a34ce3..2444be0901 100644 --- a/src/driver.h +++ b/src/driver.h @@ -2,7 +2,7 @@ * 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 . + * 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 driver.h Base for all drivers (video, sound, music, etc). */ diff --git a/src/dropdown.cpp b/src/dropdown.cpp index 540b623a47..40c47a0fd5 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dropdown.cpp Implementation of the dropdown widget. */ diff --git a/src/dropdown_common_type.h b/src/dropdown_common_type.h index dac1500d46..98939adc21 100644 --- a/src/dropdown_common_type.h +++ b/src/dropdown_common_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 dropdown_common_type.h Common drop down list components. */ diff --git a/src/dropdown_func.h b/src/dropdown_func.h index 7d72c01fbf..e8cee87247 100644 --- a/src/dropdown_func.h +++ b/src/dropdown_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 dropdown_func.h Functions related to the drop down widget. */ diff --git a/src/dropdown_type.h b/src/dropdown_type.h index 9afc546aa4..a2f495e237 100644 --- a/src/dropdown_type.h +++ b/src/dropdown_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 dropdown_type.h Types related to the drop down widget. */ diff --git a/src/economy.cpp b/src/economy.cpp index 69cf062bf9..125bb4e00b 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 economy.cpp Handling of the economy. */ diff --git a/src/economy_base.h b/src/economy_base.h index 4f9c9dc945..7d29634cfc 100644 --- a/src/economy_base.h +++ b/src/economy_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 economy_base.h Base classes related to the economy. */ diff --git a/src/economy_cmd.h b/src/economy_cmd.h index 37aa5eb38e..4757e08043 100644 --- a/src/economy_cmd.h +++ b/src/economy_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 economy_cmd.h Command definitions related to the economy. */ diff --git a/src/economy_func.h b/src/economy_func.h index e199af3c90..d92e08fc29 100644 --- a/src/economy_func.h +++ b/src/economy_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 economy_func.h Functions related to the economy. */ diff --git a/src/economy_type.h b/src/economy_type.h index 947e6e0ce2..ca0579bd1c 100644 --- a/src/economy_type.h +++ b/src/economy_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 economy_type.h Types related to the economy. */ diff --git a/src/effectvehicle.cpp b/src/effectvehicle.cpp index 58a6c963dd..58507eb541 100644 --- a/src/effectvehicle.cpp +++ b/src/effectvehicle.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 effectvehicle.cpp Implementation of everything generic to vehicles. */ diff --git a/src/effectvehicle_base.h b/src/effectvehicle_base.h index c73920eadc..3504b8c123 100644 --- a/src/effectvehicle_base.h +++ b/src/effectvehicle_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 effectvehicle_base.h Base class for all effect vehicles. */ diff --git a/src/effectvehicle_func.h b/src/effectvehicle_func.h index abd4543c33..1da7376488 100644 --- a/src/effectvehicle_func.h +++ b/src/effectvehicle_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 effectvehicle_func.h Functions related to effect vehicles. */ diff --git a/src/elrail.cpp b/src/elrail.cpp index 1b7f9feb9a..a776d36eeb 100644 --- a/src/elrail.cpp +++ b/src/elrail.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/elrail_func.h b/src/elrail_func.h index ec42c4cc61..ac5ef1939d 100644 --- a/src/elrail_func.h +++ b/src/elrail_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 elrail_func.h header file for electrified rail specific functions */ diff --git a/src/engine.cpp b/src/engine.cpp index 15f0cfa5e9..226ccd2f8f 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 engine.cpp Base for all engine handling. */ diff --git a/src/engine_base.h b/src/engine_base.h index d8e6052524..a213785367 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_base.h Base class for engines. */ diff --git a/src/engine_cmd.h b/src/engine_cmd.h index 153a5055e1..863150529a 100644 --- a/src/engine_cmd.h +++ b/src/engine_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_cmd.h Command definitions related to engines. */ diff --git a/src/engine_func.h b/src/engine_func.h index 533d13acfa..e736db611f 100644 --- a/src/engine_func.h +++ b/src/engine_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_func.h Functions related to engines. */ diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 43389f9747..dcf3955a96 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 engine_gui.cpp GUI to show engine related information. */ diff --git a/src/engine_gui.h b/src/engine_gui.h index 12d0d04d7a..861fa795e7 100644 --- a/src/engine_gui.h +++ b/src/engine_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_gui.h %Engine GUI functions, used by build_vehicle_gui and autoreplace_gui */ diff --git a/src/engine_type.h b/src/engine_type.h index 2db0b9d23e..5f7cdc715d 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_type.h Types related to engines. */ diff --git a/src/error.cpp b/src/error.cpp index 9258b46039..6b58b28726 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 error.cpp Reporting of errors. */ diff --git a/src/error.h b/src/error.h index 720677a85c..b3949719bb 100644 --- a/src/error.h +++ b/src/error.h @@ -2,7 +2,7 @@ * 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 . + * 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 error.h Functions related to errors. */ diff --git a/src/error_func.h b/src/error_func.h index 0f5c9c1d66..0779b68c38 100644 --- a/src/error_func.h +++ b/src/error_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 error_func.h Error reporting related functions. */ diff --git a/src/error_gui.cpp b/src/error_gui.cpp index 7fe4cc6f12..6efbf1ff55 100644 --- a/src/error_gui.cpp +++ b/src/error_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 error_gui.cpp GUI related to errors. */ diff --git a/src/fileio.cpp b/src/fileio.cpp index da9ae826ab..51b333337c 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 fileio.cpp Standard In/Out file operations */ diff --git a/src/fileio_func.h b/src/fileio_func.h index 36776ed992..a48d3d11a4 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 fileio_func.h Functions for Standard In/Out file operations */ diff --git a/src/fileio_type.h b/src/fileio_type.h index ab1fee9c9c..c3b0a4ce08 100644 --- a/src/fileio_type.h +++ b/src/fileio_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 fileio_type.h Types for Standard In/Out file operations */ diff --git a/src/fios.cpp b/src/fios.cpp index 67eec48b44..8b97c719a5 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/fios.h b/src/fios.h index 0da3311f7b..e9501f5bce 100644 --- a/src/fios.h +++ b/src/fios.h @@ -2,7 +2,7 @@ * 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 . + * 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 fios.h Declarations for savegames operations */ diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index a4d593dbcf..bb304ad3a4 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 fios_gui.cpp GUIs for loading/saving games, scenarios, heightmaps, ... */ diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 8f380f71e0..5c999a29f1 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 fontcache.cpp Cache for characters from fonts. */ diff --git a/src/fontcache.h b/src/fontcache.h index 98da64d00f..1bdd96e8e5 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -2,7 +2,7 @@ * 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 . + * 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 fontcache.h Functions to read fonts from files and cache them. */ diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 33500d787a..33218c243e 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 freetypefontcache.cpp FreeType font cache implementation. */ diff --git a/src/fontcache/spritefontcache.cpp b/src/fontcache/spritefontcache.cpp index c20aa68445..8a4e745156 100644 --- a/src/fontcache/spritefontcache.cpp +++ b/src/fontcache/spritefontcache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 spritefontcache.cpp Sprite fontcache implementation. */ diff --git a/src/fontcache/spritefontcache.h b/src/fontcache/spritefontcache.h index 183e31e7dc..d1b5ef3e77 100644 --- a/src/fontcache/spritefontcache.h +++ b/src/fontcache/spritefontcache.h @@ -2,7 +2,7 @@ * 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 . + * 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 spritefontcache.h Sprite font cache implementation definition. */ diff --git a/src/fontcache/truetypefontcache.cpp b/src/fontcache/truetypefontcache.cpp index fe0a358c69..4a2659e76f 100644 --- a/src/fontcache/truetypefontcache.cpp +++ b/src/fontcache/truetypefontcache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 truetypefontcache.cpp Common base implementation for font file based font caches. */ diff --git a/src/fontcache/truetypefontcache.h b/src/fontcache/truetypefontcache.h index 7714823305..b9a58c6326 100644 --- a/src/fontcache/truetypefontcache.h +++ b/src/fontcache/truetypefontcache.h @@ -2,7 +2,7 @@ * 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 . + * 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 truetypefontcache.h Common base definition for font file based font caches. */ diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index df390d2822..c1de3c5c36 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 framerate_gui.cpp GUI for displaying framerate/game speed information. */ diff --git a/src/framerate_type.h b/src/framerate_type.h index 8530fc9072..c8955347a5 100644 --- a/src/framerate_type.h +++ b/src/framerate_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 framerate_type.h diff --git a/src/game/game.hpp b/src/game/game.hpp index e4931712a3..fcdff38fcb 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game.hpp Base functions for all Games. */ diff --git a/src/game/game_config.cpp b/src/game/game_config.cpp index 063bc0af08..0085e6a8e5 100644 --- a/src/game/game_config.cpp +++ b/src/game/game_config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_config.cpp Implementation of GameConfig. */ diff --git a/src/game/game_config.hpp b/src/game/game_config.hpp index 9aa6ea994c..84c24149b6 100644 --- a/src/game/game_config.hpp +++ b/src/game/game_config.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_config.hpp GameConfig stores the configuration settings of every Game. */ diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 14ebcd9ab9..9ac954351f 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_core.cpp Implementation of Game. */ diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 34e2e30342..b5df0f8602 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_gui.cpp %Window for configuring the Game Script */ diff --git a/src/game/game_gui.hpp b/src/game/game_gui.hpp index d0159a00d5..a4f79a88d6 100644 --- a/src/game/game_gui.hpp +++ b/src/game/game_gui.hpp @@ -1,8 +1,8 @@ /* * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute itand /or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details.You should have received a copy of the GNU General Public License along with OpenTTD.If not, see < http://www.gnu.org/licenses/>. + * 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 game_gui.hpp %Window for configuring the Games */ diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp index d3293f019b..23d1023c93 100644 --- a/src/game/game_info.cpp +++ b/src/game/game_info.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_info.cpp Implementation of GameInfo */ diff --git a/src/game/game_info.hpp b/src/game/game_info.hpp index e2c801e18e..191b520aec 100644 --- a/src/game/game_info.hpp +++ b/src/game/game_info.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_info.hpp GameInfo keeps track of all information of an Game, like Author, Description, ... */ diff --git a/src/game/game_instance.cpp b/src/game/game_instance.cpp index 2a619a0e98..c857e432bc 100644 --- a/src/game/game_instance.cpp +++ b/src/game/game_instance.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_instance.cpp Implementation of GameInstance. */ diff --git a/src/game/game_instance.hpp b/src/game/game_instance.hpp index 0a7a83abe1..076267c9c8 100644 --- a/src/game/game_instance.hpp +++ b/src/game/game_instance.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_instance.hpp The GameInstance tracks games. */ diff --git a/src/game/game_scanner.cpp b/src/game/game_scanner.cpp index 16f8c70bdc..7cf7e4de89 100644 --- a/src/game/game_scanner.cpp +++ b/src/game/game_scanner.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_scanner.cpp allows scanning Game scripts */ diff --git a/src/game/game_scanner.hpp b/src/game/game_scanner.hpp index 88696fc584..01648d7a20 100644 --- a/src/game/game_scanner.hpp +++ b/src/game/game_scanner.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_scanner.hpp declarations of the class for Game scanner */ diff --git a/src/game/game_text.cpp b/src/game/game_text.cpp index 021d5fec57..dd79e9c85e 100644 --- a/src/game/game_text.cpp +++ b/src/game/game_text.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_text.cpp Implementation of handling translated strings. */ diff --git a/src/game/game_text.hpp b/src/game/game_text.hpp index 76a08a2db3..b5451309f5 100644 --- a/src/game/game_text.hpp +++ b/src/game/game_text.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_text.hpp Base functions regarding game texts. */ diff --git a/src/gamelog.cpp b/src/gamelog.cpp index c00f09d121..9512f1c17e 100644 --- a/src/gamelog.cpp +++ b/src/gamelog.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gamelog.cpp Definition of functions used for logging of fundamental changes to the game */ diff --git a/src/gamelog.h b/src/gamelog.h index e7a75e4427..d3ccbd1293 100644 --- a/src/gamelog.h +++ b/src/gamelog.h @@ -2,7 +2,7 @@ * 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 . + * 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 gamelog.h Functions to be called to log fundamental changes to the game */ diff --git a/src/gamelog_internal.h b/src/gamelog_internal.h index 73f6434fb3..3588c48d47 100644 --- a/src/gamelog_internal.h +++ b/src/gamelog_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 gamelog_internal.h Declaration shared among gamelog.cpp and saveload/gamelog_sl.cpp */ diff --git a/src/genworld.cpp b/src/genworld.cpp index 1e52fd9a24..ce1e212d2e 100644 --- a/src/genworld.cpp +++ b/src/genworld.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 genworld.cpp Functions to generate a map. */ diff --git a/src/genworld.h b/src/genworld.h index f571971260..b9805d9e95 100644 --- a/src/genworld.h +++ b/src/genworld.h @@ -2,7 +2,7 @@ * 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 . + * 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 genworld.h Functions related to world/map generation. */ diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp index 602ae8d406..e2a7e9543b 100644 --- a/src/genworld_gui.cpp +++ b/src/genworld_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 genworld_gui.cpp GUI to configure and show progress during map generation. */ diff --git a/src/gfx.cpp b/src/gfx.cpp index 02bfbfd554..6ba1fb7bf0 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gfx.cpp Handling of drawing text and other gfx related stuff. */ diff --git a/src/gfx_func.h b/src/gfx_func.h index 7820db9b35..9f03080678 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_func.h Functions related to the gfx engine. */ diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index a91f9d6ee5..5de1c2fd50 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout.cpp Handling of laying out text. */ diff --git a/src/gfx_layout.h b/src/gfx_layout.h index fa33c1f55c..bdc69707ae 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout.h Functions related to laying out the texts. */ diff --git a/src/gfx_layout_fallback.cpp b/src/gfx_layout_fallback.cpp index e24dd3de7b..3dc0d64724 100644 --- a/src/gfx_layout_fallback.cpp +++ b/src/gfx_layout_fallback.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout_fallback.cpp Handling of laying out text as fallback. */ diff --git a/src/gfx_layout_fallback.h b/src/gfx_layout_fallback.h index ad1858062c..598a688aa1 100644 --- a/src/gfx_layout_fallback.h +++ b/src/gfx_layout_fallback.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout_fallback.h Functions related to laying out the texts as fallback. */ diff --git a/src/gfx_layout_icu.cpp b/src/gfx_layout_icu.cpp index a5ec766972..fa7ba43995 100644 --- a/src/gfx_layout_icu.cpp +++ b/src/gfx_layout_icu.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout_icu.cpp Handling of laying out with ICU / Harfbuzz. */ diff --git a/src/gfx_layout_icu.h b/src/gfx_layout_icu.h index 931eb0f7ad..262d66db1e 100644 --- a/src/gfx_layout_icu.h +++ b/src/gfx_layout_icu.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_layout_icu.h Functions related to laying out the texts with ICU. */ diff --git a/src/gfx_type.h b/src/gfx_type.h index e689aaf0a8..f039b58a44 100644 --- a/src/gfx_type.h +++ b/src/gfx_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfx_type.h Types related to the graphics and/or input devices. */ diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 6620876e4d..2cdabb7acf 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gfxinit.cpp Initializing of the (GRF) graphics. */ diff --git a/src/gfxinit.h b/src/gfxinit.h index 76f19135c3..48da51895e 100644 --- a/src/gfxinit.h +++ b/src/gfxinit.h @@ -2,7 +2,7 @@ * 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 . + * 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 gfxinit.h Functions related to the graphics initialization. */ diff --git a/src/goal.cpp b/src/goal.cpp index 2b200683ef..bf0d2ac083 100644 --- a/src/goal.cpp +++ b/src/goal.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 goal.cpp Handling of goals. */ diff --git a/src/goal_base.h b/src/goal_base.h index 40b0fe44dc..97e10e50e5 100644 --- a/src/goal_base.h +++ b/src/goal_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 goal_base.h %Goal base class. */ diff --git a/src/goal_cmd.h b/src/goal_cmd.h index 7002bad775..07728078d1 100644 --- a/src/goal_cmd.h +++ b/src/goal_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 goal_cmd.h Command definitions related to goals. */ diff --git a/src/goal_gui.cpp b/src/goal_gui.cpp index e44e66644c..d7ac6c4965 100644 --- a/src/goal_gui.cpp +++ b/src/goal_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 goal_gui.cpp GUI for goals. */ diff --git a/src/goal_type.h b/src/goal_type.h index debfc2de2e..cc7b3670e7 100644 --- a/src/goal_type.h +++ b/src/goal_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 goal_type.h basic types related to goals */ diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 74b916c168..35bcf33871 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 graph_gui.cpp GUI that shows performance graphs. */ diff --git a/src/graph_gui.h b/src/graph_gui.h index 4f11807a25..aa70b6413d 100644 --- a/src/graph_gui.h +++ b/src/graph_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 graph_gui.h Graph GUI functions. */ diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp index a5b638f09a..7962aa8277 100644 --- a/src/ground_vehicle.cpp +++ b/src/ground_vehicle.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ground_vehicle.cpp Implementation of GroundVehicle. */ diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp index d4a2a60f56..92464db2d4 100644 --- a/src/ground_vehicle.hpp +++ b/src/ground_vehicle.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 ground_vehicle.hpp Base class and functions for all vehicles that move through ground. */ diff --git a/src/group.h b/src/group.h index 28de518012..3200fbada0 100644 --- a/src/group.h +++ b/src/group.h @@ -2,7 +2,7 @@ * 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 . + * 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 group.h Base class for groups and group functions. */ diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index ab971376cc..440cb58795 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 group_cmd.cpp Handling of the engine groups */ diff --git a/src/group_cmd.h b/src/group_cmd.h index dea6d7120f..e886ffd1ea 100644 --- a/src/group_cmd.h +++ b/src/group_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 group_cmd.h Command definitions related to engine groups. */ diff --git a/src/group_gui.cpp b/src/group_gui.cpp index d0a259a026..dc93c06d54 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 group_gui.cpp GUI for the group window. */ diff --git a/src/group_gui.h b/src/group_gui.h index a4385ca853..90dc587992 100644 --- a/src/group_gui.h +++ b/src/group_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 group_gui.h Functions/definitions that have something to do with groups. */ diff --git a/src/group_type.h b/src/group_type.h index 274c720af3..598696b85f 100644 --- a/src/group_type.h +++ b/src/group_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 group_type.h Types of a group. */ diff --git a/src/gui.h b/src/gui.h index 5cfded5c8f..901340f5a8 100644 --- a/src/gui.h +++ b/src/gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 gui.h GUI functions that shouldn't be here. */ diff --git a/src/heightmap.cpp b/src/heightmap.cpp index 0bbc79cb3d..dda810bac5 100644 --- a/src/heightmap.cpp +++ b/src/heightmap.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 heightmap.cpp Creating of maps from heightmaps. */ diff --git a/src/heightmap.h b/src/heightmap.h index 013781f117..3d16f65a20 100644 --- a/src/heightmap.h +++ b/src/heightmap.h @@ -2,7 +2,7 @@ * 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 . + * 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 heightmap.h Functions related to creating heightmaps from files. */ diff --git a/src/help_gui.cpp b/src/help_gui.cpp index b9fa907227..acf4d9f70a 100644 --- a/src/help_gui.cpp +++ b/src/help_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 help_gui.cpp GUI to access manuals and related. */ diff --git a/src/help_gui.h b/src/help_gui.h index 8027da6384..9a88daddb1 100644 --- a/src/help_gui.h +++ b/src/help_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 help_gui.h GUI to access manuals and related. */ diff --git a/src/highscore.cpp b/src/highscore.cpp index e46a445c52..3db9b799af 100644 --- a/src/highscore.cpp +++ b/src/highscore.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 highscore.cpp Definition of functions used for highscore handling */ diff --git a/src/highscore.h b/src/highscore.h index 72af8add1e..073aaa8d4c 100644 --- a/src/highscore.h +++ b/src/highscore.h @@ -2,7 +2,7 @@ * 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 . + * 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 highscore.h Declaration of functions and types defined in highscore.h and highscore_gui.h */ diff --git a/src/highscore_gui.cpp b/src/highscore_gui.cpp index e5e0a3da4f..6551751865 100644 --- a/src/highscore_gui.cpp +++ b/src/highscore_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 highscore_gui.cpp Definition of the HighScore and EndGame windows */ diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp index 59a623a968..68a2445448 100644 --- a/src/hotkeys.cpp +++ b/src/hotkeys.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 hotkeys.cpp Implementation of hotkey related functions */ diff --git a/src/hotkeys.h b/src/hotkeys.h index 88b714590b..48cddd2205 100644 --- a/src/hotkeys.h +++ b/src/hotkeys.h @@ -2,7 +2,7 @@ * 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 . + * 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 hotkeys.h %Hotkey related functions. */ diff --git a/src/house.h b/src/house.h index 0f362f83df..bbcd9071de 100644 --- a/src/house.h +++ b/src/house.h @@ -2,7 +2,7 @@ * 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 . + * 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 house.h definition of HouseSpec and accessors */ diff --git a/src/house_type.h b/src/house_type.h index 9b9ea1d4b0..cde6c765d4 100644 --- a/src/house_type.h +++ b/src/house_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 house_type.h declaration of basic house types and enums */ diff --git a/src/industry.h b/src/industry.h index 27296410e3..c3c316e38a 100644 --- a/src/industry.h +++ b/src/industry.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry.h Base of all industries. */ diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 75dea21975..a6cce42fc2 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 industry_cmd.cpp Handling of industry tiles. */ diff --git a/src/industry_cmd.h b/src/industry_cmd.h index 78a7687cda..42c4fb20ae 100644 --- a/src/industry_cmd.h +++ b/src/industry_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_cmd.h Command definitions related to industries. */ diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 25ac005796..54fb9af1ab 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 industry_gui.cpp GUIs related to industries. */ diff --git a/src/industry_map.h b/src/industry_map.h index 1c8acbadbc..633f236539 100644 --- a/src/industry_map.h +++ b/src/industry_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_map.h Accessors for industries */ diff --git a/src/industry_type.h b/src/industry_type.h index ed01773729..a563d6f5d4 100644 --- a/src/industry_type.h +++ b/src/industry_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_type.h Types related to the industry. */ diff --git a/src/industrytype.h b/src/industrytype.h index 74e33e26a7..f10812f24f 100644 --- a/src/industrytype.h +++ b/src/industrytype.h @@ -2,7 +2,7 @@ * 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 . + * 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 industrytype.h %Industry type specs. */ diff --git a/src/ini.cpp b/src/ini.cpp index d169833aa1..4c87f089f1 100644 --- a/src/ini.cpp +++ b/src/ini.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ini.cpp Definition of the IniItem class, related to reading/writing '*.ini' files. */ diff --git a/src/ini_load.cpp b/src/ini_load.cpp index f134f6502e..e9619633b0 100644 --- a/src/ini_load.cpp +++ b/src/ini_load.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ini_load.cpp Definition of the #IniLoadFile class, related to reading and storing '*.ini' files. */ diff --git a/src/ini_type.h b/src/ini_type.h index 0393d4a91b..2983bd5221 100644 --- a/src/ini_type.h +++ b/src/ini_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 ini_type.h Types related to reading/writing '*.ini' files. */ diff --git a/src/intro_gui.cpp b/src/intro_gui.cpp index 9ecb1e94b1..d441474ea5 100644 --- a/src/intro_gui.cpp +++ b/src/intro_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 intro_gui.cpp The main menu GUI. */ diff --git a/src/landscape.cpp b/src/landscape.cpp index a6041f733a..bd26488354 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 landscape.cpp Functions related to the landscape (slopes etc.). */ diff --git a/src/landscape.h b/src/landscape.h index 3f33789694..7227e8ca32 100644 --- a/src/landscape.h +++ b/src/landscape.h @@ -2,7 +2,7 @@ * 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 . + * 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 landscape.h Functions related to OTTD's landscape. */ diff --git a/src/landscape_cmd.h b/src/landscape_cmd.h index 1ae5b7b1b2..b17832faba 100644 --- a/src/landscape_cmd.h +++ b/src/landscape_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 landscape_cmd.h Command definitions related to landscape (slopes etc.). */ diff --git a/src/landscape_type.h b/src/landscape_type.h index 7a4f3dac54..8ad85d6179 100644 --- a/src/landscape_type.h +++ b/src/landscape_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 landscape_type.h Types related to the landscape. */ diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 72a98f5211..241d1081e4 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index af62bc17b4..e0cce46e66 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 2ca23509b1..7b85fa480d 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index a2050466b8..63cc08ed68 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 2faf0207ff..d17d1afdb6 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 6969225471..f71f834857 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 30f475523a..bb38676de2 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 49bc9aeb81..e964b7876a 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index b8f1096a77..d5212f9cc1 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/czech.txt b/src/lang/czech.txt index f3963a61ab..e9ad64e89d 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 563784ff5f..1ab7756ad7 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index c09d50a732..8728600acc 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/english.txt b/src/lang/english.txt index 3bcfc2b4a5..67c858b32d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 81d2533faa..6d2b3e8588 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 46b684dd6d..787ada1ba9 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index a0370f2266..eb9366c4dc 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index ec511f33e5..1d9eec28bd 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index e5b24720ab..c211506433 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 61c9cf4b71..9a98c20ed2 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/french.txt b/src/lang/french.txt index d027a54ff1..c4ec474cf8 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 41c7911bbb..11570d8045 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 8b85f4ff28..5bb1c50ed9 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/galician.txt b/src/lang/galician.txt index a569f4a531..935e6811cf 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/german.txt b/src/lang/german.txt index e4af35817d..c96cb0d8b8 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/greek.txt b/src/lang/greek.txt index f0111786b7..0f077fa914 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index c52ea6e7eb..22d17c8d76 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index c103ddcb04..918ff2c92f 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index fb7a46d313..d97565b593 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index fcd7544bc8..594d023a79 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 6a2107860f..a94cfda45d 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index e9e62673dd..2499f83d64 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 51e5153682..9b35e39417 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 50874a718a..2c0b7afa19 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index ba5278c213..96c1985476 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 53c7c40b4c..4112fe2f0a 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 658d4cca96..495e4f4586 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index bf5281b7d0..acb8a53ba5 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 958511692c..e4f09b3baa 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 59edb699c9..c01468dcca 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 24b1becdcb..4b2f9cbabf 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/malay.txt b/src/lang/malay.txt index c410eb8397..1389312e48 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 7d41aa8c9c..2ef8f2b525 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/maori.txt b/src/lang/maori.txt index 28a5d2c37c..86c009de0c 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index cb308dabb2..ae4d024745 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index b98cb74896..fcfe0bedfa 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index c34f5f1c7e..92f59251aa 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/persian.txt b/src/lang/persian.txt index cf3ed27ab5..9863fe09f7 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 1101599223..ec35667743 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index a1c56a63e0..ed598c463d 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 71941f2fcf..7bce57d4e8 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 2893dc1c7e..5bb2e66611 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 9e9006a930..71c7e144e1 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index fa7f98df92..1fa10969fc 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 6d6c706058..36628f4739 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 04b02deec8..f73345f6e3 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index a380405d84..00d8ed6738 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index c55bd141df..7743adf742 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index e6e0aaa683..0dfbec3c64 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 7a1cd43f7e..d0fedf3dbf 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/thai.txt b/src/lang/thai.txt index bd338b6b5d..49d3ff0d93 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index e856ec5e5c..719ee310fb 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 48dd7c8f73..a396ffd3a1 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 5d56b9df71..0b73966f85 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -15,7 +15,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 40e9f035a7..12174a8b1b 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -14,7 +14,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 9b40266c55..e80fb49fc2 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index b9d4110191..9d7d8ec871 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -13,7 +13,7 @@ # 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 . +# 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 . ##id 0x0000 diff --git a/src/language.h b/src/language.h index 3158154ed2..ddbedb4d1b 100644 --- a/src/language.h +++ b/src/language.h @@ -2,7 +2,7 @@ * 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 . + * 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 language.h Information about languages and their files. */ diff --git a/src/league_base.h b/src/league_base.h index 8bf48ac0e5..85894f6367 100644 --- a/src/league_base.h +++ b/src/league_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 league_base.h %LeagueTable base class. */ diff --git a/src/league_cmd.cpp b/src/league_cmd.cpp index 1dd7687d47..275d1dd378 100644 --- a/src/league_cmd.cpp +++ b/src/league_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 league_cmd.cpp Handling of league tables. */ diff --git a/src/league_cmd.h b/src/league_cmd.h index 83f9f3c534..c7378c9af9 100644 --- a/src/league_cmd.h +++ b/src/league_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 league_cmd.h Command definitions related to league tables. */ diff --git a/src/league_gui.cpp b/src/league_gui.cpp index 9c1a6a40e4..24bcf8b4b0 100644 --- a/src/league_gui.cpp +++ b/src/league_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 league_gui.cpp GUI for league tables. */ diff --git a/src/league_gui.h b/src/league_gui.h index 602979f1f6..9ba80ac886 100644 --- a/src/league_gui.h +++ b/src/league_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 league_gui.h League table GUI functions. */ diff --git a/src/league_type.h b/src/league_type.h index e9f0d2e7a4..20847edd0e 100644 --- a/src/league_type.h +++ b/src/league_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 league_type.h basic types related to league tables */ diff --git a/src/library_loader.h b/src/library_loader.h index a6cc8285cf..32c561bd90 100644 --- a/src/library_loader.h +++ b/src/library_loader.h @@ -2,7 +2,7 @@ * 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 . + * 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 library_loader.h Functions/types related to loading libraries dynamically. */ diff --git a/src/linkgraph/flowmapper.cpp b/src/linkgraph/flowmapper.cpp index 2fdd0a61f9..6bd096bbb5 100644 --- a/src/linkgraph/flowmapper.cpp +++ b/src/linkgraph/flowmapper.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 flowmapper.cpp Definition of flowmapper. */ diff --git a/src/linkgraph/flowmapper.h b/src/linkgraph/flowmapper.h index c59aa3f527..1f35d5b62a 100644 --- a/src/linkgraph/flowmapper.h +++ b/src/linkgraph/flowmapper.h @@ -2,7 +2,7 @@ * 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 . + * 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 flowmapper.h Declaration of flow mapper; maps paths into flows at nodes. */ diff --git a/src/linkgraph/linkgraph.cpp b/src/linkgraph/linkgraph.cpp index a5743fc6ab..66f7cd881a 100644 --- a/src/linkgraph/linkgraph.cpp +++ b/src/linkgraph/linkgraph.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph.cpp Definition of link graph classes used for cargo distribution. */ diff --git a/src/linkgraph/linkgraph.h b/src/linkgraph/linkgraph.h index 323158d230..706d8d8cf5 100644 --- a/src/linkgraph/linkgraph.h +++ b/src/linkgraph/linkgraph.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph.h Declaration of link graph classes used for cargo distribution. */ diff --git a/src/linkgraph/linkgraph_base.h b/src/linkgraph/linkgraph_base.h index 0eed6063af..2f316723a1 100644 --- a/src/linkgraph/linkgraph_base.h +++ b/src/linkgraph/linkgraph_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_base.h Some typedefs for the main game. */ diff --git a/src/linkgraph/linkgraph_gui.cpp b/src/linkgraph/linkgraph_gui.cpp index e31dd166aa..170c6d93af 100644 --- a/src/linkgraph/linkgraph_gui.cpp +++ b/src/linkgraph/linkgraph_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_gui.cpp Implementation of linkgraph overlay GUI. */ diff --git a/src/linkgraph/linkgraph_gui.h b/src/linkgraph/linkgraph_gui.h index 2df5ca25aa..d2606a69e5 100644 --- a/src/linkgraph/linkgraph_gui.h +++ b/src/linkgraph/linkgraph_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_gui.h Declaration of linkgraph overlay GUI. */ diff --git a/src/linkgraph/linkgraph_type.h b/src/linkgraph/linkgraph_type.h index 7cf07035b1..95651e785c 100644 --- a/src/linkgraph/linkgraph_type.h +++ b/src/linkgraph/linkgraph_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_type.h Declaration of link graph types used for cargo distribution. */ diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index f83e3341a9..365b0358a5 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraphjob.cpp Definition of link graph job classes used for cargo distribution. */ diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index f0f28884c4..b308211154 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraphjob.h Declaration of link graph job classes used for cargo distribution. */ diff --git a/src/linkgraph/linkgraphjob_base.h b/src/linkgraph/linkgraphjob_base.h index 1a0c3667b2..cecf088e8a 100644 --- a/src/linkgraph/linkgraphjob_base.h +++ b/src/linkgraph/linkgraphjob_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraphjob_base.h Some typedefs for component handlers. */ diff --git a/src/linkgraph/linkgraphschedule.cpp b/src/linkgraph/linkgraphschedule.cpp index 304b7b896d..ea7195e348 100644 --- a/src/linkgraph/linkgraphschedule.cpp +++ b/src/linkgraph/linkgraphschedule.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraphschedule.cpp Definition of link graph schedule used for cargo distribution. */ diff --git a/src/linkgraph/linkgraphschedule.h b/src/linkgraph/linkgraphschedule.h index 2a169b6b66..3cd2b0d6ad 100644 --- a/src/linkgraph/linkgraphschedule.h +++ b/src/linkgraph/linkgraphschedule.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraphschedule.h Declaration of link graph schedule used for cargo distribution. */ diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index e1d1c96c68..96ceb35519 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 refresh.h Definition of link refreshing utility. */ diff --git a/src/linkgraph/refresh.h b/src/linkgraph/refresh.h index 449bf2bd0d..bd357889aa 100644 --- a/src/linkgraph/refresh.h +++ b/src/linkgraph/refresh.h @@ -2,7 +2,7 @@ * 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 . + * 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 refresh.h Declaration of link refreshing utility. */ diff --git a/src/livery.h b/src/livery.h index 31c39f7840..345424c853 100644 --- a/src/livery.h +++ b/src/livery.h @@ -2,7 +2,7 @@ * 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 . + * 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 livery.h Functions/types related to livery colours. */ diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 9cf5411ec0..f54c7d6016 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 main_gui.cpp Handling of the main viewport. */ diff --git a/src/map.cpp b/src/map.cpp index a6dc2af46b..332642b10d 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 map.cpp Base functions related to the map and distances on them. */ diff --git a/src/map_func.h b/src/map_func.h index 1854de91b3..cb64390271 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 map_func.h Functions related to maps. */ diff --git a/src/map_type.h b/src/map_type.h index 6537e51008..4d0d44c772 100644 --- a/src/map_type.h +++ b/src/map_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 map_type.h Types related to maps. */ diff --git a/src/misc.cpp b/src/misc.cpp index 101f089704..1d3d462b7a 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 misc.cpp Misc functions that shouldn't be here. */ diff --git a/src/misc/alternating_iterator.hpp b/src/misc/alternating_iterator.hpp index a5b6d6f591..e318314183 100644 --- a/src/misc/alternating_iterator.hpp +++ b/src/misc/alternating_iterator.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 alternating_iterator.hpp Iterator adaptor that takes items alternating from a middle position. */ diff --git a/src/misc/autorelease.hpp b/src/misc/autorelease.hpp index 78f5d87226..f3e25bc1ef 100644 --- a/src/misc/autorelease.hpp +++ b/src/misc/autorelease.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 autorelease.hpp Helper for std::unique_ptr to use an arbitrary function as the deleter. */ diff --git a/src/misc/binaryheap.hpp b/src/misc/binaryheap.hpp index b9a35d6bf1..58053a6b09 100644 --- a/src/misc/binaryheap.hpp +++ b/src/misc/binaryheap.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 binaryheap.hpp Binary heap implementation. */ diff --git a/src/misc/dbg_helpers.cpp b/src/misc/dbg_helpers.cpp index 65076410f6..a38abdeba6 100644 --- a/src/misc/dbg_helpers.cpp +++ b/src/misc/dbg_helpers.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dbg_helpers.cpp Helpers for outputting debug information. */ diff --git a/src/misc/dbg_helpers.h b/src/misc/dbg_helpers.h index 6cf520e861..5a563b2234 100644 --- a/src/misc/dbg_helpers.h +++ b/src/misc/dbg_helpers.h @@ -2,7 +2,7 @@ * 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 . + * 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 dbg_helpers.h Functions to be used for debug printings. */ diff --git a/src/misc/endian_buffer.hpp b/src/misc/endian_buffer.hpp index ca531eb641..85fb54c12a 100644 --- a/src/misc/endian_buffer.hpp +++ b/src/misc/endian_buffer.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 endian_buffer.hpp Endian-aware buffer. */ diff --git a/src/misc/getoptdata.cpp b/src/misc/getoptdata.cpp index 73494bc1dc..77af8c6801 100644 --- a/src/misc/getoptdata.cpp +++ b/src/misc/getoptdata.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 getoptdata.cpp Library for parsing command line options. */ diff --git a/src/misc/getoptdata.h b/src/misc/getoptdata.h index a5fe16733d..dcf62245bb 100644 --- a/src/misc/getoptdata.h +++ b/src/misc/getoptdata.h @@ -2,7 +2,7 @@ * 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 . + * 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 getoptdata.h Library for parsing command-line options. */ diff --git a/src/misc/hashtable.hpp b/src/misc/hashtable.hpp index e357528d78..09f3646db0 100644 --- a/src/misc/hashtable.hpp +++ b/src/misc/hashtable.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 hashtable.hpp Hash table support. */ diff --git a/src/misc/history.cpp b/src/misc/history.cpp index 2654937b2a..1b0406634c 100644 --- a/src/misc/history.cpp +++ b/src/misc/history.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 history.cpp Implementation of functions for storing historical data. */ diff --git a/src/misc/history_func.hpp b/src/misc/history_func.hpp index b143fb4bdc..d0ed85af25 100644 --- a/src/misc/history_func.hpp +++ b/src/misc/history_func.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 history_func.hpp Functions for storing historical data. */ diff --git a/src/misc/history_type.hpp b/src/misc/history_type.hpp index d84c58bb4b..814056f4ef 100644 --- a/src/misc/history_type.hpp +++ b/src/misc/history_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 history_type.hpp Types for storing historical data. */ diff --git a/src/misc/lrucache.hpp b/src/misc/lrucache.hpp index 7267cfb128..9946430b17 100644 --- a/src/misc/lrucache.hpp +++ b/src/misc/lrucache.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 lrucache.hpp Size limited cache map with a least recently used eviction strategy. */ diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index 7afae531dd..b3a3a59764 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 misc_cmd.cpp Some misc functions that are better fitted in other files, but never got moved there... */ diff --git a/src/misc_cmd.h b/src/misc_cmd.h index fb5279a7f3..6c43c1486e 100644 --- a/src/misc_cmd.h +++ b/src/misc_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 misc_cmd.h Miscellaneous command definitions. */ diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index fdb53d53d4..d1cc6c404a 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 misc_gui.cpp GUIs for a number of misc windows. */ diff --git a/src/mixer.cpp b/src/mixer.cpp index ec46d786e3..9ae09510ce 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 mixer.cpp Mixing of sound samples. */ diff --git a/src/mixer.h b/src/mixer.h index 707967d234..bcccc734c8 100644 --- a/src/mixer.h +++ b/src/mixer.h @@ -2,7 +2,7 @@ * 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 . + * 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 mixer.h Functions to mix sound samples. */ diff --git a/src/music.cpp b/src/music.cpp index bca4a671e4..ee33585c04 100644 --- a/src/music.cpp +++ b/src/music.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 music.cpp The songs that OpenTTD knows. */ diff --git a/src/music/allegro_m.cpp b/src/music/allegro_m.cpp index ce9184f15f..056f75d0cc 100644 --- a/src/music/allegro_m.cpp +++ b/src/music/allegro_m.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 allegro_m.cpp Playing music via allegro. */ diff --git a/src/music/allegro_m.h b/src/music/allegro_m.h index eee250897b..0df363ec8e 100644 --- a/src/music/allegro_m.h +++ b/src/music/allegro_m.h @@ -2,7 +2,7 @@ * 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 . + * 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 allegro_m.h Base support for playing music via allegro. */ diff --git a/src/music/bemidi.cpp b/src/music/bemidi.cpp index 44386cf6c8..97bfcf07e5 100644 --- a/src/music/bemidi.cpp +++ b/src/music/bemidi.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bemidi.cpp Support for BeOS midi. */ diff --git a/src/music/bemidi.h b/src/music/bemidi.h index d63d93c046..d41042ac75 100644 --- a/src/music/bemidi.h +++ b/src/music/bemidi.h @@ -2,7 +2,7 @@ * 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 . + * 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 bemidi.h Base of BeOS Midi support. */ diff --git a/src/music/cocoa_m.cpp b/src/music/cocoa_m.cpp index c4616b2cd3..68f1f025c2 100644 --- a/src/music/cocoa_m.cpp +++ b/src/music/cocoa_m.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/music/cocoa_m.h b/src/music/cocoa_m.h index c0387302ac..31573b8fa7 100644 --- a/src/music/cocoa_m.h +++ b/src/music/cocoa_m.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_m.h Base of music playback via CoreAudio. */ diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index ce89c64aeb..c676656847 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dmusic.cpp Playing music via DirectMusic. */ diff --git a/src/music/dmusic.h b/src/music/dmusic.h index a988539861..3b5a1b31c4 100644 --- a/src/music/dmusic.h +++ b/src/music/dmusic.h @@ -2,7 +2,7 @@ * 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 . + * 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 dmusic.h Base of playing music via DirectMusic. */ diff --git a/src/music/extmidi.cpp b/src/music/extmidi.cpp index 04143149e3..de5edbc37a 100644 --- a/src/music/extmidi.cpp +++ b/src/music/extmidi.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 extmidi.cpp Playing music via an external player. */ diff --git a/src/music/extmidi.h b/src/music/extmidi.h index cb62b396dd..f00341658b 100644 --- a/src/music/extmidi.h +++ b/src/music/extmidi.h @@ -2,7 +2,7 @@ * 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 . + * 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 extmidi.h Base support for playing music via an external application. */ diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp index d428a14123..2a939c655f 100644 --- a/src/music/fluidsynth.cpp +++ b/src/music/fluidsynth.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 fluidsynth.cpp Playing music via the fluidsynth library. */ diff --git a/src/music/fluidsynth.h b/src/music/fluidsynth.h index 6a20ffd81d..fdfe08bacb 100644 --- a/src/music/fluidsynth.h +++ b/src/music/fluidsynth.h @@ -2,7 +2,7 @@ * 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 . + * 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 fluidsynth.h Base for FluidSynth music playback. */ diff --git a/src/music/midi.h b/src/music/midi.h index 40caf9e126..3e5832a17a 100644 --- a/src/music/midi.h +++ b/src/music/midi.h @@ -2,7 +2,7 @@ * 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 . + * 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 midi.h Declarations for MIDI data */ diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index a45688773d..3a305fb363 100644 --- a/src/music/midifile.cpp +++ b/src/music/midifile.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 midifile.cpp Parser for standard MIDI files */ diff --git a/src/music/midifile.hpp b/src/music/midifile.hpp index 27cb05db5b..8b358bd354 100644 --- a/src/music/midifile.hpp +++ b/src/music/midifile.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 midifile.hpp Parser for standard MIDI files */ diff --git a/src/music/music_driver.hpp b/src/music/music_driver.hpp index 80b889e647..2bd8c935ce 100644 --- a/src/music/music_driver.hpp +++ b/src/music/music_driver.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 music_driver.hpp Base for all music playback. */ diff --git a/src/music/null_m.cpp b/src/music/null_m.cpp index c9c8bc84f0..441ec29b67 100644 --- a/src/music/null_m.cpp +++ b/src/music/null_m.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 null_m.cpp The music playback that is silent. */ diff --git a/src/music/null_m.h b/src/music/null_m.h index 09b0c57404..3ed646544a 100644 --- a/src/music/null_m.h +++ b/src/music/null_m.h @@ -2,7 +2,7 @@ * 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 . + * 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 null_m.h Base for the silent music playback. */ diff --git a/src/music/win32_m.cpp b/src/music/win32_m.cpp index c25b5d4b4f..fab160a5ee 100644 --- a/src/music/win32_m.cpp +++ b/src/music/win32_m.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 win32_m.cpp Music playback for Windows. */ diff --git a/src/music/win32_m.h b/src/music/win32_m.h index 1f860f3d96..1613c4bd04 100644 --- a/src/music/win32_m.h +++ b/src/music/win32_m.h @@ -2,7 +2,7 @@ * 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 . + * 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 win32_m.h Base for Windows music playback. */ diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 7bdbf2dead..5842954cc8 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 music_gui.cpp GUI for the music playback. */ diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index 06776db56d..09066dca13 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 core/address.cpp Implementation of the address. */ diff --git a/src/network/core/address.h b/src/network/core/address.h index 524908610c..e7dbeb4e8b 100644 --- a/src/network/core/address.h +++ b/src/network/core/address.h @@ -2,7 +2,7 @@ * 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 . + * 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 core/address.h Wrapper for network addresses. */ diff --git a/src/network/core/config.cpp b/src/network/core/config.cpp index fbadb6818f..7e1f9c9c12 100644 --- a/src/network/core/config.cpp +++ b/src/network/core/config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/config.h b/src/network/core/config.h index 7b7d1cc45f..e287bd8aed 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/core.cpp b/src/network/core/core.cpp index 91f1594711..a0f274568d 100644 --- a/src/network/core/core.cpp +++ b/src/network/core/core.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/core.h b/src/network/core/core.h index aa354d326c..7eb2e2357c 100644 --- a/src/network/core/core.h +++ b/src/network/core/core.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/host.cpp b/src/network/core/host.cpp index 636fd9dd33..3574aa72ae 100644 --- a/src/network/core/host.cpp +++ b/src/network/core/host.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 host.cpp Functions related to getting host specific data (IPs). */ diff --git a/src/network/core/host.h b/src/network/core/host.h index 345b352193..a1526afbeb 100644 --- a/src/network/core/host.h +++ b/src/network/core/host.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/http.h b/src/network/core/http.h index 2a6d1614af..9313f7f8bc 100644 --- a/src/network/core/http.h +++ b/src/network/core/http.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index dcfc7d0a91..8616dfa0d0 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/http_none.cpp b/src/network/core/http_none.cpp index 2c3816834b..7d95302317 100644 --- a/src/network/core/http_none.cpp +++ b/src/network/core/http_none.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/http_shared.h b/src/network/core/http_shared.h index ec3ae79348..7acde118b3 100644 --- a/src/network/core/http_shared.h +++ b/src/network/core/http_shared.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/http_winhttp.cpp b/src/network/core/http_winhttp.cpp index 4555bd0a14..67543bb643 100644 --- a/src/network/core/http_winhttp.cpp +++ b/src/network/core/http_winhttp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/network_game_info.cpp b/src/network/core/network_game_info.cpp index 1fe1c2df1e..779be30e62 100644 --- a/src/network/core/network_game_info.cpp +++ b/src/network/core/network_game_info.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/network_game_info.h b/src/network/core/network_game_info.h index 2463f12c2b..5c7619ad83 100644 --- a/src/network/core/network_game_info.h +++ b/src/network/core/network_game_info.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/os_abstraction.cpp b/src/network/core/os_abstraction.cpp index 045bfb913f..bbbec4ad98 100644 --- a/src/network/core/os_abstraction.cpp +++ b/src/network/core/os_abstraction.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/os_abstraction.h b/src/network/core/os_abstraction.h index 0b4abc0fcf..5de279a25d 100644 --- a/src/network/core/os_abstraction.h +++ b/src/network/core/os_abstraction.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index bb828f846b..6d1875861a 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/packet.h b/src/network/core/packet.h index aa2754eb06..e6f92506d9 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index d29a530564..698c47deac 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index 38d76aaa47..3656e9ac61 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index 12d2d02e47..66d9789a60 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index c5b9180f03..d3a82bc24c 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_connect.cpp b/src/network/core/tcp_connect.cpp index 8b0bd647c9..e8e754a49b 100644 --- a/src/network/core/tcp_connect.cpp +++ b/src/network/core/tcp_connect.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 4eef5abb01..bfa9ae22fa 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h index 24ae8d873a..4d8faae59e 100644 --- a/src/network/core/tcp_content.h +++ b/src/network/core/tcp_content.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index ac25c241c4..3b1d2b696e 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp index da030dd680..10c4ebdaa4 100644 --- a/src/network/core/tcp_coordinator.cpp +++ b/src/network/core/tcp_coordinator.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index dd14d8b34a..a36843366c 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 5d072dbb92..f606cc8acb 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 871a2009fa..000c2f13af 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_listen.h b/src/network/core/tcp_listen.h index 55ca79cecf..4861f60ab8 100644 --- a/src/network/core/tcp_listen.h +++ b/src/network/core/tcp_listen.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_stun.cpp b/src/network/core/tcp_stun.cpp index a03bb7cf72..ca14eb0415 100644 --- a/src/network/core/tcp_stun.cpp +++ b/src/network/core/tcp_stun.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_stun.h b/src/network/core/tcp_stun.h index 0fce3b2a07..ff3457d002 100644 --- a/src/network/core/tcp_stun.h +++ b/src/network/core/tcp_stun.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp index ae600e7bfb..da0e17c119 100644 --- a/src/network/core/tcp_turn.cpp +++ b/src/network/core/tcp_turn.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h index e9558b252e..aef0a87ef5 100644 --- a/src/network/core/tcp_turn.h +++ b/src/network/core/tcp_turn.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 000e650411..b21e5e8f89 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/core/udp.h b/src/network/core/udp.h index fc5412b861..737828683a 100644 --- a/src/network/core/udp.h +++ b/src/network/core/udp.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/network.cpp b/src/network/network.cpp index 7a95f91fac..6baf23301a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network.cpp Base functions for networking support. */ diff --git a/src/network/network.h b/src/network/network.h index 1de0da3a8b..2e685a0047 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -2,7 +2,7 @@ * 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 . + * 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 network.h Basic functions/variables used all over the place. */ diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 95694636d2..99ec918ef3 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_admin.cpp Server part of the admin network protocol. */ diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 89a7ac80a5..b0b24af218 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_admin.h Server part of the admin network protocol. */ diff --git a/src/network/network_base.h b/src/network/network_base.h index 9d1ebe8597..dc62fd9c86 100644 --- a/src/network/network_base.h +++ b/src/network/network_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_base.h Base core network types and some helper functions to access them. */ diff --git a/src/network/network_chat_gui.cpp b/src/network/network_chat_gui.cpp index d55fede4f9..de5ac6ca03 100644 --- a/src/network/network_chat_gui.cpp +++ b/src/network/network_chat_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_chat_gui.cpp GUI for handling chat messages. */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 53c73a7f11..4a683dc1f4 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_client.cpp Client part of the network protocol. */ diff --git a/src/network/network_client.h b/src/network/network_client.h index 6205ed9b1b..4baae985d8 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_client.h Client part of the network protocol. */ diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index d88c4e8754..51a5f57db3 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_command.cpp Command handling over network connections. */ diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 552764722f..ced3a4d8fd 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_content.cpp Content sending/receiving part of the network protocol. */ diff --git a/src/network/network_content.h b/src/network/network_content.h index 2ed54fbd65..6e9d723e26 100644 --- a/src/network/network_content.h +++ b/src/network/network_content.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_content.h Part of the network protocol handling content distribution. */ diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index 76acaa217f..93bb0ef857 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_content_gui.cpp Implementation of the Network Content related GUIs. */ diff --git a/src/network/network_content_gui.h b/src/network/network_content_gui.h index 6fd71d0ad8..61d5c8c9db 100644 --- a/src/network/network_content_gui.h +++ b/src/network/network_content_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_content_gui.h User interface for downloading files. */ diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index 992f129a36..8ae6ea857e 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_coordinator.cpp Game Coordinator sending/receiving part of the network protocol. */ diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h index eccb90d7b1..57e0e8dbec 100644 --- a/src/network/network_coordinator.h +++ b/src/network/network_coordinator.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_coordinator.h Part of the network protocol handling Game Coordinator requests. */ diff --git a/src/network/network_crypto.cpp b/src/network/network_crypto.cpp index 60dc66fa2b..323ebc1693 100644 --- a/src/network/network_crypto.cpp +++ b/src/network/network_crypto.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_crypto.cpp Implementation of the network specific cryptography helpers. */ diff --git a/src/network/network_crypto.h b/src/network/network_crypto.h index 3657b1c0b5..7f3b9c23df 100644 --- a/src/network/network_crypto.h +++ b/src/network/network_crypto.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/network_crypto_internal.h b/src/network/network_crypto_internal.h index e4bf47bcfb..9e01623963 100644 --- a/src/network/network_crypto_internal.h +++ b/src/network/network_crypto_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_crypto_internal.h Internal bits to the crypto of the network handling. */ diff --git a/src/network/network_func.h b/src/network/network_func.h index 40a6bc8a4c..4ba84b17ad 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_func.h Network functions used by other parts of OpenTTD. */ diff --git a/src/network/network_gamelist.cpp b/src/network/network_gamelist.cpp index ebf51f87a5..dbf3e56e1a 100644 --- a/src/network/network_gamelist.cpp +++ b/src/network/network_gamelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/network_gamelist.h b/src/network/network_gamelist.h index 50c8a71abc..55f2254c49 100644 --- a/src/network/network_gamelist.h +++ b/src/network/network_gamelist.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_gamelist.h Handling of the list of games. */ diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index fdc4ecaab4..fd4112d41d 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_gui.cpp Implementation of the Network related GUIs. */ diff --git a/src/network/network_gui.h b/src/network/network_gui.h index a717db2f90..37d782ce85 100644 --- a/src/network/network_gui.h +++ b/src/network/network_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_gui.h GUIs related to networking. */ diff --git a/src/network/network_internal.h b/src/network/network_internal.h index f9e045d3f0..0aea30b3d3 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_internal.h Variables and function used internally. */ diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 82421f09cf..927079908a 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_query.cpp Query part of the network protocol. */ diff --git a/src/network/network_query.h b/src/network/network_query.h index 8e33ef9ccb..db2b1fbf70 100644 --- a/src/network/network_query.h +++ b/src/network/network_query.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_query.h Query part of the network protocol. */ diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index ff39b2b854..20c6edb817 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_server.cpp Server part of the network protocol. */ diff --git a/src/network/network_server.h b/src/network/network_server.h index 7a4528dc30..e0d3a3b1bd 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_server.h Server part of the network protocol. */ diff --git a/src/network/network_stun.cpp b/src/network/network_stun.cpp index 9424ea0221..d6f5b7476d 100644 --- a/src/network/network_stun.cpp +++ b/src/network/network_stun.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_stun.cpp STUN sending/receiving part of the network protocol. */ diff --git a/src/network/network_stun.h b/src/network/network_stun.h index 3903328412..f162cdf7de 100644 --- a/src/network/network_stun.h +++ b/src/network/network_stun.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_stun.h Part of the network protocol handling STUN requests. */ diff --git a/src/network/network_survey.cpp b/src/network/network_survey.cpp index 040db1fe48..7fb511c598 100644 --- a/src/network/network_survey.cpp +++ b/src/network/network_survey.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_survey.cpp Opt-in survey part of the network protocol. */ diff --git a/src/network/network_survey.h b/src/network/network_survey.h index aa1b664b2b..6d39de62e4 100644 --- a/src/network/network_survey.h +++ b/src/network/network_survey.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_survey.h Part of the network protocol handling opt-in survey. */ diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp index 6ba9211cf0..cd70dd9097 100644 --- a/src/network/network_turn.cpp +++ b/src/network/network_turn.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 network_turn.cpp TURN sending/receiving part of the network protocol. */ diff --git a/src/network/network_turn.h b/src/network/network_turn.h index 8ea994bd23..27ee91bfee 100644 --- a/src/network/network_turn.h +++ b/src/network/network_turn.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_turn.h Part of the network protocol handling TURN requests. */ diff --git a/src/network/network_type.h b/src/network/network_type.h index ac04e1e3be..a895717d07 100644 --- a/src/network/network_type.h +++ b/src/network/network_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_type.h Types used for networking. */ diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index ed318b92d2..0dba435029 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/network/network_udp.h b/src/network/network_udp.h index b640da018d..d444afbf5a 100644 --- a/src/network/network_udp.h +++ b/src/network/network_udp.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_udp.h Sending and receiving UDP messages. */ diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 15a06a53f4..3db85edbdb 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf.cpp Base of all NewGRF support. */ diff --git a/src/newgrf.h b/src/newgrf.h index fd89853c6d..29384bfd4f 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf.h Base for the NewGRF implementation. */ diff --git a/src/newgrf/newgrf_act0.cpp b/src/newgrf/newgrf_act0.cpp index 815c099c8d..da2675ab73 100644 --- a/src/newgrf/newgrf_act0.cpp +++ b/src/newgrf/newgrf_act0.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0.cpp NewGRF Action 0x00 handler. */ diff --git a/src/newgrf/newgrf_act0_aircraft.cpp b/src/newgrf/newgrf_act0_aircraft.cpp index d4e7df1298..521692e1f8 100644 --- a/src/newgrf/newgrf_act0_aircraft.cpp +++ b/src/newgrf/newgrf_act0_aircraft.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_aircraft.cpp NewGRF Action 0x00 handler for aircraft. */ diff --git a/src/newgrf/newgrf_act0_airports.cpp b/src/newgrf/newgrf_act0_airports.cpp index 62c0f4c61b..9e16e7730d 100644 --- a/src/newgrf/newgrf_act0_airports.cpp +++ b/src/newgrf/newgrf_act0_airports.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_airports.cpp NewGRF Action 0x00 handler for airports. */ diff --git a/src/newgrf/newgrf_act0_badges.cpp b/src/newgrf/newgrf_act0_badges.cpp index 823cf0e0d5..4322a34e3a 100644 --- a/src/newgrf/newgrf_act0_badges.cpp +++ b/src/newgrf/newgrf_act0_badges.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_badges.cpp NewGRF Action 0x00 handler for badges. */ diff --git a/src/newgrf/newgrf_act0_bridges.cpp b/src/newgrf/newgrf_act0_bridges.cpp index e91e75d3ee..12e64aa287 100644 --- a/src/newgrf/newgrf_act0_bridges.cpp +++ b/src/newgrf/newgrf_act0_bridges.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_bidges.cpp NewGRF Action 0x00 handler for bridges. */ diff --git a/src/newgrf/newgrf_act0_canals.cpp b/src/newgrf/newgrf_act0_canals.cpp index b48c8af3f7..a83e8fbf05 100644 --- a/src/newgrf/newgrf_act0_canals.cpp +++ b/src/newgrf/newgrf_act0_canals.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_canals.cpp NewGRF Action 0x00 handler for canals. */ diff --git a/src/newgrf/newgrf_act0_cargo.cpp b/src/newgrf/newgrf_act0_cargo.cpp index 1f467bbd43..398ee3c4e3 100644 --- a/src/newgrf/newgrf_act0_cargo.cpp +++ b/src/newgrf/newgrf_act0_cargo.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_cargo.cpp NewGRF Action 0x00 handler for cargo. */ diff --git a/src/newgrf/newgrf_act0_globalvar.cpp b/src/newgrf/newgrf_act0_globalvar.cpp index 18aa6d67a9..7d07bc9b31 100644 --- a/src/newgrf/newgrf_act0_globalvar.cpp +++ b/src/newgrf/newgrf_act0_globalvar.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_globalvar.cpp NewGRF Action 0x00 handler for global variables. */ diff --git a/src/newgrf/newgrf_act0_houses.cpp b/src/newgrf/newgrf_act0_houses.cpp index c73ff6fd6e..7e7bb145d8 100644 --- a/src/newgrf/newgrf_act0_houses.cpp +++ b/src/newgrf/newgrf_act0_houses.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_houses.cpp NewGRF Action 0x00 handler for houses. */ diff --git a/src/newgrf/newgrf_act0_industries.cpp b/src/newgrf/newgrf_act0_industries.cpp index a0f9449e66..9d385a30de 100644 --- a/src/newgrf/newgrf_act0_industries.cpp +++ b/src/newgrf/newgrf_act0_industries.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_industries.cpp NewGRF Action 0x00 handler for industries and industrytiles. */ diff --git a/src/newgrf/newgrf_act0_objects.cpp b/src/newgrf/newgrf_act0_objects.cpp index 4a61e11661..1ec6fa5eeb 100644 --- a/src/newgrf/newgrf_act0_objects.cpp +++ b/src/newgrf/newgrf_act0_objects.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_objects.cpp NewGRF Action 0x00 handler for objects. */ diff --git a/src/newgrf/newgrf_act0_railtypes.cpp b/src/newgrf/newgrf_act0_railtypes.cpp index d37a3684ec..1b3b75e739 100644 --- a/src/newgrf/newgrf_act0_railtypes.cpp +++ b/src/newgrf/newgrf_act0_railtypes.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_railtypes.cpp NewGRF Action 0x00 handler for railtypes. */ diff --git a/src/newgrf/newgrf_act0_roadstops.cpp b/src/newgrf/newgrf_act0_roadstops.cpp index 7c54d12cc9..fe407af08f 100644 --- a/src/newgrf/newgrf_act0_roadstops.cpp +++ b/src/newgrf/newgrf_act0_roadstops.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_roadstops.cpp NewGRF Action 0x00 handler for roadstops. */ diff --git a/src/newgrf/newgrf_act0_roadtypes.cpp b/src/newgrf/newgrf_act0_roadtypes.cpp index 4fa5746ce9..72f58e2e6e 100644 --- a/src/newgrf/newgrf_act0_roadtypes.cpp +++ b/src/newgrf/newgrf_act0_roadtypes.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_roadtypes.cpp NewGRF Action 0x00 handler for roadtypes. */ diff --git a/src/newgrf/newgrf_act0_roadvehs.cpp b/src/newgrf/newgrf_act0_roadvehs.cpp index 34fd862c98..17e8b7a23a 100644 --- a/src/newgrf/newgrf_act0_roadvehs.cpp +++ b/src/newgrf/newgrf_act0_roadvehs.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_roadvehs.cpp NewGRF Action 0x00 handler for road vehicles. */ diff --git a/src/newgrf/newgrf_act0_ships.cpp b/src/newgrf/newgrf_act0_ships.cpp index 3b9c32b15c..f5f2c902b8 100644 --- a/src/newgrf/newgrf_act0_ships.cpp +++ b/src/newgrf/newgrf_act0_ships.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_ships.cpp NewGRF Action 0x00 handler for ships. */ diff --git a/src/newgrf/newgrf_act0_sounds.cpp b/src/newgrf/newgrf_act0_sounds.cpp index a80699d41d..5318e9be82 100644 --- a/src/newgrf/newgrf_act0_sounds.cpp +++ b/src/newgrf/newgrf_act0_sounds.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_sounds.cpp NewGRF Action 0x00 handler for sounds. */ diff --git a/src/newgrf/newgrf_act0_stations.cpp b/src/newgrf/newgrf_act0_stations.cpp index b6e8f4c5d9..5e129d27ea 100644 --- a/src/newgrf/newgrf_act0_stations.cpp +++ b/src/newgrf/newgrf_act0_stations.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_stations.cpp NewGRF Action 0x00 handler for stations. */ diff --git a/src/newgrf/newgrf_act0_trains.cpp b/src/newgrf/newgrf_act0_trains.cpp index 0e44e3a1b5..fe33efa9e3 100644 --- a/src/newgrf/newgrf_act0_trains.cpp +++ b/src/newgrf/newgrf_act0_trains.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act0_trains.cpp NewGRF Action 0x00 handler for trains. */ diff --git a/src/newgrf/newgrf_act1.cpp b/src/newgrf/newgrf_act1.cpp index ae1a05ba6b..db53d19d4b 100644 --- a/src/newgrf/newgrf_act1.cpp +++ b/src/newgrf/newgrf_act1.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act1.cpp NewGRF Action 0x01 handler. */ diff --git a/src/newgrf/newgrf_act10.cpp b/src/newgrf/newgrf_act10.cpp index 7c41d7cb0c..1da87bf831 100644 --- a/src/newgrf/newgrf_act10.cpp +++ b/src/newgrf/newgrf_act10.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act10.cpp NewGRF Action 0x10 handler. */ diff --git a/src/newgrf/newgrf_act11.cpp b/src/newgrf/newgrf_act11.cpp index e923fcfe28..5721df8b5d 100644 --- a/src/newgrf/newgrf_act11.cpp +++ b/src/newgrf/newgrf_act11.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act11.cpp NewGRF Action 0x11 handler. */ diff --git a/src/newgrf/newgrf_act12.cpp b/src/newgrf/newgrf_act12.cpp index 124d2f1afe..1ade003b87 100644 --- a/src/newgrf/newgrf_act12.cpp +++ b/src/newgrf/newgrf_act12.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act12.cpp NewGRF Action 0x12 handler. */ diff --git a/src/newgrf/newgrf_act13.cpp b/src/newgrf/newgrf_act13.cpp index d9bcab51e7..281c81e2ae 100644 --- a/src/newgrf/newgrf_act13.cpp +++ b/src/newgrf/newgrf_act13.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act13.cpp NewGRF Action 0x13 handler. */ diff --git a/src/newgrf/newgrf_act14.cpp b/src/newgrf/newgrf_act14.cpp index 824cb58905..16090d999e 100644 --- a/src/newgrf/newgrf_act14.cpp +++ b/src/newgrf/newgrf_act14.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act14.cpp NewGRF Action 0x14 handler. */ diff --git a/src/newgrf/newgrf_act2.cpp b/src/newgrf/newgrf_act2.cpp index 5b1e61ab4b..abf656af59 100644 --- a/src/newgrf/newgrf_act2.cpp +++ b/src/newgrf/newgrf_act2.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act2.cpp NewGRF Action 0x02 handler. */ diff --git a/src/newgrf/newgrf_act3.cpp b/src/newgrf/newgrf_act3.cpp index 3ec90c87b7..f9e20c3d6e 100644 --- a/src/newgrf/newgrf_act3.cpp +++ b/src/newgrf/newgrf_act3.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act3.cpp NewGRF Action 0x03 handler. */ diff --git a/src/newgrf/newgrf_act4.cpp b/src/newgrf/newgrf_act4.cpp index f0559a13f2..7555448f4b 100644 --- a/src/newgrf/newgrf_act4.cpp +++ b/src/newgrf/newgrf_act4.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act4.cpp NewGRF Action 0x04 handler. */ diff --git a/src/newgrf/newgrf_act5.cpp b/src/newgrf/newgrf_act5.cpp index efa1f99d2a..80bdad715a 100644 --- a/src/newgrf/newgrf_act5.cpp +++ b/src/newgrf/newgrf_act5.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act5.cpp NewGRF Action 0x05 handler. */ diff --git a/src/newgrf/newgrf_act6.cpp b/src/newgrf/newgrf_act6.cpp index a30dcb2092..28deb7f2aa 100644 --- a/src/newgrf/newgrf_act6.cpp +++ b/src/newgrf/newgrf_act6.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act6.cpp NewGRF Action 0x06 handler. */ diff --git a/src/newgrf/newgrf_act7_9.cpp b/src/newgrf/newgrf_act7_9.cpp index 42c929e105..66438bcbbe 100644 --- a/src/newgrf/newgrf_act7_9.cpp +++ b/src/newgrf/newgrf_act7_9.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act7_9.cpp NewGRF Action 0x07 and Action 0x09 handler. */ diff --git a/src/newgrf/newgrf_act8.cpp b/src/newgrf/newgrf_act8.cpp index 129377e15a..469510a1a0 100644 --- a/src/newgrf/newgrf_act8.cpp +++ b/src/newgrf/newgrf_act8.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act8.cpp NewGRF Action 0x08 handler. */ diff --git a/src/newgrf/newgrf_acta.cpp b/src/newgrf/newgrf_acta.cpp index ba4e509bc4..0d46787b95 100644 --- a/src/newgrf/newgrf_acta.cpp +++ b/src/newgrf/newgrf_acta.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_acta.cpp NewGRF Action 0x0A handler. */ diff --git a/src/newgrf/newgrf_actb.cpp b/src/newgrf/newgrf_actb.cpp index 11a3f7e322..ee2615f838 100644 --- a/src/newgrf/newgrf_actb.cpp +++ b/src/newgrf/newgrf_actb.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_actb.cpp NewGRF Action 0x0B handler. */ diff --git a/src/newgrf/newgrf_actc.cpp b/src/newgrf/newgrf_actc.cpp index 3a38d9f7db..f4c1b06301 100644 --- a/src/newgrf/newgrf_actc.cpp +++ b/src/newgrf/newgrf_actc.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_actc.cpp NewGRF Action 0x0C handler. */ diff --git a/src/newgrf/newgrf_actd.cpp b/src/newgrf/newgrf_actd.cpp index 8231c9a192..38e727f5cb 100644 --- a/src/newgrf/newgrf_actd.cpp +++ b/src/newgrf/newgrf_actd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_actd.cpp NewGRF Action 0x0D handler. */ diff --git a/src/newgrf/newgrf_acte.cpp b/src/newgrf/newgrf_acte.cpp index fdd923ce7b..22953f5cdb 100644 --- a/src/newgrf/newgrf_acte.cpp +++ b/src/newgrf/newgrf_acte.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_acte.cpp NewGRF Action 0x0E handler. */ diff --git a/src/newgrf/newgrf_actf.cpp b/src/newgrf/newgrf_actf.cpp index 473ab023c6..ae8ace2dd0 100644 --- a/src/newgrf/newgrf_actf.cpp +++ b/src/newgrf/newgrf_actf.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_actf.cpp NewGRF Action 0x0F handler. */ diff --git a/src/newgrf/newgrf_bytereader.cpp b/src/newgrf/newgrf_bytereader.cpp index cd1a5098aa..4f265398c3 100644 --- a/src/newgrf/newgrf_bytereader.cpp +++ b/src/newgrf/newgrf_bytereader.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_bytereader.cpp NewGRF byte buffer reader implementation. */ diff --git a/src/newgrf/newgrf_bytereader.h b/src/newgrf/newgrf_bytereader.h index 69553ed884..73898886e3 100644 --- a/src/newgrf/newgrf_bytereader.h +++ b/src/newgrf/newgrf_bytereader.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_bytereader.h NewGRF buffer reader definition. */ diff --git a/src/newgrf/newgrf_internal.h b/src/newgrf/newgrf_internal.h index d4001219ec..287d513b45 100644 --- a/src/newgrf/newgrf_internal.h +++ b/src/newgrf/newgrf_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_internal.h NewGRF internal processing state. */ diff --git a/src/newgrf/newgrf_internal_vehicle.h b/src/newgrf/newgrf_internal_vehicle.h index 05a35b286a..40d477d328 100644 --- a/src/newgrf/newgrf_internal_vehicle.h +++ b/src/newgrf/newgrf_internal_vehicle.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_internal_vehicle.h NewGRF internal processing state for vehicles. */ diff --git a/src/newgrf/newgrf_stringmapping.cpp b/src/newgrf/newgrf_stringmapping.cpp index 3de9b7c993..9ddda48782 100644 --- a/src/newgrf/newgrf_stringmapping.cpp +++ b/src/newgrf/newgrf_stringmapping.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_stringmapping.cpp NewGRF string mapping implementation. */ diff --git a/src/newgrf/newgrf_stringmapping.h b/src/newgrf/newgrf_stringmapping.h index fdae5d7763..3396d5caed 100644 --- a/src/newgrf/newgrf_stringmapping.h +++ b/src/newgrf/newgrf_stringmapping.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_stringmapping.h NewGRF string mapping definition. */ diff --git a/src/newgrf_act5.h b/src/newgrf_act5.h index 4290ba1455..506352ceda 100644 --- a/src/newgrf_act5.h +++ b/src/newgrf_act5.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_act5.h Information about NewGRF Action 5. */ diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp index 3a47007a20..2188793a66 100644 --- a/src/newgrf_airport.cpp +++ b/src/newgrf_airport.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_airport.cpp NewGRF handling of airports. */ diff --git a/src/newgrf_airport.h b/src/newgrf_airport.h index b6ac05ab0a..55494bf978 100644 --- a/src/newgrf_airport.h +++ b/src/newgrf_airport.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_airport.h NewGRF handling of airports. */ diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index bc2520718a..5f8e579a49 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_airporttiles.cpp NewGRF handling of airport tiles. */ diff --git a/src/newgrf_airporttiles.h b/src/newgrf_airporttiles.h index 34b37cf5e7..d8fd625911 100644 --- a/src/newgrf_airporttiles.h +++ b/src/newgrf_airporttiles.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_airporttiles.h NewGRF handling of airport tiles. */ diff --git a/src/newgrf_animation_base.h b/src/newgrf_animation_base.h index c601179a70..892bca230a 100644 --- a/src/newgrf_animation_base.h +++ b/src/newgrf_animation_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_animation_base.h Function implementations related to NewGRF animation. */ diff --git a/src/newgrf_animation_type.h b/src/newgrf_animation_type.h index 1796c6bdc4..4a67322416 100644 --- a/src/newgrf_animation_type.h +++ b/src/newgrf_animation_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_animation_type.h Definitions related to NewGRF animation. */ diff --git a/src/newgrf_badge.cpp b/src/newgrf_badge.cpp index ba9e803ac0..4e0aa97f84 100644 --- a/src/newgrf_badge.cpp +++ b/src/newgrf_badge.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge.cpp Functionality for NewGRF badges. */ diff --git a/src/newgrf_badge.h b/src/newgrf_badge.h index f08882351a..63137f27b1 100644 --- a/src/newgrf_badge.h +++ b/src/newgrf_badge.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge.h Functions related to NewGRF badges. */ diff --git a/src/newgrf_badge_config.cpp b/src/newgrf_badge_config.cpp index c97d8427bd..5e55515114 100644 --- a/src/newgrf_badge_config.cpp +++ b/src/newgrf_badge_config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge_config.cpp Functionality for NewGRF badge configuration. */ diff --git a/src/newgrf_badge_config.h b/src/newgrf_badge_config.h index 3a4069022c..cbd3d8191e 100644 --- a/src/newgrf_badge_config.h +++ b/src/newgrf_badge_config.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge_config.h Functions related to NewGRF badge configuration. */ diff --git a/src/newgrf_badge_gui.cpp b/src/newgrf_badge_gui.cpp index f2cf6f45ca..ac0f0b5ff6 100644 --- a/src/newgrf_badge_gui.cpp +++ b/src/newgrf_badge_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge.cpp Functionality for NewGRF badges. */ diff --git a/src/newgrf_badge_gui.h b/src/newgrf_badge_gui.h index 2ac8ba66a2..d6a5817171 100644 --- a/src/newgrf_badge_gui.h +++ b/src/newgrf_badge_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge_gui.h GUI functions related to NewGRF badges. */ diff --git a/src/newgrf_badge_type.h b/src/newgrf_badge_type.h index 59864c20af..aff2a47857 100644 --- a/src/newgrf_badge_type.h +++ b/src/newgrf_badge_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_badge_type.h Types related to NewGRF badges. */ diff --git a/src/newgrf_callbacks.h b/src/newgrf_callbacks.h index 5c12e003af..cbdece5f98 100644 --- a/src/newgrf_callbacks.h +++ b/src/newgrf_callbacks.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_callbacks.h Callbacks that NewGRFs could implement. */ diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp index dd7656164f..480ab519a0 100644 --- a/src/newgrf_canal.cpp +++ b/src/newgrf_canal.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_canal.cpp Implementation of NewGRF canals. */ diff --git a/src/newgrf_canal.h b/src/newgrf_canal.h index 547d8a6b8b..586c033588 100644 --- a/src/newgrf_canal.h +++ b/src/newgrf_canal.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_canal.h Handling of NewGRF canals. */ diff --git a/src/newgrf_cargo.cpp b/src/newgrf_cargo.cpp index 0fa5f6cb70..e8b5fd9fde 100644 --- a/src/newgrf_cargo.cpp +++ b/src/newgrf_cargo.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_cargo.cpp Implementation of NewGRF cargoes. */ diff --git a/src/newgrf_cargo.h b/src/newgrf_cargo.h index b0a723e697..15d14a5ecb 100644 --- a/src/newgrf_cargo.h +++ b/src/newgrf_cargo.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_cargo.h Cargo support for NewGRFs. */ diff --git a/src/newgrf_class.h b/src/newgrf_class.h index e206ad0004..8eb43d5fd7 100644 --- a/src/newgrf_class.h +++ b/src/newgrf_class.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_class.h Header file for classes to be used by e.g. NewGRF stations and airports */ diff --git a/src/newgrf_class_func.h b/src/newgrf_class_func.h index 783bb99a3d..ac076d3fe8 100644 --- a/src/newgrf_class_func.h +++ b/src/newgrf_class_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_class_func.h Implementation of the NewGRF class' functions. */ diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index c25d13fefe..7dedfe03dc 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/newgrf_commons.h b/src/newgrf_commons.h index 4c23d5c1fc..6b6493dc1d 100644 --- a/src/newgrf_commons.h +++ b/src/newgrf_commons.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp index 422fd57f4c..e524fdefc3 100644 --- a/src/newgrf_config.cpp +++ b/src/newgrf_config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_config.cpp Finding NewGRFs and configuring them. */ diff --git a/src/newgrf_config.h b/src/newgrf_config.h index 8b03088f96..4f68bc9bec 100644 --- a/src/newgrf_config.h +++ b/src/newgrf_config.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_config.h Functions to find and configure NewGRFs. */ diff --git a/src/newgrf_debug.h b/src/newgrf_debug.h index 141415884b..5202c2b131 100644 --- a/src/newgrf_debug.h +++ b/src/newgrf_debug.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_debug.h Functions/types related to NewGRF debugging. */ diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index f7b7b37ff9..79d977c59d 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_debug_gui.cpp GUIs for debugging NewGRFs. */ diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp index 4e2fda03e6..88566a871f 100644 --- a/src/newgrf_engine.cpp +++ b/src/newgrf_engine.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_engine.cpp NewGRF handling of engines. */ diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h index 912fba67b6..e85f12e0fa 100644 --- a/src/newgrf_engine.h +++ b/src/newgrf_engine.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_engine.h Functions for NewGRF engines. */ diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp index aa90b313e2..3b4f283f9f 100644 --- a/src/newgrf_generic.cpp +++ b/src/newgrf_generic.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_generic.cpp Handling of generic feature callbacks. */ diff --git a/src/newgrf_generic.h b/src/newgrf_generic.h index 0ea88c4996..73ea38ce54 100644 --- a/src/newgrf_generic.h +++ b/src/newgrf_generic.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_generic.h Functions related to generic callbacks. */ diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp index 60d7b70f08..1d1d409020 100644 --- a/src/newgrf_gui.cpp +++ b/src/newgrf_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_gui.cpp GUI to change NewGRF settings. */ diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 565927aaa7..928cbc20be 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_house.cpp Implementation of NewGRF houses. */ diff --git a/src/newgrf_house.h b/src/newgrf_house.h index 56fbdb1dd0..c8edad4d09 100644 --- a/src/newgrf_house.h +++ b/src/newgrf_house.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_house.h Functions related to NewGRF houses. */ diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index 5a1fb6b80f..da314cc055 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_industries.cpp Handling of NewGRF industries. */ diff --git a/src/newgrf_industries.h b/src/newgrf_industries.h index 16444fd2ea..02d6029ccf 100644 --- a/src/newgrf_industries.h +++ b/src/newgrf_industries.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_industries.h Functions for NewGRF industries. */ diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp index 1c73b14b62..ab8df73bf9 100644 --- a/src/newgrf_industrytiles.cpp +++ b/src/newgrf_industrytiles.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_industrytiles.cpp NewGRF handling of industry tiles. */ diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h index 273e61e507..aa1723a155 100644 --- a/src/newgrf_industrytiles.h +++ b/src/newgrf_industrytiles.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_industrytiles.h NewGRF handling of industry tiles. */ diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 52963dc007..bd6ecc1111 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_object.cpp Handling of object NewGRFs. */ diff --git a/src/newgrf_object.h b/src/newgrf_object.h index e49d355576..6c32a08b6a 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_object.h Functions related to NewGRF objects. */ diff --git a/src/newgrf_profiling.cpp b/src/newgrf_profiling.cpp index 228e1764fc..d46baf83a1 100644 --- a/src/newgrf_profiling.cpp +++ b/src/newgrf_profiling.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_profiling.cpp Profiling of NewGRF action 2 handling. */ diff --git a/src/newgrf_profiling.h b/src/newgrf_profiling.h index 89b1222cc9..30f4e0a6cc 100644 --- a/src/newgrf_profiling.h +++ b/src/newgrf_profiling.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_profiling.h Profiling of NewGRF action 2 handling. */ diff --git a/src/newgrf_properties.h b/src/newgrf_properties.h index 4d4a31a983..f0fbf06843 100644 --- a/src/newgrf_properties.h +++ b/src/newgrf_properties.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_properties.h Properties of NewGRF Action 0. */ diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp index 67754addb2..306e4cfe5d 100644 --- a/src/newgrf_railtype.cpp +++ b/src/newgrf_railtype.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_railtype.cpp NewGRF handling of rail types. */ diff --git a/src/newgrf_railtype.h b/src/newgrf_railtype.h index e0d36349ca..562b7529c0 100644 --- a/src/newgrf_railtype.h +++ b/src/newgrf_railtype.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_railtype.h NewGRF handling of rail types. */ diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index f093c0b2b4..70230b1290 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 command.cpp Handling of NewGRF road stops. */ diff --git a/src/newgrf_roadstop.h b/src/newgrf_roadstop.h index 73fa2e9db6..3c94ce9578 100644 --- a/src/newgrf_roadstop.h +++ b/src/newgrf_roadstop.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/newgrf_roadtype.cpp b/src/newgrf_roadtype.cpp index 6b40a1e0d8..440a4c75d9 100644 --- a/src/newgrf_roadtype.cpp +++ b/src/newgrf_roadtype.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_roadtype.cpp NewGRF handling of road types. */ diff --git a/src/newgrf_roadtype.h b/src/newgrf_roadtype.h index e0fc039856..a85416d477 100644 --- a/src/newgrf_roadtype.h +++ b/src/newgrf_roadtype.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_roadtype.h NewGRF handling of road types. */ diff --git a/src/newgrf_sound.cpp b/src/newgrf_sound.cpp index 48958dcf68..ef8b75f30f 100644 --- a/src/newgrf_sound.cpp +++ b/src/newgrf_sound.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_sound.cpp Handling NewGRF provided sounds. */ diff --git a/src/newgrf_sound.h b/src/newgrf_sound.h index 9e33377258..6505b3f55e 100644 --- a/src/newgrf_sound.h +++ b/src/newgrf_sound.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_sound.h Functions related to NewGRF provided sounds. */ diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 2a904b2916..a5c5d07408 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_spritegroup.cpp Handling of primarily NewGRF action 2. */ diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index c84f3292df..dc20f33d21 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_spritegroup.h Action 2 handling. */ diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp index b5b5997dba..14fb57f2d4 100644 --- a/src/newgrf_station.cpp +++ b/src/newgrf_station.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_station.cpp Functions for dealing with station classes and custom stations. */ diff --git a/src/newgrf_station.h b/src/newgrf_station.h index 990f0bc4a9..2291200932 100644 --- a/src/newgrf_station.h +++ b/src/newgrf_station.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_station.h Header file for NewGRF stations */ diff --git a/src/newgrf_storage.cpp b/src/newgrf_storage.cpp index 6c224c447f..76074397e5 100644 --- a/src/newgrf_storage.cpp +++ b/src/newgrf_storage.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_storage.cpp Functionality related to the temporary and persistent storage arrays for NewGRFs. */ diff --git a/src/newgrf_storage.h b/src/newgrf_storage.h index 85f8047d79..c582409aca 100644 --- a/src/newgrf_storage.h +++ b/src/newgrf_storage.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_storage.h Functionality related to the temporary and persistent storage arrays for NewGRFs. */ diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp index b62a7d872f..83ffee7238 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/newgrf_text.h b/src/newgrf_text.h index 9bf2b98440..275c2e315a 100644 --- a/src/newgrf_text.h +++ b/src/newgrf_text.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_text.h Header of Action 04 "universal holder" structure and functions */ diff --git a/src/newgrf_text_type.h b/src/newgrf_text_type.h index 46a7b49265..a89df56de9 100644 --- a/src/newgrf_text_type.h +++ b/src/newgrf_text_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_text_type.h Header of Action 04 "universal holder" structure */ diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index 370769cde6..d429204e38 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_town.cpp Implementation of the town part of NewGRF houses. */ diff --git a/src/newgrf_town.h b/src/newgrf_town.h index b8bdb1f061..d3f44dfd69 100644 --- a/src/newgrf_town.h +++ b/src/newgrf_town.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_town.h Functions to handle the town part of NewGRF towns. */ diff --git a/src/newgrf_townname.cpp b/src/newgrf_townname.cpp index a1a3e1072e..cea42fea61 100644 --- a/src/newgrf_townname.cpp +++ b/src/newgrf_townname.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/newgrf_townname.h b/src/newgrf_townname.h index 2371f2faf2..f26ce3af42 100644 --- a/src/newgrf_townname.h +++ b/src/newgrf_townname.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/news_cmd.h b/src/news_cmd.h index c84c29e141..eb800167b8 100644 --- a/src/news_cmd.h +++ b/src/news_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 news_cmd.h Command definitions related to news messages. */ diff --git a/src/news_func.h b/src/news_func.h index d1d5b69ac3..2d35d22d75 100644 --- a/src/news_func.h +++ b/src/news_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 news_func.h Functions related to news. */ diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 8e63a624b7..9f92375e9b 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 news_gui.cpp GUI functions related to news messages. */ diff --git a/src/news_gui.h b/src/news_gui.h index c7fea6cebd..596982f882 100644 --- a/src/news_gui.h +++ b/src/news_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 news_gui.h GUI functions related to the news. */ diff --git a/src/news_type.h b/src/news_type.h index 11d932ced6..a8eeb30f62 100644 --- a/src/news_type.h +++ b/src/news_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 news_type.h Types related to news. */ diff --git a/src/object.h b/src/object.h index 0a6c33423c..371d4e34de 100644 --- a/src/object.h +++ b/src/object.h @@ -2,7 +2,7 @@ * 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 . + * 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 object.h Functions related to objects. */ diff --git a/src/object_base.h b/src/object_base.h index 3f87fa429f..d51e29e63b 100644 --- a/src/object_base.h +++ b/src/object_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_base.h Base for all objects. */ diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index a70b44cbe0..2cbe976002 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 object_cmd.cpp Handling of object tiles. */ diff --git a/src/object_cmd.h b/src/object_cmd.h index 048b3c6dfd..b7c32241bb 100644 --- a/src/object_cmd.h +++ b/src/object_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_cmd.h Command definitions related to objects. */ diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 76ba2f1199..6aafbc4218 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 object_gui.cpp The GUI for objects. */ diff --git a/src/object_map.h b/src/object_map.h index d997b673c0..b168e7fd51 100644 --- a/src/object_map.h +++ b/src/object_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_map.h Map accessors for object tiles. */ diff --git a/src/object_type.h b/src/object_type.h index fe5137d79a..ed011b2407 100644 --- a/src/object_type.h +++ b/src/object_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_type.h Types related to object tiles. */ diff --git a/src/openttd.cpp b/src/openttd.cpp index 1a3cd0c4c7..7d585b09e0 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 openttd.cpp Functions related to starting OpenTTD. */ diff --git a/src/openttd.h b/src/openttd.h index 340f279d08..b991fcb116 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -2,7 +2,7 @@ * 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 . + * 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 openttd.h Some generic types. */ diff --git a/src/order_backup.cpp b/src/order_backup.cpp index 2bd2032956..abd18ef1f4 100644 --- a/src/order_backup.cpp +++ b/src/order_backup.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 order_backup.cpp Handling of order backups. */ diff --git a/src/order_backup.h b/src/order_backup.h index edeaf85e30..a4de4eb7bd 100644 --- a/src/order_backup.h +++ b/src/order_backup.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_backup.h Functions related to order backups. */ diff --git a/src/order_base.h b/src/order_base.h index ad138fd947..8b67756200 100644 --- a/src/order_base.h +++ b/src/order_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_base.h Base class for orders. */ diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 09f1bb680e..2c6dafca8e 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 order_cmd.cpp Handling of orders. */ diff --git a/src/order_cmd.h b/src/order_cmd.h index 405a0e8c95..9c341c8c71 100644 --- a/src/order_cmd.h +++ b/src/order_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_cmd.h Command definitions related to orders. */ diff --git a/src/order_func.h b/src/order_func.h index ff7d865f1a..ee1d430eb4 100644 --- a/src/order_func.h +++ b/src/order_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_func.h Functions related to orders. */ diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 97b8a77fb0..5406d060cc 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 order_gui.cpp GUI related to orders. */ diff --git a/src/order_type.h b/src/order_type.h index ddfef37749..4ea010d015 100644 --- a/src/order_type.h +++ b/src/order_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_type.h Types related to orders. */ diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index c22f602286..c3135e97a5 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 crashlog_osx.cpp OS X crash log handler */ diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index 58e46fbd50..c022479a83 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 font_osx.cpp Functions related to font handling on MacOS. */ diff --git a/src/os/macosx/font_osx.h b/src/os/macosx/font_osx.h index 48de29d62e..9739613e16 100644 --- a/src/os/macosx/font_osx.h +++ b/src/os/macosx/font_osx.h @@ -2,7 +2,7 @@ * 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 . + * 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 font_osx.h Functions related to font handling on MacOS. */ diff --git a/src/os/macosx/macos.h b/src/os/macosx/macos.h index 5c9e6a52a9..5b471e43cc 100644 --- a/src/os/macosx/macos.h +++ b/src/os/macosx/macos.h @@ -2,7 +2,7 @@ * 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 . + * 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 macos.h Functions related to MacOS support. */ diff --git a/src/os/macosx/macos.mm b/src/os/macosx/macos.mm index d644d1232b..6c17103916 100644 --- a/src/os/macosx/macos.mm +++ b/src/os/macosx/macos.mm @@ -2,7 +2,7 @@ * 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 . + * 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 macos.mm Code related to MacOSX. */ diff --git a/src/os/macosx/osx_main.cpp b/src/os/macosx/osx_main.cpp index 12385d072d..61c39d35b9 100644 --- a/src/os/macosx/osx_main.cpp +++ b/src/os/macosx/osx_main.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 unix_main.cpp Main entry for Mac OSX. */ diff --git a/src/os/macosx/osx_stdafx.h b/src/os/macosx/osx_stdafx.h index c8de60e22f..3139c5e7f9 100644 --- a/src/os/macosx/osx_stdafx.h +++ b/src/os/macosx/osx_stdafx.h @@ -2,7 +2,7 @@ * 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 . + * 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 osx_stdafx.h OSX is different on some places. */ diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index ed43d8cbba..1e7ad14b21 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_osx.cpp Functions related to localized text support on OSX. */ diff --git a/src/os/macosx/string_osx.h b/src/os/macosx/string_osx.h index 973bf05b3d..7a8e9f6cf0 100644 --- a/src/os/macosx/string_osx.h +++ b/src/os/macosx/string_osx.h @@ -2,7 +2,7 @@ * 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 . + * 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 string_osx.h Functions related to localized text support on OSX. */ diff --git a/src/os/macosx/survey_osx.cpp b/src/os/macosx/survey_osx.cpp index 2a3999936b..2050d29f10 100644 --- a/src/os/macosx/survey_osx.cpp +++ b/src/os/macosx/survey_osx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 survey_osx.cpp OSX implementation of OS-specific survey information. */ diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index 9ec7d70a5e..4b1ef6c717 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 crashlog_unix.cpp Unix crash log handler */ diff --git a/src/os/unix/font_unix.cpp b/src/os/unix/font_unix.cpp index 3fa88cefc5..5db3313fe4 100644 --- a/src/os/unix/font_unix.cpp +++ b/src/os/unix/font_unix.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 font_unix.cpp Functions related to font handling on Unix/Fontconfig. */ diff --git a/src/os/unix/font_unix.h b/src/os/unix/font_unix.h index 37392d800d..b2044fe6e9 100644 --- a/src/os/unix/font_unix.h +++ b/src/os/unix/font_unix.h @@ -2,7 +2,7 @@ * 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 . + * 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 font_unix.h Functions related to detecting/finding the right font. */ diff --git a/src/os/unix/library_loader_unix.cpp b/src/os/unix/library_loader_unix.cpp index 471f1faa2a..596080596c 100644 --- a/src/os/unix/library_loader_unix.cpp +++ b/src/os/unix/library_loader_unix.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 library_loader_unix.cpp Implementation of the LibraryLoader for Linux / MacOS */ diff --git a/src/os/unix/survey_unix.cpp b/src/os/unix/survey_unix.cpp index d1f07d116f..eac85c7fb8 100644 --- a/src/os/unix/survey_unix.cpp +++ b/src/os/unix/survey_unix.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 survey_unix.cpp Unix implementation of OS-specific survey information. */ diff --git a/src/os/unix/unix.cpp b/src/os/unix/unix.cpp index 5bc89cceac..6032756ac2 100644 --- a/src/os/unix/unix.cpp +++ b/src/os/unix/unix.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 unix.cpp Implementation of Unix specific file handling. */ diff --git a/src/os/unix/unix_main.cpp b/src/os/unix/unix_main.cpp index 046a46d2b5..93b57fac8b 100644 --- a/src/os/unix/unix_main.cpp +++ b/src/os/unix/unix_main.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 unix_main.cpp Main entry for Unix. */ diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 9adc822c41..1039b68737 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 crashlog_win.cpp Implementation of a crashlogger for Windows */ diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index d3a4c7be17..a18be2da38 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 font_win32.cpp Functions related to font handling on Win32. */ diff --git a/src/os/windows/font_win32.h b/src/os/windows/font_win32.h index cf4d661f92..46cf022e37 100644 --- a/src/os/windows/font_win32.h +++ b/src/os/windows/font_win32.h @@ -2,7 +2,7 @@ * 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 . + * 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 font_win32.h Functions related to font handling on Win32. */ diff --git a/src/os/windows/library_loader_win.cpp b/src/os/windows/library_loader_win.cpp index 608b9349c9..1f96284fac 100644 --- a/src/os/windows/library_loader_win.cpp +++ b/src/os/windows/library_loader_win.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 library_loader_win.cpp Implementation of the LibraryLoader for Windows */ diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index 1ce0ad309d..ef07a47082 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -2,7 +2,7 @@ // 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 . +// 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 . // ///////////////////////////////////////////////////////////////////////////// // diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp index 9ad373cfa0..89e9045e22 100644 --- a/src/os/windows/string_uniscribe.cpp +++ b/src/os/windows/string_uniscribe.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_uniscribe.cpp Functions related to laying out text on Win32. */ diff --git a/src/os/windows/string_uniscribe.h b/src/os/windows/string_uniscribe.h index 309f59eb1b..d598fd704b 100644 --- a/src/os/windows/string_uniscribe.h +++ b/src/os/windows/string_uniscribe.h @@ -2,7 +2,7 @@ * 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 . + * 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 string_uniscribe.h Functions related to laying out text on Win32. */ diff --git a/src/os/windows/survey_win.cpp b/src/os/windows/survey_win.cpp index a5d21ea600..0689794903 100644 --- a/src/os/windows/survey_win.cpp +++ b/src/os/windows/survey_win.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 survey_win.cpp Windows implementation of OS-specific survey information. */ diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 2e005d2e9b..a51074f4a4 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 win32.cpp Implementation of MS Windows system calls */ diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h index 8f4d8bd06b..c0fdbec665 100644 --- a/src/os/windows/win32.h +++ b/src/os/windows/win32.h @@ -2,7 +2,7 @@ * 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 . + * 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 win32.h declarations of functions for MS windows systems */ diff --git a/src/os/windows/win32_main.cpp b/src/os/windows/win32_main.cpp index 7a1c275fc3..c5e84ba96f 100644 --- a/src/os/windows/win32_main.cpp +++ b/src/os/windows/win32_main.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 win32_main.cpp Implementation main for Windows. */ diff --git a/src/osk_gui.cpp b/src/osk_gui.cpp index cddf84e884..1713e486a2 100644 --- a/src/osk_gui.cpp +++ b/src/osk_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 osk_gui.cpp The On Screen Keyboard GUI */ diff --git a/src/palette.cpp b/src/palette.cpp index 11d8e57777..c04f8c6e26 100644 --- a/src/palette.cpp +++ b/src/palette.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 palette.cpp Handling of palettes. */ diff --git a/src/palette_func.h b/src/palette_func.h index a5e7dda44c..0e63cb4a47 100644 --- a/src/palette_func.h +++ b/src/palette_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 palette_func.h Functions related to palettes. */ diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp index c5a81c1d4b..4fdab63347 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 follow_track.hpp Template function for track followers */ diff --git a/src/pathfinder/pathfinder_func.h b/src/pathfinder/pathfinder_func.h index 7d37917b2d..553c957609 100644 --- a/src/pathfinder/pathfinder_func.h +++ b/src/pathfinder/pathfinder_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 pathfinder_func.h General functions related to pathfinders. */ diff --git a/src/pathfinder/pathfinder_type.h b/src/pathfinder/pathfinder_type.h index 93b2561d32..e52cd88c10 100644 --- a/src/pathfinder/pathfinder_type.h +++ b/src/pathfinder/pathfinder_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 pathfinder_type.h General types related to pathfinders. */ diff --git a/src/pathfinder/water_regions.cpp b/src/pathfinder/water_regions.cpp index 52b460d7b1..e725401f52 100644 --- a/src/pathfinder/water_regions.cpp +++ b/src/pathfinder/water_regions.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 water_regions.cpp Handles dividing the water in the map into square regions to assist pathfinding. */ diff --git a/src/pathfinder/water_regions.h b/src/pathfinder/water_regions.h index 0e93f2dbbd..cbb39fbc77 100644 --- a/src/pathfinder/water_regions.h +++ b/src/pathfinder/water_regions.h @@ -2,7 +2,7 @@ * 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 . + * 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 water_regions.h Handles dividing the water in the map into regions to assist pathfinding. */ diff --git a/src/pathfinder/yapf/nodelist.hpp b/src/pathfinder/yapf/nodelist.hpp index cf5a476e4d..fbb639a492 100644 --- a/src/pathfinder/yapf/nodelist.hpp +++ b/src/pathfinder/yapf/nodelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 nodelist.hpp List of nodes used for the A-star pathfinder. */ diff --git a/src/pathfinder/yapf/yapf.h b/src/pathfinder/yapf/yapf.h index 186986ce57..62789f9fb2 100644 --- a/src/pathfinder/yapf/yapf.h +++ b/src/pathfinder/yapf/yapf.h @@ -2,7 +2,7 @@ * 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 . + * 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 yapf.h Entry point for OpenTTD to YAPF. */ diff --git a/src/pathfinder/yapf/yapf.hpp b/src/pathfinder/yapf/yapf.hpp index db8508fdcd..bcbdec4791 100644 --- a/src/pathfinder/yapf/yapf.hpp +++ b/src/pathfinder/yapf/yapf.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf.hpp Base includes/functions for YAPF. */ diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 6555b6539e..3f257e2c8f 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_base.hpp Base classes for YAPF. */ diff --git a/src/pathfinder/yapf/yapf_cache.h b/src/pathfinder/yapf/yapf_cache.h index e0234b2c5d..06b076c979 100644 --- a/src/pathfinder/yapf/yapf_cache.h +++ b/src/pathfinder/yapf/yapf_cache.h @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_cache.h Entry point for OpenTTD to YAPF's cache. */ diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp index 538f3bd3bf..4cbf23802b 100644 --- a/src/pathfinder/yapf/yapf_common.hpp +++ b/src/pathfinder/yapf/yapf_common.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_common.hpp Commonly used classes and utilities for YAPF. */ diff --git a/src/pathfinder/yapf/yapf_costbase.hpp b/src/pathfinder/yapf/yapf_costbase.hpp index 8211ddee12..a8e709f5df 100644 --- a/src/pathfinder/yapf/yapf_costbase.hpp +++ b/src/pathfinder/yapf/yapf_costbase.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_costbase.hpp Handling of cost determination. */ diff --git a/src/pathfinder/yapf/yapf_costcache.hpp b/src/pathfinder/yapf/yapf_costcache.hpp index 12a377aef6..1cd3d8def2 100644 --- a/src/pathfinder/yapf/yapf_costcache.hpp +++ b/src/pathfinder/yapf/yapf_costcache.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_costcache.hpp Caching of segment costs. */ diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 2cda842dd3..3432f27e7b 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_costrail.hpp Cost determination for rails. */ diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index 21dc517848..34900ccf50 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_destrail.hpp Determining the destination for rail vehicles. */ diff --git a/src/pathfinder/yapf/yapf_node.hpp b/src/pathfinder/yapf/yapf_node.hpp index 6d635bcf33..6a34e866c0 100644 --- a/src/pathfinder/yapf/yapf_node.hpp +++ b/src/pathfinder/yapf/yapf_node.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_node.hpp Node in the pathfinder's graph. */ diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index cf493e1b95..30c6f18c7a 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_node_rail.hpp Node tailored for rail pathfinding. */ diff --git a/src/pathfinder/yapf/yapf_node_road.hpp b/src/pathfinder/yapf/yapf_node_road.hpp index b70e118870..4e4ac9a4b0 100644 --- a/src/pathfinder/yapf/yapf_node_road.hpp +++ b/src/pathfinder/yapf/yapf_node_road.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_node_road.hpp Node tailored for road pathfinding. */ diff --git a/src/pathfinder/yapf/yapf_node_ship.hpp b/src/pathfinder/yapf/yapf_node_ship.hpp index 481d77b9fe..894b5df5c5 100644 --- a/src/pathfinder/yapf/yapf_node_ship.hpp +++ b/src/pathfinder/yapf/yapf_node_ship.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_node_ship.hpp Node tailored for ship pathfinding. */ diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index 57ca8098f4..1ae63eda71 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_rail.cpp The rail pathfinding. */ diff --git a/src/pathfinder/yapf/yapf_river_builder.cpp b/src/pathfinder/yapf/yapf_river_builder.cpp index c084f841c9..05355c9c95 100644 --- a/src/pathfinder/yapf/yapf_river_builder.cpp +++ b/src/pathfinder/yapf/yapf_river_builder.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_river_builder.cpp Pathfinder for river building. */ diff --git a/src/pathfinder/yapf/yapf_river_builder.h b/src/pathfinder/yapf/yapf_river_builder.h index 6417770cc0..589c989cf8 100644 --- a/src/pathfinder/yapf/yapf_river_builder.h +++ b/src/pathfinder/yapf/yapf_river_builder.h @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_river_builder.h Pathfinder for river building. */ diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 2611ceb379..031212eb99 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_road.cpp The road pathfinding. */ diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 17fc7ff6f4..b024edb722 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_ship.cpp Implementation of YAPF for ships. */ diff --git a/src/pathfinder/yapf/yapf_ship_regions.cpp b/src/pathfinder/yapf/yapf_ship_regions.cpp index caa243fc10..9e36a0a6d1 100644 --- a/src/pathfinder/yapf/yapf_ship_regions.cpp +++ b/src/pathfinder/yapf/yapf_ship_regions.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_ship_regions.cpp Implementation of YAPF for water regions, which are used for finding intermediate ship destinations. */ diff --git a/src/pathfinder/yapf/yapf_ship_regions.h b/src/pathfinder/yapf/yapf_ship_regions.h index dc488754b4..5e2b6f4d8f 100644 --- a/src/pathfinder/yapf/yapf_ship_regions.h +++ b/src/pathfinder/yapf/yapf_ship_regions.h @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_ship_regions.h Implementation of YAPF for water regions, which are used for finding intermediate ship destinations. */ diff --git a/src/pathfinder/yapf/yapf_type.hpp b/src/pathfinder/yapf/yapf_type.hpp index 7aeb0f80af..aeb53f9fec 100644 --- a/src/pathfinder/yapf/yapf_type.hpp +++ b/src/pathfinder/yapf/yapf_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 yapf_type.hpp Types used by YAPF. */ diff --git a/src/pbs.cpp b/src/pbs.cpp index f47c990c6d..40dceccd40 100644 --- a/src/pbs.cpp +++ b/src/pbs.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 pbs.cpp PBS support routines */ diff --git a/src/pbs.h b/src/pbs.h index e65b6196e3..acd8716e80 100644 --- a/src/pbs.h +++ b/src/pbs.h @@ -2,7 +2,7 @@ * 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 . + * 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 pbs.h PBS support routines */ diff --git a/src/picker_func.h b/src/picker_func.h index 6d9df4f067..ac507611cf 100644 --- a/src/picker_func.h +++ b/src/picker_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 picker_func.h Functions/types etc. related to non-GUI parts of the Picker system. */ diff --git a/src/picker_gui.cpp b/src/picker_gui.cpp index 7a85be0d0a..24df9bc509 100644 --- a/src/picker_gui.cpp +++ b/src/picker_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 picker_gui.cpp %File for dealing with picker windows */ diff --git a/src/picker_gui.h b/src/picker_gui.h index 7d11f51637..1293386972 100644 --- a/src/picker_gui.h +++ b/src/picker_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 picker_gui.h Functions/types etc. related to the picker GUI. */ diff --git a/src/progress.cpp b/src/progress.cpp index 6444d8a85f..a1294e0afb 100644 --- a/src/progress.cpp +++ b/src/progress.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 progress.cpp Functions for modal progress windows. */ diff --git a/src/progress.h b/src/progress.h index d6889743eb..4baff00dc7 100644 --- a/src/progress.h +++ b/src/progress.h @@ -2,7 +2,7 @@ * 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 . + * 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 progress.h Functions related to modal progress. */ diff --git a/src/provider_manager.h b/src/provider_manager.h index 377a17af28..853419d335 100644 --- a/src/provider_manager.h +++ b/src/provider_manager.h @@ -2,7 +2,7 @@ * 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 . + * 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 provider_manager.h Definition of the ProviderManager */ diff --git a/src/querystring_gui.h b/src/querystring_gui.h index 07df9255f4..7c0974983b 100644 --- a/src/querystring_gui.h +++ b/src/querystring_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 querystring_gui.h Base for the GUIs that have an edit box in them. */ diff --git a/src/rail.cpp b/src/rail.cpp index b977c1c963..005f9451e6 100644 --- a/src/rail.cpp +++ b/src/rail.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 rail.cpp Implementation of rail specific functions. */ diff --git a/src/rail.h b/src/rail.h index a8ced13681..560f9d3602 100644 --- a/src/rail.h +++ b/src/rail.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail.h Rail specific functions. */ diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 1edbe723c5..8f96fe87d6 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 rail_cmd.cpp Handling of rail tiles. */ diff --git a/src/rail_cmd.h b/src/rail_cmd.h index 9ee4ccf2d4..9650c3b724 100644 --- a/src/rail_cmd.h +++ b/src/rail_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail_cmd.h Command definitions for rail. */ diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 30fe5bd72f..1e5fdea392 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 rail_gui.cpp %File for dealing with rail construction user interface */ diff --git a/src/rail_gui.h b/src/rail_gui.h index 46e91b0430..7e75b05b9c 100644 --- a/src/rail_gui.h +++ b/src/rail_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail_gui.h Functions/types etc. related to the rail GUI. */ diff --git a/src/rail_map.h b/src/rail_map.h index 18a3894057..48ca076db1 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail_map.h Hides the direct accesses to the map array with map accessors */ diff --git a/src/rail_type.h b/src/rail_type.h index cb12a09e37..56bbb5dd6a 100644 --- a/src/rail_type.h +++ b/src/rail_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail_type.h The different types of rail */ diff --git a/src/random_access_file.cpp b/src/random_access_file.cpp index ba41f8481d..75aa52f37c 100644 --- a/src/random_access_file.cpp +++ b/src/random_access_file.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 random_access_file.cpp Actual implementation of the RandomAccessFile class. */ diff --git a/src/random_access_file_type.h b/src/random_access_file_type.h index 9ce82ecf89..c0aaec48ac 100644 --- a/src/random_access_file_type.h +++ b/src/random_access_file_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 random_access_file_type.h Class related to random access to files. */ diff --git a/src/rev.cpp.in b/src/rev.cpp.in index 9b7cd17ccc..70eff8d753 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -2,7 +2,7 @@ * 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 . + * 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 rev.cpp Autogenerated file with the revision and such of OpenTTD. */ diff --git a/src/rev.h b/src/rev.h index cb4b7931f1..6da02d6990 100644 --- a/src/rev.h +++ b/src/rev.h @@ -2,7 +2,7 @@ * 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 . + * 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 rev.h declaration of OTTD revision dependent variables */ diff --git a/src/road.cpp b/src/road.cpp index 8b772fec76..611adf082e 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 road.cpp Generic road related functions. */ diff --git a/src/road.h b/src/road.h index 01f333ffdb..fe74115d64 100644 --- a/src/road.h +++ b/src/road.h @@ -2,7 +2,7 @@ * 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 . + * 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 road.h Road specific functions. */ diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index f891556740..47a096e5d6 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 road_cmd.cpp Commands related to road tiles. */ diff --git a/src/road_cmd.h b/src/road_cmd.h index e309edc057..20f66db986 100644 --- a/src/road_cmd.h +++ b/src/road_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_cmd.h Road related functions. */ diff --git a/src/road_func.h b/src/road_func.h index 9382246f05..8e77195fdc 100644 --- a/src/road_func.h +++ b/src/road_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_func.h Functions related to roads. */ diff --git a/src/road_gui.cpp b/src/road_gui.cpp index aecfc9c8cd..11e8505661 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 road_gui.cpp GUI for building roads. */ diff --git a/src/road_gui.h b/src/road_gui.h index 7dcf1c99d4..4f4f8ec6b0 100644 --- a/src/road_gui.h +++ b/src/road_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_gui.h Functions/types related to the road GUIs. */ diff --git a/src/road_internal.h b/src/road_internal.h index 1446a1214c..67e4560d48 100644 --- a/src/road_internal.h +++ b/src/road_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_internal.h Functions used internally by the roads. */ diff --git a/src/road_map.cpp b/src/road_map.cpp index c5aa6b8c0a..5ee2b70737 100644 --- a/src/road_map.cpp +++ b/src/road_map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 road_map.cpp Complex road accessors. */ diff --git a/src/road_map.h b/src/road_map.h index 992961189c..1d9fb95aa3 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_map.h Map accessors for roads. */ diff --git a/src/road_type.h b/src/road_type.h index 99b5f8a40b..83bbf4ea6c 100644 --- a/src/road_type.h +++ b/src/road_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_type.h Enums and other types related to roads. */ diff --git a/src/roadstop.cpp b/src/roadstop.cpp index fa89cd4ce9..7cbefe6cc1 100644 --- a/src/roadstop.cpp +++ b/src/roadstop.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 roadstop.cpp Implementation of the roadstop base class. */ diff --git a/src/roadstop_base.h b/src/roadstop_base.h index c5b14ce12d..b4e359d4be 100644 --- a/src/roadstop_base.h +++ b/src/roadstop_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 roadstop_base.h Base class for roadstops. */ diff --git a/src/roadveh.h b/src/roadveh.h index 8657512d1e..f3182096a9 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -2,7 +2,7 @@ * 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 . + * 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 src/roadveh.h Road vehicle states */ diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 79ef10c9c5..a6da977cb6 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 roadveh_cmd.cpp Handling of road vehicles. */ diff --git a/src/roadveh_cmd.h b/src/roadveh_cmd.h index 1fd781f8dd..7e3edc531d 100644 --- a/src/roadveh_cmd.h +++ b/src/roadveh_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 roadveh_cmd.h Command definitions related to road vehicles. */ diff --git a/src/roadveh_gui.cpp b/src/roadveh_gui.cpp index b7fedf2495..5ffbe8c9e4 100644 --- a/src/roadveh_gui.cpp +++ b/src/roadveh_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 roadveh_gui.cpp GUI for road vehicles. */ diff --git a/src/safeguards.h b/src/safeguards.h index c8bf2d2e0e..8e3568e2b1 100644 --- a/src/safeguards.h +++ b/src/safeguards.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 955377d669..3952941246 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 afterload.cpp Code updating data after game load */ diff --git a/src/saveload/ai_sl.cpp b/src/saveload/ai_sl.cpp index e6e52f8217..70c5f8e832 100644 --- a/src/saveload/ai_sl.cpp +++ b/src/saveload/ai_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ai_sl.cpp Handles the saveload part of the AIs */ diff --git a/src/saveload/airport_sl.cpp b/src/saveload/airport_sl.cpp index d83c45b048..9b1f624df0 100644 --- a/src/saveload/airport_sl.cpp +++ b/src/saveload/airport_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 airport_sl.cpp Code handling saving and loading airport ids */ diff --git a/src/saveload/animated_tile_sl.cpp b/src/saveload/animated_tile_sl.cpp index 950cc9c20c..39ff355309 100644 --- a/src/saveload/animated_tile_sl.cpp +++ b/src/saveload/animated_tile_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 animated_tile_sl.cpp Code handling saving and loading of animated tiles */ diff --git a/src/saveload/autoreplace_sl.cpp b/src/saveload/autoreplace_sl.cpp index 7f87451ef8..314311263b 100644 --- a/src/saveload/autoreplace_sl.cpp +++ b/src/saveload/autoreplace_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_sl.cpp Code handling saving and loading of autoreplace rules */ diff --git a/src/saveload/cargomonitor_sl.cpp b/src/saveload/cargomonitor_sl.cpp index c932ea18d7..446dfaa758 100644 --- a/src/saveload/cargomonitor_sl.cpp +++ b/src/saveload/cargomonitor_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargomonitor_sl.cpp Code handling saving and loading of Cargo monitoring. */ diff --git a/src/saveload/cargopacket_sl.cpp b/src/saveload/cargopacket_sl.cpp index 8dc0e08b86..7cdfd64cb3 100644 --- a/src/saveload/cargopacket_sl.cpp +++ b/src/saveload/cargopacket_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cargopacket_sl.cpp Code handling saving and loading of cargo packets */ diff --git a/src/saveload/cheat_sl.cpp b/src/saveload/cheat_sl.cpp index 8965d801ef..a8e622916c 100644 --- a/src/saveload/cheat_sl.cpp +++ b/src/saveload/cheat_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_sl.cpp Code handling saving and loading of cheats */ diff --git a/src/saveload/company_sl.cpp b/src/saveload/company_sl.cpp index 83119a6d2e..2bb25dcccc 100644 --- a/src/saveload/company_sl.cpp +++ b/src/saveload/company_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 company_sl.cpp Code handling saving and loading of company data */ diff --git a/src/saveload/compat/ai_sl_compat.h b/src/saveload/compat/ai_sl_compat.h index dba2855a19..4df0cae694 100644 --- a/src/saveload/compat/ai_sl_compat.h +++ b/src/saveload/compat/ai_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 ai_sl_compat.h Loading for ai chunks before table headers were added. */ diff --git a/src/saveload/compat/animated_tile_sl_compat.h b/src/saveload/compat/animated_tile_sl_compat.h index 1fcea5818a..1db9d9de99 100644 --- a/src/saveload/compat/animated_tile_sl_compat.h +++ b/src/saveload/compat/animated_tile_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 animated_tile_sl_compat.h Loading for animated_tile chunks before table headers were added. */ diff --git a/src/saveload/compat/autoreplace_sl_compat.h b/src/saveload/compat/autoreplace_sl_compat.h index abb4b0e28d..dc975cee05 100644 --- a/src/saveload/compat/autoreplace_sl_compat.h +++ b/src/saveload/compat/autoreplace_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_sl_compat.h Loading for autoreplace chunks before table headers were added. */ diff --git a/src/saveload/compat/cargomonitor_sl_compat.h b/src/saveload/compat/cargomonitor_sl_compat.h index 2bb1e999ad..7bc2e622eb 100644 --- a/src/saveload/compat/cargomonitor_sl_compat.h +++ b/src/saveload/compat/cargomonitor_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargomonitor_sl_compat.h Loading for cargomonitor chunks before table headers were added. */ diff --git a/src/saveload/compat/cargopacket_sl_compat.h b/src/saveload/compat/cargopacket_sl_compat.h index eee308bcb0..25b6e78f1e 100644 --- a/src/saveload/compat/cargopacket_sl_compat.h +++ b/src/saveload/compat/cargopacket_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargopacket_sl_compat.h Loading for cargopacket chunks before table headers were added. */ diff --git a/src/saveload/compat/cheat_sl_compat.h b/src/saveload/compat/cheat_sl_compat.h index f3c7560976..73715c5e7b 100644 --- a/src/saveload/compat/cheat_sl_compat.h +++ b/src/saveload/compat/cheat_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_sl_compat.h Loading for cheat chunks before table headers were added. */ diff --git a/src/saveload/compat/company_sl_compat.h b/src/saveload/compat/company_sl_compat.h index c5eebb9251..cec6ef3df7 100644 --- a/src/saveload/compat/company_sl_compat.h +++ b/src/saveload/compat/company_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_sl_compat.h Loading of company chunks before table headers were added. */ diff --git a/src/saveload/compat/depot_sl_compat.h b/src/saveload/compat/depot_sl_compat.h index 8fcf4b6861..76eb33b8f8 100644 --- a/src/saveload/compat/depot_sl_compat.h +++ b/src/saveload/compat/depot_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_sl_compat.h Loading for depot chunks before table headers were added. */ diff --git a/src/saveload/compat/economy_sl_compat.h b/src/saveload/compat/economy_sl_compat.h index 560673a0d0..69d0e09db1 100644 --- a/src/saveload/compat/economy_sl_compat.h +++ b/src/saveload/compat/economy_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 economy_sl_compat.h Loading for economy chunks before table headers were added. */ diff --git a/src/saveload/compat/engine_sl_compat.h b/src/saveload/compat/engine_sl_compat.h index 68a839bef1..2a303e4bed 100644 --- a/src/saveload/compat/engine_sl_compat.h +++ b/src/saveload/compat/engine_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_sl_compat.h Loading for engine chunks before table headers were added. */ diff --git a/src/saveload/compat/game_sl_compat.h b/src/saveload/compat/game_sl_compat.h index dc84ec0de7..f8565c3e22 100644 --- a/src/saveload/compat/game_sl_compat.h +++ b/src/saveload/compat/game_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 game_sl_compat.h Loading for game chunks before table headers were added. */ diff --git a/src/saveload/compat/gamelog_sl_compat.h b/src/saveload/compat/gamelog_sl_compat.h index f1298bf929..653ea77fd5 100644 --- a/src/saveload/compat/gamelog_sl_compat.h +++ b/src/saveload/compat/gamelog_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 gamelog_sl_compat.h Loading for gamelog chunks before table headers were added. */ diff --git a/src/saveload/compat/goal_sl_compat.h b/src/saveload/compat/goal_sl_compat.h index 5dc205462c..3686c0ea17 100644 --- a/src/saveload/compat/goal_sl_compat.h +++ b/src/saveload/compat/goal_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 goal_sl_compat.h Loading of goal chunks before table headers were added. */ diff --git a/src/saveload/compat/group_sl_compat.h b/src/saveload/compat/group_sl_compat.h index 50021079f2..a9a4fc3793 100644 --- a/src/saveload/compat/group_sl_compat.h +++ b/src/saveload/compat/group_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 group_sl_compat.h Loading of group chunks before table headers were added. */ diff --git a/src/saveload/compat/industry_sl_compat.h b/src/saveload/compat/industry_sl_compat.h index b5d9b7f521..11ef5f8c1a 100644 --- a/src/saveload/compat/industry_sl_compat.h +++ b/src/saveload/compat/industry_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_sl_compat.h Loading of industry chunks before table headers were added. */ diff --git a/src/saveload/compat/labelmaps_sl_compat.h b/src/saveload/compat/labelmaps_sl_compat.h index 8664cec19d..5e870a2c7b 100644 --- a/src/saveload/compat/labelmaps_sl_compat.h +++ b/src/saveload/compat/labelmaps_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 labelmaps_sl_compat.h Loading of labelmaps chunks before table headers were added. */ diff --git a/src/saveload/compat/linkgraph_sl_compat.h b/src/saveload/compat/linkgraph_sl_compat.h index eb455da8fc..df3b6610d4 100644 --- a/src/saveload/compat/linkgraph_sl_compat.h +++ b/src/saveload/compat/linkgraph_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_sl_compat.h Loading of linkgraph chunks before table headers were added. */ diff --git a/src/saveload/compat/map_sl_compat.h b/src/saveload/compat/map_sl_compat.h index 84cfb28652..919b62b8cc 100644 --- a/src/saveload/compat/map_sl_compat.h +++ b/src/saveload/compat/map_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 map_sl_compat.h Loading for map chunks before table headers were added. */ diff --git a/src/saveload/compat/misc_sl_compat.h b/src/saveload/compat/misc_sl_compat.h index 02d26002a5..58f4c7b059 100644 --- a/src/saveload/compat/misc_sl_compat.h +++ b/src/saveload/compat/misc_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 misc_sl_compat.h Loading for misc chunks before table headers were added. */ diff --git a/src/saveload/compat/newgrf_sl_compat.h b/src/saveload/compat/newgrf_sl_compat.h index 8a1803946f..52d4a5c01c 100644 --- a/src/saveload/compat/newgrf_sl_compat.h +++ b/src/saveload/compat/newgrf_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_sl_compat.h Loading of newgrf chunks before table headers were added. */ diff --git a/src/saveload/compat/object_sl_compat.h b/src/saveload/compat/object_sl_compat.h index a4a9fca6a8..dc0b513e91 100644 --- a/src/saveload/compat/object_sl_compat.h +++ b/src/saveload/compat/object_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_sl_compat.h Loading of object chunks before table headers were added. */ diff --git a/src/saveload/compat/order_sl_compat.h b/src/saveload/compat/order_sl_compat.h index 62c879cf13..3864b99139 100644 --- a/src/saveload/compat/order_sl_compat.h +++ b/src/saveload/compat/order_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_sl_compat.h Loading of order chunks before table headers were added. */ diff --git a/src/saveload/compat/settings_sl_compat.h b/src/saveload/compat/settings_sl_compat.h index 9fe49f8b12..530f1bc62b 100644 --- a/src/saveload/compat/settings_sl_compat.h +++ b/src/saveload/compat/settings_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_sl_compat.h Loading of settings chunks before table headers were added. */ diff --git a/src/saveload/compat/signs_sl_compat.h b/src/saveload/compat/signs_sl_compat.h index 80bc707893..a94c5c912b 100644 --- a/src/saveload/compat/signs_sl_compat.h +++ b/src/saveload/compat/signs_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 signs_sl_compat.h Loading of signs chunks before table headers were added. */ diff --git a/src/saveload/compat/station_sl_compat.h b/src/saveload/compat/station_sl_compat.h index 1c24a8d5d9..30662dce2a 100644 --- a/src/saveload/compat/station_sl_compat.h +++ b/src/saveload/compat/station_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_sl_compat.h Loading of station chunks before table headers were added. */ diff --git a/src/saveload/compat/storage_sl_compat.h b/src/saveload/compat/storage_sl_compat.h index f4f6d0d9a6..c5c146f341 100644 --- a/src/saveload/compat/storage_sl_compat.h +++ b/src/saveload/compat/storage_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 storage_sl_compat.h Loading of storage chunks before table headers were added. */ diff --git a/src/saveload/compat/story_sl_compat.h b/src/saveload/compat/story_sl_compat.h index 519ca2bf18..d473b55b07 100644 --- a/src/saveload/compat/story_sl_compat.h +++ b/src/saveload/compat/story_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 story_sl_compat.h Loading for story chunks before table headers were added. */ diff --git a/src/saveload/compat/subsidy_sl_compat.h b/src/saveload/compat/subsidy_sl_compat.h index 7ae758318d..1254e04fde 100644 --- a/src/saveload/compat/subsidy_sl_compat.h +++ b/src/saveload/compat/subsidy_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_sl_compat.h Loading of subsidy chunks before table headers were added. */ diff --git a/src/saveload/compat/town_sl_compat.h b/src/saveload/compat/town_sl_compat.h index 34a4141028..2dca688cdf 100644 --- a/src/saveload/compat/town_sl_compat.h +++ b/src/saveload/compat/town_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_sl_compat.h Loading of town chunks before table headers were added. */ diff --git a/src/saveload/compat/vehicle_sl_compat.h b/src/saveload/compat/vehicle_sl_compat.h index d9293eef39..a26e3251d4 100644 --- a/src/saveload/compat/vehicle_sl_compat.h +++ b/src/saveload/compat/vehicle_sl_compat.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_sl_compat.h Loading of vehicle chunks before table headers were added. */ diff --git a/src/saveload/depot_sl.cpp b/src/saveload/depot_sl.cpp index ee4e353a3c..61f3d386b7 100644 --- a/src/saveload/depot_sl.cpp +++ b/src/saveload/depot_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 depot_sl.cpp Code handling saving and loading of depots */ diff --git a/src/saveload/economy_sl.cpp b/src/saveload/economy_sl.cpp index 97edb27279..5eb55ac48e 100644 --- a/src/saveload/economy_sl.cpp +++ b/src/saveload/economy_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 economy_sl.cpp Code handling saving and loading of economy data */ diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index 8be236866d..fcdee930d0 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 engine_sl.cpp Code handling saving and loading of engines */ diff --git a/src/saveload/game_sl.cpp b/src/saveload/game_sl.cpp index 82b2c783ed..3b8ce11204 100644 --- a/src/saveload/game_sl.cpp +++ b/src/saveload/game_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 game_sl.cpp Handles the saveload part of the GameScripts */ diff --git a/src/saveload/gamelog_sl.cpp b/src/saveload/gamelog_sl.cpp index c0c904ae6a..6f055fe8be 100644 --- a/src/saveload/gamelog_sl.cpp +++ b/src/saveload/gamelog_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 gamelog_sl.cpp Code handling saving and loading of gamelog data */ diff --git a/src/saveload/goal_sl.cpp b/src/saveload/goal_sl.cpp index d2a653bda3..c81a8f6d47 100644 --- a/src/saveload/goal_sl.cpp +++ b/src/saveload/goal_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 goal_sl.cpp Code handling saving and loading of goals */ diff --git a/src/saveload/group_sl.cpp b/src/saveload/group_sl.cpp index c1f69049e5..c5dd6f59b5 100644 --- a/src/saveload/group_sl.cpp +++ b/src/saveload/group_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 group_sl.cpp Code handling saving and loading of groups */ diff --git a/src/saveload/industry_sl.cpp b/src/saveload/industry_sl.cpp index 1ba6598e01..3d32f56f58 100644 --- a/src/saveload/industry_sl.cpp +++ b/src/saveload/industry_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 industry_sl.cpp Code handling saving and loading of industries */ diff --git a/src/saveload/labelmaps_sl.cpp b/src/saveload/labelmaps_sl.cpp index 6875cd9ca4..5398e69f76 100644 --- a/src/saveload/labelmaps_sl.cpp +++ b/src/saveload/labelmaps_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 labelmaps_sl.cpp Code handling saving and loading of rail type label mappings */ diff --git a/src/saveload/league_sl.cpp b/src/saveload/league_sl.cpp index bd2b8ad902..698fb90e4e 100644 --- a/src/saveload/league_sl.cpp +++ b/src/saveload/league_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 league_sl.cpp Code handling saving and loading of league tables */ diff --git a/src/saveload/linkgraph_sl.cpp b/src/saveload/linkgraph_sl.cpp index 00533f4afc..dfbf6ebb19 100644 --- a/src/saveload/linkgraph_sl.cpp +++ b/src/saveload/linkgraph_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 linkgraph_sl.cpp Code handling saving and loading of link graphs */ diff --git a/src/saveload/map_sl.cpp b/src/saveload/map_sl.cpp index c96a76075d..14ae894215 100644 --- a/src/saveload/map_sl.cpp +++ b/src/saveload/map_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 map_sl.cpp Code handling saving and loading of map */ diff --git a/src/saveload/misc_sl.cpp b/src/saveload/misc_sl.cpp index 4094211f88..b39fd67eaa 100644 --- a/src/saveload/misc_sl.cpp +++ b/src/saveload/misc_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 misc_sl.cpp Saving and loading of things that didn't fit anywhere else */ diff --git a/src/saveload/newgrf_sl.cpp b/src/saveload/newgrf_sl.cpp index 41501260fa..93ab8fb975 100644 --- a/src/saveload/newgrf_sl.cpp +++ b/src/saveload/newgrf_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_sl.cpp Code handling saving and loading of newgrf config */ diff --git a/src/saveload/newgrf_sl.h b/src/saveload/newgrf_sl.h index 78a058bc25..6b77cb23a8 100644 --- a/src/saveload/newgrf_sl.h +++ b/src/saveload/newgrf_sl.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_sl.h Code handling saving and loading of NewGRF mappings. */ diff --git a/src/saveload/object_sl.cpp b/src/saveload/object_sl.cpp index 6d7f08f1f0..6f0febbb2d 100644 --- a/src/saveload/object_sl.cpp +++ b/src/saveload/object_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 object_sl.cpp Code handling saving and loading of objects */ diff --git a/src/saveload/oldloader.cpp b/src/saveload/oldloader.cpp index 7283b8ecf0..3d6e0aa3ba 100644 --- a/src/saveload/oldloader.cpp +++ b/src/saveload/oldloader.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 oldloader.cpp Functions for handling of TTO/TTD/TTDP savegames. */ diff --git a/src/saveload/oldloader.h b/src/saveload/oldloader.h index c95087b476..096f72425a 100644 --- a/src/saveload/oldloader.h +++ b/src/saveload/oldloader.h @@ -2,7 +2,7 @@ * 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 . + * 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 oldloader.h Declarations of structures and functions used in loader of old savegames */ diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 7f0fa5b589..dcf2851002 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 oldloader_sl.cpp Chunks and fix-ups for TTO/TTD/TTDP savegames. TTO loader code is based on SVXConverter by Roman Vetter. */ diff --git a/src/saveload/order_sl.cpp b/src/saveload/order_sl.cpp index 6106e0ed61..09d4d29733 100644 --- a/src/saveload/order_sl.cpp +++ b/src/saveload/order_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 order_sl.cpp Code handling saving and loading of orders */ diff --git a/src/saveload/randomizer_sl.cpp b/src/saveload/randomizer_sl.cpp index b5da1428a4..dae5861318 100644 --- a/src/saveload/randomizer_sl.cpp +++ b/src/saveload/randomizer_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 randomizer_sl.cpp Code handling saving and loading of script randomizers */ diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index a6dd26e3cf..ebec3d24d9 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index e27825a5dc..2b0f10cd8b 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -2,7 +2,7 @@ * 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 . + * 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 saveload.h Functions/types related to saving and loading games. */ diff --git a/src/saveload/saveload_error.hpp b/src/saveload/saveload_error.hpp index 5500d90231..d9ab1e8454 100644 --- a/src/saveload/saveload_error.hpp +++ b/src/saveload/saveload_error.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 saveload.h Functions/types related to errors from savegames. */ diff --git a/src/saveload/saveload_filter.h b/src/saveload/saveload_filter.h index 7594337b8d..282ec49654 100644 --- a/src/saveload/saveload_filter.h +++ b/src/saveload/saveload_filter.h @@ -2,7 +2,7 @@ * 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 . + * 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 saveload_filter.h Declaration of filters used for saving and loading savegames. */ diff --git a/src/saveload/saveload_internal.h b/src/saveload/saveload_internal.h index 2f35751951..e39b9869f0 100644 --- a/src/saveload/saveload_internal.h +++ b/src/saveload/saveload_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 saveload_internal.h Declaration of functions used in more save/load files */ diff --git a/src/saveload/settings_sl.cpp b/src/saveload/settings_sl.cpp index 75f53ada6b..7c5416dad7 100644 --- a/src/saveload/settings_sl.cpp +++ b/src/saveload/settings_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 settings_sl.cpp Handles the saveload part of the settings. */ diff --git a/src/saveload/signs_sl.cpp b/src/saveload/signs_sl.cpp index e8c1061374..1f3b36b98b 100644 --- a/src/saveload/signs_sl.cpp +++ b/src/saveload/signs_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signs_sl.cpp Code handling saving and loading of economy data */ diff --git a/src/saveload/station_sl.cpp b/src/saveload/station_sl.cpp index 901c939dde..d79aa9dfb9 100644 --- a/src/saveload/station_sl.cpp +++ b/src/saveload/station_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 station_sl.cpp Code handling saving and loading of stations. */ diff --git a/src/saveload/storage_sl.cpp b/src/saveload/storage_sl.cpp index 6a9b673afa..c5a393cc71 100644 --- a/src/saveload/storage_sl.cpp +++ b/src/saveload/storage_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 storage_sl.cpp Code handling saving and loading of persistent storages. */ diff --git a/src/saveload/story_sl.cpp b/src/saveload/story_sl.cpp index 179e525152..c6936b24c0 100644 --- a/src/saveload/story_sl.cpp +++ b/src/saveload/story_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 story_sl.cpp Code handling saving and loading of story pages */ diff --git a/src/saveload/strings_sl.cpp b/src/saveload/strings_sl.cpp index 94caa07b20..bcaf29d026 100644 --- a/src/saveload/strings_sl.cpp +++ b/src/saveload/strings_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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_sl.cpp Code handling saving and loading of strings */ diff --git a/src/saveload/subsidy_sl.cpp b/src/saveload/subsidy_sl.cpp index b6223077e3..70bec7c717 100644 --- a/src/saveload/subsidy_sl.cpp +++ b/src/saveload/subsidy_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_sl.cpp Code handling saving and loading of subsidies */ diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 52db7a54e6..4b2f9b306b 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 town_sl.cpp Code handling saving and loading of towns and houses */ diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 3532c6ce87..bffd80d004 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_sl.cpp Code handling saving and loading of vehicles */ diff --git a/src/saveload/water_regions_sl.cpp b/src/saveload/water_regions_sl.cpp index 92e601dca3..9aaf82506b 100644 --- a/src/saveload/water_regions_sl.cpp +++ b/src/saveload/water_regions_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 water_regions_sl.cpp Handles saving and loading of water region data */ diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 41f3d3e8be..7c5daf2116 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_sl.cpp Code handling saving and loading of waypoints */ diff --git a/src/screenshot.cpp b/src/screenshot.cpp index d06db8b154..d26341deee 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot.cpp The creation of screenshots! */ diff --git a/src/screenshot.h b/src/screenshot.h index 2cbd827b1a..a205e6ea6b 100644 --- a/src/screenshot.h +++ b/src/screenshot.h @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot.h Functions to make screenshots. */ diff --git a/src/screenshot_bmp.cpp b/src/screenshot_bmp.cpp index 260eefc6fa..53e8f777f9 100644 --- a/src/screenshot_bmp.cpp +++ b/src/screenshot_bmp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_bmp.cpp BMP screenshot provider. */ diff --git a/src/screenshot_gui.cpp b/src/screenshot_gui.cpp index 5bb532dc50..d746360322 100644 --- a/src/screenshot_gui.cpp +++ b/src/screenshot_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_gui.cpp GUI functions related to screenshots. */ diff --git a/src/screenshot_gui.h b/src/screenshot_gui.h index 493bcc80f7..be927b8517 100644 --- a/src/screenshot_gui.h +++ b/src/screenshot_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_gui.h GUI functions related to screenshots. */ diff --git a/src/screenshot_pcx.cpp b/src/screenshot_pcx.cpp index 024609a212..081fa603a5 100644 --- a/src/screenshot_pcx.cpp +++ b/src/screenshot_pcx.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_pcx.cpp PCX screenshots provider. */ diff --git a/src/screenshot_png.cpp b/src/screenshot_png.cpp index b636861b64..de14061f5a 100644 --- a/src/screenshot_png.cpp +++ b/src/screenshot_png.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_png.cpp PNG screenshot provider. */ diff --git a/src/screenshot_type.h b/src/screenshot_type.h index 4859952899..f2b6ba2111 100644 --- a/src/screenshot_type.h +++ b/src/screenshot_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_type.h Types related to screenshot providers. */ diff --git a/src/script/api/Doxyfile_AI.in b/src/script/api/Doxyfile_AI.in index 4cf9f9eb85..63536335fd 100644 --- a/src/script/api/Doxyfile_AI.in +++ b/src/script/api/Doxyfile_AI.in @@ -1,7 +1,7 @@ # 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 . +# 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 . # Doxyfile 1.9.4 diff --git a/src/script/api/Doxyfile_GS.in b/src/script/api/Doxyfile_GS.in index 78e1ce8ac3..3865d771e3 100644 --- a/src/script/api/Doxyfile_GS.in +++ b/src/script/api/Doxyfile_GS.in @@ -1,7 +1,7 @@ # 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 . +# 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 . # Doxyfile 1.9.4 diff --git a/src/script/api/ai/ai_controller.sq.hpp b/src/script/api/ai/ai_controller.sq.hpp index 04cbb209ff..fe23741608 100644 --- a/src/script/api/ai/ai_controller.sq.hpp +++ b/src/script/api/ai/ai_controller.sq.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ #include "../script_controller.hpp" diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 6f1642254a..22df5f418a 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/script/api/doxygen_filter.awk b/src/script/api/doxygen_filter.awk index 6316efcf0d..75428dcc76 100644 --- a/src/script/api/doxygen_filter.awk +++ b/src/script/api/doxygen_filter.awk @@ -1,7 +1,7 @@ # 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 . +# 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 . # # Awk script to automatically generate the code needed diff --git a/src/script/api/doxygen_filter.sh b/src/script/api/doxygen_filter.sh index 451e7d20d6..2c0096c894 100755 --- a/src/script/api/doxygen_filter.sh +++ b/src/script/api/doxygen_filter.sh @@ -3,7 +3,7 @@ # 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 . +# 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 . # Set neutral locale so sort behaves the same everywhere LC_ALL=C diff --git a/src/script/api/game/game_controller.sq.hpp b/src/script/api/game/game_controller.sq.hpp index 20cc6aafa4..44b9305e19 100644 --- a/src/script/api/game/game_controller.sq.hpp +++ b/src/script/api/game/game_controller.sq.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ #include "../script_controller.hpp" diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index ac6d56d3ad..f7096ab66c 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/script/api/script_accounting.cpp b/src/script/api/script_accounting.cpp index 1564c2e1ef..b73bcc7ae0 100644 --- a/src/script/api/script_accounting.cpp +++ b/src/script/api/script_accounting.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_accounting.cpp Implementation of ScriptAccounting. */ diff --git a/src/script/api/script_accounting.hpp b/src/script/api/script_accounting.hpp index 04c022e735..2cf9ac0b61 100644 --- a/src/script/api/script_accounting.hpp +++ b/src/script/api/script_accounting.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_accounting.hpp Everything to handle script accounting things. */ diff --git a/src/script/api/script_admin.cpp b/src/script/api/script_admin.cpp index 664b035ef6..6cc8f95ce6 100644 --- a/src/script/api/script_admin.cpp +++ b/src/script/api/script_admin.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_admin.cpp Implementation of ScriptAdmin. */ diff --git a/src/script/api/script_admin.hpp b/src/script/api/script_admin.hpp index b168b3423b..3b54554bab 100644 --- a/src/script/api/script_admin.hpp +++ b/src/script/api/script_admin.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_admin.hpp Everything to communicate with the AdminPort. */ diff --git a/src/script/api/script_airport.cpp b/src/script/api/script_airport.cpp index 05e5a7d728..a77b454af1 100644 --- a/src/script/api/script_airport.cpp +++ b/src/script/api/script_airport.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_airport.cpp Implementation of ScriptAirport. */ diff --git a/src/script/api/script_airport.hpp b/src/script/api/script_airport.hpp index 7b25471fa0..c1a5c16879 100644 --- a/src/script/api/script_airport.hpp +++ b/src/script/api/script_airport.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_airport.hpp Everything to query and build airports. */ diff --git a/src/script/api/script_asyncmode.cpp b/src/script/api/script_asyncmode.cpp index 144d7c666b..19b220dd25 100644 --- a/src/script/api/script_asyncmode.cpp +++ b/src/script/api/script_asyncmode.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_asyncmode.cpp Implementation of ScriptAsyncMode. */ diff --git a/src/script/api/script_asyncmode.hpp b/src/script/api/script_asyncmode.hpp index 788508ee8d..f282b43053 100644 --- a/src/script/api/script_asyncmode.hpp +++ b/src/script/api/script_asyncmode.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_asyncmode.hpp Switch the script instance to Async Mode. */ diff --git a/src/script/api/script_base.cpp b/src/script/api/script_base.cpp index 18c3519b65..6116912004 100644 --- a/src/script/api/script_base.cpp +++ b/src/script/api/script_base.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_base.cpp Implementation of ScriptBase. */ diff --git a/src/script/api/script_base.hpp b/src/script/api/script_base.hpp index aaaa3b2340..e7fabdc7d7 100644 --- a/src/script/api/script_base.hpp +++ b/src/script/api/script_base.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_base.hpp Everything to query basic things. */ diff --git a/src/script/api/script_basestation.cpp b/src/script/api/script_basestation.cpp index e7bea4ec29..5f183c30e5 100644 --- a/src/script/api/script_basestation.cpp +++ b/src/script/api/script_basestation.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_basestation.cpp Implementation of ScriptBaseStation. */ diff --git a/src/script/api/script_basestation.hpp b/src/script/api/script_basestation.hpp index 646bec13ab..3f14fde566 100644 --- a/src/script/api/script_basestation.hpp +++ b/src/script/api/script_basestation.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_basestation.hpp Base for stations/waypoint handling. */ diff --git a/src/script/api/script_bridge.cpp b/src/script/api/script_bridge.cpp index f96aaca887..4c1589335f 100644 --- a/src/script/api/script_bridge.cpp +++ b/src/script/api/script_bridge.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_bridge.cpp Implementation of ScriptBridge. */ diff --git a/src/script/api/script_bridge.hpp b/src/script/api/script_bridge.hpp index b2ec03c0e7..486cdc6cd0 100644 --- a/src/script/api/script_bridge.hpp +++ b/src/script/api/script_bridge.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_bridge.hpp Everything to query and build bridges. */ diff --git a/src/script/api/script_bridgelist.cpp b/src/script/api/script_bridgelist.cpp index 711ba609c3..e8893693ed 100644 --- a/src/script/api/script_bridgelist.cpp +++ b/src/script/api/script_bridgelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_bridgelist.cpp Implementation of ScriptBridgeList and friends. */ diff --git a/src/script/api/script_bridgelist.hpp b/src/script/api/script_bridgelist.hpp index 17991f41f1..f483fa117d 100644 --- a/src/script/api/script_bridgelist.hpp +++ b/src/script/api/script_bridgelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_bridgelist.hpp List all the bridges. */ diff --git a/src/script/api/script_cargo.cpp b/src/script/api/script_cargo.cpp index d38ff9300a..1a9e88eecc 100644 --- a/src/script/api/script_cargo.cpp +++ b/src/script/api/script_cargo.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargo.cpp Implementation of ScriptCargo. */ diff --git a/src/script/api/script_cargo.hpp b/src/script/api/script_cargo.hpp index 13751e6070..48081845f1 100644 --- a/src/script/api/script_cargo.hpp +++ b/src/script/api/script_cargo.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargo.hpp Everything to query cargoes. */ diff --git a/src/script/api/script_cargolist.cpp b/src/script/api/script_cargolist.cpp index 6744911cfb..aa403603e1 100644 --- a/src/script/api/script_cargolist.cpp +++ b/src/script/api/script_cargolist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargolist.cpp Implementation of ScriptCargoList and friends. */ diff --git a/src/script/api/script_cargolist.hpp b/src/script/api/script_cargolist.hpp index b170643e3c..9cfeabd437 100644 --- a/src/script/api/script_cargolist.hpp +++ b/src/script/api/script_cargolist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargolist.hpp List all the cargoes. */ diff --git a/src/script/api/script_cargomonitor.cpp b/src/script/api/script_cargomonitor.cpp index f5d5dab1d1..4a241e6e37 100644 --- a/src/script/api/script_cargomonitor.cpp +++ b/src/script/api/script_cargomonitor.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargomonitor.cpp Code to monitor cargo pickup and deliveries by companies. */ diff --git a/src/script/api/script_cargomonitor.hpp b/src/script/api/script_cargomonitor.hpp index 322c066514..6113d4d299 100644 --- a/src/script/api/script_cargomonitor.hpp +++ b/src/script/api/script_cargomonitor.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_cargomonitor.hpp Everything to monitor cargo pickup and deliveries by companies. */ diff --git a/src/script/api/script_client.cpp b/src/script/api/script_client.cpp index 10e3c73f2a..a2da2d1d3a 100644 --- a/src/script/api/script_client.cpp +++ b/src/script/api/script_client.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_client.cpp Implementation of ScriptClient. */ diff --git a/src/script/api/script_client.hpp b/src/script/api/script_client.hpp index 7e463e4f94..26670efb08 100644 --- a/src/script/api/script_client.hpp +++ b/src/script/api/script_client.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_client.hpp Everything to query a network client's information */ diff --git a/src/script/api/script_clientlist.cpp b/src/script/api/script_clientlist.cpp index 3c0ea9b006..947de68465 100644 --- a/src/script/api/script_clientlist.cpp +++ b/src/script/api/script_clientlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_clientlist.cpp Implementation of ScriptClientList and friends. */ diff --git a/src/script/api/script_clientlist.hpp b/src/script/api/script_clientlist.hpp index ea7859a6af..23544cc8a6 100644 --- a/src/script/api/script_clientlist.hpp +++ b/src/script/api/script_clientlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_clientlist.hpp List all the clients in a game or in a company. */ diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index 3ad171f9d0..117f647ddd 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_company.cpp Implementation of ScriptCompany. */ diff --git a/src/script/api/script_company.hpp b/src/script/api/script_company.hpp index ba9f72bacd..52aea64f26 100644 --- a/src/script/api/script_company.hpp +++ b/src/script/api/script_company.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_company.hpp Everything to query a company's financials and statistics or build company related buildings. */ diff --git a/src/script/api/script_companymode.cpp b/src/script/api/script_companymode.cpp index b2fb539523..75fefca1d2 100644 --- a/src/script/api/script_companymode.cpp +++ b/src/script/api/script_companymode.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_companymode.cpp Implementation of ScriptCompanyMode. */ diff --git a/src/script/api/script_companymode.hpp b/src/script/api/script_companymode.hpp index cc88d85937..2fbbd9dd31 100644 --- a/src/script/api/script_companymode.hpp +++ b/src/script/api/script_companymode.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_companymode.hpp Switch the company. */ diff --git a/src/script/api/script_controller.cpp b/src/script/api/script_controller.cpp index 65c5970bda..7c22aab52c 100644 --- a/src/script/api/script_controller.cpp +++ b/src/script/api/script_controller.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_controller.cpp Implementation of ScriptControler. */ diff --git a/src/script/api/script_controller.hpp b/src/script/api/script_controller.hpp index 59c61f553e..38e3ab5476 100644 --- a/src/script/api/script_controller.hpp +++ b/src/script/api/script_controller.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_controller.hpp The controller of the script. */ diff --git a/src/script/api/script_date.cpp b/src/script/api/script_date.cpp index 3ff39b6232..828d29acf3 100644 --- a/src/script/api/script_date.cpp +++ b/src/script/api/script_date.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_date.cpp Implementation of ScriptDate. */ diff --git a/src/script/api/script_date.hpp b/src/script/api/script_date.hpp index 44f609d80b..1e75a0d906 100644 --- a/src/script/api/script_date.hpp +++ b/src/script/api/script_date.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_date.hpp Everything to query and manipulate date related information. */ diff --git a/src/script/api/script_depotlist.cpp b/src/script/api/script_depotlist.cpp index cbb1d975f7..20a253c05c 100644 --- a/src/script/api/script_depotlist.cpp +++ b/src/script/api/script_depotlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_depotlist.cpp Implementation of ScriptDepotList and friends. */ diff --git a/src/script/api/script_depotlist.hpp b/src/script/api/script_depotlist.hpp index efbe701bda..92d604bb6e 100644 --- a/src/script/api/script_depotlist.hpp +++ b/src/script/api/script_depotlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_depotlist.hpp List all the depots (you own). */ diff --git a/src/script/api/script_engine.cpp b/src/script/api/script_engine.cpp index 873a1154b7..4ac0a3b52f 100644 --- a/src/script/api/script_engine.cpp +++ b/src/script/api/script_engine.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_engine.cpp Implementation of ScriptEngine. */ diff --git a/src/script/api/script_engine.hpp b/src/script/api/script_engine.hpp index 0404ff3e04..7fb70aa588 100644 --- a/src/script/api/script_engine.hpp +++ b/src/script/api/script_engine.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_engine.hpp Everything to query and build engines. */ diff --git a/src/script/api/script_enginelist.cpp b/src/script/api/script_enginelist.cpp index 3b86bd5ebc..2f88f9cd4c 100644 --- a/src/script/api/script_enginelist.cpp +++ b/src/script/api/script_enginelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_enginelist.cpp Implementation of ScriptEngineList and friends. */ diff --git a/src/script/api/script_enginelist.hpp b/src/script/api/script_enginelist.hpp index 05cfc03853..c2616974c3 100644 --- a/src/script/api/script_enginelist.hpp +++ b/src/script/api/script_enginelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_enginelist.hpp List all the engines. */ diff --git a/src/script/api/script_error.cpp b/src/script/api/script_error.cpp index ee410eb65d..54a7c2df6b 100644 --- a/src/script/api/script_error.cpp +++ b/src/script/api/script_error.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_error.cpp Implementation of ScriptError. */ diff --git a/src/script/api/script_error.hpp b/src/script/api/script_error.hpp index 031aa476af..b83f855948 100644 --- a/src/script/api/script_error.hpp +++ b/src/script/api/script_error.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_error.hpp Everything to query errors. */ diff --git a/src/script/api/script_event.cpp b/src/script/api/script_event.cpp index 758794a729..2a6637146f 100644 --- a/src/script/api/script_event.cpp +++ b/src/script/api/script_event.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_event.cpp Implementation of ScriptEvent. */ diff --git a/src/script/api/script_event.hpp b/src/script/api/script_event.hpp index e706151b74..0e18c43a08 100644 --- a/src/script/api/script_event.hpp +++ b/src/script/api/script_event.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_event.hpp Everything to handle events from the game. */ diff --git a/src/script/api/script_event_types.cpp b/src/script/api/script_event_types.cpp index c29cfa3a7d..321c82c12b 100644 --- a/src/script/api/script_event_types.cpp +++ b/src/script/api/script_event_types.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_event_types.cpp Implementation of all EventTypes. */ diff --git a/src/script/api/script_event_types.hpp b/src/script/api/script_event_types.hpp index 25ba6d5bb9..1f32c6911c 100644 --- a/src/script/api/script_event_types.hpp +++ b/src/script/api/script_event_types.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_event_types.hpp The detailed types of all events. */ diff --git a/src/script/api/script_execmode.cpp b/src/script/api/script_execmode.cpp index 81275cb49d..976fa21e4f 100644 --- a/src/script/api/script_execmode.cpp +++ b/src/script/api/script_execmode.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_execmode.cpp Implementation of ScriptExecMode. */ diff --git a/src/script/api/script_execmode.hpp b/src/script/api/script_execmode.hpp index a673a195b2..b847bb433c 100644 --- a/src/script/api/script_execmode.hpp +++ b/src/script/api/script_execmode.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_execmode.hpp Switch the script to Execute Mode. */ diff --git a/src/script/api/script_game.cpp b/src/script/api/script_game.cpp index 2b9fb4381b..7354ddd64a 100644 --- a/src/script/api/script_game.cpp +++ b/src/script/api/script_game.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_game.cpp Implementation of ScriptGame. */ diff --git a/src/script/api/script_game.hpp b/src/script/api/script_game.hpp index 76163162cc..c317f88436 100644 --- a/src/script/api/script_game.hpp +++ b/src/script/api/script_game.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_game.hpp Everything to manipulate the current running game. */ diff --git a/src/script/api/script_gamesettings.cpp b/src/script/api/script_gamesettings.cpp index 1396f3e9bc..96d075a7cd 100644 --- a/src/script/api/script_gamesettings.cpp +++ b/src/script/api/script_gamesettings.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_gamesettings.cpp Implementation of ScriptGameSettings. */ diff --git a/src/script/api/script_gamesettings.hpp b/src/script/api/script_gamesettings.hpp index b706e86d18..7febeec654 100644 --- a/src/script/api/script_gamesettings.hpp +++ b/src/script/api/script_gamesettings.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_gamesettings.hpp Everything to read game settings. */ diff --git a/src/script/api/script_goal.cpp b/src/script/api/script_goal.cpp index d019fdda26..5a45b0457b 100644 --- a/src/script/api/script_goal.cpp +++ b/src/script/api/script_goal.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_goal.cpp Implementation of ScriptGoal. */ diff --git a/src/script/api/script_goal.hpp b/src/script/api/script_goal.hpp index 7a4ff7e991..eb3427ee20 100644 --- a/src/script/api/script_goal.hpp +++ b/src/script/api/script_goal.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_goal.hpp Everything to manipulate the current running goal. */ diff --git a/src/script/api/script_group.cpp b/src/script/api/script_group.cpp index 5713fddc35..eda5666985 100644 --- a/src/script/api/script_group.cpp +++ b/src/script/api/script_group.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_group.cpp Implementation of ScriptGroup. */ diff --git a/src/script/api/script_group.hpp b/src/script/api/script_group.hpp index a4a497c05d..fba48e1f3b 100644 --- a/src/script/api/script_group.hpp +++ b/src/script/api/script_group.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_group.hpp Everything to put vehicles into groups. */ diff --git a/src/script/api/script_grouplist.cpp b/src/script/api/script_grouplist.cpp index c0aa69e7af..bab33178f1 100644 --- a/src/script/api/script_grouplist.cpp +++ b/src/script/api/script_grouplist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_grouplist.cpp Implementation of ScriptGroupList and friends. */ diff --git a/src/script/api/script_grouplist.hpp b/src/script/api/script_grouplist.hpp index c4b2bb4fcc..ab49b6cb0d 100644 --- a/src/script/api/script_grouplist.hpp +++ b/src/script/api/script_grouplist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_grouplist.hpp List all the groups (you own). */ diff --git a/src/script/api/script_includes.hpp.in b/src/script/api/script_includes.hpp.in index 7bb7092c74..8e1adfcd7e 100644 --- a/src/script/api/script_includes.hpp.in +++ b/src/script/api/script_includes.hpp.in @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp index dfaccb8b40..8277390a0d 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industry.cpp Implementation of ScriptIndustry. */ diff --git a/src/script/api/script_industry.hpp b/src/script/api/script_industry.hpp index e35667fcf6..94bbdec96f 100644 --- a/src/script/api/script_industry.hpp +++ b/src/script/api/script_industry.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industry.hpp Everything to query and build industries. */ diff --git a/src/script/api/script_industrylist.cpp b/src/script/api/script_industrylist.cpp index a9dab8b3d6..4aa49eb561 100644 --- a/src/script/api/script_industrylist.cpp +++ b/src/script/api/script_industrylist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrylist.cpp Implementation of ScriptIndustryList and friends. */ diff --git a/src/script/api/script_industrylist.hpp b/src/script/api/script_industrylist.hpp index bb56d9f6c1..6e7ed33bd9 100644 --- a/src/script/api/script_industrylist.hpp +++ b/src/script/api/script_industrylist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrylist.hpp List all the industries. */ diff --git a/src/script/api/script_industrytype.cpp b/src/script/api/script_industrytype.cpp index e945128b2e..13553471be 100644 --- a/src/script/api/script_industrytype.cpp +++ b/src/script/api/script_industrytype.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrytype.cpp Implementation of ScriptIndustryType. */ diff --git a/src/script/api/script_industrytype.hpp b/src/script/api/script_industrytype.hpp index 50bdb8ec60..a1b6d68e6a 100644 --- a/src/script/api/script_industrytype.hpp +++ b/src/script/api/script_industrytype.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrytype.hpp Everything to query and build industries. */ diff --git a/src/script/api/script_industrytypelist.cpp b/src/script/api/script_industrytypelist.cpp index c8986f675a..365c72864a 100644 --- a/src/script/api/script_industrytypelist.cpp +++ b/src/script/api/script_industrytypelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrytypelist.cpp Implementation of ScriptIndustryTypeList. */ diff --git a/src/script/api/script_industrytypelist.hpp b/src/script/api/script_industrytypelist.hpp index 2d2f8775be..c8bd599337 100644 --- a/src/script/api/script_industrytypelist.hpp +++ b/src/script/api/script_industrytypelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_industrytypelist.hpp List all available industry types. */ diff --git a/src/script/api/script_info_docs.hpp b/src/script/api/script_info_docs.hpp index 286dc9e33a..86c3c4b9ff 100644 --- a/src/script/api/script_info_docs.hpp +++ b/src/script/api/script_info_docs.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_info_docs.hpp Description of the functions an Script can/must provide in ScriptInfo. */ diff --git a/src/script/api/script_infrastructure.cpp b/src/script/api/script_infrastructure.cpp index 17e65e932b..4ec91d3cb9 100644 --- a/src/script/api/script_infrastructure.cpp +++ b/src/script/api/script_infrastructure.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_infrastructure.cpp Implementation of ScriptInfrastructure. */ diff --git a/src/script/api/script_infrastructure.hpp b/src/script/api/script_infrastructure.hpp index 79ced1b586..a8239fd458 100644 --- a/src/script/api/script_infrastructure.hpp +++ b/src/script/api/script_infrastructure.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_infrastructure.hpp Everything to query a company's infrastructure. */ diff --git a/src/script/api/script_league.cpp b/src/script/api/script_league.cpp index 33d74e45e8..e24efb051d 100644 --- a/src/script/api/script_league.cpp +++ b/src/script/api/script_league.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_league.cpp Implementation of ScriptLeagueTable. */ diff --git a/src/script/api/script_league.hpp b/src/script/api/script_league.hpp index d6181e0774..3e2452d715 100644 --- a/src/script/api/script_league.hpp +++ b/src/script/api/script_league.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_league.hpp Everything to manipulate league tables. */ diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index 9337ac5461..d4f68a5d48 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_list.cpp Implementation of ScriptList. */ diff --git a/src/script/api/script_list.hpp b/src/script/api/script_list.hpp index 6027ea6273..2acce55247 100644 --- a/src/script/api/script_list.hpp +++ b/src/script/api/script_list.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_list.hpp A list which can keep item/value pairs, which you can walk. */ diff --git a/src/script/api/script_log.cpp b/src/script/api/script_log.cpp index 41182f2f3b..3ba21ad899 100644 --- a/src/script/api/script_log.cpp +++ b/src/script/api/script_log.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_log.cpp Implementation of ScriptLog. */ diff --git a/src/script/api/script_log.hpp b/src/script/api/script_log.hpp index cac45a3067..9d5a8855c7 100644 --- a/src/script/api/script_log.hpp +++ b/src/script/api/script_log.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_log.hpp Everything to handle and issue log messages. */ diff --git a/src/script/api/script_log_types.hpp b/src/script/api/script_log_types.hpp index d52be944f8..7d16bb7017 100644 --- a/src/script/api/script_log_types.hpp +++ b/src/script/api/script_log_types.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_log_types.hpp Data types for script log messages. */ diff --git a/src/script/api/script_map.cpp b/src/script/api/script_map.cpp index fb76ac0bf6..5f108847d6 100644 --- a/src/script/api/script_map.cpp +++ b/src/script/api/script_map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_map.cpp Implementation of ScriptMap. */ diff --git a/src/script/api/script_map.hpp b/src/script/api/script_map.hpp index 323ba31c28..cba41e1635 100644 --- a/src/script/api/script_map.hpp +++ b/src/script/api/script_map.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_map.hpp Everything to query and manipulate map metadata. */ diff --git a/src/script/api/script_marine.cpp b/src/script/api/script_marine.cpp index 641007447b..89e5269d05 100644 --- a/src/script/api/script_marine.cpp +++ b/src/script/api/script_marine.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_marine.cpp Implementation of ScriptMarine. */ diff --git a/src/script/api/script_marine.hpp b/src/script/api/script_marine.hpp index c5556948e1..282c0550d6 100644 --- a/src/script/api/script_marine.hpp +++ b/src/script/api/script_marine.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_marine.hpp Everything to query and build marine. */ diff --git a/src/script/api/script_newgrf.cpp b/src/script/api/script_newgrf.cpp index 5e0da50269..33d814fa9a 100644 --- a/src/script/api/script_newgrf.cpp +++ b/src/script/api/script_newgrf.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_newgrf.cpp Implementation of ScriptNewGRF and friends. */ diff --git a/src/script/api/script_newgrf.hpp b/src/script/api/script_newgrf.hpp index 7b9b2286c5..cdbca28657 100644 --- a/src/script/api/script_newgrf.hpp +++ b/src/script/api/script_newgrf.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_newgrf.hpp NewGRF info for scripts. */ diff --git a/src/script/api/script_news.cpp b/src/script/api/script_news.cpp index ae4daa9f01..67526c699c 100644 --- a/src/script/api/script_news.cpp +++ b/src/script/api/script_news.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_news.cpp Implementation of ScriptNews. */ diff --git a/src/script/api/script_news.hpp b/src/script/api/script_news.hpp index 269cccd0cf..949d66e28b 100644 --- a/src/script/api/script_news.hpp +++ b/src/script/api/script_news.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_news.hpp Everything to handle news messages. */ diff --git a/src/script/api/script_object.cpp b/src/script/api/script_object.cpp index cb7421c97e..33fcceea15 100644 --- a/src/script/api/script_object.cpp +++ b/src/script/api/script_object.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_object.cpp Implementation of ScriptObject. */ diff --git a/src/script/api/script_object.hpp b/src/script/api/script_object.hpp index 4db10680e3..27ce64fa6f 100644 --- a/src/script/api/script_object.hpp +++ b/src/script/api/script_object.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_object.hpp Main object, on which all objects depend. */ diff --git a/src/script/api/script_objecttype.cpp b/src/script/api/script_objecttype.cpp index 82303b331c..1d57b0f213 100644 --- a/src/script/api/script_objecttype.cpp +++ b/src/script/api/script_objecttype.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_objecttype.cpp Implementation of ScriptObjectType. */ diff --git a/src/script/api/script_objecttype.hpp b/src/script/api/script_objecttype.hpp index 85b7011dc0..20607d4789 100644 --- a/src/script/api/script_objecttype.hpp +++ b/src/script/api/script_objecttype.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_objecttype.hpp Everything to query and build industries. */ diff --git a/src/script/api/script_objecttypelist.cpp b/src/script/api/script_objecttypelist.cpp index 725997067b..5de364418b 100644 --- a/src/script/api/script_objecttypelist.cpp +++ b/src/script/api/script_objecttypelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_objecttypelist.cpp Implementation of ScriptObjectTypeList. */ diff --git a/src/script/api/script_objecttypelist.hpp b/src/script/api/script_objecttypelist.hpp index 0276838e8c..58466417dc 100644 --- a/src/script/api/script_objecttypelist.hpp +++ b/src/script/api/script_objecttypelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_objecttypelist.hpp List all available object types. */ diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index c8fd4f6553..5810041fad 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_order.cpp Implementation of ScriptOrder. */ diff --git a/src/script/api/script_order.hpp b/src/script/api/script_order.hpp index 534e0b92b5..4cbefda839 100644 --- a/src/script/api/script_order.hpp +++ b/src/script/api/script_order.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_order.hpp Everything to query and build orders. */ diff --git a/src/script/api/script_priorityqueue.cpp b/src/script/api/script_priorityqueue.cpp index 14fe6d59f2..e68389414d 100644 --- a/src/script/api/script_priorityqueue.cpp +++ b/src/script/api/script_priorityqueue.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_priorityqueue.cpp Implementation of ScriptPriorityQueue. */ diff --git a/src/script/api/script_priorityqueue.hpp b/src/script/api/script_priorityqueue.hpp index 74aecc7507..6b6daace08 100644 --- a/src/script/api/script_priorityqueue.hpp +++ b/src/script/api/script_priorityqueue.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_priorityqueue.hpp A queue that keeps a list of items sorted by a priority. */ diff --git a/src/script/api/script_rail.cpp b/src/script/api/script_rail.cpp index 592fed196a..2b6c81a818 100644 --- a/src/script/api/script_rail.cpp +++ b/src/script/api/script_rail.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_rail.cpp Implementation of ScriptRail. */ diff --git a/src/script/api/script_rail.hpp b/src/script/api/script_rail.hpp index 6c535b84d5..ebe8a9de7b 100644 --- a/src/script/api/script_rail.hpp +++ b/src/script/api/script_rail.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_rail.hpp Everything to query and build rails. */ diff --git a/src/script/api/script_railtypelist.cpp b/src/script/api/script_railtypelist.cpp index c5344a43c9..7b779f813b 100644 --- a/src/script/api/script_railtypelist.cpp +++ b/src/script/api/script_railtypelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_railtypelist.cpp Implementation of ScriptRailTypeList and friends. */ diff --git a/src/script/api/script_railtypelist.hpp b/src/script/api/script_railtypelist.hpp index 78c7f9ecff..2d65f29696 100644 --- a/src/script/api/script_railtypelist.hpp +++ b/src/script/api/script_railtypelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_railtypelist.hpp List all available railtypes. */ diff --git a/src/script/api/script_road.cpp b/src/script/api/script_road.cpp index c29e8dedd7..9bff0ff84d 100644 --- a/src/script/api/script_road.cpp +++ b/src/script/api/script_road.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_road.cpp Implementation of ScriptRoad. */ diff --git a/src/script/api/script_road.hpp b/src/script/api/script_road.hpp index 048b4ae311..03fd0d90ec 100644 --- a/src/script/api/script_road.hpp +++ b/src/script/api/script_road.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_road.hpp Everything to query and build roads. */ diff --git a/src/script/api/script_roadtypelist.cpp b/src/script/api/script_roadtypelist.cpp index b5c23c3802..a9b1f5bbff 100644 --- a/src/script/api/script_roadtypelist.cpp +++ b/src/script/api/script_roadtypelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_roadtypelist.cpp Implementation of ScriptRoadTypeList and friends. */ diff --git a/src/script/api/script_roadtypelist.hpp b/src/script/api/script_roadtypelist.hpp index 41cf9fe2e8..0ed1f49b4a 100644 --- a/src/script/api/script_roadtypelist.hpp +++ b/src/script/api/script_roadtypelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_roadtypelist.hpp List all available roadtypes. */ diff --git a/src/script/api/script_sign.cpp b/src/script/api/script_sign.cpp index 10f73adc1f..e95511f1fe 100644 --- a/src/script/api/script_sign.cpp +++ b/src/script/api/script_sign.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_sign.cpp Implementation of ScriptSign. */ diff --git a/src/script/api/script_sign.hpp b/src/script/api/script_sign.hpp index d06898d656..2950406d76 100644 --- a/src/script/api/script_sign.hpp +++ b/src/script/api/script_sign.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_sign.hpp Everything to query and build signs. */ diff --git a/src/script/api/script_signlist.cpp b/src/script/api/script_signlist.cpp index 000c104093..a603bb92c6 100644 --- a/src/script/api/script_signlist.cpp +++ b/src/script/api/script_signlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_signlist.cpp Implementation of ScriptSignList and friends. */ diff --git a/src/script/api/script_signlist.hpp b/src/script/api/script_signlist.hpp index e814b441ef..c8cebc5b5b 100644 --- a/src/script/api/script_signlist.hpp +++ b/src/script/api/script_signlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_signlist.hpp List all the signs of your company. */ diff --git a/src/script/api/script_station.cpp b/src/script/api/script_station.cpp index 07100981c2..a0788ffb2a 100644 --- a/src/script/api/script_station.cpp +++ b/src/script/api/script_station.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_station.cpp Implementation of ScriptStation. */ diff --git a/src/script/api/script_station.hpp b/src/script/api/script_station.hpp index 32bd2827ed..1472d4e069 100644 --- a/src/script/api/script_station.hpp +++ b/src/script/api/script_station.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_station.hpp Everything to query and build stations. */ diff --git a/src/script/api/script_stationlist.cpp b/src/script/api/script_stationlist.cpp index 459c9100f5..5cca6c7898 100644 --- a/src/script/api/script_stationlist.cpp +++ b/src/script/api/script_stationlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_stationlist.cpp Implementation of ScriptStationList and friends. */ diff --git a/src/script/api/script_stationlist.hpp b/src/script/api/script_stationlist.hpp index 0331502a87..84020f6da9 100644 --- a/src/script/api/script_stationlist.hpp +++ b/src/script/api/script_stationlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_stationlist.hpp List all the stations (you own). */ diff --git a/src/script/api/script_story_page.cpp b/src/script/api/script_story_page.cpp index 3a5fb911a5..c5c8ad86da 100644 --- a/src/script/api/script_story_page.cpp +++ b/src/script/api/script_story_page.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_story_page.cpp Implementation of ScriptStoryPage. */ diff --git a/src/script/api/script_story_page.hpp b/src/script/api/script_story_page.hpp index 8816d6cd94..49fac20cb9 100644 --- a/src/script/api/script_story_page.hpp +++ b/src/script/api/script_story_page.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_story_page.hpp Everything to manipulate a story page. */ diff --git a/src/script/api/script_storypageelementlist.cpp b/src/script/api/script_storypageelementlist.cpp index c52c7d6817..725d0801fe 100644 --- a/src/script/api/script_storypageelementlist.cpp +++ b/src/script/api/script_storypageelementlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_storypageelementlist.cpp Implementation of ScriptStoryPageElementList and friends. */ diff --git a/src/script/api/script_storypageelementlist.hpp b/src/script/api/script_storypageelementlist.hpp index 15b985d359..0e1ec01a65 100644 --- a/src/script/api/script_storypageelementlist.hpp +++ b/src/script/api/script_storypageelementlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_storypageelementlist.hpp List all story page elements. */ diff --git a/src/script/api/script_storypagelist.cpp b/src/script/api/script_storypagelist.cpp index 0faf6e995d..9ab7ea96e9 100644 --- a/src/script/api/script_storypagelist.cpp +++ b/src/script/api/script_storypagelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_storypagelist.cpp Implementation of ScriptStoryPageList and friends. */ diff --git a/src/script/api/script_storypagelist.hpp b/src/script/api/script_storypagelist.hpp index b491907c53..516e6f0425 100644 --- a/src/script/api/script_storypagelist.hpp +++ b/src/script/api/script_storypagelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_storypagelist.hpp List all story pages. */ diff --git a/src/script/api/script_subsidy.cpp b/src/script/api/script_subsidy.cpp index 586c436655..092ade9ad6 100644 --- a/src/script/api/script_subsidy.cpp +++ b/src/script/api/script_subsidy.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_subsidy.cpp Implementation of ScriptSubsidy. */ diff --git a/src/script/api/script_subsidy.hpp b/src/script/api/script_subsidy.hpp index e24dfdda0a..ce4a76e98d 100644 --- a/src/script/api/script_subsidy.hpp +++ b/src/script/api/script_subsidy.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_subsidy.hpp Everything to query subsidies. */ diff --git a/src/script/api/script_subsidylist.cpp b/src/script/api/script_subsidylist.cpp index bd2ea96dfc..db5ed56bfa 100644 --- a/src/script/api/script_subsidylist.cpp +++ b/src/script/api/script_subsidylist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_subsidylist.cpp Implementation of ScriptSubsidyList. */ diff --git a/src/script/api/script_subsidylist.hpp b/src/script/api/script_subsidylist.hpp index f0fa9d97d2..12a8d87994 100644 --- a/src/script/api/script_subsidylist.hpp +++ b/src/script/api/script_subsidylist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_subsidylist.hpp List all the subsidies. */ diff --git a/src/script/api/script_testmode.cpp b/src/script/api/script_testmode.cpp index 5d7e2eadd8..5e9fba2dab 100644 --- a/src/script/api/script_testmode.cpp +++ b/src/script/api/script_testmode.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_testmode.cpp Implementation of ScriptTestMode. */ diff --git a/src/script/api/script_testmode.hpp b/src/script/api/script_testmode.hpp index abebc0a6ce..475e52e337 100644 --- a/src/script/api/script_testmode.hpp +++ b/src/script/api/script_testmode.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_testmode.hpp Switch the script instance to Test Mode. */ diff --git a/src/script/api/script_text.cpp b/src/script/api/script_text.cpp index 89f0249ad2..717acccb4d 100644 --- a/src/script/api/script_text.cpp +++ b/src/script/api/script_text.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_text.cpp Implementation of ScriptText. */ diff --git a/src/script/api/script_text.hpp b/src/script/api/script_text.hpp index 62fd3ba587..b51aecb2b2 100644 --- a/src/script/api/script_text.hpp +++ b/src/script/api/script_text.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_text.hpp Everything to handle text which can be translated. */ diff --git a/src/script/api/script_tile.cpp b/src/script/api/script_tile.cpp index 9979285610..90276de8d4 100644 --- a/src/script/api/script_tile.cpp +++ b/src/script/api/script_tile.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tile.cpp Implementation of ScriptTile. */ diff --git a/src/script/api/script_tile.hpp b/src/script/api/script_tile.hpp index 6a3154a632..dc41f74822 100644 --- a/src/script/api/script_tile.hpp +++ b/src/script/api/script_tile.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tile.hpp Everything to query and manipulate tiles. */ diff --git a/src/script/api/script_tilelist.cpp b/src/script/api/script_tilelist.cpp index 9f89ae0c6d..f86bf65ff9 100644 --- a/src/script/api/script_tilelist.cpp +++ b/src/script/api/script_tilelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tilelist.cpp Implementation of ScriptTileList and friends. */ diff --git a/src/script/api/script_tilelist.hpp b/src/script/api/script_tilelist.hpp index 4b2a2ef9f6..01f1ed06db 100644 --- a/src/script/api/script_tilelist.hpp +++ b/src/script/api/script_tilelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tilelist.hpp List tiles. */ diff --git a/src/script/api/script_town.cpp b/src/script/api/script_town.cpp index dc47da6fd9..602ffdc9fa 100644 --- a/src/script/api/script_town.cpp +++ b/src/script/api/script_town.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_town.cpp Implementation of ScriptTown. */ diff --git a/src/script/api/script_town.hpp b/src/script/api/script_town.hpp index a1d96f9e03..4e966c63c4 100644 --- a/src/script/api/script_town.hpp +++ b/src/script/api/script_town.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_town.hpp Everything to query towns. */ diff --git a/src/script/api/script_townlist.cpp b/src/script/api/script_townlist.cpp index e9ef63e9ac..a2e834f0f4 100644 --- a/src/script/api/script_townlist.cpp +++ b/src/script/api/script_townlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_townlist.cpp Implementation of ScriptTownList and friends. */ diff --git a/src/script/api/script_townlist.hpp b/src/script/api/script_townlist.hpp index 42d15d06e5..0a55dff77a 100644 --- a/src/script/api/script_townlist.hpp +++ b/src/script/api/script_townlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_townlist.hpp List all the towns. */ diff --git a/src/script/api/script_tunnel.cpp b/src/script/api/script_tunnel.cpp index ce7877dd8a..4eb064353a 100644 --- a/src/script/api/script_tunnel.cpp +++ b/src/script/api/script_tunnel.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tunnel.cpp Implementation of ScriptTunnel. */ diff --git a/src/script/api/script_tunnel.hpp b/src/script/api/script_tunnel.hpp index 2331d8b313..bf4483b789 100644 --- a/src/script/api/script_tunnel.hpp +++ b/src/script/api/script_tunnel.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_tunnel.hpp Everything to query and build tunnels. */ diff --git a/src/script/api/script_types.hpp b/src/script/api/script_types.hpp index b007ce8d56..15a198d343 100644 --- a/src/script/api/script_types.hpp +++ b/src/script/api/script_types.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp index ccc869fcdc..0bec1959e1 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_vehicle.cpp Implementation of ScriptVehicle. */ diff --git a/src/script/api/script_vehicle.hpp b/src/script/api/script_vehicle.hpp index 3994acbd79..3c8b1605ba 100644 --- a/src/script/api/script_vehicle.hpp +++ b/src/script/api/script_vehicle.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_vehicle.hpp Everything to query and build vehicles. */ diff --git a/src/script/api/script_vehiclelist.cpp b/src/script/api/script_vehiclelist.cpp index 9b52e90934..5336e431a2 100644 --- a/src/script/api/script_vehiclelist.cpp +++ b/src/script/api/script_vehiclelist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_vehiclelist.cpp Implementation of ScriptVehicleList and friends. */ diff --git a/src/script/api/script_vehiclelist.hpp b/src/script/api/script_vehiclelist.hpp index 6ac972d178..e0d2bb76bd 100644 --- a/src/script/api/script_vehiclelist.hpp +++ b/src/script/api/script_vehiclelist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_vehiclelist.hpp List all the vehicles (you own). */ diff --git a/src/script/api/script_viewport.cpp b/src/script/api/script_viewport.cpp index 82b42d0b1c..6eb7e4b07b 100644 --- a/src/script/api/script_viewport.cpp +++ b/src/script/api/script_viewport.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_viewport.cpp Implementation of ScriptViewport. */ diff --git a/src/script/api/script_viewport.hpp b/src/script/api/script_viewport.hpp index 49a8bca333..1dd0011c53 100644 --- a/src/script/api/script_viewport.hpp +++ b/src/script/api/script_viewport.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_viewport.hpp Everything to manipulate the user's viewport. */ diff --git a/src/script/api/script_waypoint.cpp b/src/script/api/script_waypoint.cpp index 45ea701ab5..b98ba9cf5c 100644 --- a/src/script/api/script_waypoint.cpp +++ b/src/script/api/script_waypoint.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_waypoint.cpp Implementation of ScriptWaypoint. */ diff --git a/src/script/api/script_waypoint.hpp b/src/script/api/script_waypoint.hpp index 81edf2b457..8c3bdb0c86 100644 --- a/src/script/api/script_waypoint.hpp +++ b/src/script/api/script_waypoint.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_waypoint.hpp Everything to query and build waypoints. */ diff --git a/src/script/api/script_waypointlist.cpp b/src/script/api/script_waypointlist.cpp index ad6ed72513..e465a9d6c2 100644 --- a/src/script/api/script_waypointlist.cpp +++ b/src/script/api/script_waypointlist.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_waypointlist.cpp Implementation of ScriptWaypointList and friends. */ diff --git a/src/script/api/script_waypointlist.hpp b/src/script/api/script_waypointlist.hpp index f05754b1e0..a4bde44fd1 100644 --- a/src/script/api/script_waypointlist.hpp +++ b/src/script/api/script_waypointlist.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_waypointlist.hpp List all the waypoints (you own). */ diff --git a/src/script/api/script_window.cpp b/src/script/api/script_window.cpp index 42b5614c03..58a47855a1 100644 --- a/src/script/api/script_window.cpp +++ b/src/script/api/script_window.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_window.cpp Implementation of ScriptWindow. */ diff --git a/src/script/api/script_window.hpp.in b/src/script/api/script_window.hpp.in index 889b9dafaf..cc29b44d6d 100644 --- a/src/script/api/script_window.hpp.in +++ b/src/script/api/script_window.hpp.in @@ -2,7 +2,7 @@ * 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 . + * 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 script_window.hpp Everything to handle window interaction. */ diff --git a/src/script/api/squirrel_export.sq.hpp.in b/src/script/api/squirrel_export.sq.hpp.in index 09b7da764c..47d0328391 100644 --- a/src/script/api/squirrel_export.sq.hpp.in +++ b/src/script/api/squirrel_export.sq.hpp.in @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */ diff --git a/src/script/script_cmd.h b/src/script/script_cmd.h index c1b3a9b23c..b53d9e2311 100644 --- a/src/script/script_cmd.h +++ b/src/script/script_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 script_cmd.h Command definitions related to scripts. */ diff --git a/src/script/script_config.cpp b/src/script/script_config.cpp index 9d9dbe85b6..fcb9e75574 100644 --- a/src/script/script_config.cpp +++ b/src/script/script_config.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_config.cpp Implementation of ScriptConfig. */ diff --git a/src/script/script_config.hpp b/src/script/script_config.hpp index 76da137bcf..96afdf7d5b 100644 --- a/src/script/script_config.hpp +++ b/src/script/script_config.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_config.hpp ScriptConfig stores the configuration settings of every Script. */ diff --git a/src/script/script_fatalerror.hpp b/src/script/script_fatalerror.hpp index 96c64e0b9d..d93f4f87f9 100644 --- a/src/script/script_fatalerror.hpp +++ b/src/script/script_fatalerror.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_fatalerror.hpp The definition of Script_FatalError. */ diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 74d9a11b8c..f2cdfbbc07 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_gui.cpp %Window for configuring the Scripts */ diff --git a/src/script/script_gui.h b/src/script/script_gui.h index abb2063679..d1cf82e629 100644 --- a/src/script/script_gui.h +++ b/src/script/script_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 script_gui.hpp %Window for configuring the scripts */ diff --git a/src/script/script_info.cpp b/src/script/script_info.cpp index 65d23fe0ea..2864d4c878 100644 --- a/src/script/script_info.cpp +++ b/src/script/script_info.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_info.cpp Implementation of ScriptInfo. */ diff --git a/src/script/script_info.hpp b/src/script/script_info.hpp index f1920aa120..d77be08f6b 100644 --- a/src/script/script_info.hpp +++ b/src/script/script_info.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_info.hpp ScriptInfo keeps track of all information of a script, like Author, Description, ... */ diff --git a/src/script/script_info_dummy.cpp b/src/script/script_info_dummy.cpp index df7519bcaf..101e9bfc62 100644 --- a/src/script/script_info_dummy.cpp +++ b/src/script/script_info_dummy.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_info_dummy.cpp Implementation of a dummy Script. */ diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 5fbd73ceea..31a72c21e9 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_instance.cpp Implementation of ScriptInstance. */ diff --git a/src/script/script_instance.hpp b/src/script/script_instance.hpp index fa11a5c896..501f7abf22 100644 --- a/src/script/script_instance.hpp +++ b/src/script/script_instance.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_instance.hpp The ScriptInstance tracks a script. */ diff --git a/src/script/script_scanner.cpp b/src/script/script_scanner.cpp index ff7bece3b1..61ceba3323 100644 --- a/src/script/script_scanner.cpp +++ b/src/script/script_scanner.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_scanner.cpp Allows scanning for scripts. */ diff --git a/src/script/script_scanner.hpp b/src/script/script_scanner.hpp index 9bd49f3357..5346d58887 100644 --- a/src/script/script_scanner.hpp +++ b/src/script/script_scanner.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_scanner.hpp Declarations of the class for the script scanner. */ diff --git a/src/script/script_storage.hpp b/src/script/script_storage.hpp index 29b0c16434..73a4d5fe83 100644 --- a/src/script/script_storage.hpp +++ b/src/script/script_storage.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_storage.hpp Defines ScriptStorage and includes all files required for it. */ diff --git a/src/script/script_suspend.hpp b/src/script/script_suspend.hpp index 1692c5b408..e585da8366 100644 --- a/src/script/script_suspend.hpp +++ b/src/script/script_suspend.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_suspend.hpp The Script_Suspend tracks the suspension of a script. */ diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp index 41e030fc1d..f59b490e8f 100644 --- a/src/script/squirrel.cpp +++ b/src/script/squirrel.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel.cpp the implementation of the Squirrel class. It handles all Squirrel-stuff and gives a nice API back to work with. */ diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp index 847c8f38ba..9f87f9fdf9 100644 --- a/src/script/squirrel.hpp +++ b/src/script/squirrel.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel.hpp defines the Squirrel class */ diff --git a/src/script/squirrel_class.hpp b/src/script/squirrel_class.hpp index dd84ff652b..47626a47ee 100644 --- a/src/script/squirrel_class.hpp +++ b/src/script/squirrel_class.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel_class.hpp Defines templates for converting C++ classes to Squirrel classes */ diff --git a/src/script/squirrel_helper.hpp b/src/script/squirrel_helper.hpp index f63351ddbf..0fa254ee33 100644 --- a/src/script/squirrel_helper.hpp +++ b/src/script/squirrel_helper.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel_helper.hpp declarations and parts of the implementation of the class for convert code */ diff --git a/src/script/squirrel_helper_type.hpp b/src/script/squirrel_helper_type.hpp index 9fa6a0aa6e..60d37e4b8c 100644 --- a/src/script/squirrel_helper_type.hpp +++ b/src/script/squirrel_helper_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel_helper_type.hpp Helper structs for converting Squirrel data structures to C++. */ diff --git a/src/script/squirrel_std.cpp b/src/script/squirrel_std.cpp index 0ee1dea873..98e20b5aa0 100644 --- a/src/script/squirrel_std.cpp +++ b/src/script/squirrel_std.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel_std.cpp Implements the Squirrel Standard Function class */ diff --git a/src/script/squirrel_std.hpp b/src/script/squirrel_std.hpp index 1a208eeae1..9f266370fb 100644 --- a/src/script/squirrel_std.hpp +++ b/src/script/squirrel_std.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 squirrel_std.hpp defines the Squirrel Standard Function class */ diff --git a/src/settingentry_gui.cpp b/src/settingentry_gui.cpp index 087cff205d..a266a10f82 100644 --- a/src/settingentry_gui.cpp +++ b/src/settingentry_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 settingentry_gui.cpp Definitions of classes for handling display of individual configuration settings. */ diff --git a/src/settingentry_gui.h b/src/settingentry_gui.h index e23d54e8bf..3f20637396 100644 --- a/src/settingentry_gui.h +++ b/src/settingentry_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 settingentry_gui.h Declarations of classes for handling display of individual configuration settings. */ diff --git a/src/settings.cpp b/src/settings.cpp index 1b90eb6140..2d15b81505 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/settings_cmd.h b/src/settings_cmd.h index 4210869eb9..2332b6aca3 100644 --- a/src/settings_cmd.h +++ b/src/settings_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_cmd.h Command definitions related to settings. */ diff --git a/src/settings_func.h b/src/settings_func.h index 8764e9cba7..851c37217d 100644 --- a/src/settings_func.h +++ b/src/settings_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_func.h Functions related to setting/changing the settings. */ diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 68268cd362..64997fd80b 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 settings_gui.cpp GUI for settings. */ diff --git a/src/settings_gui.h b/src/settings_gui.h index 77b11759fb..ba77da368c 100644 --- a/src/settings_gui.h +++ b/src/settings_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_gui.h Functions for setting GUIs. */ diff --git a/src/settings_internal.h b/src/settings_internal.h index 4efb03baee..124470b77f 100644 --- a/src/settings_internal.h +++ b/src/settings_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_internal.h Functions and types used internally for the settings configurations. */ diff --git a/src/settings_table.cpp b/src/settings_table.cpp index 1881cfd79e..fa66720b1d 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/settings_table.h b/src/settings_table.h index 3b1e8e1056..4d1af46382 100644 --- a/src/settings_table.h +++ b/src/settings_table.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/settings_type.h b/src/settings_type.h index 83a5f828d3..7a07d0d6ea 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_type.h Types related to global configuration settings. */ diff --git a/src/settingsgen/settingsgen.cpp b/src/settingsgen/settingsgen.cpp index 9a082d62d9..ab68f93e37 100644 --- a/src/settingsgen/settingsgen.cpp +++ b/src/settingsgen/settingsgen.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 settingsgen.cpp Tool to create computer-readable settings. */ diff --git a/src/ship.h b/src/ship.h index c4789bf954..e6a068d66d 100644 --- a/src/ship.h +++ b/src/ship.h @@ -2,7 +2,7 @@ * 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 . + * 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 ship.h Base for ships. */ diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 777e983b4e..7b4446de3c 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ship_cmd.cpp Handling of ships. */ diff --git a/src/ship_cmd.h b/src/ship_cmd.h index d990c308b2..4bc1aa809c 100644 --- a/src/ship_cmd.h +++ b/src/ship_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 ship_cmd.h Command definitions related to ships. */ diff --git a/src/ship_gui.cpp b/src/ship_gui.cpp index eb5eb4d42f..dc89b2a3c6 100644 --- a/src/ship_gui.cpp +++ b/src/ship_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 ship_gui.cpp GUI for ships. */ diff --git a/src/signal.cpp b/src/signal.cpp index f6af4d5268..1ad8cce687 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signal.cpp functions related to rail signals updating */ diff --git a/src/signal_func.h b/src/signal_func.h index 46807628f7..d8b9d3ba03 100644 --- a/src/signal_func.h +++ b/src/signal_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 signal_func.h Functions related to signals. */ diff --git a/src/signal_type.h b/src/signal_type.h index 9785d2a004..1704ffeb39 100644 --- a/src/signal_type.h +++ b/src/signal_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 signal_type.h Types and classes related to signals. */ diff --git a/src/signature.cpp b/src/signature.cpp index 91c8e3bff3..081f798139 100644 --- a/src/signature.cpp +++ b/src/signature.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signature.cpp Implementation of signature validation routines. */ diff --git a/src/signature.h b/src/signature.h index 769aeee591..1999866b11 100644 --- a/src/signature.h +++ b/src/signature.h @@ -2,7 +2,7 @@ * 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 . + * 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 signature.h Routines to validate signature files. */ diff --git a/src/signs.cpp b/src/signs.cpp index 90fcf00cf2..41cfd2eb64 100644 --- a/src/signs.cpp +++ b/src/signs.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signs.cpp Handling of signs. */ diff --git a/src/signs_base.h b/src/signs_base.h index 2973cb48f7..57d5e34a7c 100644 --- a/src/signs_base.h +++ b/src/signs_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 signs_base.h Base class for signs. */ diff --git a/src/signs_cmd.cpp b/src/signs_cmd.cpp index 9ac496ce1b..3f93e29726 100644 --- a/src/signs_cmd.cpp +++ b/src/signs_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signs_cmd.cpp Handling of sign related commands. */ diff --git a/src/signs_cmd.h b/src/signs_cmd.h index b51abd88d1..75f66b0044 100644 --- a/src/signs_cmd.h +++ b/src/signs_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 signs_cmd.h Command definitions related to signs. */ diff --git a/src/signs_func.h b/src/signs_func.h index 21abdc98fe..beae91d49f 100644 --- a/src/signs_func.h +++ b/src/signs_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 signs_func.h Functions related to signs. */ diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 109773b952..b0b2c94e55 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 signs_gui.cpp The GUI for signs. */ diff --git a/src/signs_type.h b/src/signs_type.h index ff95f5868e..ba4d62723e 100644 --- a/src/signs_type.h +++ b/src/signs_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 signs_type.h Types related to signs */ diff --git a/src/slider.cpp b/src/slider.cpp index 92963b6c5e..7376daa43e 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 slider.cpp Implementation of the horizontal slider widget. */ diff --git a/src/slider_func.h b/src/slider_func.h index 575c36945e..9bdba162e1 100644 --- a/src/slider_func.h +++ b/src/slider_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 slider_type.h Types related to the horizontal slider widget. */ diff --git a/src/slope_func.h b/src/slope_func.h index 7478512ee8..be33f63b07 100644 --- a/src/slope_func.h +++ b/src/slope_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 slope_func.h Functions related to slopes. */ diff --git a/src/slope_type.h b/src/slope_type.h index 6347bea2ae..351da9ea81 100644 --- a/src/slope_type.h +++ b/src/slope_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 984083b37d..6013de6a78 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 smallmap_gui.cpp GUI that shows a small map of the world with metadata like owner or height. */ diff --git a/src/smallmap_gui.h b/src/smallmap_gui.h index d17a468ae4..b34ac2fc22 100644 --- a/src/smallmap_gui.h +++ b/src/smallmap_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 smallmap_gui.h Smallmap GUI functions. */ diff --git a/src/social_integration.cpp b/src/social_integration.cpp index 887335c22b..0357fd6c11 100644 --- a/src/social_integration.cpp +++ b/src/social_integration.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 social_integration.cpp Base implementation of social integration support. */ diff --git a/src/social_integration.h b/src/social_integration.h index a6ca13f823..ed7e59f7ed 100644 --- a/src/social_integration.h +++ b/src/social_integration.h @@ -2,7 +2,7 @@ * 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 . + * 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 social_integration.h Interface definitions for game to report/respond to social integration. */ diff --git a/src/sortlist_type.h b/src/sortlist_type.h index 9ac1eebb47..47226abeed 100644 --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 sortlist_type.h Base types for having sorted lists in GUIs. */ diff --git a/src/sound.cpp b/src/sound.cpp index 49a3478a2d..31a7edea1b 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sound.cpp Handling of playing sounds. */ diff --git a/src/sound/allegro_s.cpp b/src/sound/allegro_s.cpp index a44578c160..74dc8f5560 100644 --- a/src/sound/allegro_s.cpp +++ b/src/sound/allegro_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 allegro_s.cpp Playing sound via Allegro. */ diff --git a/src/sound/allegro_s.h b/src/sound/allegro_s.h index 658d9dfd83..a90bc90945 100644 --- a/src/sound/allegro_s.h +++ b/src/sound/allegro_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 allegro_s.h Base for playing sound via Allegro. */ diff --git a/src/sound/cocoa_s.cpp b/src/sound/cocoa_s.cpp index 54198b0b5e..a88931457f 100644 --- a/src/sound/cocoa_s.cpp +++ b/src/sound/cocoa_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_s.cpp Sound driver for cocoa. */ diff --git a/src/sound/cocoa_s.h b/src/sound/cocoa_s.h index 74bb83783f..9942b5c1a8 100644 --- a/src/sound/cocoa_s.h +++ b/src/sound/cocoa_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_s.h Base for Cocoa sound handling. */ diff --git a/src/sound/null_s.cpp b/src/sound/null_s.cpp index 738c213403..9d9a1ab523 100644 --- a/src/sound/null_s.cpp +++ b/src/sound/null_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 null_s.cpp The sound driver that doesn't produce sound. */ diff --git a/src/sound/null_s.h b/src/sound/null_s.h index e6c041ac70..9ef29b02b7 100644 --- a/src/sound/null_s.h +++ b/src/sound/null_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 null_s.h Base for the sound of silence. */ diff --git a/src/sound/sdl2_s.cpp b/src/sound/sdl2_s.cpp index af12a00a31..7f2ed4dfaa 100644 --- a/src/sound/sdl2_s.cpp +++ b/src/sound/sdl2_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_s.cpp Playing sound via SDL2. */ diff --git a/src/sound/sdl_s.h b/src/sound/sdl_s.h index 5633fd7149..683dbdcc49 100644 --- a/src/sound/sdl_s.h +++ b/src/sound/sdl_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 sdl_s.h Base for playing sound via SDL. */ diff --git a/src/sound/sound_driver.hpp b/src/sound/sound_driver.hpp index fcf2ec2775..98402e7123 100644 --- a/src/sound/sound_driver.hpp +++ b/src/sound/sound_driver.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 sound_driver.hpp Base for all sound drivers. */ diff --git a/src/sound/win32_s.cpp b/src/sound/win32_s.cpp index e94358d594..03832b35ff 100644 --- a/src/sound/win32_s.cpp +++ b/src/sound/win32_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 win32_s.cpp Handling of sound for Windows. */ diff --git a/src/sound/win32_s.h b/src/sound/win32_s.h index 9fee145393..35c28e3605 100644 --- a/src/sound/win32_s.h +++ b/src/sound/win32_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 win32_s.h Base for Windows sound handling. */ diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp index eadd825e05..c9b29ea694 100644 --- a/src/sound/xaudio2_s.cpp +++ b/src/sound/xaudio2_s.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 xaudio2_s.cpp XAudio2 sound driver. */ diff --git a/src/sound/xaudio2_s.h b/src/sound/xaudio2_s.h index 5f378fa98b..251f2656b5 100644 --- a/src/sound/xaudio2_s.h +++ b/src/sound/xaudio2_s.h @@ -2,7 +2,7 @@ * 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 . + * 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 xaudio2_s.h Base for XAudio2 sound handling. */ diff --git a/src/sound_func.h b/src/sound_func.h index 9879c7c92e..325228c81c 100644 --- a/src/sound_func.h +++ b/src/sound_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 sound_func.h Functions related to sound. */ diff --git a/src/sound_type.h b/src/sound_type.h index 6c52ddc1cb..5358c62924 100644 --- a/src/sound_type.h +++ b/src/sound_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 sound_type.h Types related to sounds. */ diff --git a/src/soundloader.cpp b/src/soundloader.cpp index 96405435fb..8a2d156ba6 100644 --- a/src/soundloader.cpp +++ b/src/soundloader.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 soundloader.cpp Handling of loading sounds. */ diff --git a/src/soundloader_func.h b/src/soundloader_func.h index 1b8837e832..da9d048e4b 100644 --- a/src/soundloader_func.h +++ b/src/soundloader_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 soundloader_func.h Functions related to sound loaders. */ diff --git a/src/soundloader_opus.cpp b/src/soundloader_opus.cpp index 9e1860f3be..9d465743a3 100644 --- a/src/soundloader_opus.cpp +++ b/src/soundloader_opus.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sound_opus.cpp Loading of opus sounds. */ diff --git a/src/soundloader_raw.cpp b/src/soundloader_raw.cpp index 2ac0efc1fb..53b9d01c30 100644 --- a/src/soundloader_raw.cpp +++ b/src/soundloader_raw.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 soundloader_raw.cpp Loading of raw sounds. */ diff --git a/src/soundloader_type.h b/src/soundloader_type.h index 8c91052fd1..840219f350 100644 --- a/src/soundloader_type.h +++ b/src/soundloader_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 soundloader_type.h Types related to sound loaders. */ diff --git a/src/soundloader_wav.cpp b/src/soundloader_wav.cpp index 77db237034..fd9b12846d 100644 --- a/src/soundloader_wav.cpp +++ b/src/soundloader_wav.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 soundloader_wav.cpp Loading of wav sounds. */ diff --git a/src/source_type.h b/src/source_type.h index 1d75fda72a..dac905aaf0 100644 --- a/src/source_type.h +++ b/src/source_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 source_type.h Type for the source of cargo. */ diff --git a/src/sprite.cpp b/src/sprite.cpp index d030b73c7d..dbd95d5cd8 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sprite.cpp Handling of sprites */ diff --git a/src/sprite.h b/src/sprite.h index 504bc3a4e7..89488c00c7 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -2,7 +2,7 @@ * 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 . + * 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 sprite.h Base for drawing complex sprites. */ diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 8e890bc0d6..8b034fb3ab 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 spritecache.cpp Caching of sprites. */ diff --git a/src/spritecache.h b/src/spritecache.h index 4106622c1c..dbb94040b3 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -2,7 +2,7 @@ * 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 . + * 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 spritecache.h Functions to cache sprites in memory. */ diff --git a/src/spritecache_internal.h b/src/spritecache_internal.h index 367db3601e..1ef83e9afb 100644 --- a/src/spritecache_internal.h +++ b/src/spritecache_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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 spritecache_internal.h Internal functions to cache sprites in memory. */ diff --git a/src/spritecache_type.h b/src/spritecache_type.h index a6ffbbc6a1..e0c29ae815 100644 --- a/src/spritecache_type.h +++ b/src/spritecache_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 spritecache_type.h Types related to the sprite cache. */ diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index 905e830eca..a7ddcda139 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 grf.cpp Reading graphics data from (New)GRF files. */ diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index 5721aaf9db..046d2e6b79 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 grf.hpp Base for reading sprites from (New)GRFs. */ diff --git a/src/spriteloader/makeindexed.cpp b/src/spriteloader/makeindexed.cpp index 629f738614..0296dc2b58 100644 --- a/src/spriteloader/makeindexed.cpp +++ b/src/spriteloader/makeindexed.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 makeindexed.cpp Implementation for converting sprites from another source from 32bpp RGBA to indexed 8bpp. */ diff --git a/src/spriteloader/makeindexed.h b/src/spriteloader/makeindexed.h index 75bc67e22e..5d8b5adec6 100644 --- a/src/spriteloader/makeindexed.h +++ b/src/spriteloader/makeindexed.h @@ -2,7 +2,7 @@ * 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 . + * 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 makeindexed.h Base for converting sprites from another source from 32bpp RGBA to indexed 8bpp. */ diff --git a/src/spriteloader/sprite_file.cpp b/src/spriteloader/sprite_file.cpp index a374d7969f..47db5d425f 100644 --- a/src/spriteloader/sprite_file.cpp +++ b/src/spriteloader/sprite_file.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sprite_file.cpp Implementation of logic specific to the SpriteFile class. */ diff --git a/src/spriteloader/sprite_file_type.hpp b/src/spriteloader/sprite_file_type.hpp index cf2cbefa22..0a781f4c6a 100644 --- a/src/spriteloader/sprite_file_type.hpp +++ b/src/spriteloader/sprite_file_type.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 sprite_file_type.hpp Random Access File specialised for accessing sprites. */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index fb36cb0294..c92d143ec6 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 spriteloader.hpp Base for loading sprites. */ diff --git a/src/station.cpp b/src/station.cpp index 8b6b14a827..cf990434e4 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 station.cpp Implementation of the station base class. */ diff --git a/src/station_base.h b/src/station_base.h index 4832a0f60c..f416496f06 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_base.h Base classes/functions for stations. */ diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 9f1a2aa6c7..562f1c1b1f 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 station_cmd.cpp Handling of station tiles. */ diff --git a/src/station_cmd.h b/src/station_cmd.h index 5c12bf407d..25cb6211b9 100644 --- a/src/station_cmd.h +++ b/src/station_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_cmd.h Command definitions related to stations. */ diff --git a/src/station_func.h b/src/station_func.h index f134611e50..3e74745412 100644 --- a/src/station_func.h +++ b/src/station_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_func.h Functions related to stations. */ diff --git a/src/station_gui.cpp b/src/station_gui.cpp index 00ab921110..ca902c2f05 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 station_gui.cpp The GUI for stations. */ diff --git a/src/station_gui.h b/src/station_gui.h index 39a98cc729..7d9bd55366 100644 --- a/src/station_gui.h +++ b/src/station_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_gui.h Contains enums and function declarations connected with stations GUI */ diff --git a/src/station_kdtree.h b/src/station_kdtree.h index ffd9f4a906..13dae2d77c 100644 --- a/src/station_kdtree.h +++ b/src/station_kdtree.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_kdtree.h Declarations for accessing the k-d tree of stations */ diff --git a/src/station_layout_type.h b/src/station_layout_type.h index 3f2c70ff20..17382b3408 100644 --- a/src/station_layout_type.h +++ b/src/station_layout_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_layout_type.h Functions related to station layouts. */ diff --git a/src/station_map.h b/src/station_map.h index e1d67d952a..ae7979d849 100644 --- a/src/station_map.h +++ b/src/station_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_map.h Maps accessors for stations. */ diff --git a/src/station_type.h b/src/station_type.h index 1c4da959dd..f8d324d675 100644 --- a/src/station_type.h +++ b/src/station_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_type.h Types related to stations. */ diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index b6e6987318..fa05885049 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 statusbar_gui.cpp The GUI for the bottom status bar. */ diff --git a/src/statusbar_gui.h b/src/statusbar_gui.h index d66e609363..eb44674435 100644 --- a/src/statusbar_gui.h +++ b/src/statusbar_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 statusbar_gui.h Functions, definitions and such used only by the GUI. */ diff --git a/src/stdafx.h b/src/stdafx.h index e9ae4c02d3..db93d6a6d5 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -2,7 +2,7 @@ * 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 . + * 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 stdafx.h Definition of base types and functions in a cross-platform compatible way. */ diff --git a/src/story.cpp b/src/story.cpp index 18af96767e..286d776898 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 story.cpp Handling of stories. */ diff --git a/src/story_base.h b/src/story_base.h index 67c0995e62..0ba352f979 100644 --- a/src/story_base.h +++ b/src/story_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 story_base.h %StoryPage base class. */ diff --git a/src/story_cmd.h b/src/story_cmd.h index c001675cbc..75574f092c 100644 --- a/src/story_cmd.h +++ b/src/story_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 story_cmd.h Command definitions related to stories. */ diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 1c2605e1b3..f6c43318f3 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 story_gui.cpp GUI for stories. */ diff --git a/src/story_type.h b/src/story_type.h index 7786a7e601..7fe1bb3474 100644 --- a/src/story_type.h +++ b/src/story_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 story_type.h basic types related to story pages */ diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index 85ac7a334d..30d5e1650d 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 strgen.cpp Tool to create computer readable (stand-alone) translation files. */ diff --git a/src/strgen/strgen.h b/src/strgen/strgen.h index f2e4b79014..d659b904df 100644 --- a/src/strgen/strgen.h +++ b/src/strgen/strgen.h @@ -2,7 +2,7 @@ * 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 . + * 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 strgen.h Structures related to strgen. */ diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index 8184ecf597..a3cce39871 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 strgen_base.cpp Tool to create computer readable (stand-alone) translation files. */ diff --git a/src/string.cpp b/src/string.cpp index d87f14615f..08efada2fc 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string.cpp Handling of strings (std::string/std::string_view). */ diff --git a/src/string_base.h b/src/string_base.h index cedafa7559..f23ac9a864 100644 --- a/src/string_base.h +++ b/src/string_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ #ifndef STRING_BASE_H diff --git a/src/string_func.h b/src/string_func.h index aeab9f2e79..921a2b6bef 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/string_type.h b/src/string_type.h index e2e3de80f5..4aead7c571 100644 --- a/src/string_type.h +++ b/src/string_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 string_type.h Types for strings. */ diff --git a/src/stringfilter.cpp b/src/stringfilter.cpp index dd73006900..e1d06e9856 100644 --- a/src/stringfilter.cpp +++ b/src/stringfilter.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 stringfilter.cpp Searching and filtering using a stringterm. */ diff --git a/src/stringfilter_type.h b/src/stringfilter_type.h index f060c3ca4c..ed79926f79 100644 --- a/src/stringfilter_type.h +++ b/src/stringfilter_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 stringfilter_type.h Searching and filtering using a stringterm. */ diff --git a/src/strings.cpp b/src/strings.cpp index f99116c97b..0ab1354b30 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -2,7 +2,7 @@ * 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 . + * 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.cpp Handling of translated strings. */ diff --git a/src/strings_func.h b/src/strings_func.h index e132830977..1436e2eb26 100644 --- a/src/strings_func.h +++ b/src/strings_func.h @@ -2,7 +2,7 @@ * 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 . + * 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.h Functions related to OTTD's strings. */ diff --git a/src/strings_internal.h b/src/strings_internal.h index 07a2ab2a9b..a94216d0bb 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -2,7 +2,7 @@ * 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 . + * 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_internal.h Types and functions related to the internal workings of formatting OpenTTD's strings. */ diff --git a/src/strings_type.h b/src/strings_type.h index bced06abe5..131433e48c 100644 --- a/src/strings_type.h +++ b/src/strings_type.h @@ -2,7 +2,7 @@ * 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 . + * 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_type.h Types related to strings. */ diff --git a/src/subsidy.cpp b/src/subsidy.cpp index 33c4094ae6..0ba5447c54 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy.cpp Handling of subsidies. */ diff --git a/src/subsidy_base.h b/src/subsidy_base.h index 3cc6589e67..d219f9c615 100644 --- a/src/subsidy_base.h +++ b/src/subsidy_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_base.h %Subsidy base class. */ diff --git a/src/subsidy_cmd.h b/src/subsidy_cmd.h index 54eb2cfbbe..95ec30f833 100644 --- a/src/subsidy_cmd.h +++ b/src/subsidy_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_cmd.h Command definitions related to subsidies. */ diff --git a/src/subsidy_func.h b/src/subsidy_func.h index cdd0cb91f8..5a4dfe2c25 100644 --- a/src/subsidy_func.h +++ b/src/subsidy_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_func.h Functions related to subsidies. */ diff --git a/src/subsidy_gui.cpp b/src/subsidy_gui.cpp index 77c8807c7e..48aca74b23 100644 --- a/src/subsidy_gui.cpp +++ b/src/subsidy_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_gui.cpp GUI for subsidies. */ diff --git a/src/subsidy_type.h b/src/subsidy_type.h index 5e51bf05a5..195a6f74ac 100644 --- a/src/subsidy_type.h +++ b/src/subsidy_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_type.h basic types related to subsidies */ diff --git a/src/survey.cpp b/src/survey.cpp index 2c1a1e2428..7f84ff556d 100644 --- a/src/survey.cpp +++ b/src/survey.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 survey.cpp Functions to survey the current game / system, for crashlog and network-survey. */ diff --git a/src/survey.h b/src/survey.h index bb235160ad..4b88185745 100644 --- a/src/survey.h +++ b/src/survey.h @@ -2,7 +2,7 @@ * 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 . + * 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 survey.h Functions to survey the current game / system, for crashlog and network-survey. */ diff --git a/src/table/airport_defaults.h b/src/table/airport_defaults.h index 8aa338467d..f067d3ffce 100644 --- a/src/table/airport_defaults.h +++ b/src/table/airport_defaults.h @@ -2,7 +2,7 @@ * 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 . + * 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 airport_defaults.h Tables with default values for airports and airport tiles. */ diff --git a/src/table/airport_movement.h b/src/table/airport_movement.h index 08e81aaa89..ad7510d361 100644 --- a/src/table/airport_movement.h +++ b/src/table/airport_movement.h @@ -2,7 +2,7 @@ * 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 . + * 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 airport_movement.h Heart of the airports and their finite state machines */ diff --git a/src/table/airporttile_ids.h b/src/table/airporttile_ids.h index 27c2457de0..93fc4c739f 100644 --- a/src/table/airporttile_ids.h +++ b/src/table/airporttile_ids.h @@ -2,7 +2,7 @@ * 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 . + * 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 airporttile_ids.h Enum of the default airport tiles. */ diff --git a/src/table/airporttiles.h b/src/table/airporttiles.h index 056777bf65..7abf6fc5ad 100644 --- a/src/table/airporttiles.h +++ b/src/table/airporttiles.h @@ -2,7 +2,7 @@ * 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 . + * 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 airporttiles.h Tables with airporttile defaults. */ diff --git a/src/table/animcursors.h b/src/table/animcursors.h index f51b9e0ee2..4895c9752a 100644 --- a/src/table/animcursors.h +++ b/src/table/animcursors.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/autorail.h b/src/table/autorail.h index 8c5a5a492f..71a038d77f 100644 --- a/src/table/autorail.h +++ b/src/table/autorail.h @@ -2,7 +2,7 @@ * 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 . + * 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 autorail.h Highlight/sprite information for autorail. */ diff --git a/src/table/bridge_land.h b/src/table/bridge_land.h index c72a5a34f0..2266c6b7c5 100644 --- a/src/table/bridge_land.h +++ b/src/table/bridge_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ #include "table/strings.h" diff --git a/src/table/build_industry.h b/src/table/build_industry.h index 0fb3e00f91..f470afa977 100644 --- a/src/table/build_industry.h +++ b/src/table/build_industry.h @@ -2,7 +2,7 @@ * 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 . + * 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 build_industry.h Tables with default industry layouts and behaviours. */ diff --git a/src/table/cargo_const.h b/src/table/cargo_const.h index 34013f64d3..01005a4a75 100644 --- a/src/table/cargo_const.h +++ b/src/table/cargo_const.h @@ -2,7 +2,7 @@ * 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 . + * 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 cargo_const.h Table of all default cargo types */ diff --git a/src/table/clear_land.h b/src/table/clear_land.h index 00ea23fd0d..6d12ea3e52 100644 --- a/src/table/clear_land.h +++ b/src/table/clear_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 clear_land.h Tables with sprites for clear land and fences. */ diff --git a/src/table/company_face.h b/src/table/company_face.h index e40e0c85d3..433feea4bf 100644 --- a/src/table/company_face.h +++ b/src/table/company_face.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/control_codes.h b/src/table/control_codes.h index b215eab2c6..2ad3830098 100644 --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -2,7 +2,7 @@ * 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 . + * 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 control_codes.h Control codes that are embedded in the translation strings. */ diff --git a/src/table/elrail_data.h b/src/table/elrail_data.h index b439c0faa3..7d5a04f300 100644 --- a/src/table/elrail_data.h +++ b/src/table/elrail_data.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/engines.h b/src/table/engines.h index b5e745c1b2..0118cee592 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/genland.h b/src/table/genland.h index 51d983f2be..0395d4ae33 100644 --- a/src/table/genland.h +++ b/src/table/genland.h @@ -2,7 +2,7 @@ * 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 . + * 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 genland.h Table used to generate deserts and/or rainforests. */ diff --git a/src/table/heightmap_colours.h b/src/table/heightmap_colours.h index a03e714cfc..2819596856 100644 --- a/src/table/heightmap_colours.h +++ b/src/table/heightmap_colours.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/industry_land.h b/src/table/industry_land.h index 35b9d0b8e9..3de1ef75cd 100644 --- a/src/table/industry_land.h +++ b/src/table/industry_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_land.h Information about the behaviour of the default industry tiles. */ diff --git a/src/table/landscape_sprite.h b/src/table/landscape_sprite.h index d72cbc7cd7..2c9e14f8c8 100644 --- a/src/table/landscape_sprite.h +++ b/src/table/landscape_sprite.h @@ -2,7 +2,7 @@ * 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 . + * 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 landscape_sprite.h Offsets of sprites to replace for non-temperate landscapes. */ diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 44fd14b40a..5d75aa90dc 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_debug_data.h Data 'tables' for NewGRF debugging. */ diff --git a/src/table/object_land.h b/src/table/object_land.h index 47199bc0c9..530981e77f 100644 --- a/src/table/object_land.h +++ b/src/table/object_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_land.h Sprites to use and how to display them for object tiles. */ diff --git a/src/table/opengl_shader.h b/src/table/opengl_shader.h index b644123d14..9021af0248 100644 --- a/src/table/opengl_shader.h +++ b/src/table/opengl_shader.h @@ -2,7 +2,7 @@ * 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 . + * 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 opengl_shader.h OpenGL shader programs. */ diff --git a/src/table/palette_convert.h b/src/table/palette_convert.h index 2a4ed36dda..309685cf9b 100644 --- a/src/table/palette_convert.h +++ b/src/table/palette_convert.h @@ -2,7 +2,7 @@ * 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 . + * 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 palette_convert.h Translation tables from one GRF to another GRF. */ diff --git a/src/table/palettes.h b/src/table/palettes.h index ec0a62a0ba..750a162dfc 100644 --- a/src/table/palettes.h +++ b/src/table/palettes.h @@ -2,7 +2,7 @@ * 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 . + * 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 palettes.h The colour translation of the GRF palettes. */ diff --git a/src/table/pricebase.h b/src/table/pricebase.h index 27af6a370e..db93cf12e6 100644 --- a/src/table/pricebase.h +++ b/src/table/pricebase.h @@ -2,7 +2,7 @@ * 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 . + * 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 pricebase.h Price Bases */ diff --git a/src/table/railtypes.h b/src/table/railtypes.h index 2788212a96..55e7ece217 100644 --- a/src/table/railtypes.h +++ b/src/table/railtypes.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/road_land.h b/src/table/road_land.h index e6c57356e9..a9547548ae 100644 --- a/src/table/road_land.h +++ b/src/table/road_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_land.h Sprite constructs for road depots. */ diff --git a/src/table/roadtypes.h b/src/table/roadtypes.h index eaf9c93c56..200691fe83 100644 --- a/src/table/roadtypes.h +++ b/src/table/roadtypes.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/roadveh_movement.h b/src/table/roadveh_movement.h index 809a973ee8..a9a618dea7 100644 --- a/src/table/roadveh_movement.h +++ b/src/table/roadveh_movement.h @@ -2,7 +2,7 @@ * 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 . + * 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 table/roadveh_movement.h Data about how a road vehicle must drive on a tile */ diff --git a/src/table/settings.h.preamble b/src/table/settings.h.preamble index 599760f562..2e3c645003 100644 --- a/src/table/settings.h.preamble +++ b/src/table/settings.h.preamble @@ -2,7 +2,7 @@ * 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 . + * 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 table/settings.h Settings to save in the savegame and config file. */ diff --git a/src/table/settings/company_settings.ini b/src/table/settings/company_settings.ini index 0b947ab4bc..5f80a46e96 100644 --- a/src/table/settings/company_settings.ini +++ b/src/table/settings/company_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; These are settings that are company-wide. Meaning that if 1 player in a diff --git a/src/table/settings/currency_settings.ini b/src/table/settings/currency_settings.ini index 24bc22dde9..ecbfeef458 100644 --- a/src/table/settings/currency_settings.ini +++ b/src/table/settings/currency_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Settings for the in-game custom currency. diff --git a/src/table/settings/difficulty_settings.ini b/src/table/settings/difficulty_settings.ini index f405620f50..a4148b2d73 100644 --- a/src/table/settings/difficulty_settings.ini +++ b/src/table/settings/difficulty_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Difficulty settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/economy_settings.ini b/src/table/settings/economy_settings.ini index 332f542620..de10a04f56 100644 --- a/src/table/settings/economy_settings.ini +++ b/src/table/settings/economy_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Economy settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index c264ddc850..3c885676ab 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Game settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index 187ffef08e..698972923e 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; GUI settings as stored in the main configuration file ("openttd.cfg"). diff --git a/src/table/settings/linkgraph_settings.ini b/src/table/settings/linkgraph_settings.ini index 379449c3f0..a9ed3b689a 100644 --- a/src/table/settings/linkgraph_settings.ini +++ b/src/table/settings/linkgraph_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Linkgraph settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/locale_settings.ini b/src/table/settings/locale_settings.ini index 1296f15332..11edd5f54a 100644 --- a/src/table/settings/locale_settings.ini +++ b/src/table/settings/locale_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Locale settings as stored in the main configuration file ("openttd.cfg") and diff --git a/src/table/settings/misc_settings.ini b/src/table/settings/misc_settings.ini index a9ad6d2add..48f42704ea 100644 --- a/src/table/settings/misc_settings.ini +++ b/src/table/settings/misc_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Various of settings that are stored in global variables. They are all diff --git a/src/table/settings/multimedia_settings.ini b/src/table/settings/multimedia_settings.ini index 3f8265130e..1e40f749f7 100644 --- a/src/table/settings/multimedia_settings.ini +++ b/src/table/settings/multimedia_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Multimedia (sound / music) settings as stored in the main configuration file ("openttd.cfg"). diff --git a/src/table/settings/network_private_settings.ini b/src/table/settings/network_private_settings.ini index b8544fdd18..63b5163d0a 100644 --- a/src/table/settings/network_private_settings.ini +++ b/src/table/settings/network_private_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Network settings as stored in the private configuration file ("private.cfg"). diff --git a/src/table/settings/network_secrets_settings.ini b/src/table/settings/network_secrets_settings.ini index 54ef0b21e0..9cd0ddc6c5 100644 --- a/src/table/settings/network_secrets_settings.ini +++ b/src/table/settings/network_secrets_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Network settings as stored in the secrets configuration file ("secrets.cfg"). diff --git a/src/table/settings/network_settings.ini b/src/table/settings/network_settings.ini index 18743ae77a..e5a6aa17b3 100644 --- a/src/table/settings/network_settings.ini +++ b/src/table/settings/network_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Network settings as stored in the main configuration file ("openttd.cfg"). diff --git a/src/table/settings/news_display_settings.ini b/src/table/settings/news_display_settings.ini index ca91b08990..4a4c05a6ea 100644 --- a/src/table/settings/news_display_settings.ini +++ b/src/table/settings/news_display_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; News display settings as stored in the main configuration file ("openttd.cfg"). diff --git a/src/table/settings/old_gameopt_settings.ini b/src/table/settings/old_gameopt_settings.ini index b72c6f3a30..bb6c3cca32 100644 --- a/src/table/settings/old_gameopt_settings.ini +++ b/src/table/settings/old_gameopt_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Settings that used to be saved in the savegame under the OPTS chunk and diff --git a/src/table/settings/pathfinding_settings.ini b/src/table/settings/pathfinding_settings.ini index 63c17d1a8d..c1e6bb83bf 100644 --- a/src/table/settings/pathfinding_settings.ini +++ b/src/table/settings/pathfinding_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Pathfinding settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/script_settings.ini b/src/table/settings/script_settings.ini index edc3fa54dc..5c6381964c 100644 --- a/src/table/settings/script_settings.ini +++ b/src/table/settings/script_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Script settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/settings/win32_settings.ini b/src/table/settings/win32_settings.ini index 5f34f48830..c0bfee9b5c 100644 --- a/src/table/settings/win32_settings.ini +++ b/src/table/settings/win32_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; Windows specific settings that are stored in global variables. They are all diff --git a/src/table/settings/window_settings.ini b/src/table/settings/window_settings.ini index cf6524da04..456f91b4de 100644 --- a/src/table/settings/window_settings.ini +++ b/src/table/settings/window_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; The windows configuration file ("windows.cfg") defines various of properties diff --git a/src/table/settings/world_settings.ini b/src/table/settings/world_settings.ini index f17bf4d729..ce62136c3f 100644 --- a/src/table/settings/world_settings.ini +++ b/src/table/settings/world_settings.ini @@ -1,7 +1,7 @@ ; 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 . +; 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 . ; ; World settings as stored in the main configuration file ("openttd.cfg") diff --git a/src/table/signal_data.h b/src/table/signal_data.h index 27281911b8..4c1404cce0 100644 --- a/src/table/signal_data.h +++ b/src/table/signal_data.h @@ -2,7 +2,7 @@ * 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 . + * 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 signal_data.h Data related to rail signals. */ diff --git a/src/table/sprites.h b/src/table/sprites.h index 0564fc6b18..3cb8c6fd50 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/table/station_land.h b/src/table/station_land.h index 2552e6f761..42055d52a4 100644 --- a/src/table/station_land.h +++ b/src/table/station_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_land.h Sprites to use and how to display them for station tiles. */ diff --git a/src/table/strgen_tables.h b/src/table/strgen_tables.h index 1732343e51..dc902a94ea 100644 --- a/src/table/strgen_tables.h +++ b/src/table/strgen_tables.h @@ -2,7 +2,7 @@ * 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 . + * 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 table/strgen_tables.h Tables of commands for strgen */ diff --git a/src/table/string_colours.h b/src/table/string_colours.h index 7d18459dbc..5d932ebe4b 100644 --- a/src/table/string_colours.h +++ b/src/table/string_colours.h @@ -2,7 +2,7 @@ * 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 . + * 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 string_colours.h The colour translation of GRF's strings. */ diff --git a/src/table/town_land.h b/src/table/town_land.h index 9357c34c6c..8d8a845d4d 100644 --- a/src/table/town_land.h +++ b/src/table/town_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_land.h Sprites to use and how to display them for town tiles. */ diff --git a/src/table/townname.h b/src/table/townname.h index fa4dc9bea0..a2323d55ff 100644 --- a/src/table/townname.h +++ b/src/table/townname.h @@ -2,7 +2,7 @@ * 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 . + * 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 table/townname.h Namepart tables for the town name generator */ diff --git a/src/table/track_data.h b/src/table/track_data.h index 3724184585..ceb0910beb 100644 --- a/src/table/track_data.h +++ b/src/table/track_data.h @@ -2,7 +2,7 @@ * 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 . + * 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 track_data.h Data related to rail tracks. */ diff --git a/src/table/track_land.h b/src/table/track_land.h index 51a57b6e21..8dcd443334 100644 --- a/src/table/track_land.h +++ b/src/table/track_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 track_land.h Sprites to use and how to display them for train depot tiles. */ diff --git a/src/table/train_sprites.h b/src/table/train_sprites.h index 36dfba1785..4fe7b53a83 100644 --- a/src/table/train_sprites.h +++ b/src/table/train_sprites.h @@ -2,7 +2,7 @@ * 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 . + * 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 train_sprites.h Sprites to use for trains. */ diff --git a/src/table/tree_land.h b/src/table/tree_land.h index 6769066477..d2760b9179 100644 --- a/src/table/tree_land.h +++ b/src/table/tree_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 tree_land.h Sprites to use and how to display them for tree tiles. */ diff --git a/src/table/unicode.h b/src/table/unicode.h index 82bda7221c..7e7b2169c3 100644 --- a/src/table/unicode.h +++ b/src/table/unicode.h @@ -2,7 +2,7 @@ * 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 . + * 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 unicode.h Character mapping for using Unicode characters in OTTD. */ diff --git a/src/table/water_land.h b/src/table/water_land.h index 014a4ea370..9e97fd511d 100644 --- a/src/table/water_land.h +++ b/src/table/water_land.h @@ -2,7 +2,7 @@ * 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 . + * 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 water_land.h Sprites to use and how to display them for water tiles (depots/locks). */ diff --git a/src/tar_type.h b/src/tar_type.h index 992cb04448..534ca68889 100644 --- a/src/tar_type.h +++ b/src/tar_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 tar_type.h Structs, typedefs and macros used for TAR file handling. */ diff --git a/src/terraform_cmd.cpp b/src/terraform_cmd.cpp index 2c1c637b41..8e72366d65 100644 --- a/src/terraform_cmd.cpp +++ b/src/terraform_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 terraform_cmd.cpp Commands related to terraforming. */ diff --git a/src/terraform_cmd.h b/src/terraform_cmd.h index a4bfff5f99..3f672343e7 100644 --- a/src/terraform_cmd.h +++ b/src/terraform_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 terraform_cmd.h Command definitions related to terraforming. */ diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 14a4597e1f..92f4df19f6 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 terraform_gui.cpp GUI related to terraforming the map. */ diff --git a/src/terraform_gui.h b/src/terraform_gui.h index 79ffd86764..3eb1b98169 100644 --- a/src/terraform_gui.h +++ b/src/terraform_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 terraform_gui.h GUI stuff related to terraforming. */ diff --git a/src/tests/alternating_iterator.cpp b/src/tests/alternating_iterator.cpp index 93775685f5..4ed27c6047 100644 --- a/src/tests/alternating_iterator.cpp +++ b/src/tests/alternating_iterator.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bitmath_func.cpp Test functionality from core/bitmath_func. */ diff --git a/src/tests/bitmath_func.cpp b/src/tests/bitmath_func.cpp index 347fa55e85..190647de37 100644 --- a/src/tests/bitmath_func.cpp +++ b/src/tests/bitmath_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 bitmath_func.cpp Test functionality from core/bitmath_func. */ diff --git a/src/tests/enum_over_optimisation.cpp b/src/tests/enum_over_optimisation.cpp index 1ec718f228..5e694aa460 100644 --- a/src/tests/enum_over_optimisation.cpp +++ b/src/tests/enum_over_optimisation.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/tests/flatset_type.cpp b/src/tests/flatset_type.cpp index 7b2233ed43..678949f254 100644 --- a/src/tests/flatset_type.cpp +++ b/src/tests/flatset_type.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_consumer.cpp Test functionality from core/string_consumer. */ diff --git a/src/tests/history_func.cpp b/src/tests/history_func.cpp index 36f4019bbc..116577993e 100644 --- a/src/tests/history_func.cpp +++ b/src/tests/history_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 history_func.cpp Test functionality for misc/history_func. */ diff --git a/src/tests/landscape_partial_pixel_z.cpp b/src/tests/landscape_partial_pixel_z.cpp index 1e890cd45a..0265db7dad 100644 --- a/src/tests/landscape_partial_pixel_z.cpp +++ b/src/tests/landscape_partial_pixel_z.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 landscape_partial_pixel_z.cpp Tests for consistency/validity of the results of GetPartialPixelZ. */ diff --git a/src/tests/math_func.cpp b/src/tests/math_func.cpp index a5542f1d87..f209c8943c 100644 --- a/src/tests/math_func.cpp +++ b/src/tests/math_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 math_func.cpp Test functionality from core/math_func. */ diff --git a/src/tests/mock_environment.h b/src/tests/mock_environment.h index e1bc82dc4f..1090a4a3e1 100644 --- a/src/tests/mock_environment.h +++ b/src/tests/mock_environment.h @@ -2,7 +2,7 @@ * 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 . + * 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 mock_environment.h Singleton instance to create a mock FontCache/SpriteCache environment. */ diff --git a/src/tests/mock_fontcache.h b/src/tests/mock_fontcache.h index 7cd3a6cd04..d08456bd1d 100644 --- a/src/tests/mock_fontcache.h +++ b/src/tests/mock_fontcache.h @@ -2,7 +2,7 @@ * 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 . + * 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 mock_fontcache.h Mock font cache implementation definition. */ diff --git a/src/tests/mock_spritecache.cpp b/src/tests/mock_spritecache.cpp index d0a57985b6..f60cb9c1be 100644 --- a/src/tests/mock_spritecache.cpp +++ b/src/tests/mock_spritecache.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 mock_spritecache.cpp Mock sprite cache implementation. */ diff --git a/src/tests/mock_spritecache.h b/src/tests/mock_spritecache.h index 6d715cf699..71bc9ca765 100644 --- a/src/tests/mock_spritecache.h +++ b/src/tests/mock_spritecache.h @@ -2,7 +2,7 @@ * 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 . + * 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 mock_spritecache.h Mock sprite cache definition. */ diff --git a/src/tests/string_builder.cpp b/src/tests/string_builder.cpp index c9e3f8f99a..23e4361c35 100644 --- a/src/tests/string_builder.cpp +++ b/src/tests/string_builder.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_builder.cpp Test functionality from core/string_builder. */ diff --git a/src/tests/string_consumer.cpp b/src/tests/string_consumer.cpp index 85a523902f..4282e6d883 100644 --- a/src/tests/string_consumer.cpp +++ b/src/tests/string_consumer.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_consumer.cpp Test functionality from core/string_consumer. */ diff --git a/src/tests/string_func.cpp b/src/tests/string_func.cpp index 17d35ed35b..793e02b57e 100644 --- a/src/tests/string_func.cpp +++ b/src/tests/string_func.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_func.cpp Test functionality from string_func. */ diff --git a/src/tests/string_inplace.cpp b/src/tests/string_inplace.cpp index f6557a2b3e..9d81a65878 100644 --- a/src/tests/string_inplace.cpp +++ b/src/tests/string_inplace.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 string_inplace.cpp Test functionality from core/string_inplace. */ diff --git a/src/tests/test_main.cpp b/src/tests/test_main.cpp index fbade1e6ab..834809333e 100644 --- a/src/tests/test_main.cpp +++ b/src/tests/test_main.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 test_main.cpp Entry point for all the unit tests. */ diff --git a/src/tests/test_network_crypto.cpp b/src/tests/test_network_crypto.cpp index c3d0184780..6679cd79fd 100644 --- a/src/tests/test_network_crypto.cpp +++ b/src/tests/test_network_crypto.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 test_network_crypto.cpp Tests for network related crypto functions. */ diff --git a/src/tests/test_script_admin.cpp b/src/tests/test_script_admin.cpp index ce2ecd0ee7..3df9f1c9e6 100644 --- a/src/tests/test_script_admin.cpp +++ b/src/tests/test_script_admin.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 script_admin_json.cpp Tests for the Squirrel -> JSON conversion in ScriptAdmin. */ diff --git a/src/tests/test_window_desc.cpp b/src/tests/test_window_desc.cpp index af12075f3d..73e8e0f607 100644 --- a/src/tests/test_window_desc.cpp +++ b/src/tests/test_window_desc.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 test_window_desc.cpp Test WindowDescs for valid widget parts. */ diff --git a/src/tests/tilearea.cpp b/src/tests/tilearea.cpp index 2821c5bfde..15facf5ab1 100644 --- a/src/tests/tilearea.cpp +++ b/src/tests/tilearea.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tilearea.cpp Test functionality from tilearea_type. */ diff --git a/src/tests/utf8.cpp b/src/tests/utf8.cpp index 7c240f6030..84bfb120b8 100644 --- a/src/tests/utf8.cpp +++ b/src/tests/utf8.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 utf8.cpp Test functionality from core/utf8. */ diff --git a/src/textbuf.cpp b/src/textbuf.cpp index a35834079a..50b8e4030d 100644 --- a/src/textbuf.cpp +++ b/src/textbuf.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 textbuf.cpp Textbuffer handling. */ diff --git a/src/textbuf_gui.h b/src/textbuf_gui.h index d3f4f9915d..dff5c3ce0c 100644 --- a/src/textbuf_gui.h +++ b/src/textbuf_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 textbuf_gui.h Stuff related to the text buffer GUI. */ diff --git a/src/textbuf_type.h b/src/textbuf_type.h index 99b8353d5b..1713c6b505 100644 --- a/src/textbuf_type.h +++ b/src/textbuf_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 textbuf_type.h Stuff related to text buffers. */ diff --git a/src/texteff.cpp b/src/texteff.cpp index 36b7a35c23..18c93ab998 100644 --- a/src/texteff.cpp +++ b/src/texteff.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 texteff.cpp Handling of text effects. */ diff --git a/src/texteff.hpp b/src/texteff.hpp index 6dc656117c..6689594b1e 100644 --- a/src/texteff.hpp +++ b/src/texteff.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 texteff.hpp Functions related to text effects. */ diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 91af774e39..61c41e58f6 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 textfile_gui.cpp Implementation of textfile window. */ diff --git a/src/textfile_gui.h b/src/textfile_gui.h index 7a79bba557..49b640641d 100644 --- a/src/textfile_gui.h +++ b/src/textfile_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 textfile_gui.h GUI functions related to textfiles. */ diff --git a/src/textfile_type.h b/src/textfile_type.h index 8b1a010fe8..93fb92f070 100644 --- a/src/textfile_type.h +++ b/src/textfile_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 textfile_type.h Types related to textfiles. */ diff --git a/src/tgp.cpp b/src/tgp.cpp index 39a86b1435..3c1991d00e 100644 --- a/src/tgp.cpp +++ b/src/tgp.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tgp.cpp OTTD Perlin Noise Landscape Generator, aka TerraGenesis Perlin */ diff --git a/src/tgp.h b/src/tgp.h index e773c6ff25..9c6c231826 100644 --- a/src/tgp.h +++ b/src/tgp.h @@ -2,7 +2,7 @@ * 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 . + * 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 tgp.h Functions for the Perlin noise enhanced map generator. */ diff --git a/src/thread.h b/src/thread.h index dd9177fff3..b33a95384d 100644 --- a/src/thread.h +++ b/src/thread.h @@ -2,7 +2,7 @@ * 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 . + * 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 thread.h Base of all threads. */ diff --git a/src/tile_cmd.h b/src/tile_cmd.h index 6a12f88fe8..7ce48030d8 100644 --- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 tile_cmd.h Generic 'commands' that can be performed on all tiles. */ diff --git a/src/tile_map.cpp b/src/tile_map.cpp index 2b8bba3a7f..89d13123bd 100644 --- a/src/tile_map.cpp +++ b/src/tile_map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tile_map.cpp Global tile accessors. */ diff --git a/src/tile_map.h b/src/tile_map.h index 5f900e8ddc..a6463f1761 100644 --- a/src/tile_map.h +++ b/src/tile_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 tile_map.h Map writing/reading functions for tiles. */ diff --git a/src/tile_type.h b/src/tile_type.h index 498e5528c9..7e84444e15 100644 --- a/src/tile_type.h +++ b/src/tile_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 tile_type.h Types related to tiles. */ diff --git a/src/tilearea.cpp b/src/tilearea.cpp index 09560c9f5c..94ab5f5ee7 100644 --- a/src/tilearea.cpp +++ b/src/tilearea.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tilearea.cpp Handling of tile areas. */ diff --git a/src/tilearea_type.h b/src/tilearea_type.h index 56fb49721a..2ccc411391 100644 --- a/src/tilearea_type.h +++ b/src/tilearea_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 tilearea_type.h Type for storing the 'area' of something uses on the map. */ diff --git a/src/tilehighlight_func.h b/src/tilehighlight_func.h index 572c5bd43e..f1f7af7717 100644 --- a/src/tilehighlight_func.h +++ b/src/tilehighlight_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 tilehighlight_func.h Functions related to tile highlights. */ diff --git a/src/tilehighlight_type.h b/src/tilehighlight_type.h index 10cc3eeaf2..885cc6cd6b 100644 --- a/src/tilehighlight_type.h +++ b/src/tilehighlight_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 tilehighlight_type.h Types related to highlighting tiles. */ diff --git a/src/timer/timer.h b/src/timer/timer.h index 8e4d4018d1..71f0b2cadf 100644 --- a/src/timer/timer.h +++ b/src/timer/timer.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer.h Definition of Interval and OneShot timers */ diff --git a/src/timer/timer_game_calendar.cpp b/src/timer/timer_game_calendar.cpp index b34de8f7e9..497594cb62 100644 --- a/src/timer/timer_game_calendar.cpp +++ b/src/timer/timer_game_calendar.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_game_calendar.h b/src/timer/timer_game_calendar.h index 0af6e8654e..59454d678e 100644 --- a/src/timer/timer_game_calendar.h +++ b/src/timer/timer_game_calendar.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_game_calendar.h Definition of the game-calendar-timer */ diff --git a/src/timer/timer_game_common.cpp b/src/timer/timer_game_common.cpp index ff263979c4..8e823953d7 100644 --- a/src/timer/timer_game_common.cpp +++ b/src/timer/timer_game_common.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_game_common.h b/src/timer/timer_game_common.h index a2d5491605..e1facb5541 100644 --- a/src/timer/timer_game_common.h +++ b/src/timer/timer_game_common.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_game_common.h Definition of the common class inherited by both calendar and economy timers. */ diff --git a/src/timer/timer_game_economy.cpp b/src/timer/timer_game_economy.cpp index 607c2ae856..ba0ce02e67 100644 --- a/src/timer/timer_game_economy.cpp +++ b/src/timer/timer_game_economy.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_game_economy.h b/src/timer/timer_game_economy.h index 162181fbeb..a4e25dbb96 100644 --- a/src/timer/timer_game_economy.h +++ b/src/timer/timer_game_economy.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_game_economy.h Definition of the game-economy-timer */ diff --git a/src/timer/timer_game_realtime.cpp b/src/timer/timer_game_realtime.cpp index 6fa76ca46b..eb5898d7f4 100644 --- a/src/timer/timer_game_realtime.cpp +++ b/src/timer/timer_game_realtime.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_game_realtime.h b/src/timer/timer_game_realtime.h index e17d1fb624..37823df3ab 100644 --- a/src/timer/timer_game_realtime.h +++ b/src/timer/timer_game_realtime.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_game_realtime.h Definition of the real time game-timer */ diff --git a/src/timer/timer_game_tick.cpp b/src/timer/timer_game_tick.cpp index bec6baf7cf..ea43583da1 100644 --- a/src/timer/timer_game_tick.cpp +++ b/src/timer/timer_game_tick.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_game_tick.h b/src/timer/timer_game_tick.h index ac901e3e31..d9e5791909 100644 --- a/src/timer/timer_game_tick.h +++ b/src/timer/timer_game_tick.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_game_tick.h Definition of the tick-based game-timer */ diff --git a/src/timer/timer_manager.h b/src/timer/timer_manager.h index e6e5b6eed1..05c54a75fc 100644 --- a/src/timer/timer_manager.h +++ b/src/timer/timer_manager.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_manager.h Definition of the TimerManager */ diff --git a/src/timer/timer_window.cpp b/src/timer/timer_window.cpp index 9ec0f0163d..88a2cd6caa 100644 --- a/src/timer/timer_window.cpp +++ b/src/timer/timer_window.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/timer/timer_window.h b/src/timer/timer_window.h index 789d82618b..c5461b189a 100644 --- a/src/timer/timer_window.h +++ b/src/timer/timer_window.h @@ -2,7 +2,7 @@ * 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 . + * 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 timer_window.h Definition of the Window system */ diff --git a/src/timetable.h b/src/timetable.h index 1c15c00d40..a17798428b 100644 --- a/src/timetable.h +++ b/src/timetable.h @@ -2,7 +2,7 @@ * 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 . + * 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 timetable.h Functions related to time tabling. */ diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 8b548f5228..28f4758e6c 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 timetable_cmd.cpp Commands related to time tabling. */ diff --git a/src/timetable_cmd.h b/src/timetable_cmd.h index 45879234de..50e57c5e76 100644 --- a/src/timetable_cmd.h +++ b/src/timetable_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 timetable_cmd.h Command definitions related to timetables. */ diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index a380b37779..26d118c5d4 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 timetable_gui.cpp GUI for time tabling. */ diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 8bffb87292..267f4524a9 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 toolbar_gui.cpp Code related to the (main) toolbar. */ diff --git a/src/toolbar_gui.h b/src/toolbar_gui.h index 37cc7fb886..40d7f282cd 100644 --- a/src/toolbar_gui.h +++ b/src/toolbar_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 toolbar_gui.h Stuff related to the (main) toolbar. */ diff --git a/src/town.h b/src/town.h index 5151e3c87c..0b644dd691 100644 --- a/src/town.h +++ b/src/town.h @@ -2,7 +2,7 @@ * 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 . + * 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 town.h Base of the town class. */ diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index fabd8deece..f07f83a28e 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 town_cmd.cpp Handling of town tiles. */ diff --git a/src/town_cmd.h b/src/town_cmd.h index 2a9cce5092..1403d6aa53 100644 --- a/src/town_cmd.h +++ b/src/town_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_cmd.h Command definitions related to towns. */ diff --git a/src/town_gui.cpp b/src/town_gui.cpp index ea953c974b..e5633619e7 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 town_gui.cpp GUI for towns. */ diff --git a/src/town_kdtree.h b/src/town_kdtree.h index e22d3da13f..74aa3a0345 100644 --- a/src/town_kdtree.h +++ b/src/town_kdtree.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_kdtree.h Declarations for accessing the k-d tree of towns */ diff --git a/src/town_map.h b/src/town_map.h index 442d33f370..b3ec512e60 100644 --- a/src/town_map.h +++ b/src/town_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_map.h Accessors for towns */ diff --git a/src/town_type.h b/src/town_type.h index b3bca9b3e1..dec057d44a 100644 --- a/src/town_type.h +++ b/src/town_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_type.h Types related to towns. */ diff --git a/src/townname.cpp b/src/townname.cpp index 5067de1524..f3a263eede 100644 --- a/src/townname.cpp +++ b/src/townname.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 townname.cpp %Town name generators. */ diff --git a/src/townname_func.h b/src/townname_func.h index b3c0a601b5..0f8b3133de 100644 --- a/src/townname_func.h +++ b/src/townname_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 townname_func.h %Town name generator stuff. */ diff --git a/src/townname_type.h b/src/townname_type.h index a04bd8fe0a..a4247c09ba 100644 --- a/src/townname_type.h +++ b/src/townname_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/track_func.h b/src/track_func.h index e93e41c2ba..49c81d4764 100644 --- a/src/track_func.h +++ b/src/track_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 track_func.h Different conversion functions from one kind of track to another. */ diff --git a/src/track_type.h b/src/track_type.h index d6e79086e9..96404c2768 100644 --- a/src/track_type.h +++ b/src/track_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 track_type.h All types related to tracks */ diff --git a/src/train.h b/src/train.h index f4bd7889ad..0f3f954f6c 100644 --- a/src/train.h +++ b/src/train.h @@ -2,7 +2,7 @@ * 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 . + * 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 train.h Base for the train class. */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 670a60853b..b4e372cd15 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 train_cmd.cpp Handling of trains. */ diff --git a/src/train_cmd.h b/src/train_cmd.h index e3c39aa6f6..341ddbcad5 100644 --- a/src/train_cmd.h +++ b/src/train_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 train_cmd.h Command definitions related to trains. */ diff --git a/src/train_gui.cpp b/src/train_gui.cpp index cfa018c0ec..83a27e2f3c 100644 --- a/src/train_gui.cpp +++ b/src/train_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 train_gui.cpp GUI for trains. */ diff --git a/src/transparency.h b/src/transparency.h index 68e6860d73..8eaa980b71 100644 --- a/src/transparency.h +++ b/src/transparency.h @@ -2,7 +2,7 @@ * 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 . + * 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 transparency.h Functions related to transparency. */ diff --git a/src/transparency_gui.cpp b/src/transparency_gui.cpp index ef0791168d..7dcd18e4c6 100644 --- a/src/transparency_gui.cpp +++ b/src/transparency_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 transparency_gui.cpp The transparency GUI. */ diff --git a/src/transparency_gui.h b/src/transparency_gui.h index 85dfd453d8..86610d0c9d 100644 --- a/src/transparency_gui.h +++ b/src/transparency_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 transparency_gui.h GUI functions related to transparency. */ diff --git a/src/transport_type.h b/src/transport_type.h index 2352afe276..fc5921a6ba 100644 --- a/src/transport_type.h +++ b/src/transport_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 transport_type.h Base types related to transport. */ diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp index a5187011de..332b473452 100644 --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tree_cmd.cpp Handling of tree tiles. */ diff --git a/src/tree_cmd.h b/src/tree_cmd.h index 8a78683f87..a019c08579 100644 --- a/src/tree_cmd.h +++ b/src/tree_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 tree_cmd.h Command definitions related to tree tiles. */ diff --git a/src/tree_gui.cpp b/src/tree_gui.cpp index 6bf2ee0281..29dd6bd6a5 100644 --- a/src/tree_gui.cpp +++ b/src/tree_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tree_gui.cpp GUIs for building trees. */ diff --git a/src/tree_map.h b/src/tree_map.h index 232ad7bd8f..0668ad960f 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 tree_map.h Map accessors for tree tiles. */ diff --git a/src/tunnel_map.cpp b/src/tunnel_map.cpp index dc7c35e415..05354093b3 100644 --- a/src/tunnel_map.cpp +++ b/src/tunnel_map.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 tunnel_map.cpp Map accessors for tunnels. */ diff --git a/src/tunnel_map.h b/src/tunnel_map.h index 86f3027cbc..71e33dc41c 100644 --- a/src/tunnel_map.h +++ b/src/tunnel_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 tunnel_map.h Map accessors for tunnels. */ diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index 424fb5f42e..0d7b992b84 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -2,7 +2,7 @@ * 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 . + * 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 tunnelbridge.h Header file for things common for tunnels and bridges */ diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index e4fed0a0c4..a3810815d8 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/tunnelbridge_cmd.h b/src/tunnelbridge_cmd.h index bf468d2262..9f76184229 100644 --- a/src/tunnelbridge_cmd.h +++ b/src/tunnelbridge_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 tunnelbridge_cmd.h Command definitions related to tunnels and bridges. */ diff --git a/src/tunnelbridge_map.h b/src/tunnelbridge_map.h index 6989522fe6..22026841bb 100644 --- a/src/tunnelbridge_map.h +++ b/src/tunnelbridge_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 tunnelbridge_map.h Functions that have tunnels and bridges in common */ diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 848c2f3fd6..91c2f4c12b 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle.cpp Base implementations of all vehicles. */ diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 6e9cc5e20f..5a8e6fabb0 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_base.h Base class for all vehicles. */ diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index c5a93b0f37..f50f2682e3 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_cmd.cpp Commands for vehicles. */ diff --git a/src/vehicle_cmd.h b/src/vehicle_cmd.h index b393a6a1f3..f0d1e52d2f 100644 --- a/src/vehicle_cmd.h +++ b/src/vehicle_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_cmd.h Command definitions for vehicles. */ diff --git a/src/vehicle_func.h b/src/vehicle_func.h index f1aadce4d8..9b69b137d3 100644 --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_func.h Functions related to vehicles. */ diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 49a7087c98..1e9eb0a079 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_gui.cpp The base GUI for all vehicles. */ diff --git a/src/vehicle_gui.h b/src/vehicle_gui.h index 1c84e55fac..ca099454ec 100644 --- a/src/vehicle_gui.h +++ b/src/vehicle_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_gui.h Functions related to the vehicle's GUIs. */ diff --git a/src/vehicle_gui_base.h b/src/vehicle_gui_base.h index d1097c499c..122c5fccd9 100644 --- a/src/vehicle_gui_base.h +++ b/src/vehicle_gui_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_gui_base.h Functions/classes shared between the different vehicle list GUIs. */ diff --git a/src/vehicle_type.h b/src/vehicle_type.h index 09aa86d1a1..d4a220b377 100644 --- a/src/vehicle_type.h +++ b/src/vehicle_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_type.h Types related to vehicles. */ diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp index da4e36e7a9..3ce3b6e0a1 100644 --- a/src/vehiclelist.cpp +++ b/src/vehiclelist.cpp @@ -2,7 +2,7 @@ * 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 . + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file vehiclelist.cpp Lists of vehicles. */ diff --git a/src/vehiclelist.h b/src/vehiclelist.h index c316e30fc0..ffba2e48a4 100644 --- a/src/vehiclelist.h +++ b/src/vehiclelist.h @@ -2,7 +2,7 @@ * 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 . + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file vehiclelist.h Functions and type for generating vehicle lists. */ diff --git a/src/vehiclelist_cmd.h b/src/vehiclelist_cmd.h index 9960647062..ef30dfe43b 100644 --- a/src/vehiclelist_cmd.h +++ b/src/vehiclelist_cmd.h @@ -2,7 +2,7 @@ * 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 . + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file vehiclelist_cmd.h Functions and type for serializing vehicle lists. */ diff --git a/src/vehiclelist_func.h b/src/vehiclelist_func.h index 2a78fb0470..efd15d49c4 100644 --- a/src/vehiclelist_func.h +++ b/src/vehiclelist_func.h @@ -2,7 +2,7 @@ * 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 . + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file vehiclelist_func.h Functions and type for generating vehicle lists. */ diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 11f0d63e9b..73ab2ec563 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/video/allegro_v.h b/src/video/allegro_v.h index 551112c91e..4b2b7a2a27 100644 --- a/src/video/allegro_v.h +++ b/src/video/allegro_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 allegro_v.h Base of the Allegro video driver. */ diff --git a/src/video/cocoa/cocoa_keys.h b/src/video/cocoa/cocoa_keys.h index 2c658ce4c5..2a6c8ec728 100644 --- a/src/video/cocoa/cocoa_keys.h +++ b/src/video/cocoa/cocoa_keys.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_keys.h Mappings of Cocoa keys. */ diff --git a/src/video/cocoa/cocoa_ogl.h b/src/video/cocoa/cocoa_ogl.h index e22e11c9df..953d3a55d3 100644 --- a/src/video/cocoa/cocoa_ogl.h +++ b/src/video/cocoa/cocoa_ogl.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_ogl.h The Cocoa OpenGL video driver. */ diff --git a/src/video/cocoa/cocoa_ogl.mm b/src/video/cocoa/cocoa_ogl.mm index 308a4db220..8c52ee0cfb 100644 --- a/src/video/cocoa/cocoa_ogl.mm +++ b/src/video/cocoa/cocoa_ogl.mm @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_ogl.mm Code related to the cocoa OpengL video driver. */ diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index a8d18057f4..033446459b 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_v.h The Cocoa video driver. */ diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 860b31eacf..a43a84b083 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_v.mm Code related to the cocoa video driver(s). */ diff --git a/src/video/cocoa/cocoa_wnd.h b/src/video/cocoa/cocoa_wnd.h index 94bff1e1f8..16eba42bc0 100644 --- a/src/video/cocoa/cocoa_wnd.h +++ b/src/video/cocoa/cocoa_wnd.h @@ -2,7 +2,7 @@ * 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 . + * 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 cocoa_wnd.h OS interface for the cocoa video driver. */ diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index dcc7873185..41a9b5dbd3 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /****************************************************************************** diff --git a/src/video/dedicated_v.cpp b/src/video/dedicated_v.cpp index 3fd875b0bd..ef7f12b654 100644 --- a/src/video/dedicated_v.cpp +++ b/src/video/dedicated_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 dedicated_v.cpp Dedicated server video 'driver'. */ diff --git a/src/video/dedicated_v.h b/src/video/dedicated_v.h index 1c64386440..510104f4e5 100644 --- a/src/video/dedicated_v.h +++ b/src/video/dedicated_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 dedicated_v.h Base for the dedicated video driver. */ diff --git a/src/video/null_v.cpp b/src/video/null_v.cpp index e3a032d71f..65fc9f3415 100644 --- a/src/video/null_v.cpp +++ b/src/video/null_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 null_v.cpp The video driver that doesn't blit. */ diff --git a/src/video/null_v.h b/src/video/null_v.h index 407e447e7d..d6a835f2ad 100644 --- a/src/video/null_v.h +++ b/src/video/null_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 null_v.h Base of the video driver that doesn't blit. */ diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index 949c17eaea..260b9a4a3d 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 opengl_v.cpp OpenGL video driver support. */ diff --git a/src/video/opengl.h b/src/video/opengl.h index 75515f7210..708b796a16 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -2,7 +2,7 @@ * 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 . + * 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 opengl.h OpenGL video driver support. */ diff --git a/src/video/sdl2_default_v.cpp b/src/video/sdl2_default_v.cpp index 044251047d..2c37fe1514 100644 --- a/src/video/sdl2_default_v.cpp +++ b/src/video/sdl2_default_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_default_v.cpp Implementation of the default backend for SDL2 video driver. */ diff --git a/src/video/sdl2_default_v.h b/src/video/sdl2_default_v.h index 86b09bcbd8..c697385304 100644 --- a/src/video/sdl2_default_v.h +++ b/src/video/sdl2_default_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_default_v.h Default backend of the SDL2 video driver. */ diff --git a/src/video/sdl2_opengl_v.cpp b/src/video/sdl2_opengl_v.cpp index 08edc8b3a6..15f50954c6 100644 --- a/src/video/sdl2_opengl_v.cpp +++ b/src/video/sdl2_opengl_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_opengl_v.cpp Implementation of the OpenGL backend for SDL2 video driver. */ diff --git a/src/video/sdl2_opengl_v.h b/src/video/sdl2_opengl_v.h index f237d420a8..3d010d32d1 100644 --- a/src/video/sdl2_opengl_v.h +++ b/src/video/sdl2_opengl_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_opengl_v.h OpenGL backend of the SDL2 video driver. */ diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 46f5e2db01..e31afce540 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_v.cpp Implementation of the SDL2 video driver. */ diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index 360c783612..08f657dee5 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 sdl2_v.h Base of the SDL2 video driver. */ diff --git a/src/video/video_driver.cpp b/src/video/video_driver.cpp index ba0997b3d9..85cc2d595a 100644 --- a/src/video/video_driver.cpp +++ b/src/video/video_driver.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 video_driver.cpp Common code between video driver implementations. */ diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index d302ca1a03..7aafcbdb3f 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -2,7 +2,7 @@ * 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 . + * 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 video_driver.hpp Base of all video drivers. */ diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index d8600faa65..f7821e0677 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 win32_v.cpp Implementation of the Windows (GDI) video driver. */ diff --git a/src/video/win32_v.h b/src/video/win32_v.h index f0426a29c0..a04822837b 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -2,7 +2,7 @@ * 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 . + * 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 win32_v.h Base of the Windows video driver. */ diff --git a/src/viewport.cpp b/src/viewport.cpp index e1c7b93791..6427a1465e 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 . */ /** diff --git a/src/viewport_cmd.h b/src/viewport_cmd.h index b8d931f561..2f58b2e0b6 100644 --- a/src/viewport_cmd.h +++ b/src/viewport_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_cmd.h Command definitions related to viewports. */ diff --git a/src/viewport_func.h b/src/viewport_func.h index f58cf5ad80..05acc3f848 100644 --- a/src/viewport_func.h +++ b/src/viewport_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_func.h Functions related to (drawing on) viewports. */ diff --git a/src/viewport_gui.cpp b/src/viewport_gui.cpp index 1c6b8413b5..25c99eadee 100644 --- a/src/viewport_gui.cpp +++ b/src/viewport_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_gui.cpp Extra viewport window. */ diff --git a/src/viewport_kdtree.h b/src/viewport_kdtree.h index 3d3330e067..ccbdcac5b0 100644 --- a/src/viewport_kdtree.h +++ b/src/viewport_kdtree.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_kdtree.h Declarations for accessing the k-d tree of towns */ diff --git a/src/viewport_sprite_sorter.h b/src/viewport_sprite_sorter.h index 7f8b8daf44..591ecfb3cd 100644 --- a/src/viewport_sprite_sorter.h +++ b/src/viewport_sprite_sorter.h @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_sprite_sorter.h Types related to sprite sorting. */ diff --git a/src/viewport_sprite_sorter_sse4.cpp b/src/viewport_sprite_sorter_sse4.cpp index 448502ef0c..cfdc2007e6 100644 --- a/src/viewport_sprite_sorter_sse4.cpp +++ b/src/viewport_sprite_sorter_sse4.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_sprite_sorter_sse4.cpp Sprite sorter that uses SSE4.1. */ diff --git a/src/viewport_type.h b/src/viewport_type.h index 76edb9ac12..61c76c78c6 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_type.h Types related to viewports. */ diff --git a/src/void_cmd.cpp b/src/void_cmd.cpp index a49483e91c..4840707d86 100644 --- a/src/void_cmd.cpp +++ b/src/void_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 void_cmd.cpp Handling of void tiles. */ diff --git a/src/void_map.h b/src/void_map.h index 4a5976db3b..53b6fcb34c 100644 --- a/src/void_map.h +++ b/src/void_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 void_map.h Map accessors for void tiles. */ diff --git a/src/water.h b/src/water.h index f6c48bcf97..a7c8685187 100644 --- a/src/water.h +++ b/src/water.h @@ -2,7 +2,7 @@ * 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 . + * 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 water.h Functions related to water (management) */ diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 0068082155..2f9814a719 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 water_cmd.cpp Handling of water tiles. */ diff --git a/src/water_cmd.h b/src/water_cmd.h index 9193c5b1c4..1cf7dfb565 100644 --- a/src/water_cmd.h +++ b/src/water_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 water_cmd.h Command definitions related to water tiles. */ diff --git a/src/water_map.h b/src/water_map.h index 2dd6192ce1..0ec2bf82aa 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -2,7 +2,7 @@ * 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 . + * 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 water_map.h Map accessors for water tiles. */ diff --git a/src/waypoint.cpp b/src/waypoint.cpp index 1bf842a420..2f2def12dd 100644 --- a/src/waypoint.cpp +++ b/src/waypoint.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint.cpp Handling of waypoints. */ diff --git a/src/waypoint_base.h b/src/waypoint_base.h index dd1a1ca748..cdafb1fcb8 100644 --- a/src/waypoint_base.h +++ b/src/waypoint_base.h @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_base.h Base of waypoints. */ diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 60aee126bd..531ceb9419 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_cmd.cpp %Command Handling for waypoints. */ diff --git a/src/waypoint_cmd.h b/src/waypoint_cmd.h index 61cd6f4581..c1ad764f2d 100644 --- a/src/waypoint_cmd.h +++ b/src/waypoint_cmd.h @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_cmd.h Command definitions related to waypoints. */ diff --git a/src/waypoint_func.h b/src/waypoint_func.h index 2b06ff8f15..b53003f640 100644 --- a/src/waypoint_func.h +++ b/src/waypoint_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_func.h Functions related to waypoints. */ diff --git a/src/waypoint_gui.cpp b/src/waypoint_gui.cpp index ae95632de8..2479abe4f5 100644 --- a/src/waypoint_gui.cpp +++ b/src/waypoint_gui.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_gui.cpp Handling of waypoints gui. */ diff --git a/src/widget.cpp b/src/widget.cpp index bb0c5d2a09..eaadef11ef 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 widget.cpp Handling of the default/simple widgets. */ diff --git a/src/widget_type.h b/src/widget_type.h index 26cf34125b..af5228ba3a 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 widget_type.h Definitions about widgets. */ diff --git a/src/widgets/ai_widget.h b/src/widgets/ai_widget.h index 23144e0103..59cbe3389e 100644 --- a/src/widgets/ai_widget.h +++ b/src/widgets/ai_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 ai_widget.h Types related to the ai widgets. */ diff --git a/src/widgets/airport_widget.h b/src/widgets/airport_widget.h index af2261b149..0b57b20915 100644 --- a/src/widgets/airport_widget.h +++ b/src/widgets/airport_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 airport_widget.h Types related to the airport widgets. */ diff --git a/src/widgets/autoreplace_widget.h b/src/widgets/autoreplace_widget.h index c5d8c158aa..08294cdd76 100644 --- a/src/widgets/autoreplace_widget.h +++ b/src/widgets/autoreplace_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 autoreplace_widget.h Types related to the autoreplace widgets. */ diff --git a/src/widgets/bootstrap_widget.h b/src/widgets/bootstrap_widget.h index 073e382907..c99a8a87d9 100644 --- a/src/widgets/bootstrap_widget.h +++ b/src/widgets/bootstrap_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 bootstrap_widget.h Types related to the bootstrap widgets. */ diff --git a/src/widgets/bridge_widget.h b/src/widgets/bridge_widget.h index 0d8f46362f..f574288221 100644 --- a/src/widgets/bridge_widget.h +++ b/src/widgets/bridge_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 bridge_widget.h Types related to the bridge widgets. */ diff --git a/src/widgets/build_vehicle_widget.h b/src/widgets/build_vehicle_widget.h index 5969449f09..9f1be6beb2 100644 --- a/src/widgets/build_vehicle_widget.h +++ b/src/widgets/build_vehicle_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 build_vehicle_widget.h Types related to the build_vehicle widgets. */ diff --git a/src/widgets/cheat_widget.h b/src/widgets/cheat_widget.h index 93c492d1ed..1c652d322e 100644 --- a/src/widgets/cheat_widget.h +++ b/src/widgets/cheat_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 cheat_widget.h Types related to the cheat widgets. */ diff --git a/src/widgets/company_widget.h b/src/widgets/company_widget.h index 3be1f9a6ac..c5bee0a29f 100644 --- a/src/widgets/company_widget.h +++ b/src/widgets/company_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 company_widget.h Types related to the company widgets. */ diff --git a/src/widgets/console_widget.h b/src/widgets/console_widget.h index 8f90631824..60ec0679d6 100644 --- a/src/widgets/console_widget.h +++ b/src/widgets/console_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 console_widget.h Types related to the console widgets. */ diff --git a/src/widgets/date_widget.h b/src/widgets/date_widget.h index 45bc4e9966..ed96bf77a7 100644 --- a/src/widgets/date_widget.h +++ b/src/widgets/date_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 date_widget.h Types related to the date widgets. */ diff --git a/src/widgets/depot_widget.h b/src/widgets/depot_widget.h index f94f1263d2..6406304a4e 100644 --- a/src/widgets/depot_widget.h +++ b/src/widgets/depot_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 depot_widget.h Types related to the depot widgets. */ diff --git a/src/widgets/dock_widget.h b/src/widgets/dock_widget.h index 2877b1ac02..6e03139756 100644 --- a/src/widgets/dock_widget.h +++ b/src/widgets/dock_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 dock_widget.h Types related to the dock widgets. */ diff --git a/src/widgets/dropdown_widget.h b/src/widgets/dropdown_widget.h index b9a5f3e17a..91f6e0f181 100644 --- a/src/widgets/dropdown_widget.h +++ b/src/widgets/dropdown_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 dropdown_widget.h Types related to the dropdown widgets. */ diff --git a/src/widgets/engine_widget.h b/src/widgets/engine_widget.h index e66319ba05..0f5b347768 100644 --- a/src/widgets/engine_widget.h +++ b/src/widgets/engine_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 engine_widget.h Types related to the engine widgets. */ diff --git a/src/widgets/error_widget.h b/src/widgets/error_widget.h index 40519644e7..b402c2ec30 100644 --- a/src/widgets/error_widget.h +++ b/src/widgets/error_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 error_widget.h Types related to the error widgets. */ diff --git a/src/widgets/fios_widget.h b/src/widgets/fios_widget.h index 0d8e723848..3f4277f161 100644 --- a/src/widgets/fios_widget.h +++ b/src/widgets/fios_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 fios_widget.h Types related to the fios widgets. */ diff --git a/src/widgets/framerate_widget.h b/src/widgets/framerate_widget.h index 34418f5007..a91056b646 100644 --- a/src/widgets/framerate_widget.h +++ b/src/widgets/framerate_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 framerate_widget.h Types related to the framerate windows widgets. */ diff --git a/src/widgets/game_widget.h b/src/widgets/game_widget.h index 4ad5973fa6..31362c7489 100644 --- a/src/widgets/game_widget.h +++ b/src/widgets/game_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 game_widget.h Types related to the GS widgets. */ diff --git a/src/widgets/genworld_widget.h b/src/widgets/genworld_widget.h index e57e4efd08..7180863f9c 100644 --- a/src/widgets/genworld_widget.h +++ b/src/widgets/genworld_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 genworld_widget.h Types related to the genworld widgets. */ diff --git a/src/widgets/goal_widget.h b/src/widgets/goal_widget.h index c34749022a..c88cfbedec 100644 --- a/src/widgets/goal_widget.h +++ b/src/widgets/goal_widget.h @@ -3,7 +3,7 @@ * 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 . + * 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 goal_widget.h Types related to the goal widgets. */ diff --git a/src/widgets/graph_widget.h b/src/widgets/graph_widget.h index f6c1ae56bc..ce5d19aa6b 100644 --- a/src/widgets/graph_widget.h +++ b/src/widgets/graph_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 graph_widget.h Types related to the graph widgets. */ diff --git a/src/widgets/group_widget.h b/src/widgets/group_widget.h index c140917899..1d547b78fe 100644 --- a/src/widgets/group_widget.h +++ b/src/widgets/group_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 group_widget.h Types related to the group widgets. */ diff --git a/src/widgets/help_widget.h b/src/widgets/help_widget.h index 802e0610bb..dc4fc221e8 100644 --- a/src/widgets/help_widget.h +++ b/src/widgets/help_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 help_widget.h Types related to the help window widgets. */ diff --git a/src/widgets/highscore_widget.h b/src/widgets/highscore_widget.h index 3cf6fef968..2ae93cfe6e 100644 --- a/src/widgets/highscore_widget.h +++ b/src/widgets/highscore_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 highscore_widget.h Types related to the highscore widgets. */ diff --git a/src/widgets/industry_widget.h b/src/widgets/industry_widget.h index 2389ce918b..13371c270b 100644 --- a/src/widgets/industry_widget.h +++ b/src/widgets/industry_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 industry_widget.h Types related to the industry widgets. */ diff --git a/src/widgets/intro_widget.h b/src/widgets/intro_widget.h index 06b0509ef2..6d44340e92 100644 --- a/src/widgets/intro_widget.h +++ b/src/widgets/intro_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 intro_widget.h Types related to the intro widgets. */ diff --git a/src/widgets/league_widget.h b/src/widgets/league_widget.h index d6f7c13717..f6d1f03e00 100644 --- a/src/widgets/league_widget.h +++ b/src/widgets/league_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 league_widget.h Types related to the graph widgets. */ diff --git a/src/widgets/link_graph_legend_widget.h b/src/widgets/link_graph_legend_widget.h index a8b2357d72..f54b3e89fa 100644 --- a/src/widgets/link_graph_legend_widget.h +++ b/src/widgets/link_graph_legend_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 link_graph_legend_widget.h Types related to the linkgraph_legend widgets. */ diff --git a/src/widgets/main_widget.h b/src/widgets/main_widget.h index 8c12f42620..3adad7aa96 100644 --- a/src/widgets/main_widget.h +++ b/src/widgets/main_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 main_widget.h Types related to the main widgets. */ diff --git a/src/widgets/misc_widget.h b/src/widgets/misc_widget.h index 79ff3a4cd9..8c8c2f12ad 100644 --- a/src/widgets/misc_widget.h +++ b/src/widgets/misc_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 misc_widget.h Types related to the misc widgets. */ diff --git a/src/widgets/music_widget.h b/src/widgets/music_widget.h index bbb0a3e4d0..3cec262df1 100644 --- a/src/widgets/music_widget.h +++ b/src/widgets/music_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 music_widget.h Types related to the music widgets. */ diff --git a/src/widgets/network_chat_widget.h b/src/widgets/network_chat_widget.h index 26a3a1e436..f4f064e4fe 100644 --- a/src/widgets/network_chat_widget.h +++ b/src/widgets/network_chat_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_chat_widget.h Types related to the network chat widgets. */ diff --git a/src/widgets/network_content_widget.h b/src/widgets/network_content_widget.h index 3aa1d46de4..9f9a6bb199 100644 --- a/src/widgets/network_content_widget.h +++ b/src/widgets/network_content_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_content_widget.h Types related to the network content widgets. */ diff --git a/src/widgets/network_widget.h b/src/widgets/network_widget.h index 19fe8f9cef..22d600bc26 100644 --- a/src/widgets/network_widget.h +++ b/src/widgets/network_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 network_widget.h Types related to the network widgets. */ diff --git a/src/widgets/newgrf_debug_widget.h b/src/widgets/newgrf_debug_widget.h index 1ba6524281..a5f0b9ddf9 100644 --- a/src/widgets/newgrf_debug_widget.h +++ b/src/widgets/newgrf_debug_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_debug_widget.h Types related to the newgrf debug widgets. */ diff --git a/src/widgets/newgrf_widget.h b/src/widgets/newgrf_widget.h index d58624ab1d..288041882e 100644 --- a/src/widgets/newgrf_widget.h +++ b/src/widgets/newgrf_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 newgrf_widget.h Types related to the newgrf widgets. */ diff --git a/src/widgets/news_widget.h b/src/widgets/news_widget.h index e5e702ae22..f0967f1149 100644 --- a/src/widgets/news_widget.h +++ b/src/widgets/news_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 news_widget.h Types related to the news widgets. */ diff --git a/src/widgets/object_widget.h b/src/widgets/object_widget.h index b01e1d3ae4..b0a876c2a4 100644 --- a/src/widgets/object_widget.h +++ b/src/widgets/object_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 object_widget.h Types related to the object widgets. */ diff --git a/src/widgets/order_widget.h b/src/widgets/order_widget.h index b0399ebda6..148a0b4aee 100644 --- a/src/widgets/order_widget.h +++ b/src/widgets/order_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 order_widget.h Types related to the order widgets. */ diff --git a/src/widgets/osk_widget.h b/src/widgets/osk_widget.h index ae84037b53..d570f8dd76 100644 --- a/src/widgets/osk_widget.h +++ b/src/widgets/osk_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 osk_widget.h Types related to the osk widgets. */ diff --git a/src/widgets/picker_widget.h b/src/widgets/picker_widget.h index f58d4aae62..b153bb6d11 100644 --- a/src/widgets/picker_widget.h +++ b/src/widgets/picker_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 picker_widget.h Types related to the picker widgets. */ diff --git a/src/widgets/rail_widget.h b/src/widgets/rail_widget.h index 02da916e72..baec0262cf 100644 --- a/src/widgets/rail_widget.h +++ b/src/widgets/rail_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 rail_widget.h Types related to the rail widgets. */ diff --git a/src/widgets/road_widget.h b/src/widgets/road_widget.h index 23de63ed53..dbea9a8724 100644 --- a/src/widgets/road_widget.h +++ b/src/widgets/road_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 road_widget.h Types related to the road widgets. */ diff --git a/src/widgets/screenshot_widget.h b/src/widgets/screenshot_widget.h index 7fc3a0779f..da4a4488c0 100644 --- a/src/widgets/screenshot_widget.h +++ b/src/widgets/screenshot_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 screenshot_widget.h Types related to the screenshot widgets. */ diff --git a/src/widgets/script_widget.h b/src/widgets/script_widget.h index 71fecc5bad..cfc97448d5 100644 --- a/src/widgets/script_widget.h +++ b/src/widgets/script_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 script_widget.h Types related to the script widgets. */ diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 74a68d91a4..c5692fd721 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 settings_widget.h Types related to the settings widgets. */ diff --git a/src/widgets/sign_widget.h b/src/widgets/sign_widget.h index d6c023465c..e8ffa0c131 100644 --- a/src/widgets/sign_widget.h +++ b/src/widgets/sign_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 sign_widget.h Types related to the sign widgets. */ diff --git a/src/widgets/smallmap_widget.h b/src/widgets/smallmap_widget.h index a89f338186..33ac710fb2 100644 --- a/src/widgets/smallmap_widget.h +++ b/src/widgets/smallmap_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 smallmap_widget.h Types related to the smallmap widgets. */ diff --git a/src/widgets/station_widget.h b/src/widgets/station_widget.h index 5bef150819..959a067d7d 100644 --- a/src/widgets/station_widget.h +++ b/src/widgets/station_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 station_widget.h Types related to the station widgets. */ diff --git a/src/widgets/statusbar_widget.h b/src/widgets/statusbar_widget.h index dae3efb5b9..7d5dbced65 100644 --- a/src/widgets/statusbar_widget.h +++ b/src/widgets/statusbar_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 statusbar_widget.h Types related to the statusbar widgets. */ diff --git a/src/widgets/story_widget.h b/src/widgets/story_widget.h index ce3ffd5dff..8b5b33812b 100644 --- a/src/widgets/story_widget.h +++ b/src/widgets/story_widget.h @@ -3,7 +3,7 @@ * 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 . + * 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 story_widget.h Types related to the story widgets. */ diff --git a/src/widgets/subsidy_widget.h b/src/widgets/subsidy_widget.h index a2dfe8d1e8..88a0d48401 100644 --- a/src/widgets/subsidy_widget.h +++ b/src/widgets/subsidy_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 subsidy_widget.h Types related to the subsidy widgets. */ diff --git a/src/widgets/terraform_widget.h b/src/widgets/terraform_widget.h index d4ce57eabd..a9de519d63 100644 --- a/src/widgets/terraform_widget.h +++ b/src/widgets/terraform_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 terraform_widget.h Types related to the terraform widgets. */ diff --git a/src/widgets/timetable_widget.h b/src/widgets/timetable_widget.h index 2136b1ba2f..082eff4fd6 100644 --- a/src/widgets/timetable_widget.h +++ b/src/widgets/timetable_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 timetable_widget.h Types related to the timetable widgets. */ diff --git a/src/widgets/toolbar_widget.h b/src/widgets/toolbar_widget.h index 36b53516af..3e90ad4238 100644 --- a/src/widgets/toolbar_widget.h +++ b/src/widgets/toolbar_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 toolbar_widget.h Types related to the toolbar widgets. */ diff --git a/src/widgets/town_widget.h b/src/widgets/town_widget.h index ac60a1ae3a..f60854dc31 100644 --- a/src/widgets/town_widget.h +++ b/src/widgets/town_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 town_widget.h Types related to the town widgets. */ diff --git a/src/widgets/transparency_widget.h b/src/widgets/transparency_widget.h index 15cf7b731d..f3642e7c70 100644 --- a/src/widgets/transparency_widget.h +++ b/src/widgets/transparency_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 transparency_widget.h Types related to the transparency widgets. */ diff --git a/src/widgets/tree_widget.h b/src/widgets/tree_widget.h index ba22199d65..690f8686a2 100644 --- a/src/widgets/tree_widget.h +++ b/src/widgets/tree_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 tree_widget.h Types related to the tree widgets. */ diff --git a/src/widgets/vehicle_widget.h b/src/widgets/vehicle_widget.h index 296948283e..74668eef46 100644 --- a/src/widgets/vehicle_widget.h +++ b/src/widgets/vehicle_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 vehicle_widget.h Types related to the vehicle widgets. */ diff --git a/src/widgets/viewport_widget.h b/src/widgets/viewport_widget.h index b83d3c55e3..13270e89fd 100644 --- a/src/widgets/viewport_widget.h +++ b/src/widgets/viewport_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 viewport_widget.h Types related to the viewport widgets. */ diff --git a/src/widgets/waypoint_widget.h b/src/widgets/waypoint_widget.h index f942b51bc5..d8d29cf159 100644 --- a/src/widgets/waypoint_widget.h +++ b/src/widgets/waypoint_widget.h @@ -2,7 +2,7 @@ * 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 . + * 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 waypoint_widget.h Types related to the waypoint widgets. */ diff --git a/src/window.cpp b/src/window.cpp index 4422cd86ed..717c8a5245 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2,7 +2,7 @@ * 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 . + * 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 window.cpp Windowing system, widgets and events */ diff --git a/src/window_func.h b/src/window_func.h index 2b4fbfe0ff..289e4584d5 100644 --- a/src/window_func.h +++ b/src/window_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 window_func.h %Window functions not directly related to making/drawing windows. */ diff --git a/src/window_gui.h b/src/window_gui.h index bf09cd1985..934df38052 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -2,7 +2,7 @@ * 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 . + * 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 window_gui.h Functions, definitions and such used only by the GUI. */ diff --git a/src/window_type.h b/src/window_type.h index 880738be1d..67a23bc85e 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 window_type.h Types related to windows */ diff --git a/src/zoom_func.h b/src/zoom_func.h index df12a2382d..1ce7f36e50 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -2,7 +2,7 @@ * 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 . + * 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 zoom_func.h Functions related to zooming. */ diff --git a/src/zoom_type.h b/src/zoom_type.h index 272d2fab95..3d07ff3b3b 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -2,7 +2,7 @@ * 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 . + * 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 zoom_type.h Types related to zooming in and out. */ From 2fc877c2ec2299632e3457864ae40d26ac63d3f7 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Dec 2025 11:59:20 +0000 Subject: [PATCH 270/280] Fix #14871, 80e58e751a: Possible crash when building NewGRF station under bridge. (#14872) Triggered by reading random tile data before the tile is actually created. --- src/station_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 562f1c1b1f..52d205a156 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1492,7 +1492,7 @@ CommandCost CmdBuildRailStation(DoCommandFlags flags, TileIndex tile_org, RailTy if (statspec != nullptr) { uint32_t platinfo = GetPlatformInfo(AXIS_X, gfx, plat_len, numtracks, j, i, false); /* As the station is not yet completely finished, the station does not yet exist. */ - uint16_t callback = GetStationCallback(CBID_STATION_BUILD_TILE_LAYOUT, platinfo, 0, statspec, nullptr, tile); + uint16_t callback = GetStationCallback(CBID_STATION_BUILD_TILE_LAYOUT, platinfo, 0, statspec, nullptr, INVALID_TILE); if (callback != CALLBACK_FAILED && callback <= UINT8_MAX) gfx = (callback & ~1) + axis; } From 4339bf3dc73a028602f8fc8c3a33d862501008f8 Mon Sep 17 00:00:00 2001 From: frosch Date: Mon, 21 Apr 2025 18:58:08 +0200 Subject: [PATCH 271/280] Codechange: Use attribute syntax for debug_inline, so clang-format understands it. --- src/core/bitmath_func.hpp | 4 ++-- src/core/enum_type.hpp | 4 ++-- src/map_func.h | 42 ++++++++++++++++----------------- src/pathfinder/follow_track.hpp | 8 +++---- src/rail_map.h | 10 ++++---- src/road_map.h | 10 ++++---- src/station_base.h | 6 ++--- src/stdafx.h | 10 ++++---- src/tile_map.h | 6 ++--- src/vehicle_base.h | 4 ++-- 10 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/core/bitmath_func.hpp b/src/core/bitmath_func.hpp index d698578c4f..91ea7aee40 100644 --- a/src/core/bitmath_func.hpp +++ b/src/core/bitmath_func.hpp @@ -29,7 +29,7 @@ * @return The selected bits, aligned to a LSB. */ template -debug_inline constexpr static uint GB(const T x, const uint8_t s, const uint8_t n) +[[debug_inline]] inline constexpr static uint GB(const T x, const uint8_t s, const uint8_t n) { return (x >> s) & (((T)1U << n) - 1); } @@ -100,7 +100,7 @@ constexpr T AB(T &x, const uint8_t s, const uint8_t n, const U i) * @return True if the bit is set, false else. */ template -debug_inline constexpr bool HasBit(const T x, const uint8_t y) +[[debug_inline]] inline constexpr bool HasBit(const T x, const uint8_t y) { return (x & ((T)1U << y)) != 0; } diff --git a/src/core/enum_type.hpp b/src/core/enum_type.hpp index 26a8078871..c76b564829 100644 --- a/src/core/enum_type.hpp +++ b/src/core/enum_type.hpp @@ -139,7 +139,7 @@ inline constexpr auto operator-(enum_type a, enum_type b) * @return True iff the flag is set. */ template >> -debug_inline constexpr bool HasFlag(const T x, const T y) +[[debug_inline]] inline constexpr bool HasFlag(const T x, const T y) { return (x & y) == y; } @@ -150,7 +150,7 @@ debug_inline constexpr bool HasFlag(const T x, const T y) * @param y The flag to toggle. */ template >> -debug_inline constexpr void ToggleFlag(T &x, const T y) +[[debug_inline]] inline constexpr void ToggleFlag(T &x, const T y) { if (HasFlag(x, y)) { x &= ~y; diff --git a/src/map_func.h b/src/map_func.h index cb64390271..5c35bf65df 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -61,7 +61,7 @@ public: * Create the tile wrapper for the given tile. * @param tile The tile to access the map for. */ - debug_inline Tile(TileIndex tile) : tile(tile) {} + [[debug_inline]] inline Tile(TileIndex tile) : tile(tile) {} /** * Create the tile wrapper for the given tile. @@ -72,12 +72,12 @@ public: /** * Implicit conversion to the TileIndex. */ - debug_inline constexpr operator TileIndex() const { return this->tile; } + [[debug_inline]] inline constexpr operator TileIndex() const { return this->tile; } /** * Implicit conversion to the uint for bounds checking. */ - debug_inline constexpr operator uint() const { return this->tile.base(); } + [[debug_inline]] inline constexpr operator uint() const { return this->tile.base(); } /** * The type (bits 4..7), bridges (2..3), rainforest/desert (0..1) @@ -86,7 +86,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &type() + [[debug_inline]] inline uint8_t &type() { return base_tiles[this->tile.base()].type; } @@ -98,7 +98,7 @@ public: * @param tile The tile to get the height for. * @return reference to the byte holding the height. */ - debug_inline uint8_t &height() + [[debug_inline]] inline uint8_t &height() { return base_tiles[this->tile.base()].height; } @@ -110,7 +110,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m1() + [[debug_inline]] inline uint8_t &m1() { return base_tiles[this->tile.base()].m1; } @@ -122,7 +122,7 @@ public: * @param tile The tile to get the data for. * @return reference to the uint16_t holding the data. */ - debug_inline uint16_t &m2() + [[debug_inline]] inline uint16_t &m2() { return base_tiles[this->tile.base()].m2; } @@ -134,7 +134,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m3() + [[debug_inline]] inline uint8_t &m3() { return base_tiles[this->tile.base()].m3; } @@ -146,7 +146,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m4() + [[debug_inline]] inline uint8_t &m4() { return base_tiles[this->tile.base()].m4; } @@ -158,7 +158,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m5() + [[debug_inline]] inline uint8_t &m5() { return base_tiles[this->tile.base()].m5; } @@ -170,7 +170,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m6() + [[debug_inline]] inline uint8_t &m6() { return extended_tiles[this->tile.base()].m6; } @@ -182,7 +182,7 @@ public: * @param tile The tile to get the data for. * @return reference to the byte holding the data. */ - debug_inline uint8_t &m7() + [[debug_inline]] inline uint8_t &m7() { return extended_tiles[this->tile.base()].m7; } @@ -194,7 +194,7 @@ public: * @param tile The tile to get the data for. * @return reference to the uint16_t holding the data. */ - debug_inline uint16_t &m8() + [[debug_inline]] inline uint16_t &m8() { return extended_tiles[this->tile.base()].m8; } @@ -250,7 +250,7 @@ public: * @note try to avoid using this one * @return 2^"return value" == Map::SizeX() */ - debug_inline static uint LogX() + [[debug_inline]] inline static uint LogX() { return Map::log_x; } @@ -269,7 +269,7 @@ public: * Get the size of the map along the X * @return the number of tiles along the X of the map */ - debug_inline static uint SizeX() + [[debug_inline]] inline static uint SizeX() { return Map::size_x; } @@ -287,7 +287,7 @@ public: * Get the size of the map * @return the number of tiles of the map */ - debug_inline static uint Size() + [[debug_inline]] inline static uint Size() { return Map::size; } @@ -296,7 +296,7 @@ public: * Gets the maximum X coordinate within the map, including MP_VOID * @return the maximum X coordinate */ - debug_inline static uint MaxX() + [[debug_inline]] inline static uint MaxX() { return Map::SizeX() - 1; } @@ -382,7 +382,7 @@ public: * @param y The y coordinate of the tile * @return The TileIndex calculated by the coordinate */ -debug_inline static TileIndex TileXY(uint x, uint y) +[[debug_inline]] inline static TileIndex TileXY(uint x, uint y) { return TileIndex{(y << Map::LogX()) + x}; } @@ -413,7 +413,7 @@ inline TileIndexDiff TileDiffXY(int x, int y) * @param y The virtual y coordinate of the tile. * @return The TileIndex calculated by the coordinate. */ -debug_inline static TileIndex TileVirtXY(uint x, uint y) +[[debug_inline]] inline static TileIndex TileVirtXY(uint x, uint y) { return TileIndex{(y >> 4 << Map::LogX()) + (x >> 4)}; } @@ -424,7 +424,7 @@ debug_inline static TileIndex TileVirtXY(uint x, uint y) * @param tile the tile to get the X component of * @return the X component */ -debug_inline static uint TileX(TileIndex tile) +[[debug_inline]] inline static uint TileX(TileIndex tile) { return tile.base() & Map::MaxX(); } @@ -434,7 +434,7 @@ debug_inline static uint TileX(TileIndex tile) * @param tile the tile to get the Y component of * @return the Y component */ -debug_inline static uint TileY(TileIndex tile) +[[debug_inline]] inline static uint TileY(TileIndex tile) { return tile.base() >> Map::LogX(); } diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp index 4fdab63347..b50b793c6e 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -87,11 +87,11 @@ struct CFollowTrackT { this->railtypes = railtype_override; } - debug_inline static TransportType TT() { return Ttr_type_; } - debug_inline static bool IsWaterTT() { return TT() == TRANSPORT_WATER; } - debug_inline static bool IsRailTT() { return TT() == TRANSPORT_RAIL; } + [[debug_inline]] inline static TransportType TT() { return Ttr_type_; } + [[debug_inline]] inline static bool IsWaterTT() { return TT() == TRANSPORT_WATER; } + [[debug_inline]] inline static bool IsRailTT() { return TT() == TRANSPORT_RAIL; } inline bool IsTram() { return IsRoadTT() && RoadTypeIsTram(RoadVehicle::From(this->veh)->roadtype); } - debug_inline static bool IsRoadTT() { return TT() == TRANSPORT_ROAD; } + [[debug_inline]] inline static bool IsRoadTT() { return TT() == TRANSPORT_ROAD; } static inline bool Allow90degTurns() { return T90deg_turns_allowed_; } static inline bool DoTrackMasking() { return Tmask_reserved_tracks; } diff --git a/src/rail_map.h b/src/rail_map.h index 48ca076db1..57ddb6a63a 100644 --- a/src/rail_map.h +++ b/src/rail_map.h @@ -33,7 +33,7 @@ enum class RailTileType : uint8_t { * @pre IsTileType(t, MP_RAILWAY) * @return the RailTileType */ -debug_inline static RailTileType GetRailTileType(Tile t) +[[debug_inline]] inline static RailTileType GetRailTileType(Tile t) { assert(IsTileType(t, MP_RAILWAY)); return static_cast(GB(t.m5(), 6, 2)); @@ -46,7 +46,7 @@ debug_inline static RailTileType GetRailTileType(Tile t) * @pre IsTileType(t, MP_RAILWAY) * @return true if and only if the tile is normal rail (with or without signals) */ -debug_inline static bool IsPlainRail(Tile t) +[[debug_inline]] inline static bool IsPlainRail(Tile t) { RailTileType rtt = GetRailTileType(t); return rtt == RailTileType::Normal || rtt == RailTileType::Signals; @@ -57,7 +57,7 @@ debug_inline static bool IsPlainRail(Tile t) * @param t the tile to get the information from * @return true if and only if the tile is normal rail (with or without signals) */ -debug_inline static bool IsPlainRailTile(Tile t) +[[debug_inline]] inline static bool IsPlainRailTile(Tile t) { return IsTileType(t, MP_RAILWAY) && IsPlainRail(t); } @@ -92,7 +92,7 @@ inline void SetHasSignals(Tile tile, bool signals) * @pre IsTileType(t, MP_RAILWAY) * @return true if and only if the tile is a rail depot */ -debug_inline static bool IsRailDepot(Tile t) +[[debug_inline]] inline static bool IsRailDepot(Tile t) { return GetRailTileType(t) == RailTileType::Depot; } @@ -102,7 +102,7 @@ debug_inline static bool IsRailDepot(Tile t) * @param t the tile to get the information from * @return true if and only if the tile is a rail depot */ -debug_inline static bool IsRailDepotTile(Tile t) +[[debug_inline]] inline static bool IsRailDepotTile(Tile t) { return IsTileType(t, MP_RAILWAY) && IsRailDepot(t); } diff --git a/src/road_map.h b/src/road_map.h index 1d9fb95aa3..cb273bb22b 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -33,7 +33,7 @@ bool MayHaveRoad(Tile t); * @pre IsTileType(t, MP_ROAD) * @return The road tile type. */ -debug_inline static RoadTileType GetRoadTileType(Tile t) +[[debug_inline]] inline static RoadTileType GetRoadTileType(Tile t) { assert(IsTileType(t, MP_ROAD)); return static_cast(GB(t.m5(), 6, 2)); @@ -45,7 +45,7 @@ debug_inline static RoadTileType GetRoadTileType(Tile t) * @pre IsTileType(t, MP_ROAD) * @return True if normal road. */ -debug_inline static bool IsNormalRoad(Tile t) +[[debug_inline]] inline static bool IsNormalRoad(Tile t) { return GetRoadTileType(t) == RoadTileType::Normal; } @@ -55,7 +55,7 @@ debug_inline static bool IsNormalRoad(Tile t) * @param t Tile to query. * @return True if normal road tile. */ -debug_inline static bool IsNormalRoadTile(Tile t) +[[debug_inline]] inline static bool IsNormalRoadTile(Tile t) { return IsTileType(t, MP_ROAD) && IsNormalRoad(t); } @@ -87,7 +87,7 @@ inline bool IsLevelCrossingTile(Tile t) * @pre IsTileType(t, MP_ROAD) * @return True if road depot. */ -debug_inline static bool IsRoadDepot(Tile t) +[[debug_inline]] inline static bool IsRoadDepot(Tile t) { return GetRoadTileType(t) == RoadTileType::Depot; } @@ -97,7 +97,7 @@ debug_inline static bool IsRoadDepot(Tile t) * @param t Tile to query. * @return True if road depot tile. */ -debug_inline static bool IsRoadDepotTile(Tile t) +[[debug_inline]] inline static bool IsRoadDepotTile(Tile t) { return IsTileType(t, MP_ROAD) && IsRoadDepot(t); } diff --git a/src/station_base.h b/src/station_base.h index f416496f06..296f4a3b26 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -302,7 +302,7 @@ struct GoodsEntry { * Test if this goods entry has optional cargo packet/flow data. * @returns true iff optional data is present. */ - debug_inline bool HasData() const { return this->data != nullptr; } + [[debug_inline]] inline bool HasData() const { return this->data != nullptr; } /** * Clear optional cargo packet/flow data. @@ -314,7 +314,7 @@ struct GoodsEntry { * @pre HasData() * @returns cargo packet/flow data. */ - debug_inline const GoodsEntryData &GetData() const + [[debug_inline]] inline const GoodsEntryData &GetData() const { assert(this->HasData()); return *this->data; @@ -325,7 +325,7 @@ struct GoodsEntry { * @pre HasData() * @returns non-const cargo packet/flow data. */ - debug_inline GoodsEntryData &GetData() + [[debug_inline]] inline GoodsEntryData &GetData() { assert(this->HasData()); return *this->data; diff --git a/src/stdafx.h b/src/stdafx.h index db93d6a6d5..f264bf6bbc 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -203,7 +203,7 @@ using namespace std::literals::string_view_literals; * inlining. However, the performance benefit can be enormous; when forcing * inlining for the previously mentioned top 5, the debug build ran about 15% * quicker. - * The following debug_inline annotation may be added to functions comply + * The following debug_inline attribute may be added to functions comply * with the following preconditions: * 1: the function takes more than 0.5% of a profiled debug runtime * 2: the function does not modify the game state @@ -211,7 +211,7 @@ using namespace std::literals::string_view_literals; * i.e. no if, switch, for, do, while, etcetera. * 4: the function is one line of code, excluding assertions. * 5: the function is defined in a header file. - * The debug_inline annotation must be placed in front of the function, i.e. + * The debug_inline attribute must be placed in front of the function, i.e. * before the optional static or constexpr modifier. */ #if !defined(_DEBUG) || defined(NO_DEBUG_INLINE) @@ -219,16 +219,16 @@ using namespace std::literals::string_view_literals; * Do not force inlining when not in debug. This way we do not work against * any carefully designed compiler optimizations. */ -#define debug_inline inline +#define debug_inline #elif defined(__clang__) || defined(__GNUC__) -#define debug_inline [[gnu::always_inline]] inline +#define debug_inline gnu::always_inline #else /* * MSVC explicitly disables inlining, even forced inlining, in debug builds * so __forceinline makes no difference compared to inline. Other unknown * compilers can also just fallback to a normal inline. */ -#define debug_inline inline +#define debug_inline #endif /* This is already defined in unix, but not in QNX Neutrino (6.x) or Cygwin. */ diff --git a/src/tile_map.h b/src/tile_map.h index a6463f1761..8dc8126a05 100644 --- a/src/tile_map.h +++ b/src/tile_map.h @@ -26,7 +26,7 @@ * @return the height of the tile * @pre tile < Map::Size() */ -debug_inline static uint TileHeight(Tile tile) +[[debug_inline]] inline static uint TileHeight(Tile tile) { assert(tile < Map::Size()); return tile.height(); @@ -93,7 +93,7 @@ inline uint TilePixelHeightOutsideMap(int x, int y) * @return The tiletype of the tile * @pre tile < Map::Size() */ -debug_inline static TileType GetTileType(Tile tile) +[[debug_inline]] inline static TileType GetTileType(Tile tile) { assert(tile < Map::Size()); return (TileType)GB(tile.type(), 4, 4); @@ -147,7 +147,7 @@ inline void SetTileType(Tile tile, TileType type) * @param type The type to check against * @return true If the type matches against the type of the tile */ -debug_inline static bool IsTileType(Tile tile, TileType type) +[[debug_inline]] inline static bool IsTileType(Tile tile, TileType type) { return GetTileType(tile) == type; } diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 5a8e6fabb0..7edf7249b1 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -467,7 +467,7 @@ public: * Check if the vehicle is a ground vehicle. * @return True iff the vehicle is a train or a road vehicle. */ - debug_inline bool IsGroundVehicle() const + [[debug_inline]] inline bool IsGroundVehicle() const { return this->type == VEH_TRAIN || this->type == VEH_ROAD; } @@ -910,7 +910,7 @@ public: * Check if the vehicle is a front engine. * @return Returns true if the vehicle is a front engine. */ - debug_inline bool IsFrontEngine() const + [[debug_inline]] inline bool IsFrontEngine() const { return this->IsGroundVehicle() && HasBit(this->subtype, GVSF_FRONT); } From bbf582ff3a2653dfbaf38107dfca9aa14e9a47c4 Mon Sep 17 00:00:00 2001 From: Cyprian Klimaszewski <111280526+Rito13@users.noreply.github.com> Date: Sun, 7 Dec 2025 14:19:50 +0100 Subject: [PATCH 272/280] Fix 92e895a: don't force proceed crashed trains --- src/train_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index b4e372cd15..0ef0f49fec 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2149,7 +2149,7 @@ CommandCost CmdReverseTrainDirection(DoCommandFlags flags, VehicleID veh_id, boo */ static TrainForceProceeding DetermineNextTrainForceProceeding(const Train *t) { - if (t->force_proceed == TFP_SIGNAL) return TFP_NONE; + if (t->vehstatus.Test(VehState::Crashed) || t->force_proceed == TFP_SIGNAL) return TFP_NONE; if (!t->flags.Test(VehicleRailFlag::Stuck)) return t->IsChainInDepot() ? TFP_STUCK : TFP_SIGNAL; TileIndex next_tile = TileAddByDiagDir(t->tile, TrackdirToExitdir(t->GetVehicleTrackdir())); From ced54c3008cafc96cd746a27843df2e81028041b Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sat, 6 Dec 2025 20:51:40 +0100 Subject: [PATCH 273/280] Update: Changelog for 15.0-RC1 --- changelog.md | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/changelog.md b/changelog.md index f43b705793..eaa3dcdfd7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,91 @@ ## 15.x +### 15.0-RC1 (2025-12-07) + +- Feature: Automatically load extra fonts for missing glyphs (#14856, #13303) +- Feature: Rivers can end in wetlands if unable to reach sea (#14784, #14846) +- Feature: Signs, waypoint and station names may be moved (#14744) +- Feature: Draw infinite water when all borders are water (#13289) +- Add: [NewGRF] Allow badges to be excluded from badge name list (#14818) +- Add: [Script] ScriptTile::IsHouseTile (#14806) +- Add: Game units for height (#14615) +- Add: Show height difference in bridge is too low error message (#14614) +- Add: Include build cost in rail/road dropdowns (#14599) +- Add: Show all railtypes in the build vehicle and engine preview dialogs (#14357) +- Add: [Script] Function to get all rail types of an rail engine (#14357) +- Add: [NewGRF] Train property to set multiple track types for an engine (#14357) +- Add: [Script] Auto-convert ObjectType bool to integer when setting values for items in lists via [] (#14308) +- Change: Ensure generated towns have enough room (#14803) +- Change: Eliminate small seas instead of ending rivers there (#14797) +- Change: Clamp terraform toolbar to main toolbar (#14725) +- Change: Make groups window group list aware of interface scaling (#14679) +- Change: Prefer normal/medium weight font in FontConfig fallback detection (#14672) +- Change: Support interface scaling in network client list buttons (#14659) +- Change: Record and show multiple errors for each NewGRF (#14658) +- Change: Replace the "(City)" identifier in the town directory with the city icon (#14634) +- Change: Determine automatic interface scale by window size (#14627) +- Change: Apply interface scale to window snap distance (#14625) +- Change: Ask for confirmation before deleting a savegame / scenario / heightmap (#14621) +- Change: Add lock penalty to ship pathfinder (#14603) +- Change: Allow bridges over locks & docks (#14595, #14594) +- Change: Removed disable_node_optimization YAPF setting (#14578) +- Change: Provide road and rail overlay sprites for bridge decks (#14557) +- Change: Scale towns/industries by amount of land tiles (#10063) +- Fix #14802: Close NewGRF inspection window when overbuilding with default station/waypoint (#14859) +- Fix #14839: Do not set stacked widget height, which might not be shown (#14858) +- Fix: Incorrect background colour in badge configuration list (#14850) +- Fix #14844: Use company colour remap for badges in picker window (#14849) +- Fix: Drop down scrolling broken for mixed-height items (#14840) +- Fix #8062: (Try to) ensure enough room for profit in vehicle group window (#14835) +- Fix #9071: Don't consider tram tracks when growing towns (#14833) +- Fix: Saved default houses had incorrect class and index information (#14812) +- Fix #14756: Invalidate nested focus before widget container is cleared (#14809) +- Fix #14800: Incorrect register processing in GetCustomStationRelocation (#14801) +- Fix #14755: Remove clicked type selection when not visible (#14796) +- Fix: Incorrect parsing of var 6x parameter in NewGRF debug window (#14789) +- Fix: Two lighthouse spawn issues (#14785) +- Fix #14777: Authorized_key: Correctly target key type for add/remove (#14778) +- Fix: Incorrect spacing for badges in dropdown lists (#14768) +- Fix: Unconfigured badge classes should be visible in column 0 by default (#14766) +- Fix #14763: Crash if NewGRF currency separator is not valid (#14764) +- Fix #14701: Company colour remap for sprites in badge filter dropdowns (#14732) +- Fix: Do not pre-fill industry production history for unused production slots (#14730) +- Fix: Don't set set town index for depot tiles (#14729) +- Fix #14723: Set force proceed to TFP_SIGNAL if next tile has signals (#14724) +- Fix: Miscalculated cargo penalty for poor station rating (#14712) +- Fix: Crash when user enters a blank line in the console (#14711) +- Fix: Dump_info should not reverse non-ASCII label (#14697) +- Fix: Incorrect parameter order for CmdSetCompanyManagerFace (#14695) +- Fix: Bootstrap ignored default OpenTTD truetype fonts (#14684) +- Fix: League Table layout broken with RTL languages (#14667) +- Fix #14549: Changing interface scale could underflow viewport zoom (#14655) +- Fix: Incorrect row height in network server list (#14653) +- Fix: Doubled beep sounds when clicking toolbar buttons (#14642) +- Fix: Wrong button type for town menu in scenario editor toolbar (#14641) +- Fix #14631: Waypoint customs spec not allocated properly on initial construction (#14633) +- Fix: Variant cycle detection in FinaliseEngineArray (#14629) +- Fix #14620: Use full file path when deleting files (#14623) +- Fix: [Script] Return rail types as list instead of bitmask (#14617) +- Fix #14604: Clearing tiles to build objects did not update town ratings (#14616) +- Fix: Bridge height check for waypoints didn't include axis in layout (#14609) +- Fix #14607: Bridge-over-station discrepancy depending on build order (#14608) +- Fix: Don't add spacing in rail/road type dropdowns if no badges are present (#14598) +- Fix: [Script] Incorrect infrastructure cost for road/tram tiles (#14596) +- Fix #14588: Show error when unable to clone partly-cleared crashed train (#14591) +- Fix #14586: Empty station tile layouts incorrectly substituted with default layouts (#14587) +- Fix #14584: Crash due to drawing non-existent orders of new vehicle (#14585) +- Fix #14572: Incorrect playlist entry was removed if there are duplicates (#14583) +- Fix: Wrong row may be selected in music playlists (#14581) +- Fix #14569: Ensure music playlist window is large enough (#14570) +- Fix #14278: [Script] Memory allocation limit did not work and could result in a crash. (#14568) +- Fix: Road stop properties 0x13/0x14 were not skipped properly (#14567) +- Fix #13922: Ensure music track number widget is wide enough for track number (#14566) +- Fix: Badge filters were only applied to trains. (#14565) +- Fix: Industry accept/produce when not contiguous range from 0 (#14555) +- Fix #14240: Remember previous GUI scale when toggling auto-detect (#14380) +- Remove: Rail type cost from replace vehicle window (#14748) + + ### 15.0-beta3 (2025-08-31) - Feature: Identify cities in the main viewport by appending an icon to their names (#14504) From 0ef15fa99164d077630bf8491693f2864ebc00e6 Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Sun, 7 Dec 2025 16:55:28 +0000 Subject: [PATCH 274/280] Update: Improve wording of 15.0-RC1 changelog entries (#14876) --- changelog.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/changelog.md b/changelog.md index eaa3dcdfd7..dbbc433859 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,7 @@ ### 15.0-RC1 (2025-12-07) -- Feature: Automatically load extra fonts for missing glyphs (#14856, #13303) +- Feature: Automatically load extra fonts for missing glyphs (#13303, #14856) - Feature: Rivers can end in wetlands if unable to reach sea (#14784, #14846) - Feature: Signs, waypoint and station names may be moved (#14744) - Feature: Draw infinite water when all borders are water (#13289) @@ -30,7 +30,7 @@ - Change: Allow bridges over locks & docks (#14595, #14594) - Change: Removed disable_node_optimization YAPF setting (#14578) - Change: Provide road and rail overlay sprites for bridge decks (#14557) -- Change: Scale towns/industries by amount of land tiles (#10063) +- Change: Scale number of towns/industries by amount of land tiles (#10063) - Fix #14802: Close NewGRF inspection window when overbuilding with default station/waypoint (#14859) - Fix #14839: Do not set stacked widget height, which might not be shown (#14858) - Fix: Incorrect background colour in badge configuration list (#14850) @@ -43,18 +43,18 @@ - Fix #14800: Incorrect register processing in GetCustomStationRelocation (#14801) - Fix #14755: Remove clicked type selection when not visible (#14796) - Fix: Incorrect parsing of var 6x parameter in NewGRF debug window (#14789) -- Fix: Two lighthouse spawn issues (#14785) -- Fix #14777: Authorized_key: Correctly target key type for add/remove (#14778) +- Fix: Improve lighthouse spawn conditions (#14785) +- Fix #14777: authorized_key add/remove console commands did not apply to correct list (#14778) - Fix: Incorrect spacing for badges in dropdown lists (#14768) - Fix: Unconfigured badge classes should be visible in column 0 by default (#14766) - Fix #14763: Crash if NewGRF currency separator is not valid (#14764) - Fix #14701: Company colour remap for sprites in badge filter dropdowns (#14732) - Fix: Do not pre-fill industry production history for unused production slots (#14730) -- Fix: Don't set set town index for depot tiles (#14729) -- Fix #14723: Set force proceed to TFP_SIGNAL if next tile has signals (#14724) +- Fix: Depot-related crash when loading old savegames (#14729) +- Fix #14721, #14723: Inconsistent behaviour when skipping signals (#14724) - Fix: Miscalculated cargo penalty for poor station rating (#14712) - Fix: Crash when user enters a blank line in the console (#14711) -- Fix: Dump_info should not reverse non-ASCII label (#14697) +- Fix: Console command dump_info should not reverse non-ASCII label (#14697) - Fix: Incorrect parameter order for CmdSetCompanyManagerFace (#14695) - Fix: Bootstrap ignored default OpenTTD truetype fonts (#14684) - Fix: League Table layout broken with RTL languages (#14667) @@ -77,11 +77,11 @@ - Fix #14572: Incorrect playlist entry was removed if there are duplicates (#14583) - Fix: Wrong row may be selected in music playlists (#14581) - Fix #14569: Ensure music playlist window is large enough (#14570) -- Fix #14278: [Script] Memory allocation limit did not work and could result in a crash. (#14568) +- Fix #14278: [Script] Memory allocation limit did not work and could result in a crash (#14568) - Fix: Road stop properties 0x13/0x14 were not skipped properly (#14567) - Fix #13922: Ensure music track number widget is wide enough for track number (#14566) -- Fix: Badge filters were only applied to trains. (#14565) -- Fix: Industry accept/produce when not contiguous range from 0 (#14555) +- Fix: Badge filters were only applied to trains (#14565) +- Fix: [NewGRF] Industry acceptance/production when not contiguous range from 0 (#14555) - Fix #14240: Remember previous GUI scale when toggling auto-detect (#14380) - Remove: Rail type cost from replace vehicle window (#14748) From 0bf3de76586e4f0acceee15d45cb71857e8599b7 Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Sun, 7 Dec 2025 16:55:41 +0000 Subject: [PATCH 275/280] Fix #14863: [Script] Improve documentation for GetAPIVersion (#14877) --- src/script/api/script_info_docs.hpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/script/api/script_info_docs.hpp b/src/script/api/script_info_docs.hpp index 86c3c4b9ff..98e713f64a 100644 --- a/src/script/api/script_info_docs.hpp +++ b/src/script/api/script_info_docs.hpp @@ -154,23 +154,23 @@ public: string CreateInstance(); /** - * Gets the API version this Script is written for. If this function - * does not exist API compatibility with version 0.7 is assumed. + * Gets the API version this Script is written for. + * * If the function returns something OpenTTD does not understand, * for example a newer version or a string that is not a version, * the Script will not be loaded. * - * Although in the future we might need to make a separate - * compatibility 'wrapper' for a specific version of OpenTTD, for - * example '0.7.1', we will use only the major and minor number - * and not the bugfix number as valid return for this function. + * Valid return values are string representations of the major part + * of the OpenTTD version string (and "." prior version 12) + * Some examples: + * - "0.7" (the first valid AI version) + * - "1.2" (the first valid GS version) + * - "1.11" (last major.minor version) + * - "12" (first major-only version) + * - "15" * - * Valid return values are: - * - "0.7" (for AI only) - * - "1.0" (for AI only) - * - "1.1" (for AI only) - * - "1.2" (for both AI and GS) - * - "1.3" (for both AI and GS) + * This function must exist for GS but for historical reasons AI that + * do not set it will assume API compatibility version "0.7". * * @return The version this Script is compatible with. */ From 7f196c6652ff4a5b11c4bd74fc4da52354988ca5 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Sun, 7 Dec 2025 12:05:47 -0500 Subject: [PATCH 276/280] Feature: House placer mode to replace existing houses (#14469) --- src/lang/english.txt | 7 ++--- src/town_cmd.cpp | 55 ++++++++++++++++++++++----------------- src/town_cmd.h | 2 +- src/town_gui.cpp | 34 ++++++++++++------------ src/widgets/town_widget.h | 4 +-- 5 files changed, 56 insertions(+), 46 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 67c858b32d..33b9f155b7 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2880,10 +2880,11 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Outer Suburbs STR_HOUSE_PICKER_CLASS_ZONE4 :Inner Suburbs STR_HOUSE_PICKER_CLASS_ZONE5 :Town centre -STR_HOUSE_PICKER_PROTECT_TITLE :Prevent upgrades +STR_HOUSE_PICKER_PROTECT :Prevent upgrades STR_HOUSE_PICKER_PROTECT_TOOLTIP :Choose whether this house will be protected from replacement as the town grows -STR_HOUSE_PICKER_PROTECT_OFF :Off -STR_HOUSE_PICKER_PROTECT_ON :On + +STR_HOUSE_PICKER_REPLACE :Replace existing +STR_HOUSE_PICKER_REPLACE_TOOLTIP :Choose whether to automatically remove an existing house on the tile where this house is placed STR_STATION_CLASS_DFLT :Default STR_STATION_CLASS_DFLT_STATION :Default station diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index f07f83a28e..13d0a8b215 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2932,9 +2932,10 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile, TownExpandModes modes) * @param tile Tile on which to place the house. * @param HouseID The HouseID of the house spec. * @param is_protected Whether the house is protected from the town upgrading it. + * @param replace Whether to automatically demolish an existing house on this tile, if present. * @return Empty cost or an error. */ -CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, bool is_protected) +CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, bool is_protected, bool replace) { if (_game_mode != GM_EDITOR && _settings_game.economy.place_houses == PH_FORBIDDEN) return CMD_ERROR; @@ -2944,39 +2945,45 @@ CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, b const HouseSpec *hs = HouseSpec::Get(house); if (!hs->enabled) return CMD_ERROR; - Town *t = ClosestTownFromTile(tile, UINT_MAX); - - /* cannot build on these slopes... */ - Slope slope = GetTileSlope(tile); - if (IsSteepSlope(slope)) return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); - - /* building under a bridge? */ - if (IsBridgeAbove(tile)) return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); - - /* can we clear the land? */ - CommandCost cost = Command::Do({DoCommandFlag::Auto, DoCommandFlag::NoWater}, tile); - if (!cost.Succeeded()) return cost; - int maxz = GetTileMaxZ(tile); - /* Make sure there is no slope? */ - bool noslope = hs->building_flags.Test(BuildingFlag::NotSloped); - if (noslope && slope != SLOPE_FLAT) return CommandCost(STR_ERROR_FLAT_LAND_REQUIRED); - - TileArea ta = tile; + /* Check each tile of a multi-tile house. */ + TileArea ta(tile, 1, 1); if (hs->building_flags.Test(BuildingFlag::Size2x2)) ta.Add(TileAddXY(tile, 1, 1)); if (hs->building_flags.Test(BuildingFlag::Size2x1)) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SW)); if (hs->building_flags.Test(BuildingFlag::Size1x2)) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SE)); - /* Check additional tiles covered by this house. */ - for (const TileIndex &subtile : ta) { - cost = Command::Do({DoCommandFlag::Auto, DoCommandFlag::NoWater}, subtile); - if (!cost.Succeeded()) return cost; + for (const TileIndex subtile : ta) { + /* Houses cannot be built on steep slopes. */ + Slope slope = GetTileSlope(subtile); + if (IsSteepSlope(slope)) return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); - if (!CheckBuildHouseSameZ(subtile, maxz, noslope)) return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); + /* Houses cannot be built under bridges. */ + if (IsBridgeAbove(subtile)) return CommandCost(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); + + /* Make sure there is no slope? */ + bool noslope = hs->building_flags.Test(BuildingFlag::NotSloped); + if (noslope && slope != SLOPE_FLAT) return CommandCost(STR_ERROR_FLAT_LAND_REQUIRED); + + /* All tiles of a multi-tile house must have the same z-level. */ + if (GetTileMaxZ(subtile) != maxz) return CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); + + /* We might be replacing an existing house, otherwise check if we can clear land. */ + if (!(replace && GetTileType(subtile) == MP_HOUSE)) { + CommandCost cost = Command::Do({DoCommandFlag::Auto, DoCommandFlag::NoWater}, subtile); + if (!cost.Succeeded()) return cost; + } } if (flags.Test(DoCommandFlag::Execute)) { + /* If replacing, clear any existing houses first. */ + if (replace) { + for (const TileIndex &subtile : ta) { + if (GetTileType(subtile) == MP_HOUSE) ClearTownHouse(Town::GetByTile(subtile), subtile); + } + } + + Town *t = ClosestTownFromTile(tile, UINT_MAX); bool house_completed = _settings_game.economy.place_houses == PH_ALLOWED_CONSTRUCTED; BuildTownHouse(t, tile, hs, house, Random(), house_completed, is_protected); } diff --git a/src/town_cmd.h b/src/town_cmd.h index 1403d6aa53..168999560a 100644 --- a/src/town_cmd.h +++ b/src/town_cmd.h @@ -27,7 +27,7 @@ CommandCost CmdTownCargoGoal(DoCommandFlags flags, TownID town_id, TownAcceptanc CommandCost CmdTownSetText(DoCommandFlags flags, TownID town_id, const EncodedString &text); CommandCost CmdExpandTown(DoCommandFlags flags, TownID town_id, uint32_t grow_amount, TownExpandModes modes); CommandCost CmdDeleteTown(DoCommandFlags flags, TownID town_id); -CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, bool house_protected); +CommandCost CmdPlaceHouse(DoCommandFlags flags, TileIndex tile, HouseID house, bool house_protected, bool replace); DEF_CMD_TRAIT(CMD_FOUND_TOWN, CmdFoundTown, CommandFlags({CommandFlag::Deity, CommandFlag::NoTest}), CommandType::LandscapeConstruction) // founding random town can fail only in exec run DEF_CMD_TRAIT(CMD_RENAME_TOWN, CmdRenameTown, CommandFlags({CommandFlag::Deity, CommandFlag::Server}), CommandType::OtherManagement) diff --git a/src/town_gui.cpp b/src/town_gui.cpp index e5633619e7..04e999bf4e 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1645,6 +1645,7 @@ static CargoTypes GetProducedCargoOfHouse(const HouseSpec *hs) struct BuildHouseWindow : public PickerWindow { std::string house_info{}; static inline bool house_protected; + static inline bool replace; BuildHouseWindow(WindowDesc &desc, Window *parent) : PickerWindow(desc, parent, 0, HousePickerCallbacks::instance) { @@ -1749,11 +1750,17 @@ struct BuildHouseWindow : public PickerWindow { void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { switch (widget) { - case WID_BH_PROTECT_OFF: - case WID_BH_PROTECT_ON: - BuildHouseWindow::house_protected = (widget == WID_BH_PROTECT_ON); - this->SetWidgetLoweredState(WID_BH_PROTECT_OFF, !BuildHouseWindow::house_protected); - this->SetWidgetLoweredState(WID_BH_PROTECT_ON, BuildHouseWindow::house_protected); + case WID_BH_PROTECT_TOGGLE: + BuildHouseWindow::house_protected = !BuildHouseWindow::house_protected; + this->SetWidgetLoweredState(WID_BH_PROTECT_TOGGLE, BuildHouseWindow::house_protected); + + SndClickBeep(); + this->SetDirty(); + break; + + case WID_BH_REPLACE_TOGGLE: + BuildHouseWindow::replace = !BuildHouseWindow::replace; + this->SetWidgetLoweredState(WID_BH_REPLACE_TOGGLE, BuildHouseWindow::replace); SndClickBeep(); this->SetDirty(); @@ -1782,17 +1789,16 @@ struct BuildHouseWindow : public PickerWindow { bool hasflag = spec->extra_flags.Test(HouseExtraFlag::BuildingIsProtected); if (hasflag) BuildHouseWindow::house_protected = true; - this->SetWidgetLoweredState(WID_BH_PROTECT_OFF, !BuildHouseWindow::house_protected); - this->SetWidgetLoweredState(WID_BH_PROTECT_ON, BuildHouseWindow::house_protected); + this->SetWidgetLoweredState(WID_BH_PROTECT_TOGGLE, BuildHouseWindow::house_protected); + this->SetWidgetLoweredState(WID_BH_REPLACE_TOGGLE, BuildHouseWindow::replace); - this->SetWidgetDisabledState(WID_BH_PROTECT_OFF, hasflag); - this->SetWidgetDisabledState(WID_BH_PROTECT_ON, hasflag); + this->SetWidgetDisabledState(WID_BH_PROTECT_TOGGLE, hasflag); } void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override { const HouseSpec *spec = HouseSpec::Get(HousePickerCallbacks::sel_type); - Command::Post(STR_ERROR_CAN_T_BUILD_HOUSE, CcPlaySound_CONSTRUCTION_OTHER, tile, spec->Index(), BuildHouseWindow::house_protected); + Command::Post(STR_ERROR_CAN_T_BUILD_HOUSE, CcPlaySound_CONSTRUCTION_OTHER, tile, spec->Index(), BuildHouseWindow::house_protected, BuildHouseWindow::replace); } const IntervalTimer view_refresh_interval = {std::chrono::milliseconds(2500), [this](auto) { @@ -1822,14 +1828,10 @@ static constexpr std::initializer_list _nested_build_house_widgets NWidget(WWT_PANEL, COLOUR_DARK_GREEN), NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0), SetPadding(WidgetDimensions::unscaled.picker), NWidget(WWT_EMPTY, INVALID_COLOUR, WID_BH_INFO), SetFill(1, 1), SetMinimalTextLines(10, 0), - NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_HOUSE_PICKER_PROTECT_TITLE, STR_NULL), SetFill(1, 0), - NWidget(NWID_HORIZONTAL), SetPIPRatio(1, 0, 1), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BH_PROTECT_OFF), SetMinimalSize(60, 12), SetStringTip(STR_HOUSE_PICKER_PROTECT_OFF, STR_HOUSE_PICKER_PROTECT_TOOLTIP), - NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BH_PROTECT_ON), SetMinimalSize(60, 12), SetStringTip(STR_HOUSE_PICKER_PROTECT_ON, STR_HOUSE_PICKER_PROTECT_TOOLTIP), - EndContainer(), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BH_PROTECT_TOGGLE), SetMinimalSize(60, 12), SetStringTip(STR_HOUSE_PICKER_PROTECT, STR_HOUSE_PICKER_PROTECT_TOOLTIP), + NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BH_REPLACE_TOGGLE), SetMinimalSize(60, 12), SetStringTip(STR_HOUSE_PICKER_REPLACE, STR_HOUSE_PICKER_REPLACE_TOOLTIP), EndContainer(), EndContainer(), - EndContainer(), NWidgetFunction(MakePickerTypeWidgets), EndContainer(), diff --git a/src/widgets/town_widget.h b/src/widgets/town_widget.h index f60854dc31..451dd4c620 100644 --- a/src/widgets/town_widget.h +++ b/src/widgets/town_widget.h @@ -78,8 +78,8 @@ enum TownFoundingWidgets : WidgetID { /** Widgets of the #BuildHouseWindow class. */ enum BuildHouseWidgets : WidgetID { WID_BH_INFO, ///< Information panel of selected house. - WID_BH_PROTECT_OFF, ///< Button to protect the next house built. - WID_BH_PROTECT_ON, ///< Button to not protect the next house built. + WID_BH_PROTECT_TOGGLE, ///< Button to toggle protecting the next house built. + WID_BH_REPLACE_TOGGLE, ///< Button to toggle replacing existing houses. }; #endif /* WIDGETS_TOWN_WIDGET_H */ From 9ea4d6b2dfdfc0db99f335a43dd550306e81db75 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 7 Dec 2025 20:42:40 +0000 Subject: [PATCH 277/280] Doc: Update 15.0-rc1 changelog with last PR. (#14880) --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index dbbc433859..abffc66e21 100644 --- a/changelog.md +++ b/changelog.md @@ -5,6 +5,7 @@ - Feature: Automatically load extra fonts for missing glyphs (#13303, #14856) - Feature: Rivers can end in wetlands if unable to reach sea (#14784, #14846) - Feature: Signs, waypoint and station names may be moved (#14744) +- Feature: House placer mode to replace existing houses (#14469) - Feature: Draw infinite water when all borders are water (#13289) - Add: [NewGRF] Allow badges to be excluded from badge name list (#14818) - Add: [Script] ScriptTile::IsHouseTile (#14806) From 04f1a114dd3bde9e70a017651ea1c4d8d2c22865 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 7 Dec 2025 18:14:00 +0100 Subject: [PATCH 278/280] Change #14155: Erato's the winner of the title game competition --- media/baseset/opntitle.dat | Bin 138710 -> 156304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/media/baseset/opntitle.dat b/media/baseset/opntitle.dat index 264aaff60b5e58cad978bd390ad459da6cc06808..acae6a9ebc83c0975797e60e39feae45f563551e 100644 GIT binary patch literal 156304 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�h(TPWS%2t^eTs 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

-L2O!e8R2=uQ@1B=aoHZdv!r_o2J5voO89^rHuh8=CoP91k(f9NXpr*)6+&jantuY5FE%k}w|=$E$ZN8bG}>?`=FFRB_-oRhu>N8BFeUhxmdlCh@u7*^XU5#v_Q-^DmtyM}V zHznl$TydvRp!o?`ypHQcDf3thyUzb}4&119R*d`qi|c*U?{?Qiz3Quzv##vl<&-9K zTELGf{CPmf^rN+}S(t8x{pWhLE_KP(<`2z(Q_5@=PbMuj6=#_e_GsazYa9!F%Jctu z756#VfBWXMq~qnvex17R4&%+eA4R^)7~EN^xwie8+mriTdAHN&JrbIDDtqn03lhnN z$IY@^Uhe604f!+entuknuj@{yvjW@Nc+v`mpEgxC7#LP&i$9SM{Oxtvqe^biLC;^4 z*rzYq_~+NH==0S*h9%3`ue{s6K)CQ`&6zi*>F*>(%RU7jn;h~piFjnlU`tT&YnNVqBVbo-ee!<=Y?v)x8EpP#qhYMS!x1^1l1 zkgCtO`1u_**KrtL7POSg6_&iRH|K}Fg7?(YiN`)JIWuv^kyv}9i=G?AI=z+@&x5RQ?tD z%Q{?sEEyg7(6{K>#^~^*dCeO(uE-M975h}!T=V4Zzg;&s-8%Osvs|)v>INYu&GyX| z=K@Y8zdOJwzO>ga#49`M-7=x(s~bw|=UMD9j_;mmd!g>s#3e54+LijN4$fV;aOJTd zEwa%!;}c(rUSdAroV)PAjPvgALr>Q}exP}b?Jd*YwU7VoaP0Rs`=KDF@OMeZxf|d3 z`Oi;zyDBEBMxsvn?cW#ro1es5d5gXIEWA5g|K401rG=$WZA_Ez_D!4g#!U7__v!;l zb9V$}4{jaJ7N|NO%K z(pz><{gk%~HAY^IE23N;SC_vxQLPr*lcn%g%`oZ9hQdkT3j~++yK0BO|9$+z_Xqty zROZJO%f;|0Mx|DqEdt6mqPjpPmd5_ntlbpXyQ>iIP zF>9GEvDRN(QSoxa0iF13%>q{!T#oz}lYU6a-+kvk<+t*7R_RUJO~`{ zw(Gggw?1@T?$>oUeRJ>cJ-_!6L%Vy{@|65l>y_d!J`&jT_vOY_85`^#sN4w%nE5-b zy1&Uhie2`Z{M^cE1?kbInyYSd7QfnNBq`i{;2o35rRC3izOM)>I<u6u(~a@sD;CdL zZT>?nU**AAjMw^4ynTO{^X8PEB>^jD`pHb@r<6e=e(+)YV zmy9zCEkFHx^O}h-HeEj`cK=*&guvJRpR6}Wu0Ol!Lr-UN?Dd6LLtak*l$v7xaM?Ax zTgBJ)uI!dmoei^J88*amx4k{K^JvB<^<7<$Hu3D__*J~0 z_u$8T!TZ~mKh%i2H2ngL=jBs(x@+oG--;URZ(mTP-D@ZCvt+f-U!Ga=YvuHg`-Q(& zSU%k#Z#mQIwW_C|ewE9V-FGj_Db1}&q2j_!iS;LfcwZg9TXlv(^nQ_5UeTg6iIE5V zt(IrRXlX_UY&Wu4rnB=Faf|BdPcOKL+`}93A;NPu2v?;<}^D$9QhW(hWDK{BjK`TXH!!yX5Gj z>U$Eag!ctSACYg&X8oe@yDD)4$0EIzv5A)^WbPE@Jor}k&o-vTAL@foCOSCJeqa%j zo;6|Zu^H0YMV7wK@8&H|OxP!N_xfU|NJVoL{D{w8~532|ImrdGF&x z@8s^O^W0o2=dQ6oMc{33_Ty8xxSq0ft-s{_RocA%f1Tg4;A?ByW~|)9!30<1I}^@K z(@8VR+hO}JJ4#(LP$$%YZ%^RiIS-4u*jR1^a#gF_Z_(pZSKH*f>uZ~N?zP>KHkN-P zAMkcv-2CkH`J~|Z>>p9@_D`F()@g_g_79?bMkQRdy@?erDX^yMSd~ zYQ(9w-><5-3M~-$lfc*Z!hw6*g7-U?Jn)TfxKr)_koDJ-Cf#phEVWDSzY6RB<(swo zwb`uP{s}#f1sA8ibNg^eH7g-JnKLds!2kNQTURYY)URi4Z#btcGA-NuUU2)ac@Epn z>^8dv6dD}zW&XTdPT&P!Z$hoiN_pl*dD>@rrJs6k-k7udyUX1=?)@HS-@Z+KdZZ$S z@wb81wXc#4t*R_n9tCOgJ(+&-fZFFuSGHiTI?EqN-}K$o*StUPo0IzM{q?mKvNsrS z&sV(I6da>hV8U_m;hw$|%NB6d`nB?8y!@&2k#DBp?0my5V(}-7uCHQ}e=#HPNcBOF zdvY4j{hpr`sj@uC8`rgS|81xLrw)tDznR5(`mygzZpFVkpP0U+uodsSwvF-P8`YNm zi!?X;zWZ00P$DLMFSvMF^uCmzjHMEFXQi&p>10tee|=)c3U_N z75`n?57mVq{AaDdvN1yBoc8|0*YAT|e(zXzw5j|dOU0UZ&#!J2R}pf!K2Ic1e~#wc zZS5{5f(vc07esrWQEEeZH+_2D^FB2|;T%rtObq8P#o% zxE}h{b2Ej%-z8`N5B8*gOD>(cR~au7A+O?Y>B6=BX6cjK?}GbHMs< zoQyh|!O0nib&P`okGTxeC+ttFG#&VNNxMJe2zSQL4iEjXf5jESUe^BcQy)$HKVf>#>be`HF`HHz zT{@Jc!>_VH@&2Qt8z297JP&0)=3ptB$)3{Ywd(YOedZg>{g3^X_Bj*bdeX0RhMdC# zM)s+nxOQEB_}Or(&yx@5_m^cH`#Hm~Hs;)$9L^tq*Yuxpof}?zfqDC@&8H%(FK8Ot ze7s)jdnQkIwcb*fpi<@OK~ev-cQDUcsi5`fVupg?ck`X*?5`3+j?J{vJt3_ev+3Wo z`|*d;Wp4%Qa(yU`pZZsHnY@(2NuNdS{QB?o?tiQLb$aV6b+54RYt1ch%1`_3`yytF z^h(B6T>B#?Gf7>2&&Rk}SM=Ni_r(jPuGasqwcJ*=M4i*DX`k5{8dM5r>DieFFcZEmE${M;rF6@>-<-69}f5t`AXSZfaOTQah46m0&PVx z+4B?X{MOjaVR6vDb5{50U2i1^bJ3do5K)Ql8GFR{P16aN4E{5t<&7N0GpJ zKC~5#-^s=G)26d4LMnw#2!X1qA1q?k#vZW4YIUiQ@GnrbvZs!$tmEN}_ed)zNohCcYZ?E+=;Yyb~H+jVkR#Agu zo!)Kc6K3?97JK*C+N4bQwc6@Q#P$i%KkrC9cyN!wGpY0NRLjR}m)u;r@_gq?tKWyu z!cHe0K$=)>k_mY+~s!=?u_4hjC?qsfCT2+6r|7ysF zWuL7MuYSKRVA9rG#fmRIjzr7JgsbmZcx~c>%hGBSPn-?e+0)K08r<#^9~1ZfDwpY! zr^}0`hvn6O{%bo?xHUD8={FNoT(rlmTY@K#2Yh6;-FPy0N$rk>DH_wm{I{p9w)0~C zx5jg0IhTD&z0R+Xufv4HH4e|KtGXa{+3wwg1QGtp;t89=wi;B4eQ^6NsC0MUXR8%W zuB(=vd>PgH^tXssD1Uw>i=dvYYGIwjOPdpFj>ij5Ms4YwQoi%Dc;)ps;g@dJD*Mcw z?8tS?HCT{UDsrmZp}#5&)0D*1E%eHg#H*%%{UyM@(pC7#=Q~yF`Yz4+arE9^Ui5SpxvoenZE>uvO38+qvD-z&d^|!}U1kV9k2vO_WaZvEv-NJ= z;t40O{yz1&+_>M|Gc-5yfN7}A#M#H3y?qPM%iq~stui(7k>2(f4=0DYPZfA@@N>n+ zc&}?S{`szsHR_(lvb2KpU}0eBCSS#WGt#-V-yG?gw{*5q zZH3LLeLtO@R<6uwc8+)~b8jWP;ubmmmMqU(Q$^*ce)VFUBPX~sS96)wfl0;_`6@l5 z9x*yi_`GS(Rp0n6LH6Gr4=5g3_C6y-!(#`N;=<|qe`=M5_A!)(CvKPc@t)^*0{h*+ z5x0#F&o&CMW3+EfmT)@qkaKOb-k$e*cOP{+8k;TO*qgJEVa1ZuYcJU(o61&hKX+bS zGIPQ(f%R7-7L?Db&b-^$tdSBS1DmB_rp%PTf#zl_fE3;l1?U7bAdR{wKn zs145f8N~3@^Y*9wG}GBqM^4CbRb+87t3OEG8mMO}V!Gu;1efK#nG=;)*~;{6VqAE5 zIh#$s>vHe8adX1&3!W0J<12UCcPqN|lY_nZN~1NQF;|KX?DI4}_%x^2^QLjZT9Kpq zR?d|VZBA9BP1&z~`pxmXy#fcH>Njlsmw5W+-^b7HmlhoTSaCFTji9`$o!plC{Af+- z2-hDX`32X_W4^uSR$ubHgt?n#zPz)Wn|H*VyG+$p0p-2L@;)gzVnnjZbTKX2Rm$F9q9$6`kFUA%5q|H62_Cfk~*p47^0oK>Y<@T02i zk^B5Dhi-45lxuj$=~>ab)#fYpoEBbqdhSQiO}P{062GQ0)pjg5ttt9DyM0}?!IIfk zyKcd+C4Z)shr9gb zafS=V8_a%w&;Q>edgG|$Jua^E22zvyMVvNFj$IwGBlVo<%cN|f*;~^LF0Yy`FZ_T1 z8dG7f>0zu{E8UkkEbgC|W~8_Kzvkl~+q!n|+~Hel_c%rMz)q*9QP+(b(?rj#n7KR7 z?)rpJJ>gLmZ|u0Fmu)|@!D?wnSHNQFkC%Tv^gnbjf49b|p1`?2{~6CLUjCK;RHEYR zKb0$#lQu`_SWkVk=5yZE8K+%*=OjP%y2{p|zvk7fgZrC2JAc-Ard>X>iKp0xcm2%- z)`Fj66)y#5#ZH>9!u>#fgYsgl{n!fW1SG#w0!?@~YPDPFKx zdjFM2oA#UBFu!A6zI=J*o10>3J2rmRjK5QV_l=LB1-K z+WL8G@~gW%&HwRztb4QL+S&CoJJbYbKmFa+ymPfoNBHykTh@k8ohK(?z{Wc7{?4h| zRu8K~wtnm9^}PP_(R)^|?LSj4JQZHD`pnOmvJd^eMxjO@4=AoE<*i$g-s4iaeSSXg zmyAdMcx@+63)z}Ie-RsZ&e9Vngg6ak`|P4Jo1$*4Kfg|&<5TP@W*>_eY)p48r2l7f zSS|0AolrSVg!`2Cl^TVn?sM(;t*#{4pV%I`{-U3{m_H8u1#=Y2mo+hxYIq{|O$ z7l|Bt?OHTxLua(=!Jjk#hCF*ad-w5+cOI($Ew_FAC0eU7zb7D6!a=U`u~_@Roc`=0 z=7mf2v^;9u*GI)=cmO!T3>J|=S%&f+O#b!LcOo$IVLRmXB=<;AgDsO zL-gapy(T4LR%P)spNZGy?0lW1D6(}S%fC&=m3yA9;VEqQ`*oj7`^A<`J0@J&d27ji z^M=!`hBe!kvIP5I?}|~5Dd>Cr-tN%y`FuNNw+E#~JMZ}DCGgNqB(?2JOAgCi!wBv- z-0KyV{1A8Gcwl*F#lPI;i?*L!*kdYH$Cu?`KVz$}ew&lSW?9#tzSaEq7%Vq+w=Rk7 z6Z9`Qza{IJT$pm9+_L6%F6JyrAL5p(Hzi*2Nj~80D*T>n=9$^+D(aZpEdMTkb}Pqg zPoQ@3Wbu=UCU>SJgcx#9bnI|HT=D0wj@@M5Hx2R33pg&{ynNK|VdP{>InNwk#(+Cp zz8Ur1d%li8eAevCGTF=XN~c~djI_Bb?IZiT`H|B#t$$a)*OeOiA5H7nR~_RuKXc|; zA(79#Je=wF{B31Z7u4|_jScg^td;D?-YD7fx%R}r-kXe8F8h z{h8Uipm|5;Kk^nlw)1kQdBlob&zz>hWtXp~ls;V{?mFiNS7;^gLAIEQZMF$A*4gjY zA6)G(mbvTMr2aQ0-xj`Rt;$(e-fJv-`e*EqaE2YTznSd|;Hmn^m{OGbeg3*^pQ{fA zC89)^7v1LMwO&7z&ae$2gJyh&)4X!LT)hLw-!{`PzHuc&11f@G6Nq4K(B>XYT7 zx{og9w)l5qUam__*m7Q<>HXJz5|sN7KRNFlw`W!vLxpwq&!GDStp8suO%2^*mKibM zUH4+hWsaZ?qQ9%I=HK&I%&YC4w3H#d{I6Y__`ahvHC7eRJtuuq#d?Rmk!QRAiiy6w z|1bG;Y+CVe+KS{0?|P?3@Eb-N3CQ~T3zo)A%d)-6zwgiP+cNU!!Yf}MIqLGhuW-^A z)yMjqgc-^%txtZvx+f}td#b`z!Q_>*yg$rL`gXR)=W_I=)?f2@Liz65aBO zg*Q+1e`-IUa_E`aI+l+TuWy>Z@|Oe$-GZZN$sTKR2u{?ZLh$ss52G%77&~@% zPaY*6|2}om_1lqwnMY^xx7M@8JWX}{9WS>@>eHrn@#^!v6YA_H>K2O6_l(f<+FsrG zjjwxR!sRpK&n5Oh7LDQAV0}sazNmo5chS^!8w0)9id9{xJrTBAKS_4Vjz_C|ZL7O32Hou`*?vg>V2b78 ziwxY&2Yp-Gm(6rZ{+sk>N}{myOB;=#|Mr}F7uoC$-Sdhi{|VEIgJw)ZvxOGeEnOb{ zTDrSF>a@>S)jRxBw_I$LU-_L{d;j33X{~oNF6ITbcHWDuV%WS^SC=JIPxBH_@5Dm+ zP1}F3W7t>w_i+8D^J~uhmatf}xisW?+eXC;@nPqxQ+XvHr6qZ=+)C5S`r)IfQD}ei zTl+?9x4y#_`yYHRoGjdR@bhZzrH8JcQ+mvQS8m;@Fg}X_(Z4cTveMITyDJ4=i+q2v zGmxwNoB8qC{BNTSjD1p0olZWO_R%T!+UEX0Ve|KGcJ#9FJj&=kW8bU4e8+uWwM25i z?UOttaOqVun{y>U_tec(YmW6Ux8MKj zP5qet%l3bB%yRs$uM2)<7{2I7*V^(FljLZ=DcWud>YFl|gWcF1el|BQ$@~?2n_YeB z+s#%-SFr9&SDMP{c!+n0+wDhF(pB_=GxzuZ{~RLw_>$nyD8bJkXNbQjSn%^fyk=wk zg2+|Z*O++m+!Dw-SyerSf5ZCU)+KjTBx>ZJ>+m+mHgkM0-7+Pf!9`=8;M}EqQW{rY z%dnYZFK$(~TH;WUd;S!S&nd;1*M+$4YMmao=0U}tzN~lOrp29NQm$IQL;U4kFQ+qR z6@RQ&q$k-%okRA0(Mvp|cnq#+WR;ow?d#Nw zSuwjIwzH8ZN{hF-sQu0xtuODxxmJjH=6}uSU+Lm;Va?3 zwhVf{b8j-}vJ~Ip-8w;GMviH;PcC!j!-NO!UrqJ&ugNcO(bW59nK^OwlR3M(B(8td z`0>~E$9DFUbDJJZ&k*YhyO?|CgP%lcl4bLGy`qka5bak@dWYlJ9Y1Nh^XbMDWeui$ zRu4FR?`j>N`%67|)}$|4S!t(~8e>maM_j7D`gYyN?Sl7QY$fA6(yjA6+P8AeS^h(6 zVP0Qe>YA0ITQ+X;daSv&=^HdB@&D?fXYhj_G_?11{yOQGie=HFbdJ`FC^@jZCW(%V3~L1kJ$<0$JE;v9z69g zVrjt(*ACM)6YUmVh!DK+V%~D)l?Ka?a-5&+|8`q*>=upS87>Ex&G_M5$A9K}lzA|- zutT=a>s}YhwJ&W>vND;+a@@H8VbM}cgOA@Y*#7-}Z2vAjw(?n5=1JX;ZQaU!_=I!x z)Dv|DY4snD-P&jO$f9h2-37_jMa2`OUE?2^l*u)e3QbBr~^+JX<;pZTs`%zkja@dT+Ij^`z=I15TWo@o^;+{@$Bzw-5-n$NRUR=Drdy{W({k*yT>phdry`_#}Tn!%^ibF;Itl3;S_2}lyT1Hy;161UCHcV-r zWF#FV^zFEO$0Ci_Z>B0et(oxcx#FWAOFWPAojIAD+{3z5Tvou^q3Zlp=ZG*K`%_;V z9p@?>5x?!9HlOS8uN^OL6$RhFVg2RObKYt8yKQuef4T*G^2tv27Y-4KSn}QD)`s6Y zhokse<%EP-m#;j+Z&Q*b{h|9RGqX;yHowF+Gr=mu%x_y~34T+2cIklanOQPT4?b@Y z-?Kd_$9Ss9zq`h{Y=1U>ox8|&-a>)w-zS9PE)}1-Qu6!iFWE)SX}VRP^L6e$TWP-L zafrZnQR62n*Gu2EDmrKwYiE8+ZgSr`)5c-qGluJrR+9(JHE$PhuY?B5;N<*q`kAQ+09M*TgoTXVCn4w8b0|!9hP==rhUO# zak30PtLigZe*JseyTIE_lKcEh^ZfpuPRhcY{_?HWs0-D(d}ur8&+i|K1QvYU)bh`v z%m0Fdf6>C^(C@pJw465BlH*;=l(nW~_k)U?dnPwG^KB9NX6CZOC3NPL6D9FK@;yHv zTG%7Jis|OE!iQo9W~Q>4Ptuom%c(Y#GJ6yCFizy+v)R4}!s{gRbqwl*5B~XUm0N#S zqDCP7+MkoN^ndPNI6-;Ekwt17GTfhw%KqP;CRP=F*>mOhBMl+e%nG7en_`2^nG_eT zT)lNo-G+M!x1(yS7H-`>yEjws!GG@?9+#f8m+5S`(k!mD^m)|~J8Q+imMs|<)QfVP zHFDGidJoO%x_oqdcZP7))N?OVPW-9Smk{}tr+7x2ZT$+Xd^^6|UE%VX`-Q}NB2yC- ze|Nk5PgYMn61Ubb_TIvUFFcDjCD=cdJ(n!?_TwIfmvOr4oJZ9*7p-Z3q^J1&%?$Q! zcf6!3)RmS$V7lP@srBc2n``mwuem2nh|PU+wWWan@7x*E&&=mrmpz%P7x{DH%Y%aE zuDk1XpVlqC_x#D)OEZPU^cIR|ExEt6KlEW&e(jsxuBJ_e#yKJ#&A(=S)=Aj*QBu3- z%$Auta@Xe?`JGd{eQwHv(Ce}5-(J})ySpCGn(p2D{(Hy&#ah+-c2xhmuwaW+vGn`uAGadBrG854oc?B< zHYqfjEAZpq*SGKQcXDapy?N_rm#u1=LC)JfuEbkaxS#s;J2YS5T7N~+0w=poQ<9c2 z-1%1tP>rsAO3yaxcDs#kJ3Y7ckj8IUbhKrzhBJFd@?~KW?}LB8+)#>1Rt=-y5rEA z`i6zCM`7W-ayyrsT*sDFMBkg$zvIH|(*mvL`%5i%?Bxt&vd&8XE)=}ufYb%PDKj?) zXBw|YVr|#OS(9Sl4VRWS)@;1E>(&~zjX_(h)(Hv;Y= zdmpjsPR%nr`*Fo%j+Ma;=R-^N+vayVUh87J$*jn|Xpw(hkcsIPI+!IbGN{ zm>jH`D?c%RTA3c-v7Z;5Kiz$sk}b7-j&856&Z#|r)=mHZjs3UC`CB42$rG9XReoqG z7rdVR=5xNJXZlSExtpu^#ayYs`Si~5O-+d(XRPpdJSyrNcjZYD>&(;pmA~D~Jh$b< zB#U_uC-48dMubPTNmq11DaZD?^4>8>SLs}K zN&H$Cd%}_KLvup^dM;7ZUD(mZ!cpmZlr6QfrA{Vy#axhI94(|1GOea=Ns*P6}N>c8S{ z{{COU6agmbqc5L7&75jBE$OMC;>vXU#~LaLah1nI?;EElJuJC7u|94miOxYXQS=?)LjbF^Q%<7zFR7ka&L4 z@#buNoYE}+>#F4S*cW+I7Ay7mWH#T5Ct zF5=2G+o7}R_aWJUZhO|X#=kh`IC0E+YsfOuynV`Quh(0mx?;LJio-%V{m+>{+9fLB zdb7Ny|9kZ{>E_@KCkh|Ed0x{MX==}OzWPK8+wvd(XU~e=^E}1s;Bw}9P3ztkruum0 z<@ky-m$>tAeeb^F@$pv7+j*~(SW9nm-V?dpYv;I@@g1MW*G2uht6!y5?wsW&$@lE9 zA-6M6<&(7qTC@DO9M>o+o*P%Q%piWQTHd81i5r&}|2g`~^xljpmpE}7OVwvCo91?= z{1qvz@oTU;`r5zA{cqlfN0TjOd&EV4@vfVcVlU$qBfcmrb>IBPQoY-r2QH^*x=7wk z^>DA4{8Qmd0!M?De8#zFo#FNTB8NSl_h0C^-+ANE->s8={1Z*-NeIl|vRMD1L#XGT zR)&iF4VNF^Je(okcv9;&U(>@?`^zIr4m{snF#G=07vX<>XClx`&92T)pmi0L|`FlfE%YLgW z=D1(#3|(u)x1OBYsVSc5u=82)N8z09&7oytr;h3582iV|C!Cny)hTW1aA#G~FAgW6 z>ZR|JH)hS4urWgVwPr|fYg*9f89V!~KZ>sJ5{qf{^V#>VX1?|b#gi&mjHfodTzpV{ zhwfeV-4R;Z_phZ(&a0h&OU&l&!9{APTGmQ4S#?O%eOF_cbu(JZ!M~S{MUku7=i9Fj z4Y#I0shqN*f0a6yLcy#Y=dTq^)6x$0IzL;cuuXM^wBjTMeXo7f&B9Ok>0B2n^7K9I z)81{hb&|*zhm+y6Y$t2vQ2N=@_JReJCmc5LKfDwrk`zR zzZHE;|N6JimKIHw(^f?jXTN>5d4bg0D;i%j?m8&lZ)98jru4<9|&v|w9T=(*{PRUNkIR)>lJ0)$W)coR+<+v|%w16%C|F;<%vSfq` z>+V@?H}^i%?>*~5IqTO6KZN91BC@_ryem>0xmVrf(I-|SCIv`R=HSm0>wuTLR;}>FA9j}KHGY24 zZF$!3u72s?&FgywSA^;Yc^L-h6ZYXf>`TP{Ebw{+$9i2aa&Fo@M6@hy* zA399fqSWy@)vJH<IYv*yvT~?S9x@CncoGYxiNA7 zo;8Jdo|?S!`;NQ2uTMN*l>Wr2B2i(%a@mK<_X_J?mo1j18Jk%-y4zoz^mCq3RFZO3hV#!k-2{mn8q?b| zl(wJRe#67u5T`Bc~0kj1V1*Fv?mLG%J|vg z`zv#MSJ~3Xs~ArC?7k=WB6xeD;E4)@XHf=ib@D2ADEm5DmG>Sg zT@%wYGv|xiI?t^WHZ6?MY25$hv*61QH~kj7`URV2&$8OlIyvI`|JDK(pTilEDG%Kn zw((tHP><`HC!z2!jp3ZW!CHfqbZ7OAZEfdxmYSbmWSQe-;U)H$VdbPdJ6*hAKK@f_ zqdwhH^4O#kza^~PoZTeepIL4o)VA~D@yVxkbuXTA)GD;r`F@^FZr?ZK3h`+RU&Z#Z zojT&wb<^#pdq-tQoA5D}E9`C#_n8#BUdklYud`6OAn-8U$6)hp+|9EXt=J}UlXE(gbnanKNCsp&+Bqn9;%oE0v?Ol~Q69jJ^dCRqb zg8G8%5f0xrY@aMKQ<*O^zUb9@g{eWiWdrZKa!$SIJwb8Jp>HRXZ%34#DZDN+_4bD& z6)U~ERiE<7t#y5Rz+UibrJ|eV`OXxzBWiuy@5J(+&U)a;tg~g!9HR@bj<bSO{M*YJ)rs4;w{>@Wk zI-gArGYZM=aV+cTSR514nDkM&euGERb4^1xOMbN(2e%j6e4VPnE%!Yu@lDhAW4ar5 zxy+ZS2@acAwbtmp$U9G$a;DFlrJ1*1w*17YcY7P_#kF5wzA0PM{C0;-NvvY@DX%Zt zA7u}|clxyItSf&(@mhHnxqrpUOG=vG< zF#pBo8SmfLZ@y41Zg&0ooJ%E(lMXM5+UOqpC2+6S!k|)}HScfrDaA}nkpGZ2dy083 z^D?pM#S&s)Cq3`1e6oINq3!oj4e94AW^6I+W;%3jZYXEVDIYHVeW5iyYUdWM=vyi9N4f}g4uKg*S)bYT2-IR;3%T?r< zSy$CHKH=D$v2x4Kg+32E79{d9%D?#Z;*jqP?x$RlpQqNCo~%8`ihh`O+^6ca>85F20e2tR37AeeH0$l6)ycQR)Z{O7o_=`ny}16*D~b|94;D`A z4|jO^K*cI=cE*j#+YDcNJkzlM@uX^AKn=@h(>Lq#9eY1NS3lO@KHZ|>%%R&CX3aUc ztnKakpT5C;V$6Qb-RcbMYa01WQv?soPm@3Lp?f#SQ=1h+))pP-UO0EZX%)%sPnu&l zHD=}gK&~wnEivJrJiN`*KV*4JxW7E*-g039qi_0T^YjR=pWOe2J-@wutA6O_yOz+2 zLcRN6Ddw+^(N7k2`Vu~G`d`hPua2(dnOf{3yt^Z5o~7*1%l$4(cQKT0bJbsccUemq%#Fu>zYf~4lS$ekL_PXPQsER)aBtIt~xnF2BZH@1nOS5ii zRbNuOc-=Y7t!Dle@u1e|xILUsjZMyCsxy4#lp^@P$ZmV?uXTv^mCB@_YO~AJf4XIC zockyvMeEG|SEe$vua-$YPnNfT_ELU%BUCT$lm zY)iXoTkI0D$&UN-4u(kuodGi~)EAW$)h%1qP}VAxP4u-tk__vo_>3STRnWjEe2{N>Lk6yPe;u>aRp z_w{+#7f*?~b-P+A{`GcNGsjR-w&RT})^<(&bkJgh*wr$&nA`6K1F|?P>eNC?_&+^; z@oH<=`Hzjsjwha!Ycv(`D~HW;=xuoTmRt9M=T4(ECB2fw?QK)u9SW8R;=je=_3qr| zqUhVdHs-}jzTj?ou<3$eQHGbQRqQE)PD7Dh{oDs;yio{?*|+5Bs#!-B)|ec=))g-O zWxmmsf6F)zudSQ0=0je9@yC1o-$PdLFom_UebC-;<$j6D!n-p}JC}ddE?cm-eeanY zj$gSOF`Spoc+}WZj$>&@4uaC_R`4;xoz{NI} zGi%w}XXfQQa<*{RWtpx1(G#_oc@w|D5&L~_w+kMBam^*6i}j1;9rcN`+7I2Fy!ZH& zW!E%V1iW4`*{$Cs|Fq(0#1}`mU5n=J^Gx#7lUhBObMKP**AFgG5Vn@$3;uS;Fhcy5 z!77O)Ki!`%j@&n&JN58!PL9L!&Kavy4qu(Dw#;@)E$iOoJ&~)M<>Vub=X!CeGgr>P zsGYt4ad+Pb{koRUjSXg521#n`q!i9 zYMfC0OD3y@IqZg9#&+hjtjri)Zp{3Ts48h8X|rC~kae62r)0^|5eE zL_yO_*~H1*ix+13O=dl6sk|wkQ~X)}noV(yKFu5Nsrg6rE?zoKPfdhbe3e%sd-CQ@ zwF?57x&`&mX+)^+kfD%L4nG>XKz==1iq}zwvf21 zxXvKh*--I+XhDrt&!#Q6xps+ab51UKuH#uHcKrFiwWax&H^(SdR$qDNvtC7HV&}=G z2(D={!E9<7T21`iGlVWB==Cnq`|UB~-o~?qpAq)&&Ine3>g|Raz}5`e^%fwh*ta#Y$qvS69uu)AH=X`djJQY`NX7>1o>1M^8*= zxwGu#{;u`QXX<;reZuhmmFwI13SB!4lDmH4csq}!w7CDX>T+F@wtV!{ zw);T>U3{vAe)p4mrj#*tmHzm%VJX}0?YhmEwnlzf;cX?bZIjZ$7ja_W-o07WVpsiS z>iQX8OMm|6d9n4(%6CT(RoxT{|2@ae+>|l6?M#tV(pJSzv!4BXpFfR(QV1(sQ<4@6{RHe;)E|u-~>Z-RGyw zpCy57Ue)ert*>L*u=&~)jZJ#d7a~r$2>(;HHD7dh`c_v*jm*y-qY#xu#JW^IW~y0pK1@T1a2kMA4pa`yD+2(Xz`q4n^p^xi+_!9|x6 zE1h42`b7k{DqMPRwbp%EP2iVA$uCb1q!gq$O*cKl*efgUcvnjGkxcK;*^17}4Kh<2 z5<24EJ1vR0{Ml3Oz*(O4-`}Wlv)M~mcfX5unDjEK;_JK6+~ddXq7wtZdX^oMp8d(< z%5x5`>c4WCe_uUGQqOuSdM__WRX^vwP@~WdEs4M|(M1!s)*NQ;;{G1rC=vEt>rHH) zq@T^qYJ1O<4}5Pd-PT(qxMa6P&cVCqqMz+L6j2hqCi}NleLps2`7qs0Fg#!C z?3)>oRXHn~dDi1QTtzztExJA`PO^|K|CLd!7C$Q@dEK3ei}C^A>%LB(tN(`kv@P4W zUz6na{n_wS-;!~rVepfk&9B@2_9^ihe=6;KFhhOK&fUJ6W$Paua`1817j9YL{o;uV zhwDqblUI&%|IVB&_F<`Js&nMrtQN87@`_)!E!t~n>oQxf^F3$XufF|qn%9b~>?mBKcSMjfDPtLX;sp$(mmMEl5NQ;_k&0xK;`s1zEz{&d2N(Q=O=ADzOcjRq} z|6M6p!?UQi`rRslfV5**{Bnid^->wu*Y1CCv)Y{3IIU0h)jt-c8ME7~ZoWKoi2u~= z@7aYq&aDTw{(Hi>|K0b^vA=_h&*p``<4-x~oc?I83sZTr_03hx2d}H%<*ZZk-Y56) zQKH4hbJuETo@-m{R3ma^^TA!Sv~zkr)$EMIIKpU%L!;Y?j@iwd(JuM{hm+ z>sTeU#e&$Tntd!a7ktLU{Xc8M{wbX*-oYtCdZ)dNzr@LYnBCW>`QPzI`vLYZv0KEm zB_6uE2|ZnCcQ7p6wW4xkiSk@yEzZj)^3F6fcx(LPKW!$v$SUG_;E8tm?86x|!yU|7 zr9?E`e#f3}t=>^(F6hH6FPU-vN>=hg5B1kBJYNo;{QYyLUqx!uDGBBoh8IIEA175r zi~YrstbM5WX@+j;=Iz=06;ng> zmtSAScwvX?rRu}FT<=PfOkXE0R!si?hO?1#MgOIQ>wBJZa^LAxoRx6xj`I`!!Y zo>)$E*?HfN|C0F4$Vodox9{7~U4Cid-zjfyHO%Z)U-tFX8tu>Z%}0FSgj||*yL0`& zpVzOPo8R1FTk1AXErI2|$h5EZpSfnuwyZz(Grd4CSpBTo1Ca$ACT`8Vv$NYShyTje zJA2&3?~1Q`^W@ni!BblbE7OY8bnaZ$nis};YSzgz)*n}uLLPm1e|wJo-tBvKEoGWv zV>2`2(y7j!*E_>LTb-Epg!#*##Iz2US?^UPMa?J7{JG}r2?qng2I;Au5e|+j8Ve@4 zc^_bj+$t7+t+6SpZdS$--=&;K!=obO+kM?_V&ht~47KfMYw*?iSZe&gl)p5y)$_fK z;lXUq{yK*3N8TFW_rFlLPB7^F-Z_6J92A&P^L_UGWetkk)a*07erU@qxEXexC+EUX zkC!*ruWt{V-MP2o^2TG#trpFlr=8BLJbu&@Ww)i|uW`iD({DOB1Fm=H{+IFj+gU=)o?TzF z*m*AdbTNk?#{aw$t?XST*x#*`FYB;r&OzKZvHN#;ov3H%zbG#8TuH$BqKoxQ>7^L~Cl{HBJvDI6Uy!$^BYg75DXlJt z7JN^z*ywI~Ay|Bs+sShN=8i6nlhf8#*ljyl;;}!{B>$Ios6@fOc9REo{7Wp(aq3T& zt%|f}?Jl>jxvc6##)DYIjKzv zsYWZ>=hO)7S^DOG#M38p_>}jZ4Lln6X+rYvr^^)Nf3?)NURw6I=*;i6pEtS1vasIX z`1n(0;p*G%QvY2-S>H!-6&?8=WnODE{mhNO>Q+g3tlGw)yIYZ)=4Bo|jUTID1PhZk5i7Hg`Jrc#o5Waf@i~Jp<6CqcA z^gn!7vWr`C+3u}Dog3%29P*ocig~}?z4pczXCB{uq@!;4GiTzY(C>$D^)KF*D7>iU z)ZUN+^@bmH)?e4Za+SB#a{Mb-_<_-nE8xpqu5PZi_p6h8cLZg9FT**ImM-szOB z#~YiMEU;u@4(k$VjehXaMiFYs@wVJ+6XD%Vcu-dc>3l0UH>CXHfqg%&1Tdb ztk1*35;s+;rfz!p(zO}NEeDbwN-qDmBZ}eKj_wIIn>5_~G8g?|5Ku9Yv3~tqzmlRy`Ocod`kLFzaRfT=QTX5QeNBn$1!mKwQ|kOE`f;h zObO!)lh*duiI`VUpSL2*EdTEA?ppWUYRj4}uLXC$4s@EO!(7uTsJgv%eSDzT{ft`| z-rB}Vo35Pxz9l-z_tKV_of|)x#F!VaGt5-=n_X=t6;^7pp;<}c6)V@_>7J2Cf7qPp z$uI8V+dNhM{pX4q^PY+ZnyyMHu?uI}_xZs|(+#TOk>9_U-?B*PS~x{?Q|0pIA?XYL z)JAe?WPQ##SZ@}&-SgU-3C~Yn_cC~qUu60FaLoU%HJOjKd>D5;|FqfD zJ#Ih2;um8iu>Zk{E#6bMIK&;^?)!Lk+|;#!uk0ra`yH@or zAX>BQ{=Yjn+njiMB34Ko^kF(4^e{^MpVY@Hj<28a zU;5%Fv)UM)z7g7;7wopYdC^X@(qjeR-yCSO&}6&otV_; zfB1kQFqoZHZsmP53%M`~2wR`1e=q&b|yGn86;oOswX3Ot3OpU*A#i7-a zcS~Fj*KtliA^Syfd<_zFnLevkl__66_9I(tR!VQ}UqS8WW$Si${t=nJk>5lxByN-E zooP|lKe?;f7m9N{e#QTLmdL)#QZZ9yRQq0*cdHwUh%rfhnn9P0gjhp=ldq}9D>&u0%HC?f-HCfsBkH^h% zj1{hKFq?njcUjeav-=I^d$J~I&SqpQG%EYf$1&IC%%nP*X$#vwsx_Kyvfk0YI!(cH z!Uo~R62g9ENiUZ4^)Bd3KH12dX~B%hw?WwPUX$5z4vjUb;>l$Y4#TXdc9l< zz0dvIe_#A*;vt*-sdBF~rX3Pnad~0lyzEf6MpH%>Lb1V!DHg+gfOcL;AgG z6Wb2lmprxeW|Z%bg&U2%R2PMP`2XOS`G&hDi-K(So=LkB+VFkfBc*>+EDuTrxjnwW zr0LwXmFM1F2y*H>EwVp^Guo{!(aPXaa>W5>=F$@{UI+K)ds!+5-Y?2;YhBFTBO&xy z{q61_S)b=;tU12?9_Lc7=WQ?FthgBC{l8LJCFzC)*Hv3)wy@jM1?N^3ZguvHswjRZ zo!EN)aLbIKlAC|L#I^~XdV3=z`iJT1?-RD%VaxE8EIH}^Uv-XKeB4Ri)%N#JZJDv| zSHb?qbFkaw2<8!tlnzvOAF~;;ADA*(=9nujdLx3>l7b0kI;U(RjzYq z?3%s$!z{_^^}+Tl?%fQu<%vA_x<~$+%B`%bvWxqEN?7f#aO8D+&)RWwgP_{F=N5bF5BL8%eysh;w@eG+p0gsb}cZ_7HR%A@vgM@ zox}IMem0j|vu~+txp;5Kqp%+x_l5aA??0cCb4jMG>_fLp?aXcFjGfw*|KdLJ9GmxL z_VGl`1)32BISa18Xt(BHr`pLOj=}BTThd%vln)mRBB}070sx_Z|cF1%4r>=|-SKX^4 z`E==?ZA*1Ux(j{^+?t{h>6yF8XmvS%G4JBc9QVH#tRE|_KTqHMsUxJQKzRStwBxMe zejnQA`flB`b;g0<#aUmRFY+?4f1}vwng4G}jyuP!3WQ@fqa201i7!Ae!SB2Ut{U~z1@aY-3#@muY9-e)VF;c z2l)=1%f84kqk2=S>U(LQhn#o3IJbJ0WXG`W{24bj_t>@WMwex3sz(18SLhVXyuN0J zSNk;0^V80DDt?Mysr8>pEh@q`xrue^`K1}B?fyMIBfuErm>K0`7pSJPpzN8_X^$y^ zO4HZfRopi9NT%!Nw>{cnQCXdf6|24r9;=FCw`Osj%yK*Pg8R9*k8fX%S?8R1SKIEX z#gC8taS}_#CvOchySAR|T-d_c#yvWrYzZbiCp}(feTy-4=__NWFSGiL66zK&oXy4> z@jF{$qukR=CM$DX1()W9l#5NxElQfu5~|K>Dk69!#^sNk!R7W7>l^24%3oiW(>Q0E z*j_#NWiOwF1~A{rl`>r$!tUgI+)Ci_+TRQP>mG2OoB6{{g(=~l_MKgI?X8}2Yxl_h z@ZtE^shGRxe@&RX%FKyg{lbo^+e;evtx9j!aQJ4ZUS^cVr*)w_z)8kC=O+a51{Sl4%kG3ooa2i2-p#&L6Z zht1G9rqJQ9IrURbuY>$=*}GMrmHUt8Jo{T@q?e~(`{Q_~*8ExeKUtid1KWFN>Th1$ z##4Mfj7{UrevV=h-|YN5Y$bt}u~AP0#u*_|Hwlk5-`9s+0 zm7k-p9hzxARmLnMB4cg?`%d3)Pfm09FW5SDmsp|Q6Y;rywZ}5O^IY+Ms5DlwRQ9hx}QlTC11sF$$Z7beCx$$-)ehQbWqvZ$L{XQ z9egSg1uuf0m42F%S<2lb=(6XM=|%UrARg11eLtDj!BE$D3Z zv>z|79V`;vy7pYR{9a}mzvJ?)1>RM^H7`vy2w+I?!* z^cO8Q+a!4W;<-TU7*H(P4* zHhhBa<^L_Lzg{lddru*-eX63glT6F`Gi&Uwg-tzFswf)cGQF{U)yI?DpOil|ceBm+^MnR>`2u?83fzUAtAYC;7YxI1{uZb54Acp1NI|PB@=_)oFt=d#f%*TDLjV ztYtT?E4#Al_m!i2mP)C67Jp%1(dYemvczM}rG6619%4z{tN7Dz?-3T(?-oDy*|(!R zbysYJS=PL5xs%*eU&$L@DCv$`p~xV<(8+je_k`Ud8yPB1GWD*f9ZUWt|Gv$VyV$lN zXyyKEn_jA%5WT)2_SM0rrOR(xJL)ZxTeEo6uDpmea@d1?wZ@v4y<|ltUM~b(MkO8yD+gCbMKg6sSI&Y_U(*B}(56om!w^|0cU7UE4+xzJc1sN&% z8#niepMUsFsLP>`|8xEOFOGs!99$~@B|Seqe?GHD)?1I|J3C%SJ~xg!ux!PHiIbdG z21=V=uN6ExuW$2>cXyQDuILuA>}5{&cKhY5#+fb_b9IKRPuZ&(nVbSO=cnbXzy0jJ z(sZ4%6Z4ySH{_4RU1I*4^Eu*SGOxyp9Xp)wmbUYKmQoOxsk{GzKg8{p@A3m0oJ*e_ zTmJI`i>buvcy8Z@jyOJ><{&+3?uk5mzFaA~Z4{u>?X~s$gHqo9lYQbp)}QM(yZ8Q{ z%98bJGkC5nd$<34*$uvo>^+_)r50Y(ez=@CG0}5w8&l4oTZgq8IHXY*H*pdZ2NzGJ{!ho$ zZOhHNzMN1#Hzn%$0rqp^AM&lrUg+WCy#>QIZKsi(9_>!(-+k%=2 z(T_z{9tVHts<={~>+0W~dFIE;9dUoJt9>l@`Z&-1eSXjyrCcqRmppQhww`(-dedr= zVu&CZ&|UJz|%QR3F#exko0?5N})>>AB-(@rzUwxf3g& zNrpN3bMBP(y}S0r5vN1pImwQ-lf5*3Drct&7S`No7SHYec;2Pp!pUE3>P2Tx+C1cF zn~;jSN2mJ_0_Se;EA4;#_?+D&XvV4 zFIQT;O68LDgV+$EgvGIU4!&=#3;4miZP_6=*Ufzf-423B-ZbYPx%Ol4?bjcxob7!# zo38ozX~D@0x+YwawKx9#<+TsEbKt>;r|b4LD115U`sM83e16Ss%GDZOVW$e^zp$R| za{FaITlOONC*zC+_Q-2a>^8TR-7V&ZEf3^ynX1^JzOHK0R-Y$TS8}eVyB=Mp@KJGV z=Cz6S)%80i`}wb0RPCSJCev#6V$V&x<8>dG80~5Lyg~BZJkFqLk;i>lSiJdcRD0Q$ znntodnmu!SX1=`N#c6rw<@1*NM6C;Cm?m=BWR@*+vGEs!zV(M*CEPf4{O%st#h+P! z8x(!&Sk9VLwfBZd=o^VuA8+1ake#~m@`9)CpTifk&(7H0>#Yzyg}tF!ndg}I@o zjb4B3IrK|E{jljZuh$PKJ7s9+|&MhOnzON`p{A8>Eg4G zn3Sf;Ow%(tvgdo#sgI{Ni5r>zh^)GJ>g90{|LOmD0?#i{TXwXxByiK4Ma~AZ-aMJI zLi*;>pVD6UZ%jX3k-^~EUidk@aV9_S(yJVE^|t1+CajX#n;92mCr}^R6U6sPC+>@B zhs2r}!XBM=Vt=MCJ}4>tku&P9jLnIEo9=%)_9gici^Ip+;o6TQSDs%IlYRDJ*{w}(S+Co(vN)s~(z+n}k#uwrW2dt1r!jK|qru?79^@A+&ZjBT24oz+>u z`pVdU#Z4LO567Gi)ktY(d9BF3l+Tqb#A9>p`@j6vFFrE9-S5pD@Ha>InbWMT|G8H9 z&sZa7(66&TYa@T4XOncRQeRs|6X zZpsh%mhxcbw$f;W?Ty>LYZonS1*r$8`p87g<`?a|IPd*zS?b5B9loPD8 zpng_v*2UFk{>zu=_NF@JxZYuWT$jG-`J2P5rUrU{*=ApRH|Dt36qRo?S$FsIT)8)Y z+a_ka+uHWo&i)22wF`nzXT92R`(x{cS7KhZz3FV8N(L4TH<{~GpUifS^*tPwTkrD! zqie^3+d_=r!zCuq2`y>1zR4-@^6?**b%jPzGcHee;>ls!u8?>7nv~IJktxq?W_{8= z#IZTm&mkryB<{8UaB!VQ`FXfwPl->RpsIl5r)i+?{U*nW=P39vnOtTBRYxj5j#l2_Jp1>EJVpWAJT=$=S=fQj| z!<#K8V0KNQ?1!($Ied-n_n)4qici>cYe)Qq%4=tZWhQ;Dc6>TJW&Uptd#eX;HttK= z^y6Po3)3|onL@k25n;x!ywcNe9r)q7R7?MI%dMwHZtnU=8czOK`~Buhi+O=-=kAHs zDv`45u2jC98gM3W(=@#&%LTjA=bk&V@0NzcYRZ@IDlm!F-xZ*13kJ=Y=ebwx#{ zg7R_Q(=9gz@1JUJdw4}+;?8$Q#b=BY&K1q6y64Z(V3|3?ymqyw)WWG@EB-s@7^O*X z`(3WF)GJal)aU8t+MWw<7no0OYd$tTXIu5`trF25hSlCuIqjl}6Fy%1v|9O@Te;nQ zA0EfMs?|4>&POLQ#_Te^rfq(yNA<#q7ym=8)eo$A#P7Fy#m<|7Q}#HN^q%wZZhghp z#Jbl<*YG}L^0MhC&g%+(`zu|fb>qU6?f~T@TC=9+O|30*e-Ysqb(C$gQpt$|?uD$Q3zfSg&k>oB>d0SlA zlmAR*`!%1VdnTSdqBTKjhUPa@)wL5vg#H=IPoK9*=?iCGV9)ih{V~r3|G39(>YwQw zb!6d6Yp1VE;*Z>SEZgk6SZ`i~^Je?ihNqp@Co83N?=AViK1tytzt3wU=acJNS>tY0 z>V=usOuS_H+mUD0tEVsLMYkVJFhBij^}!U!YdwLlEdHNS_2bq1!swBsDEdTb`~PLv z16SlUc^R%>`#`?ne@8{&v5jed#cXTBMN6{_M4$T4pR#PB*;U0oPP^CLDf@iw{7YAt z)6ODGK1u%EeP$X%!B6*dd!}t}h*EC)Rv4hVtNWC{M4c~SJuvaTzf)xU-8sQ3||hsTv+M1@Me$vJH?cm*M6Ur zrpgV@743S32e_<7`S}dx?>hRzDv(JEj<0?;(2L>)lL7)+)vFpUTjgn`Bq`Vb+I4$ z(*Is(T;6cN!!TY;gpYe`qfp$Z1V4$yMYeNR8FPOvV(@O4D1YQOIjH9QsoKV`dpM;0 zt)ls~=B%^mT2ZL{fG@cE)PJt;e9vx{2zInf21Mp;b*Z}f^NBKhQMY{hl6vJiarY%k zQhk_P(^;nq{o{O}YSXe|#fmw{4lN73%O>*aP?6Q!{=kNh=TaS}t9VZ_d}+LB`{~-8 zMXf1WKW+Ld&ec3iUHr&o&f7OXK^E^Ah1 zkm;w#C+K`oDn^*eIG<^WdG6fx<^7h=4{x_umfxh*`>879>x-Y#D=qarW-k4j-W4I;W%y7} zLT;T|_Ni*OgZE$W=ytg^!`@pfPNU%OZ@)&(VDZD#Extdz(BS*Ytl8$Etj2fa`{70& zPFGBwC!L$7d`bV@nZvJi_PMTEfAC~kSyfnyR_{K3usCJ^22( z|D3L9HBpFD*yF~&r5YgtAAMK&q%KiPS;6@3uBX$M&oTwU`H!YwXh?`&S{WRkd4Iu~ zFHU(X4$nM8Ix8ZpjTXseE|uiJ5ulg8nMM0!6-%~-@1%3gNyq2BQhyS+)x$qAAU1zq z*Xv8KgsoVNs{{YfeS9UC^LVfKf@mJE8K`ZGcRrruzgw2D!7T5dQ4i)N{Eyvp+GY*Sr)z_W}Q5(`!I zSs(l}IkjoNt3;=+yS4h;qZjV+U9%BO;p3h1;^eN+o)@3a$||v1Ym~PBs$*rK35WCa zkDL1>SH5a{wO8+#m3=VVtHp^Ynq}(4%gQppS6hmBzkWLRli1XGQ!|!C+??^e#r?dx zUSqYr^4{CK4Q-k_h3>N6Tw}n`SMgCsZJUYm9*)Ly)i3)*%a{IN-6j|^OYQ01Vh^u1 zYjl@qn=SL6_rsxd(Tc_Acit6_?*CRQ9e4PCL4L$MhBZ3oDyHXG+zStS64X0=_0qY5 z2ezr*NqX|>d-3)EmR@c4%3ou;OI|!Sb?D0W_GNxQT`e-B$rkzt7rCn?K!fVCxY((oO|&98-t$dTejK$tY=hYth-@&Pi=nq8&2`C z?}d>QbTzaeJm2?4tJ_LvZp)f&#=9e9JrC_}xTo{A&f?+0jE(1nYV1FhS~YeS*_DeK ziM$C(_q-LTF!TC;kzE=Uo7c{*5h(AvXC%NH{gzMpWrChUdc>R+>Bf$_fx8_4+f;t} zver;`1GntNi8tO%`ljwsCSiU(J*ah>cUw#HkMHZ}?7Uj!ohDE+uToT^?i6!u$>Q`$ z3Qv1Dj`;A_oT=iK*%PwBGHB-v*NuzrY;SF{5O}b;&*Lpy#O##RLs4sQ8ts&_F}``Y zd^e*({INF|+U5PLy`ZtM%OOIC1;3`olU!ESn z?%`GGG=b~PAJ0uLcrtgJTk#2g887t@-rXr?TziET_r*Ku{#pC*+0JBU?t`f_o=$#z zMYr~eVcfkv7q%_<_;QWS+I)ZACx_x!?yH#bMf_~5X75Qhfy^yxkN5sloxab!?NNTm zl%);D7j8`#*3UYF+L zl@eX&KBGop+3T&J^%hipf0MHI_sYjXjgJ0_U;E6?nI80;=+tg!-P*vOk#@aLa$Rl0 zW43fVf3ZBn)wksK-nWn}HxD?xeS5X|eSJUa4fpO9l`&c6?=X?!&%F5lzp~WcsVlYL z{c0ENa{HOKxJ++OsbcQU*+ssqF!&Jw{4*sQTye{%&Nj~zMDLEDNWh-=2+s*>lHOj790Hx*7WyY^OO7_*1p*O zT~TxOgVtj|T-GV-C}np08ZUFr`;%d_R!eE~-uAptwq3jOW=AzyyxZH=rL85v@+>*` z|Gj6$8yc$>R8Rd>$qSzs)%o0YQ`secvF?QDs}nTe*_LNEJ)0Eex4|kU%h_mll_uX2 zPU(HjS0q?j*>*_6({=3LKJznDNe4B{QGL-;^fMdtqyy{Y}8iQR&G9P z<LYQkqtWHY+BzxBM}LrKnGht!;RpRbRZWPB|TvAbvfVMyxR>rbaMMU9 z;L?jNCAR((-bn2)G?*0oSg!0vWy-RPmnU7hZ|mN3jrI3=aT$)RD!01T7q^M&Xa2r= zZAyr{YxL3L+kQW%_%Jw0yA&+hH|Y%b%ox9Y{clp%%ilP-VqI1$!>TQbXY>>!z8+iZ zU&wCym*2O^qpH5E!CmJ}yrG_Ck|L$+y#{AGV@<*1GD=0JVN{Dse)-iMCDf8X`s~K-F ze42mv%bVy0i%O~_&i!~Z?cdBjD^Ce{w{c7C)w=ok$If$sGeWxyXRbGQn%A7uwC%K; zWqtf^&fWXG_I}zv`yIzGCWb`0L%VO^kVrgl|Ky~YddHKxVB>(PqM7W9-|l7Ii1k}y zD_de>Z)#Mcu=PM$?$ntZ)&FpRuG!F-8lkb|EBCJV+N`VE)BW!<%`*G0Gj;i%!iy98 zXI{I}R8^@YwD7OLOv(|1O#hnsWouKAyfy0fun?)Ez? zr>tiFzJ)1e?Ui@3${wa2a#uDT&&{^kyQi}Kz38 z89Fh~cIore6Qez17Q4>gc3^5A*BqG{A7mr~RpxGdn3b|~0Z)De8f!A}KuSfA~Fovnv?Pf8)T{-QpWYOn4 zk~W``{yu(hEkE!4)Ky!LKhN1-*vfLac4pV68^!k`a;)ZdEG^^NwA1L@?74UK87wXY zI9vYR7bZFP;CYSODS}gUIWB(Btd8DMsD4`P&rUX9ThpTY_uGQzCfLZ`TmRns&y5B9 zVj3rT`>A;EF<(>aJLS#FpcT*e#s3qyWWe0bqtd@&`E{0$%ez`umm2OWt_?aFtF0UF z5&LUjoO0BY&uZ40jUSdhQ(wN~t@NcoIzemw_zJJLH8eX-cidE2*|hpf?t{3-C)oQ#5^Sm2x5` zZ*9&qJD5E4YGWU(g|;}S=)|zaRZD)IdvYx5pT6sv@RGwk^B*MaG`V+9|B}eB2Bq7c zYaVk{y$mV1Wb`6n?jbeHqs?+(E`Q~0z2+b5k(+yZ$4x%rlMba{H%=F5dT!ao$k_cN zW#y74l?zv6t6xpr{dwYH*Xf}Et|C2 zNO3mzk)zD>R^0V`xMkyENzvA){}&cMoo<`?w)?@|H|Kx6@LMRrxzn`#r}uWF_#e$j z*_s+x@0bxJw=Y(t?N|GI-San}{a@t5v}(6R#kvQJH@)02w{6ihgMYIue|`;}d;Zk@ zO@<4X9!j$PeIVGlM(A^%V@=mXo5C7TwRgLW(`Q|N^y)>RS=hUWrVDvZy949OS`{Bl z&G7LRs#4pUN8Hb|Z%)L>R8P63`(mm>9KXSJ zp%-hXKl)mJBg){p`zy3PqXCAR*Ipen>@olb^iGV=h>aJt8hn}zcw9?^_lau^UV*he(KhII~B2UxMx1=yBX35pVYji$-yzyv-VM*z?+cOlnwuHA; zUinj5Cdpm!Nyp@AN}0@y^&x#LKE6AceR&;|lA7oL!{^;ygXbO24?AEJ=ixN(_GIT* zQ-9Q-`F=Rz=X~cA&t2vmez)=L3&&;YpZ>5baW0)Qf9v7=;l39|+EuK)93`s-`lf8?%n7OW~Z_VMxSyWx8M?zvUxW*(a@ zyntEbCQsXvN0}dDPWi9Uas5@5cyzbdzcv2<4*ok}oMyT5p}Rv?Z*6##gNxAB6CJAl zR_(m{7ae9qPo4TS>7{m?w)ZK6KT|x4FV}MDdrtqhU&8a>mZtqmPdcL1t3Fp%PPwQM zGUbcf)7dp;KF-t9yBBeP7dx@7r@hV+W+|G+VyQ> z{O1bOzpUqf`fT6PSmw?y#{0Ugj1r65rKSl!R_V(Y@ay*5pJXZa%_l_D@aU(HT<0f5 z%n81Gl#N5cs^*E*t|jTm6I^17`10*)YinOMSzI=fe%YRJKmO^|CGoY=C;uwutly|2 zpI)M>!=Y3$Wxf0jgIBqGZOb@zPO^S;eaiIz`qF``pY}dD=JP(3ar*6fdM6XNJl(-* zBy>ZsNIK=+rnBC6d;Aw}%{Z)V-nVDrS1YS!(=RZdU7u|CSF726-jkl$ou@eG_-}d8 zd0)^&Ha~Dri@@P^OFyVI**>oM)V#1ORrbTi*rd7F%NnJZB-dF?QJ%j0eE+Q7FXsQY zlx6(+_{O%}J`HEK*H(7jLLA4}U%x$B?YZpgSF+Bl zcxGYR>X4Ad$2?Am?~r(KFa3XK7zHO(m!|KW6qRx%0>@^np zbj-MLxjj;DeoP_evw;MA3KI*cZkP3d|pdI;lg8|F#s=%|8?jFc7C_iz- z^m}sjiV0KQvKjnCR`X?TG?Vv!5ii~L#nQ^Pe@=s(WNlyd;!^n~GKY>x323M@PMi_E z;=qDcCoR_osPL%HKb#)oQ>C(K-OQ2+-)4C8dAD0vJcwxDzkOlKl7!VaCMD)N3Y6xl z9cgpep~&vbvUKI#9SbidP4vDQRFk;0v_@2aO^?Xr+uqs<*)v_vskuiUJNhc{;LUeZ z(>~mhc1Vof(W!9v&b3E8Iw7k3U3+!E+=#VHHaKD)B69B@pKGtjG%bHluLiA)UPAvJ z^WP>k^oyh`&rvhbFkI@GoHoU~<-|IDZYe2Y#%uZ2vY$V)zjVlb8^7AF;lw-lg-X-T zY@fZ7Me$#Z>HY-|IPzwkPY7vU8#u%I)PMPaITP~STjyQ>XB(sz`sDXI!KlMo3=y2$RcOpe<2!`#eck(o?e?Dxn-{V@~4w<^u{dxznEO`){x1 z?mT+SsIvW=hx3akmsTD$S-kS=c3pMaf_1ii1x$^B9nUfAK78Tg@t?Axk z&wXoV?3Hr1xzVtqzbae7_E2Q>{I;b#jY*6{mzbk*}SDIJlIX| z&fD?B^0S1+vEt@sZ1Vj-qAv>^%Gh3LS-mfE(dQN$;X}Cssl{;@ow@9GJ%!XE$s$NC3xQ3bzBmWN!fDHZNf>_4}_@61oubrI{2 zi9TL_p?j9G^SUXiSKLgKj(^Z?4c+#pWn;GK_03E?H9xGL@6edwR@t_#Ve#ItreDIj znhg8rU6d0l5ArD8ne92vTe#+kZ4`^hHtvw=Gd3CPR~VP9l)PcW-7w>2#W&t8_0L<( zr*!(u-|BvT?MQvQ{{6Mes;1l-$&L$E_lxx>Oy0_&Sia9neV4=0<;&im!|K)I@ z`1MR)jq(b&m0h(mjIN@Wwk|ko@nO>@iRW5B3{5qRB5nxR_^AnOvXl769jN!X_}1JD zb{~>wzY~o1;#4~M&Foc##eURPU#|8b{W@`oZ^H zV8xO7`u#FOCzBT0T@MRXoRM<8$K*-=f(QS;Ch4wb;I6wOyY0us(8N>Kc3WO`Y>k-c zap27Cv~C6d^l8QO-#t;#rsZvkF#XDY0~BKx3euW zn7v=bVgILw6D*SpehSHak37GH(QcDiBb(UI*mql%-}1BSc>Y|be(3j)hP3`u(Xs(- z&t^W?GPZc%Q+V=(XNB;wuy5}d@3Q_clRtZ#W+UI+nllwW-p8KYm#b*%7mQRkSa0wk z{AjAHIqM67wB+pEvn*ke0@XFzi$1!(X6}0^dg|i$MSfLEZ?-J$5je4?avgiz@|9X! zqYMmHHbwMFMDVQS->cYJ$&mW@^1rv|zyB+b5&NDU5*BqdeAY|$33@WzdpP?`0&?=g z^^W#Vd%5%SkIROO0{yHuJwCgG@wBa$sekaTb!Y#bJMv+t!Tz!*S1lH2g}vflDO_it z`^8}6p$Q>U=MFL7VLHG2%eoh)OO|)swDZzCn5?|t_YhC?^9{3~ACJ|xm7gT{e}~M> zf+?OY3@a}CzfW5h+9tbLL9}7Q?7{_W?(yrtc5+c(`QhhHr%qpcF(qE zeV1wauO~AIuM9uvva-G4%aDfj+mO9FWD)jB?U(f&K%f# z#aCXWM#Roqqj{;ws^?+G7rt(dcjeo3M$=Qmszv*md92+^BO~p37tD?vGLhfovPSNo zzV6-){a!~t{NyygCUp6g?9a2j<|kdbne(1(^y%8OgXi$u?WQ4jHFk+Vo3};eL++ae zoGDsIcP`WXqIc&2+m5uI@y;tW-^8@aoL{*jif22^UQU%?x2~;Q#3S_XgJ|~(TgRnq z=h;Y$XmWQRH2JI4G3`d{gpxZq{Z2?O@#1{CBjfzSdu=2v;^wvw+*RBBhLLc*_; z3JmkpO)DpCvR+fDZe5wS%5ml|7Pq#U?x(WW3+Nfns&iY>AXuI9Cen0qi0bxPlf`s; zvLh4Pr>&nq*+b>>n+V5hF7~{VZomB%Eb@~)Psx0_z+V4SIHO2=S?`h=(vdSO{C@3x zDRyjUTgHh`Au;t^VvUWr*^Bx8HgmW1&{O}~weix6wAH3lo?K~MBv;KoDWf!n!krfmNZplaN&`zVfQ*liIs^T@qjC#GdTACfizgL!bBj z=hf>ko9chp{Z_r(4JLhd0}F~q_#`OPfhmS=ghTgFWz!XlC_J+y_HujSmxqC zf48jD`hV5mq)P{wBxS#mImp+x;)P<+`&Z|=#Q*l4Rh=+%$Ek@olsi82&6>Ua>}6fY zpP&79wUs`)GB0>@yuHzWDf5`O_YPlK#(v=H6N@`Z1>8$b(q&efy*x0ZMM~hOapyay z!jk((ybWi&E@?dd^HtYn^&Dx%bNK;|Ygg^RzV55FK;EA0oh-8}^m{578ulDn*s(St zNmujFRF-@0duCUjJi{ks`!Qr&n1lc7u4@;vSEW6;zb;Eo?DW|-O@@tk53P>Oe673l zhMPg)Z1zuOMr(tL9Xlcx-xG9@KG3<^*t2P}mC!CJjh26t_Zew92%O?9=YPO+ApKar z@Y=2?CSC$__wT55y)L+pD~-9M)3w0=?Fw(v*IQLpZGC4*9amd_c3s)y= zCS_+!2gL=1x>xtK+8V z8L5GrL>$Xy4A*@;&*W`-aR-xI5dS5H$C2Zu~N{?ZN7^4-Xw;eVO_iHtjhDZ3$zc`JQtB~ei3c? z?uzV(%;Q~895((DH1J&?l0Qu^pYhvW*{uNwQ=WB9w?Fv!B9_94p zdAt2r=p`~QnLIo43-{{}iYni#=jXl%xT`JQRal+b*{vUxnY8coybaQe_v`TODl-0_ zsJuT-t61^oF*k;(&(hvcDkA^HPX)PgHug(TSyH!rX~@pp zHEYklYR%+TtPjq-^;ey1-D1`a2d8B%Ocj2a`S;As^GiB5-%_)l@;UHYhv|(cho^j* z6dkDg)}O~k_X~$g|Jv-s`%j9S9_HN7FL+WiX!`sDPnVX)RmUzeulDY$4Y$?(y-wRC z+Ia)x+Z`f`k|I7`mlmG*pe#T2F)Q=0^!4W79>k|-^E-DZNiW~LB#1jw;b=wdA!V!Q zvhmIz*EOA=cWqsk;2am9sp%(9@3ONETaa?u0zr^VGu z@?)L1t!bLm9?^Ac@(!08v!@m({UzEPgZKVFFvH>Di_dF%geF|A;aqlL-8spR0{7*M zf3vFJJaRt6<%HP9ij5(fhFkQfxo>}v(!-y74C2 z{5J1I>9k1aLuGGX{FTwVD*Na6%5yn0S4ZDpDfe>6v$f0a^u@~f-A`M&RI;ty;=ZTM zLH`X0X9g^qFmLN7e|w+G6Z5vYDQ48Cl*XLuFETP~IXNfr%S7$AIiEYr-__0ey=*Ug z*Sjt3Y}I)dSt&w>zZ#95I_8`4nhRTfeQ)d&Y_;{!@sf4IHD`W$TRu$sI=lbotG~D6 zv;5*y|JWv-IktVdJip4BjWdq2WX*T>*t1+BUE~hWg6m#P*oIf+&`e5>c=Tl1p zZkq8}7eW6#EuLK6GuEj}h|er4Lp70EZQ)_+TGFp+_cO$6ZU4hR zuR4#P6LoyZv3ZNdE{-*C%AyW$o@2MSQSt4b73$G1Vi;o-Sx-xGPI~u5u`MJd>7S-g z^75zyeg`%GKRR3dbmkG6Bg$uko;LHDN~eqKKg%^*aIHXemxHeZYJH~5PyB^!|gcx;{~pl>lDw~&h*{p z%#pGAu6U4i@tOUv!k+&RC}ZF{6W6)cz<<#x!RP0 zsZ%fC$iISPAHPbK-_AbE^B4Z?T9Y2HrD|~e)Pu8b0yZ|My%ul0;^KOs@uOO9OdosW z_w+eiIjjP#elGa;f8FGH>rYK3w8hY5uy&<&hF!pw3Ad@3`0I``8y8%bB8f;kxfMq2)_cd2TIXw>q(M^}0R% zW*PFjUnR;e^h6Sg#*kDK5k>mX=bUU>4F#--V1-^FfU zNLMR$H+FYdOT3G61x{~e<0~$=D0HT z#QeTYm92-1|9So08@lqbZqEG!6K;NbE0}Y{Y`s|L#akb{PfSesy>R)?w-4jJKbtPO zcKSnbr&qe=f9}@H&%}?koZr5tW8dNAlG{^H>^UO!RC8X&cmCjwGLH2EnmnPV4_#GX zoBsc_a)w=8(!9G>DG|mcT2Z^p7dhweU^L!v`ixv!#Qb?nUp(DuJbA9>j!f>P690$3 zWp5*z?rC!zkh~`I;qQBiIqp_@5s%n@7))6d@UQBb?(PkpZb8yV9x z>9gsN9h$E5)=%EfBsFnPpk8J+L+RwDp#~9R2O3gC&92(^GtRNwnDuqT>*F)M8aDn< zT6V{%q~lfR0mYDTKCvT{%>O$r>iQYn_d%$qNV4eM{`I11ht?WoN-tbnUanX1%2#C> z$K!gg@cR*eK5oen^G&oa*(Dxr@NVI%{THH=w75+6T19+TFzK7wFRgY`?98@*kDXQ~ zJmOa{EBGQ|^6IO`nXvwo45z$Wj`w#QIh15vTXnOF_s$mU#fy)zu3eC3$z*M&Dw{ z_@%RnPt7ckS>txrdP`@QIp@9_u2RZSXud9bQ0kURi<*H2`|cu6o_|{=wC(!64%(wgvHH{*1o_#yr>jPAi*QLx^shqp+R>8L|yT2$&Wz4!`e9_Kp?;WAA zjDY9jii>$C$RtY`ecdW^cESFHsa<~J0c%f4&6*vuXvSUcy-fVm7SF#K>*@ZgyP<9K zo*w<}HVgZAoKAfl+AJAaGN<=Qbg9bpUx^oLCgmF~pSNT7jRa2JkG~__WX*40OjZjl zr!ex5G9yn0HWe&DOd z&+vHfv9QXdBX5s{ zUevoUn{r=l(NI|Zf%|Hi`;y%+I*$hjIvc+`Wxrv=&sm$i{@gN6e{wtK*FMp?@fT}S zOb?1>?~D7hRcURz&(Cv{9%~)2w_=Hi-4S~4?Y66aw)Tc;ClAhynm$ochK=F!;WNJP z<9}TUdO!cKp}$RJa;Ij;&6%5LZ*e;KwB1``qG-dxUCSGj6tgZ|-{Pkozj6DUnR0D* zH!iMx{Z{=}z>m414hNL}X_?$V_1Hqt;uk}7fNmhmo{0ZT?lA31I;nQ-^U{KRu4#S# zVn+kd9mqBnX>9DUQCUvzQ$_RHON+uQxhy<$4@tS<@1HK})U%PYPQYy9}* z(p{stm1pKwE*4zWFFw&Y=n1b;!0o;3cZe}d3B^B6wVA~*#UU&#^}?wcipw-lS3CaP zB%5&4L(AaT7BOw@cS{bfW}RTV-1*EIh8cE6uUAd%w)^^5udL(X+G~e6r)+56_wKV= zO#N?3zY32Db1nFt6nHjuImg(@#vPkIdA>i7joM0vndzcoqTb>!SUdUut}kJWJ?XeJ zNOTg*l%P@>aRZxYmoM&Z=C`qw^;n*J)6HdHT4}_Cs)rx%z1g+js%OSa*6Dp6A6b|0 z{?EUb^GQ_Q$s}p(`GqfAx4gMx5IMP9$M5jr`{%gML~haL*=ZrRrab45M!ifur)!py zRK~OaQ@on*NjM#~Gr8a|vZZp1Psf4W9bEU5aw7L0mD&6J!fn%253b&KC@<;qZwswC z!?5H^f@?<*|Hk$!oEzWqGG8n^B>QS&D^aU29RGcY z_kjDaX~*|AJYDQzkv+}!L43$bmqliwlDZ*}8onhx+qz@du>^5LDTR*By^61`*LNzH zoqqO5eA>TE0G(|>F(CJzlZBrJ>9BSD^dRQSm5S6u7!+?8@JXsN<7v%z53?Pz|7c&O}T<;bAxwA z$z1a)EVOx@)HrK}M9t1*&PCeuW?R4A{_Je~mCs#`N7jXWe3$RpneKL3?Sv@*gp&4| z)@7;zQCZT;n;H&g=|Az$6Xr>|zp+8&l1BUCz`c3wYa&clDxXxZzw>*if9ketiy7Pm zXSlfkTsrl?N<-aoJKe%i8_xynAJ&%l{*d(1J@`Xm|EC+b1DDqta9Vc7hyJ+V@E|Y! zaP9S-C;2}WnXPb{eV?UC-QTn9pkdR;jV0?QdVKt(DiVK|N%e2^%T0BbWyh7AcyziJ ztu8yI_U!JBdHH900=U?e^!(D0dS@$ARF zOPRM^)35JQy>+-~#<_A{v+bHLlX{+|FWEC)?e`R|`_CGRDo&hzK7Z1x+5U&D?>oG@ zp0|CoZFb3=vh+*&Mb&NxHcm}DuE8Hr7|7+gsqo9}U48x*P7`lmf2Q=RJ#lHCGyfm= zl5(?66ZUS{c>2uhIK9RCnV0R18de71)w0&%F_@nl2{r+OFE1&KgD?ay(I<>5@=zeD^pFqPI9_Ni) z@A${dHQ1}@Ue)=|zwN~O@MepflP1}Go_j9H^3L~f@@nPf@lL#=g6~hUcJy;9-A?vQ zT=p#Qx1yomH<<+si+F3-`To4llq>gHcZ0m>f$*ztzgNsx557Kesa=54U7t78SKW_h zV4pm>S-7=;?by~=#pkzgI(KUpBcs+4HqrH0_a7EHpy#9NTBo?r`OYh;Dei9-OYhqL zJ0bnzUrR#42TQZ&gxwoH zyyg77Zgap_{Ti1nJ(bA4iYK;fB=buzzhryL-}G}u0Lu$qMun_A$A{4@Q=aTg^NVIL zbNxAOX|?Vd?MDSmOJyaE56a}d`_o*MGFw!7Li04&Nm(;0RVUpG4dmQBv1+%|gS)IR zd*#g9B&}<|^zg{97n0w@amv4l<9C(Cqg7XG*e42AOHb04&YJeKrM7A6{Y2O8vbJH0 zE0Pa7aQnSgNOrh&rh8)D>5XYWCv8~s|7-8_iJE)-{6tyqaUP7?Ip?H}x&g=eg`79H zY!+l#QQG+}_hI3bginXAKKD##IegDO&xX(9s@Iy?AElhGMTLC2b9SrOk=}2d$3!^S ziY44kYk!wv!t>$-g}Jn44t9(|xCmE|kApWV2_Up_jfx+2l#TZf&`ANvlrz zwD0D!6YD%0_U+G@Yq(-+(dz;)Z7I>$4T^U1JNG+^`YJ4wn3q)UtIPQCx8t_SvTSz~ zulIAz3*yzBa$kvIzY#;8M`W$n+l^LRe-tZ;?UiH=3DB)kcn}@8E6sPFqR8u6I@P>0 z7L*9FAODw4;6k(7h>}L`+n)m zq@w}96|xR?Jj*haRuBnhVd%-2_vu>K#B6c`c~GZZDEfiT6X9j`g~Ah z?vu4H_BUDbE&b$MH2XzsDJa^*GqJ}bc!T;;9YtT(PUzg+r6hGmUWzbnrgrEN7C z5id&~6mJ#V{?t&WeFySbSmf^MA3q!Xdegk!UhW59C`ezK zE%@Eb=;Fx(ZH&uHTi2X8o4Rog|4iQntM!>TudTKH$$$Ok?K{S=-fns2R3|4Jq+7Qw zrAyi3a85gK@ic{fMitXuvgS9cIV7)mzB^=X)6$n|tR0=J?M)2|PL}4?{VxmRWHA2Z zThx#+>+PiZr#WU6OjzoFzbUx)urK5OpVyx82DwDoaiy>|yB0MFq^@uMalLoOyEf@b ztG$@ro&*Vq+kk&Gc!8;a<}iRl6LKikpEl1%wcpZs!;e{ zFC!XazqomO&Z`aU+LymBG!hXmme{-~D>^fk&IU%y+S4M+v zW}NrpTE>pLl%#sS7n$35ZK5v~{Y+w(;X75^^QFdlx7(4gFAsgGnJ7K!Sx2Z+jlupV z#tk7A#j*z;Z(hb#+q3Ub-Y%O(l}Vu+_1NmSysuvo!p&`3YJ;SamdV6|orhF&= zn+(H-PufiXzq^*)aTeJ-?WWKn0@Vg9@wEmE+!t&tV>O>V=~%76g}b&KAN$Y0x0T+e zex-B6wY^*%Ei;#f+w@r$HRR`en;H9ZyUuOGfr)h|u7=5O*>nNZE(|nl{t?Wb$g=EmCRLJ`0M!E-$?m(l_^al9q6X;MpaO3PRl{{wqu5 zX*~HH{n>@>^UMFM;{JcHXPj<3@zO$-ibaVJ?`lpgdl6K5_+Ooj{gbl|B^8dkOWrzt z>tbFVaA(y&whzJ6opg$u9WO~Y{#Uvt)26^=m9tnXOfI&g7BSD}jzx)0~xyCffG2OY2u3Om5}&+I{+?$87iiyu1W8`7Gem!i6*ymf^A*3pZ?hh((YRP( zP%|;CUh@9Z;BVD}IiLAIAE-*4aOIcOiTKv_Iueh!v;KWq8JxFr!iS@Ub4tuh9;ql7 zvaGtWfX{pPoP)=13Ge<>*)#e7#!9hWhfY^F9W1lwNqu)nbmG+v~^^I{a#w zRj_bk;j7ist8KMDM+$InI%_f|?d{9NhSh%Ye`g$@^JdNwH=9R)lDc|2IbR0|uSoO# z95hRQyOrN6{@b>{t{HD=H7mY(w!>`Z!j9rkVK+WXC#pX~pL=^cm9=B}Myc5)zr8cEyCZtOGh`%GXL_$;4URGVsPOpK7eSluFx8j|I{Qm` zS8Ua|&uM6QMq{ayxJAC*@8bvg!&b58?&dX2JGK8$ooN2yh_1Z{b~I@`-@4z00g<~#BD1!3<$aw)Z!+H{`=B-gb*@T^t;mbB1C%W+cvx8kY_@dbY)o@QT} zz+jiukn9(EA#<*QMA-X`nQ0v*3hS=kzmuNnUHWhHhF>b@g}CQr<>qW+yM6ap?fvZ3 zntd;SJh++R+4$d1?e^Ug&5zq2|C;}St?k{MO9{W8bog0(zQ}mkG>unt&E%b@*Bxx1 zztB$m={p&T@@hj`Xl%;b*L~@O7)IToSC|sdFX>)(w z?XZAlbM>XRTiLkHuZ?L?wrtT3|93l0Ol12}wTla{XPcMgCRV&y*}p$#L#B~V)Rf|m zQxVnY(n4lT?{}&F7CQ5JRq4i;vnFy@&Of|)$e>xR8rdN@PL_Eut z_wa4eu0q9ob1$tu|L)BD3wJ*pD$@wiu372jk|xk!JmKC0Bd_TKovELMCtAw4_plA@pQvs4$oJp7_!dQkuC z)UuNP;0r5x;!j@pmxy$_aoMzE`u_3+x8JU37z^KYhOeI-m(yAP`1?G2q5X-Oi?~bV z*Uh@{g)@w68S8g%2MNIo#)>+}e`-gEO6vY+mwGj?Cb>0)+a==fz23fb!w=H4X7H`> zpME>;N+kD}+xod8)|y*6+`2dotiY1ar!6EovP<|;t>`zw} zaTJK2pAxL_Y<+Tf!2Qn!zpNd4-wAei*fUua%9O4=#Ll@|XVyN};LQm~60VqSbz%&k zFDy0x@2?K&qpCTUbw6h52hW$^{%r1*$#O2W<=hhLZVMJUc)y#uthrs1zc)&{!DQ|= z^S75$K5V%+`FX^}=1mzB9^ZSP^h|M*Y3KL zu`kzrn!Mjutm)x-E@!raLgO!q-Vfa$GH&nqe5tc_)A<(03eO{xR&;esUT@oS^1u0i zm!t;ni#xB)ac?(MFI%$u!83rRf_rO=*JK7fn@;p4*Q~FAHAQ_6_M?e0z)Ok$Qpo84_7@W(jFqWzJs4d$*D$ zm$SksqK@&Pgy(9_OIznzrwJ2i??4c z5$X85vH5`Rq@ybs9bUA@-p>xUzay_Gt-A8`7t^34O6G1HKRMUGkTlxQ_-B{vQ|p~m z?kbt@xTw%j#ja8(J7FcCyvgVP3wLyXe&80B@gbP&gof0opA+kE{hSyW&vEVajcc!^ zPdi7?K2p$hW?t5uHy=9l!~-fh?3IrDtj}f1%E;wgY_vt9B`D{V!BU^aF|LiQ9BSJi z+zON6`JQ38IbCSs0kh<;!xPf~h-_U~b+|^xTc9%j*CN>7m&N_8juOnxkFTe$lcraDo`yk=qWo*!A9zkL~&%w~9w`iQ+}8N$blORu_xTuvlY$aFX5R zTQ}}rtbhMiW?!IgjaTbua~+}W)Apa^mrCSQZ%i{>l((V8=#?v*Z~opLHy&}U5`D0> z|Kqket2;Z~64S4~`MgbM`Kg}B6xAD*E~0-N^e;U$D=sOrH=aM~tbvtN#OxpU*R9#( z!Fr@zILmO|JodF_v3V8Y)*&nZG)C=>_l}xtI6EQxkKc@GURJEpv90UpJ~%vQfofRP z^Q?!qyxUtjd-?ue%yy0vGP{!USy`-W|LphA`KQ(Lev&9v{j8BT>-zQWl69UFAI{>R z^K9+>soUlLBB-`)dw!tHdYu%J3R}$(U zD{KjmxW^ZFr_ogULQ7c<_9$EFo!=A@sXrmTVo$*5 zZS&?to2tv&sT8FzWVJpgU^2boqx#PaU(~qPY?z-=-WB^~^P+nT;&q(Ul7BAY?oFB| z^62!S6n;2?B7$TQqDK=XJ&n!zdAC9ZL=w7nXkR@#9OlS80OEqy|SY$d#wUo~8b?a{F#_Y@e7T;|Da<)3l z502zy#*@9fm>7=vFP`@8`@MbNE8Hx9cDKUL_OGXzeYVVfE-bMv zy;EP}segdVHM2Q+34VEhUqlya3f!KOkl7QyWQCUWpNENwp;393JI+mBoRgIh;Q2jZ z`x&c>so&I9fA4$Ond;V?;>eX_btZDn^w5ty0v;)e#_= z_CW@G^P@g0YFj%8|5uo^Z1s+*`6>eqRq*u=>k9S{}_kztZ!} z2d&4M+xw@v+bL@YbbJU4ZJ5+~KkZfn?`DqEZvu|i#8&AB+p3?KCLTNg>BFfTrf9xi z{jNk_jQLzo+>y&F98L{i&a|8;N))`!^Q$DKR-Y+g|IPJms$SKtSFf9Fv_0e*otyHr zv+{Px`~U570#C|5oSQGw&SDr?*R^x?JYUIY8hwwyt}6~X`XpVb=>8IWo1bepq%J9v zdUI4c~*PQ5Ow(V)y{brXx=icl}o7KhsSqAg=MK3(^Lxs_4 zR(5E;nOL^kvyCqleBaNos!+aR>T<@8Sx@JKyO;atgIN-YXkI^DZtMvm^CoewHyW+dqLHZ6}Ww~F%f^M zXsgk3LtwI@?Yg18bJ`i*H^Bj0)vI<~lv*C@#T4-DZp@PDhxNZ`$rY-_ z_v#i!%)6jw>r|oBK{EsE`7NdLv@|{$KfWP-`h*fZyhcdzsuku z6TL;X_^hpa;ZvjkmNzn%ex4H2n|S?XJ7gL-R|!% zR>{qpaCGC&>aYG+B>7d3-+WcOW5>C*r@Ttv{SY>qw6;n<$aO}A_78(|dtP7Let*{D zJ=0g)9Vymuie8$bGPAX*e}e4%D<7_3*#76{MRnzMmnMij-JPD=7;bF9R5E#arRVhE zUF&BFZC-Ny%H=(i%;y(%PPxW$`h3CZ*)c+2h0MS7?$2O1{>+lv{#C%ryCYa>@#h^$ zQavL6S9WdorWztD8kR6*l& z*&EZZD}SA+LGHEv)3JSK3~ zm1L&mK6wv^#N($M7r&`bkdLX}z#s2q+162-bFt~}?q@ojkx%{yTv}qZa^t+`ub3;F zPtQ+zu;J>x1zeL~FtD;U&p)hta`(OJ`u3wUZG_iooi_e-I^XXOgV4|BJ?yGyU)DSA zQ-1z_lC(}=v}x%v)yvTz&BM+6$p_F8ozf-&`#7o3!`GJx<%x`oh_d zCFGCn{3&TSMblL0@>@;YP1iU}9833q+nUII?wN*Jd`1bIE;H ziM4sr<~-)8w6xslr^at`qn5Vpy!b~baHIeJRV69QlUEdN<4=gqcByogmSuWyzo1d2 zMn@(_Z07GT-QPnNu6W%NH@$A%UC!-1b@4K@t|wgjlyTxS!{v-~h9dHdH`rgFli${N zQT~!}rp7|KO+o3(2hX=pKDEuHfvM-H^QHN*KgB$sykPj}r!Q|+E3flp<@u$n|5mge znYO&QkyU2Zd}r0!TeHQ*?AK>F&s*nZU_9fl)kTHZOMK>S zT)^}8LS+2hEe|JbFMKGn-f>m-a>-*$C4Xw|$>%BZy!3pEu*$r93T#;q5^HQT^Vn}V zC@>sijhSJ#^sAH7o%shBT(SSXnpwt4?$Vbh|K_Eru&haa88ZLnQKK2=zc#yH|0DgP zsat8y~m)#lG!LqS@`wx zIcr>3%f|}J-_>w<73Q6`@z=#Etz}}>Qw4s6_*?6r&wN(Dp4`R;`hYcUh+Y=AKm9Sy}U`4&*$a)pL{n{wd_ra06WoG6&IuCG~ho}fOv*OQGR(*%rbN}u1nS@Sv7n74(= z;O+@79sT*Qe#}?rc=z|(B{gr?6te{xJxB96&F&xUle;~G_kHr2!%9}uwc<+p1VxVkCcegLXXU%! zhp0cP`*2LAQ2yWIUPe{6AGg=GtyTVC%^Rnw17YPHm(n+NEAj+*2!CY>_2lsY}bA+ zdsEgW=QF>$o$HNTcst)*Bu9AP?S226pXFPB5O`oE`J_AUZE4j$?Lu>pMXl{B1;;#3 z+~Dg^W=Ng2AU4>2?~#MS{B{mSIbk?ksh}2M%7H=yA_uv$-i0uERa3_ z`lb5y#ajKV?=~#ZyUnyx?Ddx)Pfpj&xwPR^WWx{spAlbr{?)M_yiofrZ2!#b^DYa| z@_5R4V)v0*{=El{j$c^%`QpJPENQ#BKDbzRg|%nxn*73AC2vY=L(P7&K2VT~4xq1jDTXas`qQCCv_5&=+zVmMf-E3#HFQ4-%aAG0P;{Ow` z#mD9~wa%|wx$IWHl!fq(t#12IO|#@Hsd07Bx{yC9ggtn$DL<*l(ks z&929J61?!C9BrkwJ5 zdq1;X>FGo9v(pSSr@XCZOh0C*ZLb@?N?&z{+0Kn?^WLg=v?;EL`gZ#HsgR{oI-0+J zb(JqVmtKAF;~}ecr+HZo*NQmoI8kG?UH$fLwNHP`T*3H?peCq3(^SVLq%Xw5(e*H_a;;s37 z{QSF>{rRHKWe3e(TxFhmXQlWZRql)Zf4!#ti7GzITV${xuXts^wd-?JKSxJUi)=jPa!xFWP!<2Rl{8EBbOC)A(8b@`_K~Jb@K?f2>MR zS>HPo=W+Ro%&y|r5dBK^x~me^Z11CrG40OXZy%K#HFM_#r!G>-6`UvV z>UGF$nF*ghoD}TdB(Z!(;>Wd5Tc({_Rrl{0+lFZj$zO9P30(+1u_VE7r;tOdGMClF*5A?+H;;t* z=ZTA*`@8>(T;Ju3N8Ss(W-q_o)2?NvSiEHUVy}Ob0xZ=|2ybjOlUt&_p#QWA&%AX; zVzYy`F4Jy`mYu!H+3VBUPsML@w9<{X2E0&G*SQ|>%kSgE>MWlklQ_ni=KOjpPF{Mm zS~u~ZP{-QgMYUxG9Cp3}~Ezb&3kn#R3ID?Qfd*NdZS9}Dw7{QZ2( zdxQ0?_Ff(-F8*R+XJ2Loop(CZR9~)Y*YtQVZu#uN8^gRdR&E(D@kwz-S8{S^g*R?H zZTqY;`&E-f#A975`zz;pV@dn`_xjri&AlD=&09Jd&1O`)Kl>t)JyyH~g8Fd(%g4 z5##6FQ~NJlPU8>Uy3j*AV#%C|(LaReur13C_c+SqcgRVl$E4MI-pP;ESBl>;%4+bg zUawY{n0WN<`*|x@W=9BZn^!Vv<-g`&OX>7G%o9FJ9^EsW`Al%+_S6%`3>W9WIi9bm z&U2A-HTRD1;v3o4a>k~ty87QIGD=9}TiK(+dgqh-1y=37x#!u_Yc?^B<=eOa3Yp0F ztofty1{-tkikCUY326rc&wp8Bskd)|@#>OZdDWPIq75gQgM2q^%M(qX_*?#|gYDY0 zDWP&xGbX&?{5M;GJz^W@$p(hGIn6C%E7b}ce%vXaaMXr()+_ZK(d*kIa<3Pus#)~p zMzJ2;9cv?h?PbS;jYhwZ$pzn9{nxx{)%r?9Ge7M@zNo(f>0fk|7RX-|;|OJ3xM|Dx zVyCPk$r+D!9CPH2sOdX)*?!&WYggY+c%Sop$*q6ZX%abC-|lC9T;aOEO@YW)!KSSh)-7BSph_+MJ z0X7XsI#VM0Q>O8}c(t!>_5xW^Cf%1>mVY9jzDbt(n^%vs9q5|s8RD`4tGi4!8yN!Hem-w%YF z>@s<#)sXe0wrFJ`Tj5zb?mdR@efu`ONpt@3qhU($-r}W!4tgIsXG99!o_uq!?qZ%J zF6)DpWNtcc@oK$y)rHEG-XYm_*3myg6QT>LGFty4%~=x;1)i^eXvk_<0sziCXP9Vfw2i2 zqi#N6%U6ugcHLEw-FW9~mvdpfNa+%#vmQayuOv6L-u+bm^xgI2$zCtdu}g-ue{5}y zMQwoJ|CpT^niY}sZ_HVv*gW&3%JYG6|ChF5lX*DMY(*4g1{!xiOk6C)&g zT6xB?BW72QI|!&f-Jia1TH0l=kM8d`ci-oD?cP|j(f5J2>6@HoUsv%MuMV4gqh0S< z$-&3}#Sh3%5?Ykgqg=mSV}T!wM9_V{Plv50xF~xwT>CFrws6MvKL_RJ&pPL_WreG( zoXV%Bqszore!Ar7CrwbL3Y1Ny?1sQhqu|~ z`U8tTXf0Sf<@Q&ORw3s7Wz{Xyr20?Ugci)Z!EgT0j(1*>)UwS-)Z8~ziNC$^GUmm^ zdlsFuZmoE(Yqn5i{qH$bo#g9meZ}oo?vm@$)x6yo;&du-Qc75U!p!obS&5>oN-uSJ z^a5C$%4+_6>O7O4QgVRtTk6pXJMYgAQckFIe#$F6DbK!ylRrMX$@nA7kteq0dv{ zgbQ{n+dH`1oQqw1O!~y+$GRfF9N0CN7VI@&HgBbo{)88cefe7ob0XfH-fOEJxgh-f z!S%J28-ZW&%e`K7dc(JRyS$eH@TU12km*>xAqD7<%y~#a-_$f z`r`X)vlidx>5)E17x6h9`LEJ_E9-mZuDUDrbLCDPWzw7V@k`K+Rc4bXALjQe5a-jK zd9P^s$<-RWzKE#Gy0T9DvDx};anqHnb0RYQB)*95%UdlO{_Zonms6!!1Uxgp zHdXsvovyUytq@y)3)98A4~u-A{&a0i{BLRTZf{s>Qfo@x)gzz91!8}nHnj>f30Ix5 zwAsu&y>p>?mFCNL?|pi9HLGg=t3T??eM#qBYyPpgCso!DeV1H3)i!mSV~Tc7W1_J~ zO}kj@T9;h+rHyMs&d%zeS}7=M`{e)f_&4_^Tkp7QbZ77OQ-3&nr>=fqZtd2#J*PMKj9u~i^0?jC)z|tdG+lf(WBY+) zKkq$Rvs7hb+}v&dUH|8B&S4aPKC`0jQOO2Q3AVf2!&^2i<30YCqj;%L$Ldw#nBle6v_PPhXS%=^TH3igwylt%B%F zSKNhCI!`UVo)LK|y~lR3o#>(6vAfu~-uW56O`RZGk;(71Yrbhm-j)>_B|7t@mITuY_|37I%{ht|~&jgIu{XL=1Q^Xo|dDW4Uo2pFw zkA)d3w$FB4Xlm3gv3L31jK&sg$#;{^yD#u7G}M1_<=L@U-t*RoTFrj>%VB5x-Th@I z%->G3K03HP%z2jGY5!-XXYFTyV=&`&`g%(=#W|mkzokQ(f#rlG-*h`wp%avMzNq}Bi6t`9rJpA?O^Iuspl1JPP4!)7H==c33S-4)p;l8?zPDt>{{fpZx zLy~86eROmyf9J+z6wsok`lzGx%tYHsy8Iu!QUzYh)~$@F{Bb_;yYX_hYuo>JSM}UJ z@aSD424#9NuIt{XDdBu=cb4%#;(yr_C_-ZpnT=~wdwA53Lw zIdwsE{pLN>s?&IE0^j8=c9Ob(#`o=|TcvsD{bTQ2?tkZ+vfG5Aw)39CzLOT;gjyE8 zPb{isJHvFS%W1(9d&8)EYoiYyy&U|L(b6u;KF^))h5kA7GnHM&%lcpT=gtkPw_o2- zq#zTb8>Tkf_GE&0OZ$P(2{|f8%k!>_o%&Mn*-peWUDk8OrrQSV!|pRE`ewY7JhOsr zbIrPG;dfQ`CV%>n?^TfBlUaI(!TaHbIq~zS?-BZcS!(C5V5bts{lEuYqU1Tt=`zOXk_=lc2Zxht}mekJ4{vN*OO zJScJguEfLrJ+pJB9+=9>wCmFS$URjPVyngGIy~$=w)mXGV*TJOu9>r9ysS?jG3ANo zzAjbLJ!5;h^p(&}8Ha9nzR*>THp|ot%7|xh;I`Yld99N2`oGKxYroFxe;DvcT7S9A z$NhOvrR~q^WC(B3Dag>yPc8q$Ru;`RH)HSCg!$-eoB`1H@ciS=7&8Z&$D4~^Q1wGq<;x7r;IYr7`5vFBTsPWpt>R+*2IX%_D{ zJ+(a0CKhAr_?4sIKp|WELPnWzV|OL+I+dq9V3%ymN16LqH$Nd_Ezs$ zniSXK~$;ySE%dVb1Rd{1vN{!<}+fR2QI#z}KO8#q}wVyjIQTv=%qfJOcv^|4a z-=PiXx^JXBYvel^?>@!s^<75B&8^4X>qFPZ3uxy{#dq+D$E?x)uC6<6jh29<=eLEz zVp=HyA#>zJVap`2tdBymI@Rm0QrB<4=jz-!z-TSWjUpnSt#`(#!-cL$XWvfG+%!AIWn#dup?-WO)MXWxSxYu_&n2w2N(ub0}ld9&+l zKF>gYzcpX?I#1qFy4BLZf9|PmyKkJibMIvMN2bhgMj9$yt<7(kezG_`C_QJry~JsK zoZGx)rkd8ZQ({HuaqnmNyUC`ZY~hL(T#TI8ws9@|#B%ziimXM~DL+%ieTKi6C#_N4 ze^g|FXxrbE_sbZ6oQo)ZFKaeYbxWoA^?l*?C12SiY^=5SIUkrL9jFzc|EP19*>~>N zsrAM=!IpP-xI|6+cenX(@n43sm6xWqrOHm^Si+)M^6#%jpMQpY$;&56``4Wa(oeTc z+HPsIvwg!7$@|+*N?-WAN#>hF>%0joSGrc+XvvagENs3+MVhQ=JsXExw}MDQa8I*Q=uQdCPBDN(VK~vkaKZu=j*Q zX!d-M_jikud2?M0{aYMZjBEGUK74fV+%>raN^mtf952ywRHdH)fUjI65l0mw-a{xxGm!=VdSmv%pyXCz=USyI-f(r95Wm!SD2mmR!<#e4Q| zUR%F+WAbHS%4}XTw*Hn>n`PId9eOj+m}gt+<%Hy{~WEnxw$m%{DU>w4|axOz>ILHsjlr zD=k{u$9hB3o5eNkb$jP9bosgZ-(N8^|Etu*mrd$Q2_Jt;OxbF@tmmBB=3NU#!e_}v zKRp)3(-~O0r#oia97mg4re87KUo}Kkm?oURux_Hs+p@jQJO{jP{*OxzS+Tvif<-ph zA?}yN(Gz7eIl^njJ(lfSxKeG#r}fE3YDMR-`GrK>-5@vRU$NZRq9v!+i$=cV_%*@z zwW)~w+QfBp=PZ^uR{m~J&B2~ouSFKdvYvT<`N`*-E;b)}q_(7AERotM_-ECgU8$BP zU2`q+} ztg*d0%f(G|B zd@q95>^*Yo^O039Tjyx3i4WTLtoHTfFPr=OntfNTF&C+;lTI!-di}{#E-&kG;$+Q+ zZBozYrn8l&WL0}jj=k^3cV}k*;+@lH?^zqCTq8A6mZ7%aYo*IZ5rYT!w~8-f6|-~R z8u~$b?-KD7FT!_id!pECxUg};y|Yak(=rl2z2AOXxxIhFoSHAX;ty_JooT?^vpsN1 z8P93ya*>_Y+Of;3e?4E?Z?o%ZL%YY>r^llt?WFe_Jt@0exWV}2`}ON07sj>xNfFxm zZTipe%`1vidnu8&31PSG_rsXojN=ZhSDnhr#it&TsE@m97k^wp00n&-c`{n;N@ z*>N>RrXgP8y4(LmjY7EvhbqMGOS8N=)7ttqf5LVln}WH)(~6i663r;3bW9~-h3=!8^hHxN z0-h;b{Jgw!>ev69k3au(!&D*t@4U|SAFC}m%I412R+t(o>8_HrUuvP*>l2Sp$lp4p zHt~8@4(DHsYqq{-d-T;OZmyW1x!7{q!54Y@eG*K!?_FN7>gLt$w;$B`|C`)d)orHB zSM@EiWTLoyZi@Zp6NT(5u@Z|6m>0-Q;^MEpbMouCk>s|G&NR z)Q0z2URu}mn7n>5OY!`ZXgqPoXJU8i*-)N2H3_N#-|A%#hnQI(SaoLOk;c9cJm2rj z#ve3nklOuT&VQNJqs^&-CtvjKJMUid{Omi4Gc#{%UrOceo3Jz3cjj5Mc&4Z)t0MlG zOxL`=qtLf|WuwHZ_|q!2XFrqU{yT{eRxoaOQJ|-h^+5c;xVnzltxxMxBJH1k-`q1bW5PzYx2MkZ z_?}W<)W9GY+#R~dG_(B8<=(aKZ!%saxRh_Z9%PlVElAA!*}bm4ep62Vc=V^vcXB<` zyY(fz-JhQ5oD?Woz;0XFb#3!+h4g~+^IJr#nT@*l+gaDXp1R}ZM9GblMQ?12(yI7k z8!8vRYO=X6pHrEha?|;HzR7dvDj#~hZ`qoVmyUBTw=e0QoBQ5I;pmN%Gx-9f%bARR zJZQN4WA;C$H?=qHX2&kBnPDXOB;fzE37ZT+vRt@J$F$0^l_rlT%Si9yjafpy>ogLraXBif7TYeCe0HX zc1Gv+-k(--`PXsw51-eu&0gyu&hjH&h*)@mmoIHE# zkdxtR?t6M`%EbGC=P$lj}aEhgyMn|77$B@ZoqLg(z?`00RN;JimF zDoIZp5`UMspFg#l$M3?zpA`ys=RSD2rR$`)Psh6`o}Q#kr`u*_iVt1vVvWPwXMesv zgX!k>O%r$D`Q6nU%v7%G@@@^ckMD8)J7Qf7GEZmiQrYmqh12Ick5s7o_m2D@8IB99 zFRUup?1^Dq^*&?&)|LMS{~Nwqdgh?j?*(;d#kr)Mx*2EXK5*LSeyilfB#ozeVzV-C zsX4dGz0*|ss=OunlQ&!Q=}BQXCLEq4Uv20b_C5O42aiV;o#9(onoTZ(IT$^TWvG91D zrs_W?)(bH{-j)+JOEsg`zu*y_&+qsm?9j=tYq$c7d8&U8usknvq|c>Xfkhjp%@|7S2p3QYg}Z=-s6 zSD)IH6osilk51p1d*;|fIibMZAJZA-uL%~^?(SW>|JY`!X6H8_?3t&W7y82T%kcS> zvNWrk2h{Ixzn#T>ihTuBT)04CfZe3?I#ER*7U@_fZAq1$_V1)cKcZ*ot2{BM6?YP)$} z*z_+a^iJM5yXT*zv(Rp>UG3@L+jk$a75MCv_0>Von)eisdioN!-qls_1lLqeP~BAY zE5LEaJiiS=6R)y%=u}O14N0hdqLTaLfk)y?_G4aVTPL+mXWyeKCi%KwAWUV->J7%P zWPD3`MFeNq-deY1qTz(kmirEIJ(HOH@PPB?*$XC^00eDm7}^+&_vand!y;u&m2?pci%h7@baLug!2Wy2NDjsl~VOp{=tiXtzc7k)1C34 zzU;ZB>*lYka<9ilt@%=aCH8NBTU}wd%`v0o_-Vh{wGYkb&h%H^%Dl8?-|a_#?n(CU zTxe_8?Qs62&C6yNZ8P8fJJ;Wz#C$Gq!9;_LH4mF3)9xLOJ#=mI3+cHFl{i@|*B&+w zG&C1flQwoddMHDGbzFRZ(#;1VkGC%~nmj#N&iUi+$jlwFf>o26S6)it4_e}#TUhjP z$`iF~e|B}9JoSn{&b=@owAbM4wz71=C@E)y>M1V2tEAm|m+-h=)Vf!4MPio$@~G zwC3l{}Jr>uuqjvXZ4&^w#C8pS`;8wZ9f!^8H2v--MvG zT9=C(JniKY8U%e98P(%{FOIFT*js0|Y3KXZI*ETP4(uorxR^L`LRW3sxwrct%`Dl~ zzjdmc&hzp`9-pkH{R}Aml5EfXr;fj%@OO!V(}~zkD_Miqysu=wZBzzxlF#!NcP_vA`oW(c*dHQdd=T6r(_m2Fjt>gO#nhNE|GNy*P(qs$P~tT6USfMJ3yB-e1LL+cksV z$8S1T+x*Ao=kn|?4~;m!ooYLLnCbQNr;TyNP1Qapy5$x=4*V+rbA$7*KW{w~S6uU9 zerwKHG3)YMz9ij~Mh*qnKUU|NGP?giaLI4~`nSc*8f*`*EVX?5%z^p%6wb{&cCVkY zs`#kuq+So@O?`C!wNqyO^fRf3|ErW&vPa~;pCBeT>G1LHV=*!5uYSr=2`A$i>Jlk%2c`Y*B;hGP!uI_Xv$`jd2R2%^USl}X@KCoy>tfIZ_0L}> zZ+1^xk*+4W(6vIM^ruTl$-;f9b ztC_PObj(eNV2|>T=PmW#rLbyc+~(A*XGx(lJSKDQtNg2S6y@g+kqEn4wrSh-E59E6 zxnlQcF=NlF#KoPNhhH=aDHu=DvSSd)37VyPp!}+K`jUS$3i~}H1aBQXo`31QaG+nh zPmg6QTj%NDIcL9Zew|ux+R!h2S?iOj;TfIPoeu1wQL}wTC;eY^HC>gt`{QF<@d-iv22GRxI~BSro@T0Y z$nx}^&eCe4;~n|4q2k)xNhweC@1;Lb%uJIxs&(|8&{z2f^3r?ay(R=aQ<<=E(P4wd z3@l0gFY0_WMLQ=5%#utw@0_vqg#NA6cbg`yUpGtL&3*m(_mBK-zt*z9u=C%BnwqNFT#K(ykqL61 zy<1v9aP5}lZ-vnyOx$=rl3wWA-_6Q$Z%ay^idA0fVCykeVKU>XXyWi{N z9DVs)_nCj+Ie#RnPX06}qhiwKio`98w>oh)wl)f${#U&(AuB2RYI#S*r5UGgilptC z^Wpr#m5*NE-F4=6alyvkH7y%mzP;I8sXg~>n%^h)=i*&kyhTinR_1hwe=Z9=XQI#O zbjw(wSD~k2lG@cnDUT<8`n&(<>BggpvRUI3J;!DH}Cn)^a+#p{@VT_+*7bV zWKGBkF^i%#x2AoJDr}pd*CsA`>x@rL&y1Y8CzvmOm?rRHg?Qx2hgNou1`_{X3#goS z{C(r0YKi*MH!~HNSZi%;xXdu8vozxZgWbo(60^xGQtM2))Qr4Zp0CO-oBjLkg>%o^ ze$SD;wt&e?=-hgi+UiGK4dShhpMKh;&DziL@L0*Tg7if%b%G{JysNRydSH1i<(o_Y zZJk{kvOWa$bn@?+m-_kYZHGv)1P!*m3uerm&!X`~UEVHAzb<6Gt4;Pdvbsw}(@N+)DeUtUhbw_sx%@p%5IBQkgA<2I`g{#l_ z@~-QiM)$Y%=%4?>v2~tD!o>WSMQgX%O*zgLqWUDrTHfk(OYO7r>sHpkD+?yC|7HKF zt)a8z(3`#Os*Xz!J!HKj#8aF-9wWzIQ=dhr(|Q z8g<{-X`9HrO>MuC?Kv?;&Ahdxk^Af{BCRLB7mGODDkjAKIq&&`uz5FSl`kxw;uEq= zkbl+9oo!9U-o7hcrSj}J0z3EL7F$w0{pR|o`tsYBu}r!%i*M4WEi3nYp1k4WT^8LR zw|#6SsvoGHm8kXB)i_fa*$}&K{+aD5YSTA|T>bU5xqa>t=c7M<9A6&1YI)e|O*8ua zG@oeK1Y4hZd_1wgu;`g@=5wvn8PYs#=1+6A1y8w)e=;nelKl2)rE-cx>CV}o8RvWw zsAAb1J}t<(^MjJI&}SZ1*WaEGzTG;aFQ*!mW2Gmc$oW%w*OAp`>sU@#7QT+!s=@wI zey+>b`1jK1;&1I*JLR6cU+br>4-c%`5 z+iwv5+wH;5oth7B2uzL-(ETi-bWt(a&+kan-|p4#rX+q;ez9~cL zw`jq>X&%M@_H`^{j9`d)q+%*1K3OJ8V!prF`hdUTmlm>b{4rb5_v#(yE@k&O%eJZW zEh^!hV)$Z`%aX+gF>d!8wwdoucion|@a?6n%xt!qM5f(@ zv)g&lW!mAE^L3LV-#ClBDf_OUC;588J^Q74lm82P%4`y5tNCeE`|ZiA+T43{*Q#o+ z+|!=2K}v-oWrAVvgQ>z^msgy6qUXE4aBpgSV*1^$mMYnH=hn_~nfIXZfH|Acvy=l_ z>t|2?^n8=a4E2A3E*(<4CS7V4Tpqgr%yi!Oi*kP*Te?21G|uXvR?GLDmLfCa8XUD= zv-l@e`bTw#&TXB1f6v0mxfgCFEt`;a`Rm$d@pod!{{MN-qu@JxzVGzKVfP=e3HxTT zeY0hA$=!LOG23Q!S^Q0B5n4Ih%(VH~EB(dyo;oPY) z-iy3=W6Sql87s=;Bg3zCdFOAPl*Q?7r0dsyWpRec#l`7sjtH4%sq0>gZLqHT8SUFx z)NRdIcOqVLqg4DA)!Mxq)xYjvbguh-%Fe${r_Md9lW_scQ5Z=72!<(cP~#;-KZS*tgvd~L0D2KUJjJ+2265B>DjTlVEy&m*o& zHa}NvefNE9-=D6^;%ia1MrEoBaNjLM@)LT!l`*wWX*Y;86 z$7W~M;C-vpw-tq-(_WXNv8{Ybh|a6s91QyFexAC*z|YruWYtWy3Q?W!=YM^%HJ%vU zbV2<^d(`jG^HaUWZ6@ie9aDE<`q#OWZ}WomY}+Yq*KfW1qADT4nRns%_wA1}dOO;x z_D*JYNm;_Y^1|HSO&e{SXZKsP{4O{8|IK#JhUSyUx|42A(e>UfpEK{6RLk`)!4J`o z-F`WwWE?vqJB#t{k4+cn8l@JtT-rOCX+crKYlfvc9D8eH-NUZ_%v0PIA!}9VBWU5A zc%_an=*Ho^JDvYNzcO7pX`-T7sPwAPebKWr`$M|LFFo!&<~iegK%n)GKYf#gUd`!< zZgieu{d}9DN0{@%Yh{l^Yit+0y<4{BpIgsSgB>;}t;!d7RIPsfeEa$%yhji3*3dQ+ z`(u;Y>{nDWml~i^%0A#(%(FJ_wm4?OEO}fnHuxAwc32G>wk6V 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%0AW(A5mRI`K#>0oLR6rC#<<~7E8cCF)i~K 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 RwY!6F{P^^ragp^+Jpc%4;iCWm From b575769a7f25c4754988982ac2738230dc390b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Mon, 8 Dec 2025 00:50:14 +0100 Subject: [PATCH 279/280] Fix: [CI] Install NSIS for windows releases (#14885) --- .github/workflows/release-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-windows.yml b/.github/workflows/release-windows.yml index 393566ebb8..b84cce9103 100644 --- a/.github/workflows/release-windows.yml +++ b/.github/workflows/release-windows.yml @@ -54,7 +54,7 @@ jobs: shell: bash run: | echo "::group::Install choco dependencies" - choco install pandoc + choco install pandoc nsis echo "::endgroup::" echo "::group::Install breakpad dependencies" From 4b701e053fa9e9accc1e3652be12ca001c359c40 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 8 Dec 2025 17:52:28 +0000 Subject: [PATCH 280/280] Update: Backport language changes --- src/lang/afrikaans.txt | 1 + src/lang/arabic_egypt.txt | 4 +--- src/lang/basque.txt | 1 + src/lang/belarusian.txt | 1 + src/lang/brazilian_portuguese.txt | 6 +++--- src/lang/bulgarian.txt | 1 + src/lang/catalan.txt | 31 +++++++++++++++++++------------ src/lang/chuvash.txt | 1 + src/lang/croatian.txt | 1 + src/lang/czech.txt | 4 +--- src/lang/danish.txt | 4 +--- src/lang/dutch.txt | 4 +--- src/lang/english_AU.txt | 6 +++--- src/lang/english_US.txt | 6 +++--- src/lang/esperanto.txt | 1 + src/lang/estonian.txt | 1 + src/lang/faroese.txt | 1 + src/lang/finnish.txt | 6 +++--- src/lang/french.txt | 4 +--- src/lang/frisian.txt | 1 + src/lang/gaelic.txt | 1 + src/lang/galician.txt | 4 +--- src/lang/german.txt | 4 +--- src/lang/greek.txt | 6 +++--- src/lang/hebrew.txt | 1 + src/lang/hindi.txt | 1 + src/lang/hungarian.txt | 4 +--- src/lang/icelandic.txt | 1 + src/lang/ido.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 | 4 +--- src/lang/latin.txt | 1 + src/lang/latvian.txt | 4 +--- src/lang/lithuanian.txt | 1 + src/lang/luxembourgish.txt | 4 +--- src/lang/macedonian.txt | 1 + src/lang/malay.txt | 1 + src/lang/maltese.txt | 1 + src/lang/maori.txt | 4 +--- src/lang/marathi.txt | 1 + src/lang/norwegian_bokmal.txt | 4 +--- src/lang/norwegian_nynorsk.txt | 1 + src/lang/persian.txt | 4 +--- src/lang/polish.txt | 6 +++--- src/lang/portuguese.txt | 22 +++++++++++----------- src/lang/romanian.txt | 4 +--- src/lang/russian.txt | 6 +++--- src/lang/serbian.txt | 1 + src/lang/simplified_chinese.txt | 4 +--- src/lang/slovak.txt | 1 + src/lang/slovenian.txt | 1 + src/lang/spanish.txt | 4 +--- src/lang/spanish_MX.txt | 4 +--- src/lang/swedish.txt | 4 +--- src/lang/tamil.txt | 1 + src/lang/thai.txt | 1 + src/lang/traditional_chinese.txt | 4 +--- src/lang/turkish.txt | 1 + src/lang/ukrainian.txt | 4 +--- src/lang/urdu.txt | 1 + src/lang/vietnamese.txt | 4 +--- src/lang/welsh.txt | 4 +--- 65 files changed, 107 insertions(+), 113 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 241d1081e4..7fabeb8ad4 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -2383,6 +2383,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Bou 'n s + STR_STATION_CLASS_DFLT :Verstek stasie STR_STATION_CLASS_WAYP :Roetebakens diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index e0cce46e66..45a0154c34 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -2288,10 +2288,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :الضواحي STR_HOUSE_PICKER_CLASS_ZONE4 :الضواحي الداخلية STR_HOUSE_PICKER_CLASS_ZONE5 :مركز المدينة -STR_HOUSE_PICKER_PROTECT_TITLE :منع الترقيات STR_HOUSE_PICKER_PROTECT_TOOLTIP :اختر ما اذا كان هذا المنزل محمي من الاستبدال مع نمو المدينة -STR_HOUSE_PICKER_PROTECT_OFF :ايقاف -STR_HOUSE_PICKER_PROTECT_ON :تفعيل + STR_STATION_CLASS_DFLT :المحطة القياسية STR_STATION_CLASS_WAYP :نقطة عبور diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 7b85fa480d..3ed0960e6f 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -2263,6 +2263,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Geltokia + STR_STATION_CLASS_DFLT :Geltoki lehenetsia STR_STATION_CLASS_WAYP :Bidepuntuak diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 63cc08ed68..47bc36c863 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -3100,6 +3100,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Пабу + STR_STATION_CLASS_DFLT :Стандартная станцыя STR_STATION_CLASS_DFLT_STATION :Стандартная чыг. станцыя STR_STATION_CLASS_DFLT_ROADSTOP :Стандартны прыпынак diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index d17d1afdb6..17b6085590 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1091,6 +1091,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Marque esta cai STR_GAME_OPTIONS_GUI_FONT_SPRITE :Usar a fonte fixa tradicional STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Marque esta caixa se preferir usar o tipo de fonte tradicional de tamanho fixo +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Usar fonte padrão +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Marque esta opção para usar a fonte padrão em vez das fontes alternativas encontradas no sistema STR_GAME_OPTIONS_GUI_FONT_AA :Fontes com contornos suaves STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Marque esta caixa para usar fontes redimensionáveis com contornos suaves @@ -2879,10 +2881,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Periferia Dista STR_HOUSE_PICKER_CLASS_ZONE4 :Periferia Próxima STR_HOUSE_PICKER_CLASS_ZONE5 :Centro da cidade -STR_HOUSE_PICKER_PROTECT_TITLE :Não permitir atualizações STR_HOUSE_PICKER_PROTECT_TOOLTIP :Escolher se essa casa será protegida contra substituição quando a cidade crescer -STR_HOUSE_PICKER_PROTECT_OFF :Desativado -STR_HOUSE_PICKER_PROTECT_ON :Ativado + STR_STATION_CLASS_DFLT :Padrão STR_STATION_CLASS_DFLT_STATION :Estação padrão diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index f71f834857..e11a07a12b 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -2823,6 +2823,7 @@ STR_HOUSE_PICKER_CLASS_ZONE4 :Вътрешн STR_HOUSE_PICKER_CLASS_ZONE5 :Градски център + STR_STATION_CLASS_DFLT :Станция по подразбиране STR_STATION_CLASS_DFLT_STATION :Товарна станция по подразбиране STR_STATION_CLASS_DFLT_ROADSTOP :Спирка по подразбиране diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index bb38676de2..bcf5d1c51a 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -313,6 +313,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}Activant STR_BUTTON_DEFAULT :{BLACK}Predeterminat STR_BUTTON_CANCEL :{BLACK}Cancel·la STR_BUTTON_OK :{BLACK}D'acord +STR_BUTTON_MOVE :{BLACK}Mou # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-= qwertyuiop[]asdfghjkl;'#\zxcvbnm,./ . @@ -1090,6 +1091,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Marqueu aquesta STR_GAME_OPTIONS_GUI_FONT_SPRITE :Fes servir la font tradicional STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Marqueu aquesta casella si preferiu fer servir la font tradicional de mida fixa i pixelada. +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Prefereix la font per defecte +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Marqueu aquesta casella si preferiu fer servir la font tradicional abans que les fonts alternatives trobades. STR_GAME_OPTIONS_GUI_FONT_AA :Aplica anti-àlies a les fonts STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Marqueu aquesta casella per a fer servir tècniques d'anti-àlies a les fonts redimensionables. @@ -2862,15 +2865,15 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Trieu quina zon STR_PICKER_HOUSE_TYPE_TOOLTIP :Trieu quin tipus de casa construir. Amb Ctrl+clic, s'afegeix o es trau l'element de la llista de desats. STR_HOUSE_PICKER_CAPTION :Selecció de cases -STR_HOUSE_PICKER_NAME :{BLACK}Nom: {ORANGE}{STRING} -STR_HOUSE_PICKER_POPULATION :{BLACK}Habitants: {ORANGE}{NUM} -STR_HOUSE_PICKER_YEARS :{BLACK}Anys: {ORANGE}{NUM}-{NUM} -STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anys: {ORANGE}Qualssevol -STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anys: {ORANGE}De {NUM} -STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anys: {ORANGE}Fins al {NUM} -STR_HOUSE_PICKER_SIZE :{BLACK}Mida: {ORANGE}{NUM}x{NUM} caselles -STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Càrrega acceptada: {ORANGE} -STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Càrrega produïda: {ORANGE}{CARGO_LIST} +STR_HOUSE_PICKER_NAME :{BLACK}Nom: {GOLD}{STRING} +STR_HOUSE_PICKER_POPULATION :{BLACK}Habitants: {GOLD}{NUM} +STR_HOUSE_PICKER_YEARS :{BLACK}Anys: {GOLD}{NUM}-{NUM} +STR_HOUSE_PICKER_YEARS_ANY :{BLACK}Anys: {GOLD}Qualssevol +STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Anys: {GOLD}De {NUM} +STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Anys: {GOLD}Fins al {NUM} +STR_HOUSE_PICKER_SIZE :{BLACK}Mida: {GOLD}{NUM}x{NUM} caselles +STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Càrrega acceptada: {GOLD} +STR_HOUSE_PICKER_CARGO_PRODUCED :{BLACK}Càrrega produïda: {GOLD}{CARGO_LIST} STR_HOUSE_PICKER_CLASS_ZONE1 :Vora STR_HOUSE_PICKER_CLASS_ZONE2 :Afores @@ -2878,10 +2881,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Suburbi exterio STR_HOUSE_PICKER_CLASS_ZONE4 :Suburbi interior STR_HOUSE_PICKER_CLASS_ZONE5 :Centre de la població -STR_HOUSE_PICKER_PROTECT_TITLE :Evita les millores STR_HOUSE_PICKER_PROTECT_TOOLTIP :Escolliu si aquesta casa s'ha de protegir i evitar que es reemplaci quan creixi la població. -STR_HOUSE_PICKER_PROTECT_OFF :Desactivat -STR_HOUSE_PICKER_PROTECT_ON :Activat + STR_STATION_CLASS_DFLT :Per defecte STR_STATION_CLASS_DFLT_STATION :Estació per defecte @@ -3905,12 +3906,14 @@ STR_CARGO_RATING_EXCELLENT :Excel·lent STR_CARGO_RATING_OUTSTANDING :Excepcional STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc de l'estació. Amb Ctrl+clic, s'obre una vista al lloc de l'estació. +STR_STATION_VIEW_EDIT_TOOLTIP :{BLACK}Canvia el nom de l'estació o mou-ne el senyal. STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostra tots els trens que tinguin aquesta estació en el seu itinerari STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostra tots els vehicles que tinguin aquesta estació en el seu itinerari STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostra tots els avions que tinguin aquest aeroport en el seu itinerari STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Mostra tots els vaixells que tinguin aquest port en el seu itinerari +STR_STATION_VIEW_EDIT_STATION_SIGN :{WHITE}Edita el senyal de l'estació STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Tanca l'aeroport STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita que els avions aterrin en aquest aeroport @@ -3918,9 +3921,11 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Evita qu # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal al lloc del punt de pas. Amb Ctrl+clic, s'obre una vista al lloc del punt de pas. +STR_WAYPOINT_VIEW_EDIT_TOOLTIP :{BLACK}Canvia el nom del punt de pas o mou-ne el senyal. STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centra la vista principal en la boia. Amb Ctrl+clic, s'obre una vista centrada a la boia. STR_BUOY_VIEW_RENAME_TOOLTIP :{BLACK}Canvia el nom de la boia +STR_WAYPOINT_VIEW_EDIT_WAYPOINT_SIGN :{WHITE}Edita el senyal del punt de pas # Finances window STR_FINANCES_CAPTION :{WHITE}Finances de {COMPANY} {BLACK}{COMPANY_NUM} @@ -5134,6 +5139,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_CAN_T_MOVE_STATION_NAME :{WHITE}El senyal de l'estació no es pot moure... 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 @@ -5165,6 +5171,7 @@ STR_ERROR_CAN_T_BUILD_RAIL_WAYPOINT :{WHITE}Aquí no STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Aquí no es pot construir un punt de pas de carretera... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Aquí no es pot situar una boia... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}No es pot canviar el nom del punt de pas... +STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME :{WHITE}El senyal del punt de pas no es pot moure... STR_ERROR_CAN_T_REMOVE_RAIL_WAYPOINT :{WHITE}Aquí no es pot treure un punt de pas de tren... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Aquí no es pot traure cap punt de pas de carretera... diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index e964b7876a..a002a1b8a0 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -1067,6 +1067,7 @@ STR_CONTENT_DETAIL_VERSION :{SILVER}Вер + # Signal window # Bridge selection window diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index d5212f9cc1..25b592a12b 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -2526,6 +2526,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Napravi + STR_STATION_CLASS_DFLT :Zadana postaja STR_STATION_CLASS_WAYP :Čvorišta diff --git a/src/lang/czech.txt b/src/lang/czech.txt index e9ad64e89d..a2313eecff 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -2916,10 +2916,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Vnější před STR_HOUSE_PICKER_CLASS_ZONE4 :Vnitní předměstí STR_HOUSE_PICKER_CLASS_ZONE5 :Centrum města -STR_HOUSE_PICKER_PROTECT_TITLE :Zabránit vylepšování STR_HOUSE_PICKER_PROTECT_TOOLTIP :Vyber, zdali bude tento dům chráněn před nahrazením, jak se bude město rozrůstat -STR_HOUSE_PICKER_PROTECT_OFF :Vypnuto -STR_HOUSE_PICKER_PROTECT_ON :Zapnuto + STR_STATION_CLASS_DFLT :Původní STR_STATION_CLASS_DFLT_STATION :Původní stanice diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 1ab7756ad7..c1d6a12e59 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -2875,10 +2875,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Ydre Forstæder STR_HOUSE_PICKER_CLASS_ZONE4 :Indre Forstæder STR_HOUSE_PICKER_CLASS_ZONE5 :Bymidte -STR_HOUSE_PICKER_PROTECT_TITLE :Forhindre opgraderinger STR_HOUSE_PICKER_PROTECT_TOOLTIP :Vælg om dette hus skal beskyttes mod udskiftning i takt med at byen vokser -STR_HOUSE_PICKER_PROTECT_OFF :Slukket -STR_HOUSE_PICKER_PROTECT_ON :tændt + STR_STATION_CLASS_DFLT :Standard station STR_STATION_CLASS_DFLT_STATION :Standard station diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 8728600acc..db58750ffe 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2877,10 +2877,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Buitenste voors STR_HOUSE_PICKER_CLASS_ZONE4 :Binnenste voorsteden STR_HOUSE_PICKER_CLASS_ZONE5 :Stadscentrum -STR_HOUSE_PICKER_PROTECT_TITLE :Opwaarderen voorkomen STR_HOUSE_PICKER_PROTECT_TOOLTIP :Kies of dit huis wordt beschermd tegen vervangen als de stad groeit -STR_HOUSE_PICKER_PROTECT_OFF :Uit -STR_HOUSE_PICKER_PROTECT_ON :Aan + STR_STATION_CLASS_DFLT :Standaard STR_STATION_CLASS_DFLT_STATION :Standaard station diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 6d2b3e8588..771c31ea7f 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1090,6 +1090,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Check this box STR_GAME_OPTIONS_GUI_FONT_SPRITE :Use traditional sprite font STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Check this box if you prefer to use the traditional fixed-size sprite font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Prefer default font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Check this box if you prefer to use the default font over discovered fallback fonts STR_GAME_OPTIONS_GUI_FONT_AA :Anti-alias fonts STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Check this box to anti-alias resizable fonts @@ -2878,10 +2880,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Outer Suburbs STR_HOUSE_PICKER_CLASS_ZONE4 :Inner Suburbs STR_HOUSE_PICKER_CLASS_ZONE5 :Town centre -STR_HOUSE_PICKER_PROTECT_TITLE :Prevent upgrades STR_HOUSE_PICKER_PROTECT_TOOLTIP :Choose whether this house will be protected from replacement as the town grows -STR_HOUSE_PICKER_PROTECT_OFF :Off -STR_HOUSE_PICKER_PROTECT_ON :On + STR_STATION_CLASS_DFLT :Default STR_STATION_CLASS_DFLT_STATION :Default station diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 787ada1ba9..98026e3f34 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1090,6 +1090,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Check this box STR_GAME_OPTIONS_GUI_FONT_SPRITE :Use traditional sprite font STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Check this box if you prefer to use the traditional fixed-size sprite font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Prefer default font +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Check this box if you prefer to use the default font over discovered fallback fonts STR_GAME_OPTIONS_GUI_FONT_AA :Anti-alias fonts STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Check this box to anti-alias resizable fonts @@ -2878,10 +2880,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Outer Suburbs STR_HOUSE_PICKER_CLASS_ZONE4 :Inner Suburbs STR_HOUSE_PICKER_CLASS_ZONE5 :Town center -STR_HOUSE_PICKER_PROTECT_TITLE :Prevent upgrades STR_HOUSE_PICKER_PROTECT_TOOLTIP :Choose whether this house will be protected from replacement as the town grows -STR_HOUSE_PICKER_PROTECT_OFF :Off -STR_HOUSE_PICKER_PROTECT_ON :On + STR_STATION_CLASS_DFLT :Default STR_STATION_CLASS_DFLT_STATION :Default station diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index eb9366c4dc..5ec8bc2e05 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -2742,6 +2742,7 @@ STR_HOUSE_PICKER_CLASS_ZONE2 :Periferioj STR_HOUSE_PICKER_CLASS_ZONE3 :Eksteraj Antaŭurboj + STR_STATION_CLASS_DFLT :Defaŭlta STR_STATION_CLASS_DFLT_STATION :Defaŭlta stacio STR_STATION_CLASS_DFLT_ROADSTOP :Defaŭlta vojhaltejo diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 1d9eec28bd..2daebbfe10 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -2847,6 +2847,7 @@ STR_HOUSE_PICKER_CLASS_ZONE4 :Eeslinnad STR_HOUSE_PICKER_CLASS_ZONE5 :Kesklinn + STR_STATION_CLASS_DFLT :Vaikimisi STR_STATION_CLASS_DFLT_STATION :Vaikimisi jaam STR_STATION_CLASS_DFLT_ROADSTOP :Vaikimisi peatus diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index c211506433..dd208003a0 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -2163,6 +2163,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Bygg ein + STR_STATION_CLASS_DFLT :Vanlig støð STR_STATION_CLASS_WAYP :Waypoint diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 9a98c20ed2..e3ad12fa3e 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1090,6 +1090,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Valitse tämä STR_GAME_OPTIONS_GUI_FONT_SPRITE :Käytä perinteistä sprite-fonttia STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Valitse tämä ruutu käyttääksesi perinteistä kiinteäkokoista sprite-kirjasintyyppiä +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Suosi oletusfonttia +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Valitse tämä ruutu, jos haluat käyttää oletuskirjaintyyppiä löydettyjen varafonttien sijaan STR_GAME_OPTIONS_GUI_FONT_AA :Pehmennä kirjasinten reunoja STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Valitse tämä ruutu pehmentääksesi muuttuvan kokoisten fonttien reunoja @@ -2878,10 +2880,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Ulommat lähiö STR_HOUSE_PICKER_CLASS_ZONE4 :Sisemmät lähiöt STR_HOUSE_PICKER_CLASS_ZONE5 :Keskusta -STR_HOUSE_PICKER_PROTECT_TITLE :Estä uudistaminen STR_HOUSE_PICKER_PROTECT_TOOLTIP :Valitse, suojataanko tämä talo korvaamiselta kunnan kasvaessa -STR_HOUSE_PICKER_PROTECT_OFF :Ei -STR_HOUSE_PICKER_PROTECT_ON :Kyllä + STR_STATION_CLASS_DFLT :Oletus STR_STATION_CLASS_DFLT_STATION :Oletusasema diff --git a/src/lang/french.txt b/src/lang/french.txt index c4ec474cf8..5b65c3e7eb 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -2878,10 +2878,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Banlieue extér STR_HOUSE_PICKER_CLASS_ZONE4 :Banlieue intérieure STR_HOUSE_PICKER_CLASS_ZONE5 :Centre-ville -STR_HOUSE_PICKER_PROTECT_TITLE :Empêcher les améliorations STR_HOUSE_PICKER_PROTECT_TOOLTIP :Définit si cette maison sera protégée contre son remplacement lors de la croissance de la ville -STR_HOUSE_PICKER_PROTECT_OFF :Désactivé -STR_HOUSE_PICKER_PROTECT_ON :Activé + STR_STATION_CLASS_DFLT :Par défaut STR_STATION_CLASS_DFLT_STATION :Stations par défaut diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 11570d8045..dc68bcbf2f 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -2264,6 +2264,7 @@ STR_STATION_BUILD_DRAG_DROP :Sleepe en los l + STR_STATION_CLASS_DFLT :Standert stasjon STR_STATION_CLASS_WAYP :Kontrôleposten diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 5bb1c50ed9..e6e6481f08 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -2565,6 +2565,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Tog stè + STR_STATION_CLASS_DFLT :Stèisean bunaiteach STR_STATION_CLASS_WAYP :Puingean-turais diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 935e6811cf..f1721df2ca 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -2879,10 +2879,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Suburbios da pe STR_HOUSE_PICKER_CLASS_ZONE4 :Suburbios interiores STR_HOUSE_PICKER_CLASS_ZONE5 :Centro da vila -STR_HOUSE_PICKER_PROTECT_TITLE :Evitar melloras STR_HOUSE_PICKER_PROTECT_TOOLTIP :Escolle se esta casa estará protexida do remprazo a medida que a vila medra -STR_HOUSE_PICKER_PROTECT_OFF :Desactivado -STR_HOUSE_PICKER_PROTECT_ON :Activado + STR_STATION_CLASS_DFLT :Por defecto STR_STATION_CLASS_DFLT_STATION :Estación por defecto diff --git a/src/lang/german.txt b/src/lang/german.txt index c96cb0d8b8..488d004456 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2879,10 +2879,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Äußere Vorort STR_HOUSE_PICKER_CLASS_ZONE4 :Innere Vororte STR_HOUSE_PICKER_CLASS_ZONE5 :Stadtmitte -STR_HOUSE_PICKER_PROTECT_TITLE :Aufwertungen verhindern STR_HOUSE_PICKER_PROTECT_TOOLTIP :Auswählen, ob dieses Haus vor dem Ersetzen geschützt wird, wenn die Stadt wächst. -STR_HOUSE_PICKER_PROTECT_OFF :Aus -STR_HOUSE_PICKER_PROTECT_ON :An + STR_STATION_CLASS_DFLT :Standard STR_STATION_CLASS_DFLT_STATION :Standart-Haltestelle diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 0f077fa914..e6752f439e 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1183,6 +1183,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Τσεκάρε STR_GAME_OPTIONS_GUI_FONT_SPRITE :Χρήση παραδοσιακής γραμματοσειράς STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Τσεκάρετε αυτό το κουτάκι εάν προτιμάτε να χρησιμοποιήσετε την παραδοσιακή γραμματοσειρά σταθερού μεγέθους +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Προτίμησε την προεπιλεγμένη γραμματοσειρά +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Επιλέξτε αυτό το πλαίσιο αν προτιμάτε να χρησιμοποιήσετε την προεπιλεγμένη γραμματοσειρά αντί για τις ανακαλυφθείσες εφεδρικές γραμματοσειρές STR_GAME_OPTIONS_GUI_FONT_AA :Εξομάλυνση εμφάνισης γραμματοσειράς STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Τσεκάρετε αυτό το κουτάκι για εξομάλυνση εμφάνισης γραμματοσειράς μεταβλητού μεγέθους @@ -2971,10 +2973,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Εξωτερι STR_HOUSE_PICKER_CLASS_ZONE4 :Εσωτερικά Προάστια STR_HOUSE_PICKER_CLASS_ZONE5 :Κέντρο της πόλης -STR_HOUSE_PICKER_PROTECT_TITLE :Αποτροπή αναβαθμίσεων STR_HOUSE_PICKER_PROTECT_TOOLTIP :Επιλέξτε αν αυτό το σπίτι θα προστατεύεται από αντικατάσταση καθώς η πόλη μεγαλώνει -STR_HOUSE_PICKER_PROTECT_OFF :Ανενεργό -STR_HOUSE_PICKER_PROTECT_ON :Ενεργό + STR_STATION_CLASS_DFLT :Προεπιλεγμένος STR_STATION_CLASS_DFLT_STATION :Προεπιλεγμένος σταθμός diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 22d17c8d76..e10378a46b 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -2549,6 +2549,7 @@ STR_PICKER_MODE_SAVED_TOOLTIP :החלף הצג + STR_STATION_CLASS_DFLT :ברירת מחדל STR_STATION_CLASS_DFLT_STATION :תחנת ברירת מחדל STR_STATION_CLASS_DFLT_ROADSTOP :תחנת ברירת מחדל diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 918ff2c92f..af43909f58 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -885,6 +885,7 @@ STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}अक + STR_STATION_CLASS_DFLT :मानक स्टेशन STR_STATION_CLASS_WAYP :पथ-संकेत diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index d97565b593..65bfaf9d07 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -2942,10 +2942,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Külső kertvá STR_HOUSE_PICKER_CLASS_ZONE4 :Belső kertváros STR_HOUSE_PICKER_CLASS_ZONE5 :Városközpont -STR_HOUSE_PICKER_PROTECT_TITLE :Frissítések megelőzése STR_HOUSE_PICKER_PROTECT_TOOLTIP :Válaszd ki, hogy a város növekedésével ez a ház védve legyen-e a cserétől -STR_HOUSE_PICKER_PROTECT_OFF :Ki -STR_HOUSE_PICKER_PROTECT_ON :Be + STR_STATION_CLASS_DFLT :Alapértelmezett STR_STATION_CLASS_DFLT_STATION :Alapértelmezett állomás diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 594d023a79..fdc0a912a8 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -2214,6 +2214,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Byggja l + STR_STATION_CLASS_DFLT :Sjálfgefin stöð STR_STATION_CLASS_WAYP :Millistöð diff --git a/src/lang/ido.txt b/src/lang/ido.txt index a94cfda45d..c2ccca33ad 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -963,6 +963,7 @@ STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Aceptas: + # Signal window # Bridge selection window diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 2499f83d64..2ac2b2c018 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -2717,6 +2717,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Membangu + STR_STATION_CLASS_DFLT :Standar STR_STATION_CLASS_DFLT_STATION :Stasiun standar STR_STATION_CLASS_DFLT_ROADSTOP :Pemberhentian jalan standar diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 9b35e39417..20fae506b5 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -2538,6 +2538,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Tóg st + STR_STATION_CLASS_DFLT :Stáisiún réamhshocraithe STR_STATION_CLASS_WAYP :Pointí bealaigh diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 2c0b7afa19..cf19be9b49 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -2886,6 +2886,7 @@ STR_HOUSE_PICKER_CLASS_ZONE4 :Sobborghi inter STR_HOUSE_PICKER_CLASS_ZONE5 :Centro città + STR_STATION_CLASS_DFLT :Predefinita STR_STATION_CLASS_DFLT_STATION :Stazione predefinita STR_STATION_CLASS_DFLT_ROADSTOP :Fermata stradale predefinita diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 96c1985476..fe15ba8792 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -2657,6 +2657,7 @@ STR_PICKER_MODE_ALL :すべて + STR_STATION_CLASS_DFLT :標準駅 STR_STATION_CLASS_WAYP :中継駅 diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 4112fe2f0a..9cf523b305 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2879,10 +2879,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :바깥쪽 시 STR_HOUSE_PICKER_CLASS_ZONE4 :안쪽 시내 STR_HOUSE_PICKER_CLASS_ZONE5 :도시 중심 -STR_HOUSE_PICKER_PROTECT_TITLE :업그레이드 방지 STR_HOUSE_PICKER_PROTECT_TOOLTIP :이 건물이 도시가 성장함에 따라 교체되는 것을 막을지 여부를 선택합니다 -STR_HOUSE_PICKER_PROTECT_OFF :끄기 -STR_HOUSE_PICKER_PROTECT_ON :켜기 + STR_STATION_CLASS_DFLT :기본 STR_STATION_CLASS_DFLT_STATION :기본 역 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 495e4f4586..0dff47f786 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -2570,6 +2570,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Struere + STR_STATION_CLASS_DFLT :Statio solita STR_STATION_CLASS_WAYP :Interloci diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index acb8a53ba5..18d52c383c 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -2879,10 +2879,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Ārējās priek STR_HOUSE_PICKER_CLASS_ZONE4 :Iekšējās priekšpilsētas STR_HOUSE_PICKER_CLASS_ZONE5 :Pilsētas centrs -STR_HOUSE_PICKER_PROTECT_TITLE :Novērst uzlabojumus STR_HOUSE_PICKER_PROTECT_TOOLTIP :Izvēlieties, vai šī māja tiks aizsargāta pret nomaiņu, pilsētai augot -STR_HOUSE_PICKER_PROTECT_OFF :Izslēgts -STR_HOUSE_PICKER_PROTECT_ON :Ieslēgts + STR_STATION_CLASS_DFLT :Noklusējuma STR_STATION_CLASS_DFLT_STATION :Noklusējuma stacija diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index e4f09b3baa..0408675eeb 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -2935,6 +2935,7 @@ STR_PICKER_MODE_ALL :Visi STR_HOUSE_PICKER_CLASS_ZONE1 :Kraštas + STR_STATION_CLASS_DFLT :Numatytoji STR_STATION_CLASS_DFLT_STATION :Numatytoji stotelė STR_STATION_CLASS_DFLT_ROADSTOP :Numatytoji kelio stotelė diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index c01468dcca..90ab2d7976 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -2878,10 +2878,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Aner Viruerter STR_HOUSE_PICKER_CLASS_ZONE4 :Bannescht Viruerter STR_HOUSE_PICKER_CLASS_ZONE5 :Stadzentrum -STR_HOUSE_PICKER_PROTECT_TITLE :Upgrades verhënneren STR_HOUSE_PICKER_PROTECT_TOOLTIP :Wiel aus ob dëst Haus firun engem Ersetze geschützt gëtt wann d'Stad wiisst -STR_HOUSE_PICKER_PROTECT_OFF :Aus -STR_HOUSE_PICKER_PROTECT_ON :Un + STR_STATION_CLASS_DFLT :Standard STR_STATION_CLASS_DFLT_STATION :Standardstatioun diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 4b2f9cbabf..2ed3b9fd8a 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1304,6 +1304,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Изгр + # Signal window STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Влез сигнализација (електрика){}Зелено е се додека има барем еден зелен излез-сигнал во продолжението на траката, во спротивно е црвено. STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Излез Сигнализација (електрика){}Се однесува на ист начин како блок-сигналот, но потребно е да ја има точната боја на влезен и комбо пресигнал. diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 1389312e48..397fcb8bce 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -2110,6 +2110,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Bina ste + STR_STATION_CLASS_DFLT :Stesen lazim STR_STATION_CLASS_WAYP :Tandatuju diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 2ef8f2b525..06017ea97c 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -892,6 +892,7 @@ STR_NETWORK_SERVER_MESSAGE :*** {STRING} + # Signal window # Bridge selection window diff --git a/src/lang/maori.txt b/src/lang/maori.txt index 86c009de0c..52baee704e 100644 --- a/src/lang/maori.txt +++ b/src/lang/maori.txt @@ -2877,10 +2877,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Paenoho Waho STR_HOUSE_PICKER_CLASS_ZONE4 :Paenoho Roto STR_HOUSE_PICKER_CLASS_ZONE5 :Pokapū Tāone -STR_HOUSE_PICKER_PROTECT_TITLE :Āraia ngā whakamohoa STR_HOUSE_PICKER_PROTECT_TOOLTIP :Kōwhiria mehemea ka tiakina tēnei whare kei whakakapi ina tupu ake te tāone -STR_HOUSE_PICKER_PROTECT_OFF :Poko -STR_HOUSE_PICKER_PROTECT_ON :Kā + STR_STATION_CLASS_DFLT :Taunoa STR_STATION_CLASS_DFLT_STATION :Teihana taunoa diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index ae4d024745..b00b579f52 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -1198,6 +1198,7 @@ STR_NETWORK_SERVER_MESSAGE :*** {STRING} + # Signal window # Bridge selection window diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index fcfe0bedfa..370cb5bf9c 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2880,10 +2880,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Ytre forsteder STR_HOUSE_PICKER_CLASS_ZONE4 :Indre forsteder STR_HOUSE_PICKER_CLASS_ZONE5 :Bysentrum -STR_HOUSE_PICKER_PROTECT_TITLE :Forhindre oppgraderinger STR_HOUSE_PICKER_PROTECT_TOOLTIP :Velg hvorvidt dette huset skal være beskyttet mot å bli byttet ut når byen vokser -STR_HOUSE_PICKER_PROTECT_OFF :Av -STR_HOUSE_PICKER_PROTECT_ON :På + STR_STATION_CLASS_DFLT :Standard STR_STATION_CLASS_DFLT_STATION :Standard stasjon diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 92f59251aa..f4dc777297 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -2286,6 +2286,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Bygg sta + STR_STATION_CLASS_DFLT :Standard stasjon STR_STATION_CLASS_WAYP :Kontrollpunkt diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 9863fe09f7..20607b8661 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -2309,10 +2309,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :حومه‌ها STR_HOUSE_PICKER_CLASS_ZONE4 :حومه‌های داخلی STR_HOUSE_PICKER_CLASS_ZONE5 :مرکز شهر -STR_HOUSE_PICKER_PROTECT_TITLE :جلوگیری از ارتقا STR_HOUSE_PICKER_PROTECT_TOOLTIP :انتخاب کنید که آیا این خانه با رشد شهر از جایگزینی در امان خواهد بود یا خیر -STR_HOUSE_PICKER_PROTECT_OFF :خاموش -STR_HOUSE_PICKER_PROTECT_ON :روشن + STR_STATION_CLASS_DFLT :ایستگاه پیش فرض STR_STATION_CLASS_WAYP :نقطه مسیر ها diff --git a/src/lang/polish.txt b/src/lang/polish.txt index ec35667743..f6b7659dd7 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -1470,6 +1470,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Zaznacz to pole STR_GAME_OPTIONS_GUI_FONT_SPRITE :Użyj tradycyjnego fonta typu sprite STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Zaznacz to pole, jeśli wolisz używać tradycyjnego fonta typu sprite o stałym rozmiarze +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Preferuj font domyślny +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Zaznacz to pole, jeśli wolisz używać fontu domyślnego zamiast wykrytych fontów zastępczych STR_GAME_OPTIONS_GUI_FONT_AA :Wygładzanie fontów STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Zaznacz to pole, aby wygładzać fonty o zmiennym rozmiarze @@ -3258,10 +3260,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Przedmieścia z STR_HOUSE_PICKER_CLASS_ZONE4 :Przedmieścia wewnętrzne STR_HOUSE_PICKER_CLASS_ZONE5 :Centrum miasta -STR_HOUSE_PICKER_PROTECT_TITLE :Zapobieganie modernizacji STR_HOUSE_PICKER_PROTECT_TOOLTIP :Określ, czy ten budynek ma być chroniony przed zastąpieniem w miarę rozwoju miasta -STR_HOUSE_PICKER_PROTECT_OFF :Wył. -STR_HOUSE_PICKER_PROTECT_ON :Wł. + STR_STATION_CLASS_DFLT :Standardowa STR_STATION_CLASS_DFLT_STATION :Standardowa stacja diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index ed598c463d..ad57f530af 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1087,10 +1087,12 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO :Detetar automat STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :Marque esta opção para detetar automaticamente o tamanho do interface STR_GAME_OPTIONS_GUI_SCALE_BEVELS :Escalar rebordos -STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Marque esta opção para dimensionar os chanfros por tamanho de interface +STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Marque esta opção para dimensionar os rebordos das janelas em relação ao tamanho da interface STR_GAME_OPTIONS_GUI_FONT_SPRITE :Usar o tipo de letra com gráficos tradicionais STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Marque esta opção se prefere usar o tipo de letra tradicional de tamanho fixo +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Preferir tipo de letra padrão +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Marque esta opção se prefere usar o tipo de letra padrão em vez os tipos de letra alternativos encontrados no seu sistema. STR_GAME_OPTIONS_GUI_FONT_AA :Tipos de letra com contornos suaves STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Marque esta opção para tipos de letra redimensionáveis com contornos suaves @@ -2254,7 +2256,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecion STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Abrir tabela de classificações -STR_INTRO_TOOLTIP_HELP :{BLACK}Obter acesso a documentação e recursos online +STR_INTRO_TOOLTIP_HELP :{BLACK}Aceder a documentação e outros recursos online STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Verificar conteúdo novo e atualizado para descarga STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' @@ -2676,9 +2678,9 @@ STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Clique n STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Selecionar tudo STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo para ser descarregado STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Sel. atualizações -STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo que seja atualização ao conteúdo existente a ser descarregado +STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Marcar para descarregar todo o conteúdo que seja uma atualização ao conteúdo já presente no seu sistema STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Desselecionar tudo -STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Marcar todo o conteúdo que não deva ser descarregado +STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Desmarcar todo o conteúdo selecionado STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Pesquisar em páginas externas STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Escolher conteúdo não disponível no serviço de conteúdo do OpenTTD em páginas não associadas ao OpenTTD STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Está a sair do OpenTTD! @@ -2879,10 +2881,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Subúrbios Peri STR_HOUSE_PICKER_CLASS_ZONE4 :Subúrbios Centrais STR_HOUSE_PICKER_CLASS_ZONE5 :Centro da localidade -STR_HOUSE_PICKER_PROTECT_TITLE :Impedir atualizações STR_HOUSE_PICKER_PROTECT_TOOLTIP :Escolha se esta casa será protegida contra a substituição à medida que localidade cresce -STR_HOUSE_PICKER_PROTECT_OFF :Desativado -STR_HOUSE_PICKER_PROTECT_ON :Ativado + STR_STATION_CLASS_DFLT :Padrão STR_STATION_CLASS_DFLT_STATION :Estação padrão @@ -4950,13 +4950,13 @@ STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING} STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Recuar no histórico de navegação STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Avançar no histórico de navegação STR_TEXTFILE_WRAP_TEXT :{WHITE}Envolver o texto -STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Envolve o texto da janela de forma que não é necessário deslizar listagem +STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Envolve o texto da janela de forma em que não seja necessário deslizar o conteúdo na horizontal STR_TEXTFILE_VIEW_README :{BLACK}Leia-me -STR_TEXTFILE_VIEW_README_TOOLTIP :Ver 'Leia-me' para este conteúdo +STR_TEXTFILE_VIEW_README_TOOLTIP :Ver 'Leia-me' deste conteúdo STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Lista de alterações -STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Ver o registo de alterações para este conteúdo +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Ver o registo de alterações deste conteúdo STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licença -STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Ver a licença para este conteúdo +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Ver a licença deste conteúdo ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}Leiame {STRING} de {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}Lista de alterações {STRING} de {STRING} diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 7bce57d4e8..b69f78c5c6 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -2833,10 +2833,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Suburbiile peri STR_HOUSE_PICKER_CLASS_ZONE4 :Suburbiile urbane STR_HOUSE_PICKER_CLASS_ZONE5 :Centrul orașului -STR_HOUSE_PICKER_PROTECT_TITLE :Preveniți upgrade-urile STR_HOUSE_PICKER_PROTECT_TOOLTIP :Alege dacă această casă va fi protejată împotriva înlocuirii pe măsură ce orașul crește -STR_HOUSE_PICKER_PROTECT_OFF :Oprit -STR_HOUSE_PICKER_PROTECT_ON :Pornit + STR_STATION_CLASS_DFLT :Implicită STR_STATION_CLASS_DFLT_STATION :Stație implicită diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 5bb2e66611..af72c9eb6c 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1235,6 +1235,8 @@ STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :Масштаб STR_GAME_OPTIONS_GUI_FONT_SPRITE :Использовать растровый шрифт STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :Включить/отключить использование классического растрового шрифта фиксированного размера +STR_GAME_OPTIONS_GUI_FONT_DEFAULT :Предпочитать шрифт по умолчанию +STR_GAME_OPTIONS_GUI_FONT_DEFAULT_TOOLTIP :Всегда использовать шрифт по умолчанию вместо динамически подгружаемых шрифтов при отображении символов, отсутствующих в текущем шрифте STR_GAME_OPTIONS_GUI_FONT_AA :Сглаживание шрифтов STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :Включить/отключить сглаживание масштабируемых шрифтов @@ -3049,10 +3051,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Перифер STR_HOUSE_PICKER_CLASS_ZONE4 :Центральные районы STR_HOUSE_PICKER_CLASS_ZONE5 :Центр -STR_HOUSE_PICKER_PROTECT_TITLE :Запрет улучшений STR_HOUSE_PICKER_PROTECT_TOOLTIP :Вы можете указать, что это здание нельзя заменять другим, несмотря на рост и расширение города. -STR_HOUSE_PICKER_PROTECT_OFF :отключён -STR_HOUSE_PICKER_PROTECT_ON :включён + STR_STATION_CLASS_DFLT :Стандартная станция STR_STATION_CLASS_DFLT_STATION :Стандартная ж/д станция diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 71c7e144e1..e5835e5a7b 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -2912,6 +2912,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Gradnja + STR_STATION_CLASS_DFLT :Podrazumevana stanica STR_STATION_CLASS_WAYP :Putanje diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 1fa10969fc..653915355e 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -2878,10 +2878,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :外郊区 STR_HOUSE_PICKER_CLASS_ZONE4 :内郊区 STR_HOUSE_PICKER_CLASS_ZONE5 :城镇中心 -STR_HOUSE_PICKER_PROTECT_TITLE :防止升级 STR_HOUSE_PICKER_PROTECT_TOOLTIP :选择是否保护房屋以防止房屋随着城镇发展被替换 -STR_HOUSE_PICKER_PROTECT_OFF :关闭 -STR_HOUSE_PICKER_PROTECT_ON :开启 + STR_STATION_CLASS_DFLT :默认 STR_STATION_CLASS_DFLT_STATION :默认车站 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 36628f4739..4d7fc0d3aa 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -2849,6 +2849,7 @@ STR_PICKER_HOUSE_CLASS_TOOLTIP :Zvoľ veľkosť STR_HOUSE_PICKER_CLASS_ZONE1 :Okraj + STR_STATION_CLASS_DFLT :Pôvodná STR_STATION_CLASS_DFLT_STATION :Predvolená stanica STR_STATION_CLASS_DFLT_ROADSTOP :Predvolená zastávka diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index f73345f6e3..2b2c463d4b 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -2509,6 +2509,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Zgradi p + STR_STATION_CLASS_DFLT :Privzeta postaja STR_STATION_CLASS_WAYP :Točke poti diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 00d8ed6738..aa1735ebb8 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -2847,10 +2847,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Suburbios exter STR_HOUSE_PICKER_CLASS_ZONE4 :Suburbios interiores STR_HOUSE_PICKER_CLASS_ZONE5 :Centro urbano -STR_HOUSE_PICKER_PROTECT_TITLE :Evitar mejoras STR_HOUSE_PICKER_PROTECT_TOOLTIP :Selecciona si esta casa estará protegida de reemplazos cuando el municipio crezca -STR_HOUSE_PICKER_PROTECT_OFF :No -STR_HOUSE_PICKER_PROTECT_ON :Sí + STR_STATION_CLASS_DFLT :Por defecto STR_STATION_CLASS_DFLT_STATION :Estación por defecto diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 7743adf742..217dc38dc0 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -2871,10 +2871,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Suburbios exter STR_HOUSE_PICKER_CLASS_ZONE4 :Suburbios interiores STR_HOUSE_PICKER_CLASS_ZONE5 :Centro -STR_HOUSE_PICKER_PROTECT_TITLE :Prevenir mejoras STR_HOUSE_PICKER_PROTECT_TOOLTIP :Optar por que el edificio no sea reemplazado cuando el pueblo crezca -STR_HOUSE_PICKER_PROTECT_OFF :No -STR_HOUSE_PICKER_PROTECT_ON :Sí + STR_STATION_CLASS_DFLT :por defecto STR_STATION_CLASS_DFLT_STATION :Estación por defecto diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 0dfbec3c64..ec3c882acd 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -2878,10 +2878,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Yttrerförorter STR_HOUSE_PICKER_CLASS_ZONE4 :Innerförorter STR_HOUSE_PICKER_CLASS_ZONE5 :Stadskärnan -STR_HOUSE_PICKER_PROTECT_TITLE :Förhindra uppgraderingar STR_HOUSE_PICKER_PROTECT_TOOLTIP :Välj huruvida detta hus ska skyddas från att ersättas i samband med att staden växer -STR_HOUSE_PICKER_PROTECT_OFF :Av -STR_HOUSE_PICKER_PROTECT_ON :På + STR_STATION_CLASS_DFLT :Original STR_STATION_CLASS_DFLT_STATION :Standardstation diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index d0fedf3dbf..f606038505 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -2542,6 +2542,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}இழ + STR_STATION_CLASS_DFLT :இயல்பிருப்பு STR_STATION_CLASS_DFLT_STATION :இயல்பிருப்பு நிலையம் STR_STATION_CLASS_DFLT_ROADSTOP :இயல்பிருப்பு சாலை நிறுத்தம் diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 49d3ff0d93..6409d9a165 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -2399,6 +2399,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}สร + STR_STATION_CLASS_DFLT :สถานีมาตรฐาน STR_STATION_CLASS_WAYP :จุดตรวจ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 719ee310fb..5733fb158a 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -2878,10 +2878,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :遠郊 STR_HOUSE_PICKER_CLASS_ZONE4 :近郊 STR_HOUSE_PICKER_CLASS_ZONE5 :市鎮中心 -STR_HOUSE_PICKER_PROTECT_TITLE :防止升級 STR_HOUSE_PICKER_PROTECT_TOOLTIP :選擇是否要保護房屋以免房屋隨著市鎮的發展而被替換 -STR_HOUSE_PICKER_PROTECT_OFF :關閉 -STR_HOUSE_PICKER_PROTECT_ON :開啟 + STR_STATION_CLASS_DFLT :預設 STR_STATION_CLASS_DFLT_STATION :預設車站 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index a396ffd3a1..5b8612f119 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2803,6 +2803,7 @@ STR_HOUSE_PICKER_CLASS_ZONE4 :İç banliyöle STR_HOUSE_PICKER_CLASS_ZONE5 :Şehir merkezi + STR_STATION_CLASS_DFLT :Varsayılan STR_STATION_CLASS_DFLT_STATION :Varsayılan istasyon STR_STATION_CLASS_DFLT_ROADSTOP :Varsayılan yol durağı diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 0b73966f85..fe5c589d21 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -2986,10 +2986,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Передмі STR_HOUSE_PICKER_CLASS_ZONE4 :Щільне передмістя STR_HOUSE_PICKER_CLASS_ZONE5 :Центр міста -STR_HOUSE_PICKER_PROTECT_TITLE :Захист від оновлень STR_HOUSE_PICKER_PROTECT_TOOLTIP :Укажіть, чи буде захищено цю будівлю від змін у разі зростання міста -STR_HOUSE_PICKER_PROTECT_OFF :вимкнено -STR_HOUSE_PICKER_PROTECT_ON :увімкнено + STR_STATION_CLASS_DFLT :Звичайна STR_STATION_CLASS_DFLT_STATION :Звичайна станція diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 12174a8b1b..4a957b0060 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1984,6 +1984,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}کھین + STR_STATION_CLASS_DFLT :طے شدہ اسٹیشن STR_STATION_CLASS_WAYP :گزرگاہیں diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index e80fb49fc2..8cd03d4aa6 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -2875,10 +2875,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Phía ngoài ng STR_HOUSE_PICKER_CLASS_ZONE4 :Phía trong ngoại ô STR_HOUSE_PICKER_CLASS_ZONE5 :Nội thành -STR_HOUSE_PICKER_PROTECT_TITLE :Ngăn chặn nâng cấp STR_HOUSE_PICKER_PROTECT_TOOLTIP :Chọn nếu ngôi nhà này có được bảo vệ khỏi việc bị thay thế hay không khi thị trấn phát triển -STR_HOUSE_PICKER_PROTECT_OFF :Tắt -STR_HOUSE_PICKER_PROTECT_ON :Bật + STR_STATION_CLASS_DFLT :Mặc định STR_STATION_CLASS_DFLT_STATION :Trạm mặc định diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 9d7d8ec871..4eee389e06 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -2863,10 +2863,8 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Maestrefi Allan STR_HOUSE_PICKER_CLASS_ZONE4 :Maestrefi Mewnol STR_HOUSE_PICKER_CLASS_ZONE5 :Canol y ddinas -STR_HOUSE_PICKER_PROTECT_TITLE :Atal uwchraddiadau STR_HOUSE_PICKER_PROTECT_TOOLTIP :Dewis a fydd y tŷ yma'n cael ei amddiffyn rhag disodli wrth i'r dref tyfu -STR_HOUSE_PICKER_PROTECT_OFF :I ffwrdd -STR_HOUSE_PICKER_PROTECT_ON :Ymlaen + STR_STATION_CLASS_DFLT :Rhagosodiad STR_STATION_CLASS_DFLT_STATION :Gorsaf rhagosodedig