1
0
Fork 0

Merge branch 'master' of https://github.com/tabytac/OpenTTD into intro-date

pull/14015/head
Tabytac 2025-04-17 16:30:11 +01:00
commit 92a4ea5c6b
13 changed files with 407 additions and 343 deletions

View File

@ -2022,7 +2022,7 @@ STR_CONFIG_SETTING_SOFT_LIMIT :Maksimālais lo
STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Atvērtu nepielipušo logu skaits, pirms tie tiek automātiski aizvērti lai atbrīvotu vietu jauniem logiem STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Atvērtu nepielipušo logu skaits, pirms tie tiek automātiski aizvērti lai atbrīvotu vietu jauniem logiem
STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :izslēgts STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Izslēgts
STR_CONFIG_SETTING_ZOOM_MIN :Maksimālais pietuvinājuma līmenis: {STRING} STR_CONFIG_SETTING_ZOOM_MIN :Maksimālais pietuvinājuma līmenis: {STRING}
STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Maksimālais pietuvinājuma līmenis skatvietām. Ir jāievēro ka paaugstinot pietuvinājuma līmeni, pieaug operatīvās atmiņas izlietojums STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Maksimālais pietuvinājuma līmenis skatvietām. Ir jāievēro ka paaugstinot pietuvinājuma līmeni, pieaug operatīvās atmiņas izlietojums

View File

@ -452,6 +452,12 @@ STR_SETTINGS_MENU_SANDBOX_OPTIONS :Sandbox Optioun
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparenz Optiounen STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Transparenz Optiounen
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stiednimm uweisen STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stiednimm uweisen
STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Statiounsnimm uweisen STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Statiounsnimm uweisen
STR_SETTINGS_MENU_STATION_NAMES_TRAIN :Garen
STR_SETTINGS_MENU_STATION_NAMES_LORRY :Camionsgaren
STR_SETTINGS_MENU_STATION_NAMES_BUS :Busarrêten
STR_SETTINGS_MENU_STATION_NAMES_SHIP :Hafen
STR_SETTINGS_MENU_STATION_NAMES_PLANE :Fluchhäfen
STR_SETTINGS_MENU_STATION_NAMES_GHOST :Geescht
STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Weepunktnimm uweisen STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :Weepunktnimm uweisen
STR_SETTINGS_MENU_SIGNS_DISPLAYED :Schëlder uweisen STR_SETTINGS_MENU_SIGNS_DISPLAYED :Schëlder uweisen
STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Géignerschëlder an Nimm uweisen STR_SETTINGS_MENU_SHOW_COMPETITOR_SIGNS :Géignerschëlder an Nimm uweisen
@ -1017,6 +1023,7 @@ STR_GAME_OPTIONS_CURRENCY_IDR :Indonesesch Rup
STR_GAME_OPTIONS_CURRENCY_MYR :Malaysesche Ringgit STR_GAME_OPTIONS_CURRENCY_MYR :Malaysesche Ringgit
STR_GAME_OPTIONS_CURRENCY_LVL :Lettesch Lat STR_GAME_OPTIONS_CURRENCY_LVL :Lettesch Lat
STR_GAME_OPTIONS_CURRENCY_PTE :Portugieseschen Escudo STR_GAME_OPTIONS_CURRENCY_PTE :Portugieseschen Escudo
STR_GAME_OPTIONS_CURRENCY_UAH :Ukrainesch Hryvnia
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autospäicheren STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autospäicheren
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Wiel den Intervall aus fir d'Autospäicherung STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Wiel den Intervall aus fir d'Autospäicherung
@ -1210,7 +1217,7 @@ STR_CITY_APPROVAL_TOLERANT :Tolerant
STR_CITY_APPROVAL_HOSTILE :Feindlech STR_CITY_APPROVAL_HOSTILE :Feindlech
STR_CITY_APPROVAL_PERMISSIVE :Fräizügeg (keng Auswierkung op Firmenactiounen) STR_CITY_APPROVAL_PERMISSIVE :Fräizügeg (keng Auswierkung op Firmenactiounen)
STR_WARNING_NO_SUITABLE_AI :{WHITE}Keng KI fonnt...{}KI kënnen iwwert den 'Online Content' system downgeload ginn STR_WARNING_NO_SUITABLE_AI :{WHITE}Keng KI fonnt...{}{}KI kënnen iwwert den 'Online Content' system downgeload ginn
# Settings tree window # Settings tree window
STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Astellungen STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Astellungen
@ -1923,7 +1930,8 @@ STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Nie
STR_CONFIG_SETTING_ECONOMY_TYPE :Wiertschaftstyp: {STRING} STR_CONFIG_SETTING_ECONOMY_TYPE :Wiertschaftstyp: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :"Glaat" suergt fir méi oft a kleng Produktiounsännerungen. "Agefruer" stoppt jeglech Ännerungen an der Wiertschaft an Industrieschléissungen. Dës Astellunge kinnten keen Afloss hunn, wann en NewGRF benotzt gëtt STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :"Glaat" suergt fir méi oft a kleng Produktiounsännerungen. "Agefruer" stoppt jeglech Ännerungen an der Wiertschaft an Industrieschléissungen. Dës Astellunge kinnten keen Afloss hunn, wann en NewGRF benotzt gëtt.{}{}Industrieproduktioun pro Mount kinnt nach emmer variabel ausgesinn wann d'Ekonomie agefruer ass, wëll d'Produktioun a fixen Intervalle ugefrot gëtt an dat net exakt de equivalent zu de Méint ass
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT_PERIOD :"Glaat" suergt fir méi oft a kleng Produktiounsännerungen. "Agefruer" stoppt jeglech Ännerungen an der Wiertschaft an Industrieschléissungen. Dës Astellunge kinnten keen Afloss hunn, wann en NewGRF benotzt gëtt.{}{}Industrieproduktioun pro Minut kinnt nach emmer variabel ausgesinn wann d'Ekonomie agefruer ass, wëll d'Produktioun a fixen Intervalle ugefrot gëtt an dat net exakt de equivalent zu Minuten ass
###length 3 ###length 3
STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Original
@ -1966,19 +1974,24 @@ STR_CONFIG_SETTING_TOWN_LAYOUT_RANDOM :Zoufälleg
STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Stied däerfen Stroossen bauen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_ROADS :Stied däerfen Stroossen bauen: {STRING}
STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Erlaabt Stied Stroossen ze bauen fir ze wuessen. Ausschalten fir d'Stiedréid dorun ze hënneren fir Stroossen selwer ze bauen STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Erlaabt Stied Stroossen ze bauen fir ze wuessen. Ausschalten fir d'Stiedréid dorun ze hënneren fir Stroossen selwer ze bauen
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Stied dierfe Barrière bauen: {STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Stied dierfe Barrière bauen: {STRING}
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Wann dës Astellung ugeschalt ass, kënnen Stied Stroossen iwwert Schinne bauen STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Wann dës Astellung ugeschalt ass, kënne Stied Stroossen iwwert Schinne bauen
STR_CONFIG_SETTING_NOISE_LEVEL :Limitéier de Bau vu Fluchhäfen geméiss dem Kaméidisniveau: {STRING} STR_CONFIG_SETTING_NOISE_LEVEL :Limitéier de Bau vu Fluchhäfen geméiss dem Kaméidisniveau: {STRING}
STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Erlaabt de Stied de Bau vu Fluchhäfen opgront vum Kaméidisniveau ze blockéiren, wat sech op d'Gréisst vun der Stad an d'Gréisst an Distanz vum Fluchhafe baséiert. Wann dat ausgeschalt ass, erlaabt d'Stad zwee Fluchhäfen ausser d'Gemengenastellung ass "Fräizügeg" STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Erlaabt de Stied de Bau vu Fluchhäfen opgront vum Kaméidisniveau ze blockéiren, wat sech op d'Gréisst vun der Stad an d'Gréisst an Distanz vum Fluchhafe baséiert. Wann dat ausgeschalt ass, erlaabt d'Stad zwee Fluchhäfen ausser d'Gemengenastellung ass "Fräizügeg"
STR_CONFIG_SETTING_TOWN_FOUNDING :Stiedgrënnung am Spill: {STRING} STR_CONFIG_SETTING_TOWN_FOUNDING :Stiedgrënnung am Spill: {STRING}
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Wann dës Astellung ugeschalt ass, kënnen Spiller nei Stied am Spill grënnen STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Wann dës Astellung ugeschalt ass, kënne Spiller nei Stied am Spill grënnen
###length 3 ###length 3
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Verbueden STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Verbueden
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Erlaabt STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Erlaabt
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Erlaabt, eegene Stad-Layout STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Erlaabt, eegene Stad-Layout
STR_CONFIG_SETTING_HOUSE_PLACER :Individuell Haiser plazéiren: {STRING}
STR_CONFIG_SETTING_HOUSE_PLACER_HELPTEXT :Wann des Astellung ugeschalt ass, kënne Spiller Haiser manuell plazéiren
###length 3 ###length 3
STR_CONFIG_SETTING_HOUSE_PLACER_FORBIDDEN :Verbueden
STR_CONFIG_SETTING_HOUSE_PLACER_ALLOWED :Erlabt
STR_CONFIG_SETTING_HOUSE_PLACER_FULLY_CONSTRUCTED :Erlabt, fäerdeg gebaut
STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Duerfwuerengeneratioun: {STRING} STR_CONFIG_SETTING_TOWN_CARGOGENMODE :Duerfwuerengeneratioun: {STRING}
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Wéivill Wuere produzéiert ginn, relativ zur Bevölkerung vum Duerf.{}Quadratesche Wuesstum: En duebel sou grousst Duerf, generéiert véier mol souvill Passagéier.{}Lineare Wuesstum: En duebel sou grousst Duerf, generéiert duebel souvill Passagéier STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :Wéivill Wuere produzéiert ginn, relativ zur Bevölkerung vum Duerf.{}Quadratesche Wuesstum: En duebel sou grousst Duerf, generéiert véier mol souvill Passagéier.{}Lineare Wuesstum: En duebel sou grousst Duerf, generéiert duebel souvill Passagéier
@ -2007,7 +2020,7 @@ STR_CONFIG_SETTING_SOFT_LIMIT :Maximal Unzuel
STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Unzuel un net-gepinnten openen Fënster befier al Fënsteren automatesch zougemaach ginn fir nei Plaz ze man fir nei Fënsteren STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :Unzuel un net-gepinnten openen Fënster befier al Fënsteren automatesch zougemaach ginn fir nei Plaz ze man fir nei Fënsteren
STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :ausgeschalt STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :Ausgeschalt
STR_CONFIG_SETTING_ZOOM_MIN :Maximale Razoom Level: {STRING} STR_CONFIG_SETTING_ZOOM_MIN :Maximale Razoom Level: {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_MIN_HELPTEXT :Maximal Razoomstuf fir Usiichtsfënsteren. Et gëtt méi Späicher gebraucht wann d'Stufen ze grouss ginn
@ -2192,7 +2205,7 @@ STR_INTRO_HIGHSCORE :{BLACK}Beschtel
STR_INTRO_HELP :{BLACK}Hëllef & Handbuch STR_INTRO_HELP :{BLACK}Hëllef & Handbuch
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Astellungen STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Astellungen
STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Astellungen STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF Astellungen
STR_INTRO_ONLINE_CONTENT :{BLACK}Check Online Inhalt STR_INTRO_ONLINE_CONTENT :{BLACK}Online Content
STR_INTRO_AI_SETTINGS :{BLACK}KI Astellungen STR_INTRO_AI_SETTINGS :{BLACK}KI Astellungen
STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Spillscriptastellungen STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Spillscriptastellungen
STR_INTRO_QUIT :{BLACK}Eraus STR_INTRO_QUIT :{BLACK}Eraus
@ -2241,6 +2254,7 @@ STR_HELP_WINDOW_README :{BLACK}Readme
STR_HELP_WINDOW_CHANGELOG :{BLACK}Changelog STR_HELP_WINDOW_CHANGELOG :{BLACK}Changelog
STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}Bekannte Bugs STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}Bekannte Bugs
STR_HELP_WINDOW_LICENSE :{BLACK}Lizenz STR_HELP_WINDOW_LICENSE :{BLACK}Lizenz
STR_HELP_WINDOW_FONTS :{BLACK}Schrëften
STR_HELP_WINDOW_MAIN_WEBSITE :{BLACK}OpenTTD STR_HELP_WINDOW_MAIN_WEBSITE :{BLACK}OpenTTD
STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}Handbuch / Wiki STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}Handbuch / Wiki
STR_HELP_WINDOW_BUGTRACKER :{BLACK}E Bug melden STR_HELP_WINDOW_BUGTRACKER :{BLACK}E Bug melden
@ -2629,13 +2643,14 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :warden op d'Akt
STR_NETWORK_MESSAGE_CLIENT_LEAVING :verloossen STR_NETWORK_MESSAGE_CLIENT_LEAVING :verloossen
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} ass dem Spill bäigetrueden STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} ass dem Spill bäigetrueden
STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} ass an d'Spill komm (Client #{NUM}) STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} ass an d'Spill komm (Client #{NUM})
STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} ass bei d'Firma {STRING} gaang
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} ass als Zuschauer do STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} ass als Zuschauer do
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} huet eng nei Firma gegrënnt (#{NUM}) STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} huet eng nei Firma gegrënnt (#{NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} huet d'Spill verlooss ({STRING}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} huet d'Spill verlooss ({STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} huet säin Numm op {STRING} gewiesselt STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} huet säin Numm op {STRING} gewiesselt
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} huet {CURRENCY_LONG} der Firma {STRING} ginn STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} huet {CURRENCY_LONG} der Firma {STRING} ginn
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De Server huet d'Sessioun zougemaach STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De Server huet d'Sessioun zougemaach
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De Server gëtt nei gestart...{}W.e.g. waarden... STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De Server gëtt nei gestart...{}{}W.e.g. waarden...
STR_NETWORK_MESSAGE_KICKED :*** {STRING} gouf gekickt. Grond: ({STRING}) STR_NETWORK_MESSAGE_KICKED :*** {STRING} gouf gekickt. Grond: ({STRING})
STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Server Registration huet net geklappt STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Server Registration huet net geklappt
@ -2644,7 +2659,7 @@ STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}De Serve
STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Aner Spiller wäerte sech net op de Server verbanne kënnen STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Aner Spiller wäerte sech net op de Server verbanne kënnen
# Content downloading window # Content downloading window
STR_CONTENT_TITLE :{WHITE}Lueden Inhalt erof STR_CONTENT_TITLE :{WHITE}Online Content
STR_CONTENT_TYPE_CAPTION :{BLACK}Typ STR_CONTENT_TYPE_CAPTION :{BLACK}Typ
STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Typ vum Inhalt STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Typ vum Inhalt
STR_CONTENT_NAME_CAPTION :{BLACK}Numm STR_CONTENT_NAME_CAPTION :{BLACK}Numm
@ -2843,6 +2858,7 @@ STR_HOUSE_PICKER_YEARS_FROM :{BLACK}Joer: {O
STR_HOUSE_PICKER_YEARS_UNTIL :{BLACK}Joer: {ORANGE}Bis {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_SIZE :{BLACK}Gréisst: {ORANGE}{NUM}x{NUM} Felder
STR_HOUSE_PICKER_CARGO_ACCEPTED :{BLACK}Akzeptéiert Wuer: {ORANGE} 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_CLASS_ZONE1 :Rand STR_HOUSE_PICKER_CLASS_ZONE1 :Rand
STR_HOUSE_PICKER_CLASS_ZONE2 :Ausseberäich STR_HOUSE_PICKER_CLASS_ZONE2 :Ausseberäich
@ -2850,6 +2866,10 @@ STR_HOUSE_PICKER_CLASS_ZONE3 :Aner Viruerter
STR_HOUSE_PICKER_CLASS_ZONE4 :Bannescht Viruerter STR_HOUSE_PICKER_CLASS_ZONE4 :Bannescht Viruerter
STR_HOUSE_PICKER_CLASS_ZONE5 :Stadzentrum 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 :Standard
STR_STATION_CLASS_DFLT_STATION :Standardstatioun STR_STATION_CLASS_DFLT_STATION :Standardstatioun
@ -2883,6 +2903,7 @@ STR_SELECT_ROAD_BRIDGE_CAPTION :{WHITE}Stroosse
STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Bréckenauswiel - Wiel deng Bréck aus STR_SELECT_BRIDGE_SELECTION_TOOLTIP :{BLACK}Bréckenauswiel - Wiel deng Bréck aus
STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING} STR_SELECT_BRIDGE_INFO_NAME :{GOLD}{STRING}
STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY} STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED :{GOLD}{STRING},{} {VELOCITY}
STR_SELECT_BRIDGE_INFO_NAME_COST :{GOLD}{STRING},{} {WHITE}{CURRENCY_LONG}
STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG} STR_SELECT_BRIDGE_INFO_NAME_MAX_SPEED_COST :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY_LONG}
STR_BRIDGE_NAME_SUSPENSION_STEEL :Stolen Hängebréck STR_BRIDGE_NAME_SUSPENSION_STEEL :Stolen Hängebréck
STR_BRIDGE_NAME_GIRDER_STEEL :Stoldréier Bréck STR_BRIDGE_NAME_GIRDER_STEEL :Stoldréier Bréck
@ -2941,7 +2962,7 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Wueren-T
# Waterways toolbar (last two for SE only) # Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Waasserstroosse bauen STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Waasserstroosse bauen
STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Waasserstroossen STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Waasserstroossen
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Kanäl bauen. Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Kanäl bauen. Ctrl+Klick+Zéien fir wielt d'Areal diagonal aus. Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Schleise bauen. Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Schleise bauen. Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Schëffsschapp bauen (fir Schëffer ze bauen an ze reparéiren). Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Schëffsschapp bauen (fir Schëffer ze bauen an ze reparéiren). Dréck Shift fir nëmmen déi ongeféier Käschten unzeweisen
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Schëffsdock bauen. Ctrl aktivéiert ubaue vu Statiounen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Schëffsdock bauen. Ctrl aktivéiert ubaue vu Statiounen. Shift wiesselt tëscht bauen/ongeféier Käschten uweisen
@ -3126,6 +3147,8 @@ STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Tramtyp:
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Schinne-Geschw.-Limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Schinne-Geschw.-Limit: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Stroosse-Geschw.-Limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Stroosse-Geschw.-Limit: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Tram-Geschw.-Limit: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Tram-Geschw.-Limit: {LTBLUE}{VELOCITY}
STR_LAND_AREA_INFORMATION_TOWN_CAN_UPGRADE :{BLACK}Stad kann upgraden: {LTBLUE}Jo
STR_LAND_AREA_INFORMATION_TOWN_CANNOT_UPGRADE :{BLACK}Stad kann upgraden: {LTBLUE}Nee
# Description of land area of different tiles # Description of land area of different tiles
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Fielsen STR_LAI_CLEAR_DESCRIPTION_ROCKS :Fielsen
@ -3134,6 +3157,9 @@ STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :Eidelt Land
STR_LAI_CLEAR_DESCRIPTION_GRASS :Gras STR_LAI_CLEAR_DESCRIPTION_GRASS :Gras
STR_LAI_CLEAR_DESCRIPTION_FIELDS :Felder STR_LAI_CLEAR_DESCRIPTION_FIELDS :Felder
STR_LAI_CLEAR_DESCRIPTION_DESERT :Wüst STR_LAI_CLEAR_DESCRIPTION_DESERT :Wüst
STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS :Schnéibedeckt Fielsen
STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND :Schnéibedeckt knubbelegt Land
STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS :Schnéibedeckt Gras
STR_LAI_RAIL_DESCRIPTION_TRACK :Schinn STR_LAI_RAIL_DESCRIPTION_TRACK :Schinn
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Schinn mat Blocksignaler STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Schinn mat Blocksignaler
@ -3605,17 +3631,17 @@ STR_NEWGRF_LIST_COMPATIBLE :{YELLOW}Kompati
STR_NEWGRF_LIST_MISSING :{RED}Dateien feelen STR_NEWGRF_LIST_MISSING :{RED}Dateien feelen
# NewGRF 'it's broken' warnings # NewGRF 'it's broken' warnings
STR_NEWGRF_BROKEN :{WHITE}Verhalen vun der NewGRF '{0:STRING}' kann Desyncs oder Crashen verursachen STR_NEWGRF_BROKEN :{WHITE}Verhalen vun der NewGRF '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' kann Desyncs oder Crashen verursachen
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Ännert den Zoustand fir '{1:ENGINE}' wann net an engem Schapp STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Ännert den Zoustand fir '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' wann net an engem Schapp
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Ännert d'Gefierlängt fir '{1:ENGINE}' wann net an engem Schapp STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Ännert d'Gefierlängt fir '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' wann net an engem Schapp
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Geännerte Gefierkapazitéit vun '{1:ENGINE}' wann net an engem Schapp oder amgaang emgebaut ze ginn STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Geännerte Gefierkapazitéit vun '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' wann net an engem Schapp oder amgaang emgebaut ze ginn
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Zuch'{VEHICLE}' vun der Firma '{COMPANY}' huet eng falsch Längt. Et kënnt wahrscheinlech wéinst den NewGRFs. Spill kann desyncroniséiren oder ofstierzen STR_BROKEN_VEHICLE_LENGTH :{WHITE}Zuch'{VEHICLE}' vun der Firma '{COMPANY}' huet eng falsch Längt. Et kënnt wahrscheinlech wéinst den NewGRFs. Spill kann desyncroniséiren oder ofstierzen
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' huet Fehlinformatiounen STR_NEWGRF_BUGGY :{WHITE}NewGRF '{PUSH_COLOUR}{0:STRING}{POP_COLOUR}' huet Fehlinformatiounen
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit Informatioun fir '{1:ENGINE}' ass anescht wéi an der Kaflëscht no der Constructioun. Dëst kann en Autoerneirung/-ersetzen Feeler oprufen STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit Informatioun fir '{PUSH_COLOUR}{1:ENGINE}{POP_COLOUR}' ass anescht wéi an der Kaflëscht no der Constructioun. Dëst kann en Autoerneirung/-ersetzen Feeler oprufen
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' huet eng Endlosschläif am Production callback verursaacht STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' huet eng Endlosschläif am Production callback verursaacht
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} huet en onbekannten/invalid Resultat {2:HEX} STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} huet en onbekannten/invalid Resultat {2:HEX}
STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' huet en ongültegen Wuerentyp am Production-callback bei {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{PUSH_COLOUR}{1:STRING}{POP_COLOUR}' huet en ongültegen Wuerentyp am Production-callback bei {2:HEX}
# 'User removed essential NewGRFs'-placeholders for stuff without specs # 'User removed essential NewGRFs'-placeholders for stuff without specs
STR_NEWGRF_INVALID_CARGO :<invalid Wuer> STR_NEWGRF_INVALID_CARGO :<invalid Wuer>
@ -4011,6 +4037,10 @@ STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produzé
STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING}
STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Brauch: STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Brauch:
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} warden{3:STRING}
STR_INDUSTRY_VIEW_ACCEPT_CARGO_NOSUFFIX :{YELLOW}{0:STRING}
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 :{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 Produktiounslevel (Prozenter, bis zu 800%)
@ -4668,54 +4698,56 @@ STR_ORDER_ROAD_VEHICLE_DEPOT :Stroossegefier-
STR_ORDER_SHIP_DEPOT :Schëffswerft STR_ORDER_SHIP_DEPOT :Schëffswerft
###next-name-looks-similar ###next-name-looks-similar
STR_ORDER_GO_TO_NEAREST_HANGAR_FORMAT :{STRING} den noosten Hangar
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} den noosten {STRING}
STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT} STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT}
STR_ORDER_REFIT_ORDER :(Ëmbau op {STRING}) STR_ORDER_REFIT_ORDER :{SPACE}(Ëmbau op {STRING})
STR_ORDER_REFIT_STOP_ORDER :(Ëmbau op {STRING} an stoppen) STR_ORDER_REFIT_STOP_ORDER :{SPACE}(Ëmbau op {STRING} an stoppen)
STR_ORDER_STOP_ORDER :(Stop) STR_ORDER_STOP_ORDER :{SPACE}(Stop)
STR_ORDER_WAIT_TO_UNBUNCH :(Warden fir ze verspreeën) STR_ORDER_WAIT_TO_UNBUNCH :{SPACE}(Warden fir ze verspreeën)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} STR_ORDER_GO_TO_STATION :{STRING} {STATION}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Statioun kann net benotzt ginn){POP_COLOUR} {STRING} {STATION} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Statioun kann net benotzt ginn){POP_COLOUR} {STRING} {STATION}
STR_ORDER_IMPLICIT :(Implizit) STR_ORDER_IMPLICIT :{SPACE}(Implizit)
STR_ORDER_FULL_LOAD :(Voll lueden) STR_ORDER_FULL_LOAD :{SPACE}(Voll lueden)
STR_ORDER_FULL_LOAD_ANY :(Voll lueden mat all Wuer) STR_ORDER_FULL_LOAD_ANY :{SPACE}(Voll lueden mat all Wuer)
STR_ORDER_NO_LOAD :(Net lueden) STR_ORDER_NO_LOAD :{SPACE}(Net lueden)
STR_ORDER_UNLOAD :(Entlueden an Luedung huelen) STR_ORDER_UNLOAD :{SPACE}(Entlueden an Luedung huelen)
STR_ORDER_UNLOAD_FULL_LOAD :(Entlueden an erem voll lueden) STR_ORDER_UNLOAD_FULL_LOAD :{SPACE}(Entlueden an erem voll lueden)
STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Entlueden an mat all Wuer voll lueden) STR_ORDER_UNLOAD_FULL_LOAD_ANY :{SPACE}(Entlueden an mat all Wuer voll lueden)
STR_ORDER_UNLOAD_NO_LOAD :(Entlueden an eidel loosen) STR_ORDER_UNLOAD_NO_LOAD :{SPACE}(Entlueden an eidel loosen)
STR_ORDER_TRANSFER :(Transferéieren an Lueden) STR_ORDER_TRANSFER :{SPACE}(Transferéieren an Lueden)
STR_ORDER_TRANSFER_FULL_LOAD :(Transferéieren an voll lueden) STR_ORDER_TRANSFER_FULL_LOAD :{SPACE}(Transferéieren an voll lueden)
STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferéieren an mat all Wuer voll lueden) STR_ORDER_TRANSFER_FULL_LOAD_ANY :{SPACE}(Transferéieren an mat all Wuer voll lueden)
STR_ORDER_TRANSFER_NO_LOAD :(Transferéieren an eidel loosen) STR_ORDER_TRANSFER_NO_LOAD :{SPACE}(Transferéieren an eidel loosen)
STR_ORDER_NO_UNLOAD :(Net entlueden an Wueren lueden) STR_ORDER_NO_UNLOAD :{SPACE}(Net entlueden an Wueren lueden)
STR_ORDER_NO_UNLOAD_FULL_LOAD :(Net entlueden an op voll Beluedung waarden) STR_ORDER_NO_UNLOAD_FULL_LOAD :{SPACE}(Net entlueden an op voll Beluedung waarden)
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Net entlueden an op iergendeng voll Beluedung waarden) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :{SPACE}(Net entlueden an op iergendeng voll Beluedung waarden)
STR_ORDER_NO_UNLOAD_NO_LOAD :(Keen Ent- an Belueden) STR_ORDER_NO_UNLOAD_NO_LOAD :{SPACE}(Keen Ent- an Belueden)
STR_ORDER_AUTO_REFIT :(Embauen op {STRING}) STR_ORDER_AUTO_REFIT :{SPACE}(Embauen op {STRING})
STR_ORDER_FULL_LOAD_REFIT :(Voll lueden mat ëmbauen op {STRING}) STR_ORDER_FULL_LOAD_REFIT :{SPACE}(Voll lueden mat ëmbauen op {STRING})
STR_ORDER_FULL_LOAD_ANY_REFIT :(Voll lueden mat all Wueren mat ëmbauen op {STRING}) STR_ORDER_FULL_LOAD_ANY_REFIT :{SPACE}(Voll lueden mat all Wueren mat ëmbauen op {STRING})
STR_ORDER_UNLOAD_REFIT :(Entlueden an Wueren lueden mat Embauen op {STRING}) STR_ORDER_UNLOAD_REFIT :{SPACE}(Entlueden an Wueren lueden mat Embauen op {STRING})
STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Entlueden an op voll Luedung waarden mat Embauen op {STRING}) STR_ORDER_UNLOAD_FULL_LOAD_REFIT :{SPACE}(Entlueden an op voll Luedung waarden mat Embauen op {STRING})
STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Entlueden an waard op iergendeng Volluedung mat Embauen op {STRING}) STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :{SPACE}(Entlueden an waard op iergendeng Volluedung mat Embauen op {STRING})
STR_ORDER_TRANSFER_REFIT :(Transfer an lued Wueren mat Auto-Embauen zu {STRING}) STR_ORDER_TRANSFER_REFIT :{SPACE}(Transfer an lued Wueren mat Auto-Embauen zu {STRING})
STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transfer an waard op Vollueden mat Auto-Embauen op {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_REFIT :{SPACE}(Transfer an waard op Vollueden mat Auto-Embauen op {STRING})
STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transfer an waard op iergendeng Volluedung mat Auto-Embauen op {STRING}) STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :{SPACE}(Transfer an waard op iergendeng Volluedung mat Auto-Embauen op {STRING})
STR_ORDER_NO_UNLOAD_REFIT :(Keen Entlueden an huel Wueren mat Auto-Embauen op {STRING}) STR_ORDER_NO_UNLOAD_REFIT :{SPACE}(Keen Entlueden an huel Wueren mat Auto-Embauen op {STRING})
STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Keen Entlueden an waard op Vollueden mat Auto-Embauen op {STRING}) STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :{SPACE}(Keen Entlueden an waard op Vollueden mat Auto-Embauen op {STRING})
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Keen Entlueden an waard op iergendend Volluedung mat Auto-Embauen op {STRING}) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :{SPACE}(Keen Entlueden an waard op iergendend Volluedung mat Auto-Embauen op {STRING})
STR_ORDER_AUTO_REFIT_ANY :verfügbar Wueren STR_ORDER_AUTO_REFIT_ANY :verfügbar Wueren
###length 3 ###length 3
STR_ORDER_STOP_LOCATION_NEAR_END :[noosten Enn] STR_ORDER_STOP_LOCATION_NEAR_END :{SPACE}[no um Enn]
STR_ORDER_STOP_LOCATION_MIDDLE :[Mëtt] STR_ORDER_STOP_LOCATION_MIDDLE :{SPACE}[Mëtt]
STR_ORDER_STOP_LOCATION_FAR_END :[wäit Enn] STR_ORDER_STOP_LOCATION_FAR_END :{SPACE}[wäit Enn]
STR_ORDER_OUT_OF_RANGE :{RED} (Nächst Destinatioun ass ze wäit fort) STR_ORDER_OUT_OF_RANGE :{RED} (Nächst Destinatioun ass ze wäit fort)
@ -4740,8 +4772,8 @@ STR_TIMETABLE_TRAVEL_FOR :Ënnerwee währ
STR_TIMETABLE_TRAVEL_FOR_SPEED :Fiert während {STRING} mat maximal {VELOCITY} 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_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_TRAVEL_FOR_SPEED_ESTIMATED :Fuer (während {STRING}, ouni Zäitplang) mat maximal {VELOCITY}
STR_TIMETABLE_STAY_FOR_ESTIMATED :(bleif während {STRING}, ouni Zäitplang) STR_TIMETABLE_STAY_FOR_ESTIMATED :{SPACE}(waard {STRING}, ouni Zäitplang)
STR_TIMETABLE_AND_TRAVEL_FOR_ESTIMATED :(fuer während {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_STAY_FOR :an bleif fir {STRING}
STR_TIMETABLE_AND_TRAVEL_FOR :an ënnerwee während {STRING} STR_TIMETABLE_AND_TRAVEL_FOR :an ënnerwee während {STRING}
@ -4762,12 +4794,14 @@ STR_TIMETABLE_START_SECONDS_QUERY :Sekonne bis den
STR_TIMETABLE_CHANGE_TIME :{BLACK}Zäit wiesselen STR_TIMETABLE_CHANGE_TIME :{BLACK}Zäit wiesselen
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Änner Zäit déi den ugewielten Optrag brauche soll. Ctrl+Klick ännert d'Zäit fir all Opträg STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Änner Zäit déi den ugewielten Optrag brauche soll. Ctrl+Klick ännert d'Zäit fir all Opträg
STR_TIMETABLE_CHANGE_TIME_QUERY :Zäit änneren
STR_TIMETABLE_CLEAR_TIME :{BLACK}Zäit läschen STR_TIMETABLE_CLEAR_TIME :{BLACK}Zäit läschen
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Läsch Zäit fir de gewielten Optrag. Ctrl+Klick läscht d'Zäite fir all opträg STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Läsch Zäit fir de gewielten Optrag. Ctrl+Klick läscht d'Zäite fir all opträg
STR_TIMETABLE_CHANGE_SPEED :{BLACK}Änner de Geschwindegkeetslimit STR_TIMETABLE_CHANGE_SPEED :{BLACK}Änner de Geschwindegkeetslimit
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Änner d'maximal Reesgeschwindëgkeet fir de gewielten Optrag. Ctrl+Klick ännert d'Geschwindegkeet fir all Opträg STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Änner d'maximal Reesgeschwindëgkeet fir de gewielten Optrag. Ctrl+Klick ännert d'Geschwindegkeet fir all Opträg
STR_TIMETABLE_CHANGE_SPEED_QUERY :Geschwindegkeetslimit änneren
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Geschwindegkeetslimit läschen STR_TIMETABLE_CLEAR_SPEED :{BLACK}Geschwindegkeetslimit läschen
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Maximal Reesgeschwindegkeet vum gewielten Optrag läschen. Ctrl+Klick läscht d'Geschwindegkeet fir all Opträg STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Maximal Reesgeschwindegkeet vum gewielten Optrag läschen. Ctrl+Klick läscht d'Geschwindegkeet fir all Opträg
@ -4873,7 +4907,7 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Minimap-
# Script Parameters # Script Parameters
STR_AI_SETTINGS_CAPTION_AI :KI STR_AI_SETTINGS_CAPTION_AI :KI
STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spill-Script STR_AI_SETTINGS_CAPTION_GAMESCRIPT :{WHITE}Spill-Script-Parameter
STR_AI_SETTINGS_CLOSE :{BLACK}Zoumaachen STR_AI_SETTINGS_CLOSE :{BLACK}Zoumaachen
STR_AI_SETTINGS_RESET :{BLACK}Reset STR_AI_SETTINGS_RESET :{BLACK}Reset
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
@ -4934,7 +4968,7 @@ STR_GAME_SAVELOAD_NOT_AVAILABLE :<keen do>
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spill gouf an enger Versioun ouni Tram support gesaved. All Tram gouf wechgeholl STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spill gouf an enger Versioun ouni Tram support gesaved. All Tram gouf wechgeholl
# Map generation messages # Map generation messages
STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Kaartenerstellung ofgebrach...{}... keng passend Stadplazen STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Kaartenerstellung ofgebrach...{}{}... keng passend Stadplazen
STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... et ass keng Stad an dësem Szenario STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... et ass keng Stad an dësem Szenario
STR_ERROR_PNGMAP :{WHITE}Kann d'Landschaft net vum PNG lueden... STR_ERROR_PNGMAP :{WHITE}Kann d'Landschaft net vum PNG lueden...
@ -4963,6 +4997,7 @@ STR_ERROR_SCREENSHOT_FAILED :{WHITE}Screensh
# Error message titles # Error message titles
STR_ERROR_MESSAGE_CAPTION :{YELLOW}Meldung STR_ERROR_MESSAGE_CAPTION :{YELLOW}Meldung
STR_ERROR_MESSAGE_CAPTION_OTHER_COMPANY :{YELLOW}Matdeelung vun {COMPANY}
# Generic construction errors # Generic construction errors
STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Ausserhalb vun der Kaart STR_ERROR_OFF_EDGE_OF_MAP :{WHITE}Ausserhalb vun der Kaart
@ -4981,6 +5016,7 @@ STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... Limi
STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... Limit fir d'Raume vu Felder erreecht STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... Limit fir d'Raume vu Felder erreecht
STR_ERROR_TREE_PLANT_LIMIT_REACHED :{WHITE}... Limit fir Beem ze planzen erreecht STR_ERROR_TREE_PLANT_LIMIT_REACHED :{WHITE}... Limit fir Beem ze planzen erreecht
STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}Numm muss eenzegarteg sinn STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}Numm muss eenzegarteg sinn
STR_ERROR_GENERIC_OBJECT_IN_THE_WAY :{WHITE}{STRING} am Wee
STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Net erlaabt an der Paus STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Net erlaabt an der Paus
# Local authority errors # Local authority errors
@ -5023,7 +5059,7 @@ STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... ze n
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ze vill Stied STR_ERROR_TOO_MANY_TOWNS :{WHITE}... ze vill Stied
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... et ass keng Plaz méi op der Kaart STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... et ass keng Plaz méi op der Kaart
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Stroossenarbeschten amgaangen STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Stroossenarbeschten amgaangen
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kann des Stad net läschen...{}Eng Statioun oder Schapp huet den Numm vun dëser Stad oder en Stéck dat der Stad gehéiert kann net ewechgeholl ginn STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Kann des Stad net läschen...{}{}Eng Statioun oder Schapp huet den Numm vun dëser Stad oder en Stéck dat der Stad gehéiert kann net ewechgeholl ginn
STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... et gëtt keng gëeegent Plaz fir eng Statu am Stadzentrum STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... et gëtt keng gëeegent Plaz fir eng Statu am Stadzentrum
STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}Kann d'Haus net bauen... STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}Kann d'Haus net bauen...
@ -5297,8 +5333,16 @@ STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Kann Sch
STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Kann de Fliger net verkafen... STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Kann de Fliger net verkafen...
###length VEHICLE_TYPES ###length VEHICLE_TYPES
STR_ERROR_CAN_T_SELL_ALL_TRAIN :{WHITE}Kann net all Zich verkafen...
STR_ERROR_CAN_T_SELL_ALL_ROAD_VEHICLE :{WHITE}Kann net all Gefierer verkafen...
STR_ERROR_CAN_T_SELL_ALL_SHIP :{WHITE}Kann net all Schëffer verkafen...
STR_ERROR_CAN_T_SELL_ALL_AIRCRAFT :{WHITE}Kann all Fligeren net verkafen...
###length VEHICLE_TYPES ###length VEHICLE_TYPES
STR_ERROR_CAN_T_AUTOREPLACE_TRAIN :{WHITE}Kann Zich net automatesch ersetzen...
STR_ERROR_CAN_T_AUTOREPLACE_ROAD_VEHICLE :{WHITE}Ka Gefierer net automatesch ersetzen...
STR_ERROR_CAN_T_AUTOREPLACE_SHIP :{WHITE}Ka Schëffer net automatesch ersetzen...
STR_ERROR_CAN_T_AUTOREPLACE_AIRCRAFT :{WHITE}Ka Fliger net automatesch ersetzen...
STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Ze vill Gefierer am Spill STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Ze vill Gefierer am Spill
STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}De Service-Intervall kann net geännert ginn... STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}De Service-Intervall kann net geännert ginn...
@ -5818,7 +5862,7 @@ STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STR
STR_SAVEGAME_NAME_SPECTATOR :Zuschauer, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :Zuschauer, {1:STRING}
# Viewport strings # Viewport strings
STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA}) STR_VIEWPORT_TOWN_POP :{TOWN} ({COMMA})
STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES} STR_VIEWPORT_STATION :{STATION} {STATION_FEATURES}
# Simple strings to get specific types of data # Simple strings to get specific types of data
@ -5880,3 +5924,4 @@ STR_SHIP :{BLACK}{SHIP}
STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY}) STR_TOOLBAR_RAILTYPE_VELOCITY :{STRING} ({VELOCITY})
STR_BADGE_NAME_LIST :{STRING}: {GOLD}{STRING}

View File

@ -945,40 +945,40 @@ void FinaliseCargoArray()
* @param filename The filename of the newgrf this house was defined in. * @param filename The filename of the newgrf this house was defined in.
* @return Whether the given housespec is valid. * @return Whether the given housespec is valid.
*/ */
static bool IsHouseSpecValid(HouseSpec *hs, const HouseSpec *next1, const HouseSpec *next2, const HouseSpec *next3, const std::string &filename) static bool IsHouseSpecValid(HouseSpec &hs, const HouseSpec *next1, const HouseSpec *next2, const HouseSpec *next3, const std::string &filename)
{ {
if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) && if ((hs.building_flags.Any(BUILDING_HAS_2_TILES) &&
(next1 == nullptr || !next1->enabled || next1->building_flags.Any(BUILDING_HAS_1_TILE))) || (next1 == nullptr || !next1->enabled || next1->building_flags.Any(BUILDING_HAS_1_TILE))) ||
(hs->building_flags.Any(BUILDING_HAS_4_TILES) && (hs.building_flags.Any(BUILDING_HAS_4_TILES) &&
(next2 == nullptr || !next2->enabled || next2->building_flags.Any(BUILDING_HAS_1_TILE) || (next2 == nullptr || !next2->enabled || next2->building_flags.Any(BUILDING_HAS_1_TILE) ||
next3 == nullptr || !next3->enabled || next3->building_flags.Any(BUILDING_HAS_1_TILE)))) { next3 == nullptr || !next3->enabled || next3->building_flags.Any(BUILDING_HAS_1_TILE)))) {
hs->enabled = false; hs.enabled = false;
if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} as multitile, but no suitable tiles follow. Disabling house.", filename, hs->grf_prop.local_id); if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} as multitile, but no suitable tiles follow. Disabling house.", filename, hs.grf_prop.local_id);
return false; return false;
} }
/* Some places sum population by only counting north tiles. Other places use all tiles causing desyncs. /* Some places sum population by only counting north tiles. Other places use all tiles causing desyncs.
* As the newgrf specs define population to be zero for non-north tiles, we just disable the offending house. * As the newgrf specs define population to be zero for non-north tiles, we just disable the offending house.
* If you want to allow non-zero populations somewhen, make sure to sum the population of all tiles in all places. */ * If you want to allow non-zero populations somewhen, make sure to sum the population of all tiles in all places. */
if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) && next1->population != 0) || if ((hs.building_flags.Any(BUILDING_HAS_2_TILES) && next1->population != 0) ||
(hs->building_flags.Any(BUILDING_HAS_4_TILES) && (next2->population != 0 || next3->population != 0))) { (hs.building_flags.Any(BUILDING_HAS_4_TILES) && (next2->population != 0 || next3->population != 0))) {
hs->enabled = false; hs.enabled = false;
if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines multitile house {} with non-zero population on additional tiles. Disabling house.", filename, hs->grf_prop.local_id); if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines multitile house {} with non-zero population on additional tiles. Disabling house.", filename, hs.grf_prop.local_id);
return false; return false;
} }
/* Substitute type is also used for override, and having an override with a different size causes crashes. /* Substitute type is also used for override, and having an override with a different size causes crashes.
* This check should only be done for NewGRF houses because grf_prop.subst_id is not set for original houses.*/ * This check should only be done for NewGRF houses because grf_prop.subst_id is not set for original houses.*/
if (!filename.empty() && (hs->building_flags & BUILDING_HAS_1_TILE) != (HouseSpec::Get(hs->grf_prop.subst_id)->building_flags & BUILDING_HAS_1_TILE)) { if (!filename.empty() && (hs.building_flags & BUILDING_HAS_1_TILE) != (HouseSpec::Get(hs.grf_prop.subst_id)->building_flags & BUILDING_HAS_1_TILE)) {
hs->enabled = false; hs.enabled = false;
Debug(grf, 1, "FinaliseHouseArray: {} defines house {} with different house size then it's substitute type. Disabling house.", filename, hs->grf_prop.local_id); Debug(grf, 1, "FinaliseHouseArray: {} defines house {} with different house size then it's substitute type. Disabling house.", filename, hs.grf_prop.local_id);
return false; return false;
} }
/* Make sure that additional parts of multitile houses are not available. */ /* Make sure that additional parts of multitile houses are not available. */
if (!hs->building_flags.Any(BUILDING_HAS_1_TILE) && (hs->building_availability & HZ_ZONALL) != 0 && (hs->building_availability & HZ_CLIMALL) != 0) { if (!hs.building_flags.Any(BUILDING_HAS_1_TILE) && (hs.building_availability & HZ_ZONALL) != 0 && (hs.building_availability & HZ_CLIMALL) != 0) {
hs->enabled = false; hs.enabled = false;
if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} without a size but marked it as available. Disabling house.", filename, hs->grf_prop.local_id); if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} without a size but marked it as available. Disabling house.", filename, hs.grf_prop.local_id);
return false; return false;
} }
@ -1027,12 +1027,12 @@ static void FinaliseHouseArray()
* On the other hand, why 1930? Just 'fix' the houses with the lowest * On the other hand, why 1930? Just 'fix' the houses with the lowest
* minimum introduction date to 0. * minimum introduction date to 0.
*/ */
for (const auto &file : _grf_files) { for (auto &file : _grf_files) {
if (file.housespec.empty()) continue; if (file.housespec.empty()) continue;
size_t num_houses = file.housespec.size(); size_t num_houses = file.housespec.size();
for (size_t i = 0; i < num_houses; i++) { for (size_t i = 0; i < num_houses; i++) {
HouseSpec *hs = file.housespec[i].get(); auto &hs = file.housespec[i];
if (hs == nullptr) continue; if (hs == nullptr) continue;
@ -1040,10 +1040,14 @@ static void FinaliseHouseArray()
const HouseSpec *next2 = (i + 2 < num_houses ? file.housespec[i + 2].get() : nullptr); const HouseSpec *next2 = (i + 2 < num_houses ? file.housespec[i + 2].get() : nullptr);
const HouseSpec *next3 = (i + 3 < num_houses ? file.housespec[i + 3].get() : nullptr); const HouseSpec *next3 = (i + 3 < num_houses ? file.housespec[i + 3].get() : nullptr);
if (!IsHouseSpecValid(hs, next1, next2, next3, file.filename)) continue; if (!IsHouseSpecValid(*hs, next1, next2, next3, file.filename)) continue;
_house_mngr.SetEntitySpec(hs); _house_mngr.SetEntitySpec(std::move(*hs));
} }
/* Won't be used again */
file.housespec.clear();
file.housespec.shrink_to_fit();
} }
for (size_t i = 0; i < HouseSpec::Specs().size(); i++) { for (size_t i = 0; i < HouseSpec::Specs().size(); i++) {
@ -1054,7 +1058,7 @@ static void FinaliseHouseArray()
/* We need to check all houses again to we are sure that multitile houses /* We need to check all houses again to we are sure that multitile houses
* did get consecutive IDs and none of the parts are missing. */ * did get consecutive IDs and none of the parts are missing. */
if (!IsHouseSpecValid(hs, next1, next2, next3, std::string{})) { if (!IsHouseSpecValid(*hs, next1, next2, next3, std::string{})) {
/* GetHouseNorthPart checks 3 houses that are directly before /* GetHouseNorthPart checks 3 houses that are directly before
* it in the house pool. If any of those houses have multi-tile * it in the house pool. If any of those houses have multi-tile
* flags set it assumes it's part of a multitile house. Since * flags set it assumes it's part of a multitile house. Since
@ -1096,18 +1100,24 @@ static void FinaliseHouseArray()
*/ */
static void FinaliseIndustriesArray() static void FinaliseIndustriesArray()
{ {
for (const auto &file : _grf_files) { for (auto &file : _grf_files) {
for (const auto &indsp : file.industryspec) { for (auto &indsp : file.industryspec) {
if (indsp == nullptr || !indsp->enabled) continue; if (indsp == nullptr || !indsp->enabled) continue;
_industry_mngr.SetEntitySpec(indsp.get()); _industry_mngr.SetEntitySpec(std::move(*indsp));
} }
for (const auto &indtsp : file.indtspec) { for (auto &indtsp : file.indtspec) {
if (indtsp != nullptr) { if (indtsp != nullptr) {
_industile_mngr.SetEntitySpec(indtsp.get()); _industile_mngr.SetEntitySpec(std::move(*indtsp));
} }
} }
/* Won't be used again */
file.industryspec.clear();
file.industryspec.shrink_to_fit();
file.indtspec.clear();
file.indtspec.shrink_to_fit();
} }
for (auto &indsp : _industry_specs) { for (auto &indsp : _industry_specs) {
@ -1144,12 +1154,16 @@ static void FinaliseIndustriesArray()
*/ */
static void FinaliseObjectsArray() static void FinaliseObjectsArray()
{ {
for (const auto &file : _grf_files) { for (auto &file : _grf_files) {
for (auto &objectspec : file.objectspec) { for (auto &objectspec : file.objectspec) {
if (objectspec != nullptr && objectspec->grf_prop.HasGrfFile() && objectspec->IsEnabled()) { if (objectspec != nullptr && objectspec->grf_prop.HasGrfFile() && objectspec->IsEnabled()) {
_object_mngr.SetEntitySpec(objectspec.get()); _object_mngr.SetEntitySpec(std::move(*objectspec));
} }
} }
/* Won't be used again */
file.objectspec.clear();
file.objectspec.shrink_to_fit();
} }
ObjectSpec::BindToClasses(); ObjectSpec::BindToClasses();
@ -1162,18 +1176,24 @@ static void FinaliseObjectsArray()
*/ */
static void FinaliseAirportsArray() static void FinaliseAirportsArray()
{ {
for (const auto &file : _grf_files) { for (auto &file : _grf_files) {
for (auto &as : file.airportspec) { for (auto &as : file.airportspec) {
if (as != nullptr && as->enabled) { if (as != nullptr && as->enabled) {
_airport_mngr.SetEntitySpec(as.get()); _airport_mngr.SetEntitySpec(std::move(*as));
} }
} }
for (auto &ats : file.airtspec) { for (auto &ats : file.airtspec) {
if (ats != nullptr && ats->enabled) { if (ats != nullptr && ats->enabled) {
_airporttile_mngr.SetEntitySpec(ats.get()); _airporttile_mngr.SetEntitySpec(std::move(*ats));
} }
} }
/* Won't be used again */
file.airportspec.clear();
file.airportspec.shrink_to_fit();
file.airtspec.clear();
file.airtspec.shrink_to_fit();
} }
} }

View File

@ -134,22 +134,22 @@ void BindAirportSpecs()
} }
void AirportOverrideManager::SetEntitySpec(AirportSpec *as) void AirportOverrideManager::SetEntitySpec(AirportSpec &&as)
{ {
uint8_t airport_id = this->AddEntityID(as->grf_prop.local_id, as->grf_prop.grfid, as->grf_prop.subst_id); uint8_t airport_id = this->AddEntityID(as.grf_prop.local_id, as.grf_prop.grfid, as.grf_prop.subst_id);
if (airport_id == this->invalid_id) { if (airport_id == this->invalid_id) {
GrfMsg(1, "Airport.SetEntitySpec: Too many airports allocated. Ignoring."); GrfMsg(1, "Airport.SetEntitySpec: Too many airports allocated. Ignoring.");
return; return;
} }
*AirportSpec::GetWithoutOverride(airport_id) = *as; AirportSpec::specs[airport_id] = std::move(as);
/* Now add the overrides. */ /* Now add the overrides. */
for (int i = 0; i < this->max_offset; i++) { for (int i = 0; i < this->max_offset; i++) {
AirportSpec *overridden_as = AirportSpec::GetWithoutOverride(i); AirportSpec *overridden_as = AirportSpec::GetWithoutOverride(i);
if (this->entity_overrides[i] != as->grf_prop.local_id || this->grfid_overrides[i] != as->grf_prop.grfid) continue; if (this->entity_overrides[i] != AirportSpec::specs[airport_id].grf_prop.local_id || this->grfid_overrides[i] != AirportSpec::specs[airport_id].grf_prop.grfid) continue;
overridden_as->grf_prop.override_id = airport_id; overridden_as->grf_prop.override_id = airport_id;
overridden_as->enabled = false; overridden_as->enabled = false;

View File

@ -141,6 +141,8 @@ struct AirportSpec : NewGRFSpecBase<AirportClassID> {
private: private:
static AirportSpec specs[NUM_AIRPORTS]; ///< Specs of the airports. static AirportSpec specs[NUM_AIRPORTS]; ///< Specs of the airports.
friend void AirportOverrideManager::SetEntitySpec(AirportSpec &&as);
}; };
/** Information related to airport classes. */ /** Information related to airport classes. */

View File

@ -66,22 +66,22 @@ void AirportTileSpec::ResetAirportTiles()
_airporttile_mngr.ResetOverride(); _airporttile_mngr.ResetOverride();
} }
void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts) void AirportTileOverrideManager::SetEntitySpec(AirportTileSpec &&airpts)
{ {
StationGfx airpt_id = this->AddEntityID(airpts->grf_prop.local_id, airpts->grf_prop.grfid, airpts->grf_prop.subst_id); StationGfx airpt_id = this->AddEntityID(airpts.grf_prop.local_id, airpts.grf_prop.grfid, airpts.grf_prop.subst_id);
if (airpt_id == this->invalid_id) { if (airpt_id == this->invalid_id) {
GrfMsg(1, "AirportTile.SetEntitySpec: Too many airport tiles allocated. Ignoring."); GrfMsg(1, "AirportTile.SetEntitySpec: Too many airport tiles allocated. Ignoring.");
return; return;
} }
AirportTileSpec::tiles[airpt_id] = *airpts; AirportTileSpec::tiles[airpt_id] = std::move(airpts);
/* Now add the overrides. */ /* Now add the overrides. */
for (int i = 0; i < this->max_offset; i++) { for (int i = 0; i < this->max_offset; i++) {
AirportTileSpec *overridden_airpts = &AirportTileSpec::tiles[i]; AirportTileSpec *overridden_airpts = &AirportTileSpec::tiles[i];
if (this->entity_overrides[i] != airpts->grf_prop.local_id || this->grfid_overrides[i] != airpts->grf_prop.grfid) continue; if (this->entity_overrides[i] != AirportTileSpec::tiles[airpt_id].grf_prop.local_id || this->grfid_overrides[i] != AirportTileSpec::tiles[airpt_id].grf_prop.grfid) continue;
overridden_airpts->grf_prop.override_id = airpt_id; overridden_airpts->grf_prop.override_id = airpt_id;
overridden_airpts->enabled = false; overridden_airpts->enabled = false;

View File

@ -84,7 +84,7 @@ struct AirportTileSpec {
private: private:
static AirportTileSpec tiles[NUM_AIRPORTTILES]; static AirportTileSpec tiles[NUM_AIRPORTTILES];
friend void AirportTileOverrideManager::SetEntitySpec(const AirportTileSpec *airpts); friend void AirportTileOverrideManager::SetEntitySpec(AirportTileSpec &&airpts);
}; };
void AnimateAirportTile(TileIndex tile); void AnimateAirportTile(TileIndex tile);

View File

@ -157,9 +157,9 @@ uint16_t OverrideManagerBase::GetSubstituteID(uint16_t entity_id) const
* It will find itself the proper slot on which it will go * It will find itself the proper slot on which it will go
* @param hs HouseSpec read from the grf file, ready for inclusion * @param hs HouseSpec read from the grf file, ready for inclusion
*/ */
void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs) void HouseOverrideManager::SetEntitySpec(HouseSpec &&hs)
{ {
HouseID house_id = this->AddEntityID(hs->grf_prop.local_id, hs->grf_prop.grfid, hs->grf_prop.subst_id); HouseID house_id = this->AddEntityID(hs.grf_prop.local_id, hs.grf_prop.grfid, hs.grf_prop.subst_id);
if (house_id == this->invalid_id) { if (house_id == this->invalid_id) {
GrfMsg(1, "House.SetEntitySpec: Too many houses allocated. Ignoring."); GrfMsg(1, "House.SetEntitySpec: Too many houses allocated. Ignoring.");
@ -170,13 +170,13 @@ void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs)
/* Now that we know we can use the given id, copy the spec to its final destination. */ /* Now that we know we can use the given id, copy the spec to its final destination. */
if (house_id >= house_specs.size()) house_specs.resize(house_id + 1); if (house_id >= house_specs.size()) house_specs.resize(house_id + 1);
house_specs[house_id] = *hs; house_specs[house_id] = std::move(hs);
/* Now add the overrides. */ /* Now add the overrides. */
for (int i = 0; i < this->max_offset; i++) { for (int i = 0; i < this->max_offset; i++) {
HouseSpec *overridden_hs = HouseSpec::Get(i); HouseSpec *overridden_hs = HouseSpec::Get(i);
if (this->entity_overrides[i] != hs->grf_prop.local_id || this->grfid_overrides[i] != hs->grf_prop.grfid) continue; if (this->entity_overrides[i] != house_specs[house_id].grf_prop.local_id || this->grfid_overrides[i] != house_specs[house_id].grf_prop.grfid) continue;
overridden_hs->grf_prop.override_id = house_id; overridden_hs->grf_prop.override_id = house_id;
this->entity_overrides[i] = this->invalid_id; this->entity_overrides[i] = this->invalid_id;
@ -245,18 +245,18 @@ uint16_t IndustryOverrideManager::AddEntityID(uint16_t grf_local_id, uint32_t gr
* checking what is available * checking what is available
* @param inds Industryspec that comes from the grf decoding process * @param inds Industryspec that comes from the grf decoding process
*/ */
void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds) void IndustryOverrideManager::SetEntitySpec(IndustrySpec &&inds)
{ {
/* First step : We need to find if this industry is already specified in the savegame data. */ /* First step : We need to find if this industry is already specified in the savegame data. */
IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grfid); IndustryType ind_id = this->GetID(inds.grf_prop.local_id, inds.grf_prop.grfid);
if (ind_id == this->invalid_id) { if (ind_id == this->invalid_id) {
/* Not found. /* Not found.
* Or it has already been overridden, so you've lost your place. * Or it has already been overridden, so you've lost your place.
* Or it is a simple substitute. * Or it is a simple substitute.
* We need to find a free available slot */ * We need to find a free available slot */
ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grfid, inds->grf_prop.subst_id); ind_id = this->AddEntityID(inds.grf_prop.local_id, inds.grf_prop.grfid, inds.grf_prop.subst_id);
inds->grf_prop.override_id = this->invalid_id; // make sure it will not be detected as overridden inds.grf_prop.override_id = this->invalid_id; // make sure it will not be detected as overridden
} }
if (ind_id == this->invalid_id) { if (ind_id == this->invalid_id) {
@ -265,27 +265,27 @@ void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds)
} }
/* Now that we know we can use the given id, copy the spec to its final destination... */ /* Now that we know we can use the given id, copy the spec to its final destination... */
_industry_specs[ind_id] = *inds; _industry_specs[ind_id] = std::move(inds);
/* ... and mark it as usable*/ /* ... and mark it as usable*/
_industry_specs[ind_id].enabled = true; _industry_specs[ind_id].enabled = true;
} }
void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its) void IndustryTileOverrideManager::SetEntitySpec(IndustryTileSpec &&its)
{ {
IndustryGfx indt_id = this->AddEntityID(its->grf_prop.local_id, its->grf_prop.grfid, its->grf_prop.subst_id); IndustryGfx indt_id = this->AddEntityID(its.grf_prop.local_id, its.grf_prop.grfid, its.grf_prop.subst_id);
if (indt_id == this->invalid_id) { if (indt_id == this->invalid_id) {
GrfMsg(1, "IndustryTile.SetEntitySpec: Too many industry tiles allocated. Ignoring."); GrfMsg(1, "IndustryTile.SetEntitySpec: Too many industry tiles allocated. Ignoring.");
return; return;
} }
_industry_tile_specs[indt_id] = *its; _industry_tile_specs[indt_id] = std::move(its);
/* Now add the overrides. */ /* Now add the overrides. */
for (int i = 0; i < this->max_offset; i++) { for (int i = 0; i < this->max_offset; i++) {
IndustryTileSpec *overridden_its = &_industry_tile_specs[i]; IndustryTileSpec *overridden_its = &_industry_tile_specs[i];
if (this->entity_overrides[i] != its->grf_prop.local_id || this->grfid_overrides[i] != its->grf_prop.grfid) continue; if (this->entity_overrides[i] != _industry_tile_specs[indt_id].grf_prop.local_id || this->grfid_overrides[i] != _industry_tile_specs[indt_id].grf_prop.grfid) continue;
overridden_its->grf_prop.override_id = indt_id; overridden_its->grf_prop.override_id = indt_id;
overridden_its->enabled = false; overridden_its->enabled = false;
@ -300,17 +300,17 @@ void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its)
* checking what is available * checking what is available
* @param spec ObjectSpec that comes from the grf decoding process * @param spec ObjectSpec that comes from the grf decoding process
*/ */
void ObjectOverrideManager::SetEntitySpec(ObjectSpec *spec) void ObjectOverrideManager::SetEntitySpec(ObjectSpec &&spec)
{ {
/* First step : We need to find if this object is already specified in the savegame data. */ /* First step : We need to find if this object is already specified in the savegame data. */
ObjectType type = this->GetID(spec->grf_prop.local_id, spec->grf_prop.grfid); ObjectType type = this->GetID(spec.grf_prop.local_id, spec.grf_prop.grfid);
if (type == this->invalid_id) { if (type == this->invalid_id) {
/* Not found. /* Not found.
* Or it has already been overridden, so you've lost your place. * Or it has already been overridden, so you've lost your place.
* Or it is a simple substitute. * Or it is a simple substitute.
* We need to find a free available slot */ * We need to find a free available slot */
type = this->AddEntityID(spec->grf_prop.local_id, spec->grf_prop.grfid, OBJECT_TRANSMITTER); type = this->AddEntityID(spec.grf_prop.local_id, spec.grf_prop.grfid, OBJECT_TRANSMITTER);
} }
if (type == this->invalid_id) { if (type == this->invalid_id) {
@ -322,7 +322,7 @@ void ObjectOverrideManager::SetEntitySpec(ObjectSpec *spec)
/* Now that we know we can use the given id, copy the spec to its final destination. */ /* Now that we know we can use the given id, copy the spec to its final destination. */
if (type >= _object_specs.size()) _object_specs.resize(type + 1); if (type >= _object_specs.size()) _object_specs.resize(type + 1);
_object_specs[type] = *spec; _object_specs[type] = std::move(spec);
} }
/** /**
@ -617,7 +617,7 @@ uint32_t NewGRFSpriteLayout::PrepareLayout(uint32_t orig_offset, uint32_t newgrf
* and apply the default sprite offsets (unless disabled). */ * and apply the default sprite offsets (unless disabled). */
const TileLayoutRegisters *regs = this->registers.empty() ? nullptr : this->registers.data(); const TileLayoutRegisters *regs = this->registers.empty() ? nullptr : this->registers.data();
bool ground = true; bool ground = true;
for (DrawTileSeqStruct result : result_seq) { for (DrawTileSeqStruct &result : result_seq) {
TileLayoutFlags flags = TLF_NOTHING; TileLayoutFlags flags = TLF_NOTHING;
if (regs != nullptr) flags = regs->flags; if (regs != nullptr) flags = regs->flags;

View File

@ -210,7 +210,7 @@ public:
HouseOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) : HouseOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
OverrideManagerBase(offset, maximum, invalid) {} OverrideManagerBase(offset, maximum, invalid) {}
void SetEntitySpec(const HouseSpec *hs); void SetEntitySpec(HouseSpec &&hs);
}; };
@ -223,7 +223,7 @@ public:
uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id) override; uint16_t AddEntityID(uint16_t grf_local_id, uint32_t grfid, uint16_t substitute_id) override;
uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const override; uint16_t GetID(uint16_t grf_local_id, uint32_t grfid) const override;
void SetEntitySpec(IndustrySpec *inds); void SetEntitySpec(IndustrySpec &&inds);
}; };
@ -235,7 +235,7 @@ public:
IndustryTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) : IndustryTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
OverrideManagerBase(offset, maximum, invalid) {} OverrideManagerBase(offset, maximum, invalid) {}
void SetEntitySpec(const IndustryTileSpec *indts); void SetEntitySpec(IndustryTileSpec &&indts);
}; };
struct AirportSpec; struct AirportSpec;
@ -244,7 +244,7 @@ public:
AirportOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) : AirportOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
OverrideManagerBase(offset, maximum, invalid) {} OverrideManagerBase(offset, maximum, invalid) {}
void SetEntitySpec(AirportSpec *inds); void SetEntitySpec(AirportSpec &&inds);
}; };
struct AirportTileSpec; struct AirportTileSpec;
@ -255,7 +255,7 @@ public:
AirportTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) : AirportTileOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
OverrideManagerBase(offset, maximum, invalid) {} OverrideManagerBase(offset, maximum, invalid) {}
void SetEntitySpec(const AirportTileSpec *ats); void SetEntitySpec(AirportTileSpec &&ats);
}; };
struct ObjectSpec; struct ObjectSpec;
@ -266,7 +266,7 @@ public:
ObjectOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) : ObjectOverrideManager(uint16_t offset, uint16_t maximum, uint16_t invalid) :
OverrideManagerBase(offset, maximum, invalid) {} OverrideManagerBase(offset, maximum, invalid) {}
void SetEntitySpec(ObjectSpec *spec); void SetEntitySpec(ObjectSpec &&spec);
}; };
extern HouseOverrideManager _house_mngr; extern HouseOverrideManager _house_mngr;

View File

@ -628,12 +628,20 @@ bool CanDeleteHouse(TileIndex tile)
} }
} }
static void AnimationControl(TileIndex tile, uint16_t random_bits) /**
* Call the tile loop animation trigger for houses, if enabled.
* @param tile House tile
* @param sync Whether to call the synchronized or the unsynchronized trigger.
* @param random_bits Shared random bits for the synchronized trigger.
*/
static void AnimationControl(TileIndex tile, bool sync, uint16_t random_bits)
{ {
const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile)); const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) { /* Check whether the matching trigger is enabled */
uint32_t param = hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random(); if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop) &&
hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B) == sync) {
uint32_t param = sync ? (GB(Random(), 0, 16) | random_bits << 16) : Random();
HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_ANIMATION_START_STOP, hs, Town::GetByTile(tile), tile, param, 0); HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_ANIMATION_START_STOP, hs, Town::GetByTile(tile), tile, param, 0);
} }
} }
@ -650,21 +658,16 @@ bool NewHouseTileLoop(TileIndex tile)
TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP); TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP);
if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP_TOP); if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP_TOP);
if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) { /* Call the unsynchronized tile loop trigger */
/* If this house is marked as having a synchronised callback, all the AnimationControl(tile, false, 0);
* tiles will have the callback called at once, rather than when the
* tile loop reaches them. This should only be enabled for the northern
* tile, or strange things will happen (here, and in TTDPatch). */
if (hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B)) {
uint16_t random = GB(Random(), 0, 16);
if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) AnimationControl(tile, random); /* Call the synchronized tile loop trigger, if this is the north tile */
if (hs->building_flags.Any(BUILDING_2_TILES_Y)) AnimationControl(TileAddXY(tile, 0, 1), random); if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) {
if (hs->building_flags.Any(BUILDING_2_TILES_X)) AnimationControl(TileAddXY(tile, 1, 0), random); uint16_t random = GB(Random(), 0, 16);
if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) AnimationControl(TileAddXY(tile, 1, 1), random); AnimationControl(tile, true, random);
} else { if (hs->building_flags.Any(BUILDING_2_TILES_Y)) AnimationControl(TileAddXY(tile, 0, 1), true, random);
AnimationControl(tile, 0); if (hs->building_flags.Any(BUILDING_2_TILES_X)) AnimationControl(TileAddXY(tile, 1, 0), true, random);
} if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) AnimationControl(TileAddXY(tile, 1, 1), true, random);
} }
/* Check callback 21, which determines if a house should be destroyed. */ /* Check callback 21, which determines if a house should be destroyed. */

View File

@ -889,9 +889,13 @@ enum class CargoSortType : uint8_t {
class CargoSorter { class CargoSorter {
public: public:
using is_transparent = void;
CargoSorter(CargoSortType t = CargoSortType::StationID, SortOrder o = SO_ASCENDING) : type(t), order(o) {} CargoSorter(CargoSortType t = CargoSortType::StationID, SortOrder o = SO_ASCENDING) : type(t), order(o) {}
CargoSortType GetSortType() {return this->type;} CargoSortType GetSortType() {return this->type;}
bool operator()(const CargoDataEntry *cd1, const CargoDataEntry *cd2) const; bool operator()(const CargoDataEntry &cd1, const CargoDataEntry &cd2) const;
bool operator()(const CargoDataEntry &cd1, const std::unique_ptr<CargoDataEntry> &cd2) const { return this->operator()(cd1, *cd2); }
bool operator()(const std::unique_ptr<CargoDataEntry> &cd1, const CargoDataEntry &cd2) const { return this->operator()(*cd1, cd2); }
bool operator()(const std::unique_ptr<CargoDataEntry> &cd1, const std::unique_ptr<CargoDataEntry> &cd2) const { return this->operator()(*cd1, *cd2); }
private: private:
CargoSortType type; CargoSortType type;
@ -899,11 +903,11 @@ private:
template <class Tid> template <class Tid>
bool SortId(Tid st1, Tid st2) const; bool SortId(Tid st1, Tid st2) const;
bool SortCount(const CargoDataEntry *cd1, const CargoDataEntry *cd2) const; bool SortCount(const CargoDataEntry &cd1, const CargoDataEntry &cd2) const;
bool SortStation (StationID st1, StationID st2) const; bool SortStation(StationID st1, StationID st2) const;
}; };
typedef std::set<CargoDataEntry *, CargoSorter> CargoDataSet; typedef std::set<std::unique_ptr<CargoDataEntry>, CargoSorter> CargoDataSet;
/** /**
* A cargo data entry representing one possible row in the station view window's * A cargo data entry representing one possible row in the station view window's
@ -920,7 +924,7 @@ public:
* @param station ID of the station for which an entry shall be created or retrieved * @param station ID of the station for which an entry shall be created or retrieved
* @return a child entry associated with the given station. * @return a child entry associated with the given station.
*/ */
CargoDataEntry *InsertOrRetrieve(StationID station) CargoDataEntry &InsertOrRetrieve(StationID station)
{ {
return this->InsertOrRetrieve<StationID>(station); return this->InsertOrRetrieve<StationID>(station);
} }
@ -930,7 +934,7 @@ public:
* @param cargo type of the cargo for which an entry shall be created or retrieved * @param cargo type of the cargo for which an entry shall be created or retrieved
* @return a child entry associated with the given cargo. * @return a child entry associated with the given cargo.
*/ */
CargoDataEntry *InsertOrRetrieve(CargoType cargo) CargoDataEntry &InsertOrRetrieve(CargoType cargo)
{ {
return this->InsertOrRetrieve<CargoType>(cargo); return this->InsertOrRetrieve<CargoType>(cargo);
} }
@ -944,7 +948,7 @@ public:
void Remove(StationID station) void Remove(StationID station)
{ {
CargoDataEntry t(station); CargoDataEntry t(station);
this->Remove(&t); this->Remove(t);
} }
/** /**
@ -954,7 +958,7 @@ public:
void Remove(CargoType cargo) void Remove(CargoType cargo)
{ {
CargoDataEntry t(cargo); CargoDataEntry t(cargo);
this->Remove(&t); this->Remove(t);
} }
/** /**
@ -965,7 +969,7 @@ public:
CargoDataEntry *Retrieve(StationID station) const CargoDataEntry *Retrieve(StationID station) const
{ {
CargoDataEntry t(station); CargoDataEntry t(station);
return this->Retrieve(this->children->find(&t)); return this->Retrieve(this->children->find(t));
} }
/** /**
@ -976,7 +980,7 @@ public:
CargoDataEntry *Retrieve(CargoType cargo) const CargoDataEntry *Retrieve(CargoType cargo) const
{ {
CargoDataEntry t(cargo); CargoDataEntry t(cargo);
return this->Retrieve(this->children->find(&t)); return this->Retrieve(this->children->find(t));
} }
void Resort(CargoSortType type, SortOrder order); void Resort(CargoSortType type, SortOrder order);
@ -1027,19 +1031,19 @@ public:
void SetTransfers(bool value) { this->transfers = value; } void SetTransfers(bool value) { this->transfers = value; }
void Clear(); void Clear();
private:
CargoDataEntry(StationID station, uint count, CargoDataEntry *parent); CargoDataEntry(StationID station, uint count, CargoDataEntry *parent);
CargoDataEntry(CargoType cargo, uint count, CargoDataEntry *parent); CargoDataEntry(CargoType cargo, uint count, CargoDataEntry *parent);
CargoDataEntry(StationID station); CargoDataEntry(StationID station);
CargoDataEntry(CargoType cargo); CargoDataEntry(CargoType cargo);
private:
CargoDataEntry *Retrieve(CargoDataSet::iterator i) const; CargoDataEntry *Retrieve(CargoDataSet::iterator i) const;
template <class Tid> template <class Tid>
CargoDataEntry *InsertOrRetrieve(Tid s); CargoDataEntry &InsertOrRetrieve(Tid s);
void Remove(CargoDataEntry *entry); void Remove(CargoDataEntry &entry);
void IncrementSize(); void IncrementSize();
CargoDataEntry *parent; ///< the parent of this entry. CargoDataEntry *parent; ///< the parent of this entry.
@ -1052,7 +1056,7 @@ private:
}; };
uint num_children; ///< the number of subentries belonging to this entry. uint num_children; ///< the number of subentries belonging to this entry.
uint count; ///< sum of counts of all children or amount of cargo for this entry. uint count; ///< sum of counts of all children or amount of cargo for this entry.
CargoDataSet *children; ///< the children of this entry. std::unique_ptr<CargoDataSet> children; ///< the children of this entry.
}; };
CargoDataEntry::CargoDataEntry() : CargoDataEntry::CargoDataEntry() :
@ -1060,7 +1064,7 @@ CargoDataEntry::CargoDataEntry() :
station(StationID::Invalid()), station(StationID::Invalid()),
num_children(0), num_children(0),
count(0), count(0),
children(new CargoDataSet(CargoSorter(CargoSortType::CargoType))) children(std::make_unique<CargoDataSet>(CargoSorter(CargoSortType::CargoType)))
{} {}
CargoDataEntry::CargoDataEntry(CargoType cargo, uint count, CargoDataEntry *parent) : CargoDataEntry::CargoDataEntry(CargoType cargo, uint count, CargoDataEntry *parent) :
@ -1068,7 +1072,7 @@ CargoDataEntry::CargoDataEntry(CargoType cargo, uint count, CargoDataEntry *pare
cargo(cargo), cargo(cargo),
num_children(0), num_children(0),
count(count), count(count),
children(new CargoDataSet) children(std::make_unique<CargoDataSet>())
{} {}
CargoDataEntry::CargoDataEntry(StationID station, uint count, CargoDataEntry *parent) : CargoDataEntry::CargoDataEntry(StationID station, uint count, CargoDataEntry *parent) :
@ -1076,7 +1080,7 @@ CargoDataEntry::CargoDataEntry(StationID station, uint count, CargoDataEntry *pa
station(station), station(station),
num_children(0), num_children(0),
count(count), count(count),
children(new CargoDataSet) children(std::make_unique<CargoDataSet>())
{} {}
CargoDataEntry::CargoDataEntry(StationID station) : CargoDataEntry::CargoDataEntry(StationID station) :
@ -1098,7 +1102,6 @@ CargoDataEntry::CargoDataEntry(CargoType cargo) :
CargoDataEntry::~CargoDataEntry() CargoDataEntry::~CargoDataEntry()
{ {
this->Clear(); this->Clear();
delete this->children;
} }
/** /**
@ -1106,13 +1109,7 @@ CargoDataEntry::~CargoDataEntry()
*/ */
void CargoDataEntry::Clear() void CargoDataEntry::Clear()
{ {
if (this->children != nullptr) { if (this->children != nullptr) this->children->clear();
for (auto &it : *this->children) {
assert(it != this);
delete it;
}
this->children->clear();
}
if (this->parent != nullptr) this->parent->count -= this->count; if (this->parent != nullptr) this->parent->count -= this->count;
this->count = 0; this->count = 0;
this->num_children = 0; this->num_children = 0;
@ -1124,13 +1121,10 @@ void CargoDataEntry::Clear()
* which only contains the ID of the entry to be removed. In this case child is * which only contains the ID of the entry to be removed. In this case child is
* not deleted. * not deleted.
*/ */
void CargoDataEntry::Remove(CargoDataEntry *entry) void CargoDataEntry::Remove(CargoDataEntry &entry)
{ {
CargoDataSet::iterator i = this->children->find(entry); CargoDataSet::iterator i = this->children->find(entry);
if (i != this->children->end()) { if (i != this->children->end()) this->children->erase(i);
delete *i;
this->children->erase(i);
}
} }
/** /**
@ -1140,17 +1134,16 @@ void CargoDataEntry::Remove(CargoDataEntry *entry)
* @return the new or retrieved subentry * @return the new or retrieved subentry
*/ */
template <class Tid> template <class Tid>
CargoDataEntry *CargoDataEntry::InsertOrRetrieve(Tid child_id) CargoDataEntry &CargoDataEntry::InsertOrRetrieve(Tid child_id)
{ {
CargoDataEntry tmp(child_id); CargoDataEntry tmp(child_id);
CargoDataSet::iterator i = this->children->find(&tmp); CargoDataSet::iterator i = this->children->find(tmp);
if (i == this->children->end()) { if (i == this->children->end()) {
IncrementSize(); IncrementSize();
return *(this->children->insert(new CargoDataEntry(child_id, 0, this)).first); return **(this->children->insert(std::make_unique<CargoDataEntry>(child_id, 0, this)).first);
} else { } else {
CargoDataEntry *ret = *i;
assert(this->children->value_comp().GetSortType() != CargoSortType::Count); assert(this->children->value_comp().GetSortType() != CargoSortType::Count);
return ret; return **i;
} }
} }
@ -1176,9 +1169,9 @@ void CargoDataEntry::IncrementSize()
void CargoDataEntry::Resort(CargoSortType type, SortOrder order) void CargoDataEntry::Resort(CargoSortType type, SortOrder order)
{ {
CargoDataSet *new_subs = new CargoDataSet(this->children->begin(), this->children->end(), CargoSorter(type, order)); auto new_children = std::make_unique<CargoDataSet>(CargoSorter(type, order));
delete this->children; new_children->merge(*this->children);
this->children = new_subs; this->children = std::move(new_children);
} }
CargoDataEntry *CargoDataEntry::Retrieve(CargoDataSet::iterator i) const CargoDataEntry *CargoDataEntry::Retrieve(CargoDataSet::iterator i) const
@ -1187,21 +1180,21 @@ CargoDataEntry *CargoDataEntry::Retrieve(CargoDataSet::iterator i) const
return nullptr; return nullptr;
} else { } else {
assert(this->children->value_comp().GetSortType() != CargoSortType::Count); assert(this->children->value_comp().GetSortType() != CargoSortType::Count);
return *i; return i->get();
} }
} }
bool CargoSorter::operator()(const CargoDataEntry *cd1, const CargoDataEntry *cd2) const bool CargoSorter::operator()(const CargoDataEntry &cd1, const CargoDataEntry &cd2) const
{ {
switch (this->type) { switch (this->type) {
case CargoSortType::StationID: case CargoSortType::StationID:
return this->SortId<StationID>(cd1->GetStation(), cd2->GetStation()); return this->SortId<StationID>(cd1.GetStation(), cd2.GetStation());
case CargoSortType::CargoType: case CargoSortType::CargoType:
return this->SortId<CargoType>(cd1->GetCargo(), cd2->GetCargo()); return this->SortId<CargoType>(cd1.GetCargo(), cd2.GetCargo());
case CargoSortType::Count: case CargoSortType::Count:
return this->SortCount(cd1, cd2); return this->SortCount(cd1, cd2);
case CargoSortType::StationString: case CargoSortType::StationString:
return this->SortStation(cd1->GetStation(), cd2->GetStation()); return this->SortStation(cd1.GetStation(), cd2.GetStation());
default: default:
NOT_REACHED(); NOT_REACHED();
} }
@ -1213,12 +1206,12 @@ bool CargoSorter::SortId(Tid st1, Tid st2) const
return (this->order == SO_ASCENDING) ? st1 < st2 : st2 < st1; return (this->order == SO_ASCENDING) ? st1 < st2 : st2 < st1;
} }
bool CargoSorter::SortCount(const CargoDataEntry *cd1, const CargoDataEntry *cd2) const bool CargoSorter::SortCount(const CargoDataEntry &cd1, const CargoDataEntry &cd2) const
{ {
uint c1 = cd1->GetCount(); uint c1 = cd1.GetCount();
uint c2 = cd2->GetCount(); uint c2 = cd2.GetCount();
if (c1 == c2) { if (c1 == c2) {
return this->SortStation(cd1->GetStation(), cd2->GetStation()); return this->SortStation(cd1.GetStation(), cd2.GetStation());
} else if (this->order == SO_ASCENDING) { } else if (this->order == SO_ASCENDING) {
return c1 < c2; return c1 < c2;
} else { } else {
@ -1392,25 +1385,25 @@ struct StationViewWindow : public Window {
switch (groupings[i]) { switch (groupings[i]) {
case GR_CARGO: case GR_CARGO:
assert(i == 0); assert(i == 0);
data = data->InsertOrRetrieve(cargo); data = &data->InsertOrRetrieve(cargo);
data->SetTransfers(source != this->window_number); data->SetTransfers(source != this->window_number);
expand = expand->Retrieve(cargo); expand = expand->Retrieve(cargo);
break; break;
case GR_SOURCE: case GR_SOURCE:
if (auto_distributed || source != this->window_number) { if (auto_distributed || source != this->window_number) {
data = data->InsertOrRetrieve(source); data = &data->InsertOrRetrieve(source);
expand = expand->Retrieve(source); expand = expand->Retrieve(source);
} }
break; break;
case GR_NEXT: case GR_NEXT:
if (auto_distributed) { if (auto_distributed) {
data = data->InsertOrRetrieve(next); data = &data->InsertOrRetrieve(next);
expand = expand->Retrieve(next); expand = expand->Retrieve(next);
} }
break; break;
case GR_DESTINATION: case GR_DESTINATION:
if (auto_distributed) { if (auto_distributed) {
data = data->InsertOrRetrieve(dest); data = &data->InsertOrRetrieve(dest);
expand = expand->Retrieve(dest); expand = expand->Retrieve(dest);
} }
break; break;
@ -1498,7 +1491,7 @@ struct StationViewWindow : public Window {
/* Draw waiting cargo. */ /* Draw waiting cargo. */
NWidgetBase *nwi = this->GetWidget<NWidgetBase>(WID_SV_WAITING); NWidgetBase *nwi = this->GetWidget<NWidgetBase>(WID_SV_WAITING);
Rect waiting_rect = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); Rect waiting_rect = nwi->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
this->DrawEntries(&cargo, waiting_rect, pos, maxrows, 0); this->DrawEntries(cargo, waiting_rect, pos, maxrows, 0);
scroll_to_row = INT_MAX; scroll_to_row = INT_MAX;
} }
} }
@ -1521,20 +1514,20 @@ struct StationViewWindow : public Window {
void RecalcDestinations(CargoType cargo) void RecalcDestinations(CargoType cargo)
{ {
const Station *st = Station::Get(this->window_number); const Station *st = Station::Get(this->window_number);
CargoDataEntry *entry = cached_destinations.InsertOrRetrieve(cargo); CargoDataEntry &entry = cached_destinations.InsertOrRetrieve(cargo);
entry->Clear(); entry.Clear();
if (!st->goods[cargo].HasData()) return; if (!st->goods[cargo].HasData()) return;
for (const auto &it : st->goods[cargo].GetData().flows) { for (const auto &it : st->goods[cargo].GetData().flows) {
StationID from = it.first; StationID from = it.first;
CargoDataEntry *source_entry = entry->InsertOrRetrieve(from); CargoDataEntry &source_entry = entry.InsertOrRetrieve(from);
uint32_t prev_count = 0; uint32_t prev_count = 0;
for (const auto &flow_it : *it.second.GetShares()) { for (const auto &flow_it : *it.second.GetShares()) {
StationID via = flow_it.second; StationID via = flow_it.second;
CargoDataEntry *via_entry = source_entry->InsertOrRetrieve(via); CargoDataEntry &via_entry = source_entry.InsertOrRetrieve(via);
if (via == this->window_number) { if (via == this->window_number) {
via_entry->InsertOrRetrieve(via)->Update(flow_it.first - prev_count); via_entry.InsertOrRetrieve(via).Update(flow_it.first - prev_count);
} else { } else {
EstimateDestinations(cargo, from, via, flow_it.first - prev_count, via_entry); EstimateDestinations(cargo, from, via, flow_it.first - prev_count, via_entry);
} }
@ -1552,7 +1545,7 @@ struct StationViewWindow : public Window {
* @param count Size of the batch of cargo. * @param count Size of the batch of cargo.
* @param dest CargoDataEntry to save the results in. * @param dest CargoDataEntry to save the results in.
*/ */
void EstimateDestinations(CargoType cargo, StationID source, StationID next, uint count, CargoDataEntry *dest) void EstimateDestinations(CargoType cargo, StationID source, StationID next, uint count, CargoDataEntry &dest)
{ {
if (Station::IsValidID(next) && Station::IsValidID(source)) { if (Station::IsValidID(next) && Station::IsValidID(source)) {
GoodsEntry &ge = Station::Get(next)->goods[cargo]; GoodsEntry &ge = Station::Get(next)->goods[cargo];
@ -1565,19 +1558,19 @@ struct StationViewWindow : public Window {
const FlowStat::SharesMap *shares = map_it->second.GetShares(); const FlowStat::SharesMap *shares = map_it->second.GetShares();
uint32_t prev_count = 0; uint32_t prev_count = 0;
for (FlowStat::SharesMap::const_iterator i = shares->begin(); i != shares->end(); ++i) { for (FlowStat::SharesMap::const_iterator i = shares->begin(); i != shares->end(); ++i) {
tmp.InsertOrRetrieve(i->second)->Update(i->first - prev_count); tmp.InsertOrRetrieve(i->second).Update(i->first - prev_count);
prev_count = i->first; prev_count = i->first;
} }
} }
if (tmp.GetCount() == 0) { if (tmp.GetCount() == 0) {
dest->InsertOrRetrieve(StationID::Invalid())->Update(count); dest.InsertOrRetrieve(StationID::Invalid()).Update(count);
} else { } else {
uint sum_estimated = 0; uint sum_estimated = 0;
while (sum_estimated < count) { while (sum_estimated < count) {
for (CargoDataSet::iterator i = tmp.Begin(); i != tmp.End() && sum_estimated < count; ++i) { for (CargoDataSet::iterator i = tmp.Begin(); i != tmp.End() && sum_estimated < count; ++i) {
CargoDataEntry *child = *i; CargoDataEntry &child = **i;
uint estimate = DivideApprox(child->GetCount() * count, tmp.GetCount()); uint estimate = DivideApprox(child.GetCount() * count, tmp.GetCount());
if (estimate == 0) estimate = 1; if (estimate == 0) estimate = 1;
sum_estimated += estimate; sum_estimated += estimate;
@ -1587,10 +1580,10 @@ struct StationViewWindow : public Window {
} }
if (estimate > 0) { if (estimate > 0) {
if (child->GetStation() == next) { if (child.GetStation() == next) {
dest->InsertOrRetrieve(next)->Update(estimate); dest.InsertOrRetrieve(next).Update(estimate);
} else { } else {
EstimateDestinations(cargo, source, child->GetStation(), estimate, dest); EstimateDestinations(cargo, source, child.GetStation(), estimate, dest);
} }
} }
} }
@ -1598,7 +1591,7 @@ struct StationViewWindow : public Window {
} }
} }
} else { } else {
dest->InsertOrRetrieve(StationID::Invalid())->Update(count); dest.InsertOrRetrieve(StationID::Invalid()).Update(count);
} }
} }
@ -1618,8 +1611,8 @@ struct StationViewWindow : public Window {
for (FlowStat::SharesMap::const_iterator flow_it = shares->begin(); flow_it != shares->end(); ++flow_it) { for (FlowStat::SharesMap::const_iterator flow_it = shares->begin(); flow_it != shares->end(); ++flow_it) {
const CargoDataEntry *via_entry = source_entry->Retrieve(flow_it->second); const CargoDataEntry *via_entry = source_entry->Retrieve(flow_it->second);
for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End(); ++dest_it) { for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End(); ++dest_it) {
CargoDataEntry *dest_entry = *dest_it; CargoDataEntry &dest_entry = **dest_it;
ShowCargo(entry, cargo, from, flow_it->second, dest_entry->GetStation(), dest_entry->GetCount()); ShowCargo(entry, cargo, from, flow_it->second, dest_entry.GetStation(), dest_entry.GetCount());
} }
} }
} }
@ -1652,7 +1645,7 @@ struct StationViewWindow : public Window {
uint remaining = cp->Count(); uint remaining = cp->Count();
for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End();) { for (CargoDataSet::iterator dest_it = via_entry->Begin(); dest_it != via_entry->End();) {
CargoDataEntry *dest_entry = *dest_it; CargoDataEntry &dest_entry = **dest_it;
/* Advance iterator here instead of in the for statement to test whether this is the last entry */ /* Advance iterator here instead of in the for statement to test whether this is the last entry */
++dest_it; ++dest_it;
@ -1664,10 +1657,10 @@ struct StationViewWindow : public Window {
* not matching GoodsEntry::TotalCount() */ * not matching GoodsEntry::TotalCount() */
val = remaining; val = remaining;
} else { } else {
val = std::min<uint>(remaining, DivideApprox(cp->Count() * dest_entry->GetCount(), via_entry->GetCount())); val = std::min<uint>(remaining, DivideApprox(cp->Count() * dest_entry.GetCount(), via_entry->GetCount()));
remaining -= val; remaining -= val;
} }
this->ShowCargo(entry, cargo, cp->GetFirstStation(), next, dest_entry->GetStation(), val); this->ShowCargo(entry, cargo, cp->GetFirstStation(), next, dest_entry.GetStation(), val);
} }
} }
this->ShowCargo(entry, cargo, NEW_STATION, NEW_STATION, NEW_STATION, packets.ReservedCount()); this->ShowCargo(entry, cargo, NEW_STATION, NEW_STATION, NEW_STATION, packets.ReservedCount());
@ -1701,16 +1694,16 @@ struct StationViewWindow : public Window {
* Mark a specific row, characterized by its CargoDataEntry, as expanded. * Mark a specific row, characterized by its CargoDataEntry, as expanded.
* @param entry The row to be marked as expanded. * @param entry The row to be marked as expanded.
*/ */
void SetDisplayedRow(const CargoDataEntry *entry) void SetDisplayedRow(const CargoDataEntry &entry)
{ {
std::list<StationID> stations; std::list<StationID> stations;
const CargoDataEntry *parent = entry->GetParent(); const CargoDataEntry *parent = entry.GetParent();
if (parent->GetParent() == nullptr) { if (parent->GetParent() == nullptr) {
this->displayed_rows.push_back(RowDisplay(&this->expanded_rows, entry->GetCargo())); this->displayed_rows.push_back(RowDisplay(&this->expanded_rows, entry.GetCargo()));
return; return;
} }
StationID next = entry->GetStation(); StationID next = entry.GetStation();
while (parent->GetParent()->GetParent() != nullptr) { while (parent->GetParent()->GetParent() != nullptr) {
stations.push_back(parent->GetStation()); stations.push_back(parent->GetStation());
parent = parent->GetParent(); parent = parent->GetParent();
@ -1764,9 +1757,9 @@ struct StationViewWindow : public Window {
* @param column The "column" the entry will be shown in. * @param column The "column" the entry will be shown in.
* @return either STR_STATION_VIEW_VIA or STR_STATION_VIEW_NONSTOP. * @return either STR_STATION_VIEW_VIA or STR_STATION_VIEW_NONSTOP.
*/ */
StringID SearchNonStop(CargoDataEntry *cd, StationID station, int column) StringID SearchNonStop(CargoDataEntry &cd, StationID station, int column)
{ {
CargoDataEntry *parent = cd->GetParent(); CargoDataEntry *parent = cd.GetParent();
for (int i = column - 1; i > 0; --i) { for (int i = column - 1; i > 0; --i) {
if (this->groupings[i] == GR_DESTINATION) { if (this->groupings[i] == GR_DESTINATION) {
if (parent->GetStation() == station) { if (parent->GetStation() == station) {
@ -1779,9 +1772,9 @@ struct StationViewWindow : public Window {
} }
if (this->groupings[column + 1] == GR_DESTINATION) { if (this->groupings[column + 1] == GR_DESTINATION) {
CargoDataSet::iterator begin = cd->Begin(); CargoDataSet::iterator begin = cd.Begin();
CargoDataSet::iterator end = cd->End(); CargoDataSet::iterator end = cd.End();
if (begin != end && ++(cd->Begin()) == end && (*(begin))->GetStation() == station) { if (begin != end && ++(cd.Begin()) == end && (*(begin))->GetStation() == station) {
return STR_STATION_VIEW_NONSTOP; return STR_STATION_VIEW_NONSTOP;
} else { } else {
return STR_STATION_VIEW_VIA; return STR_STATION_VIEW_VIA;
@ -1801,20 +1794,20 @@ struct StationViewWindow : public Window {
* @param cargo Current cargo being drawn (if cargo column has been passed). * @param cargo Current cargo being drawn (if cargo column has been passed).
* @return row (in "pos" counting) after the one we have last drawn to. * @return row (in "pos" counting) after the one we have last drawn to.
*/ */
int DrawEntries(CargoDataEntry *entry, const Rect &r, int pos, int maxrows, int column, CargoType cargo = INVALID_CARGO) int DrawEntries(CargoDataEntry &entry, const Rect &r, int pos, int maxrows, int column, CargoType cargo = INVALID_CARGO)
{ {
if (this->sortings[column] == CargoSortType::AsGrouping) { if (this->sortings[column] == CargoSortType::AsGrouping) {
if (this->groupings[column] != GR_CARGO) { if (this->groupings[column] != GR_CARGO) {
entry->Resort(CargoSortType::StationString, this->sort_orders[column]); entry.Resort(CargoSortType::StationString, this->sort_orders[column]);
} }
} else { } else {
entry->Resort(CargoSortType::Count, this->sort_orders[column]); entry.Resort(CargoSortType::Count, this->sort_orders[column]);
} }
for (CargoDataSet::iterator i = entry->Begin(); i != entry->End(); ++i) { for (CargoDataSet::iterator i = entry.Begin(); i != entry.End(); ++i) {
CargoDataEntry *cd = *i; CargoDataEntry &cd = **i;
Grouping grouping = this->groupings[column]; Grouping grouping = this->groupings[column];
if (grouping == GR_CARGO) cargo = cd->GetCargo(); if (grouping == GR_CARGO) cargo = cd.GetCargo();
bool auto_distributed = _settings_game.linkgraph.GetDistributionType(cargo) != DT_MANUAL; bool auto_distributed = _settings_game.linkgraph.GetDistributionType(cargo) != DT_MANUAL;
if (pos > -maxrows && pos <= 0) { if (pos > -maxrows && pos <= 0) {
@ -1823,10 +1816,10 @@ struct StationViewWindow : public Window {
int y = r.top - pos * GetCharacterHeight(FS_NORMAL); int y = r.top - pos * GetCharacterHeight(FS_NORMAL);
if (this->groupings[column] == GR_CARGO) { if (this->groupings[column] == GR_CARGO) {
str = STR_STATION_VIEW_WAITING_CARGO; str = STR_STATION_VIEW_WAITING_CARGO;
DrawCargoIcons(cd->GetCargo(), cd->GetCount(), r.left + this->expand_shrink_width, r.right - this->expand_shrink_width, y); DrawCargoIcons(cd.GetCargo(), cd.GetCount(), r.left + this->expand_shrink_width, r.right - this->expand_shrink_width, y);
} else { } else {
if (!auto_distributed) grouping = GR_SOURCE; if (!auto_distributed) grouping = GR_SOURCE;
station = cd->GetStation(); station = cd.GetStation();
str = this->GetGroupingString(grouping, station); str = this->GetGroupingString(grouping, station);
if (grouping == GR_NEXT && str == STR_STATION_VIEW_VIA) str = this->SearchNonStop(cd, station, column); if (grouping == GR_NEXT && str == STR_STATION_VIEW_VIA) str = this->SearchNonStop(cd, station, column);
@ -1839,11 +1832,11 @@ struct StationViewWindow : public Window {
Rect text = r.Indent(column * WidgetDimensions::scaled.hsep_indent, rtl).Indent(this->expand_shrink_width, !rtl); Rect text = r.Indent(column * WidgetDimensions::scaled.hsep_indent, rtl).Indent(this->expand_shrink_width, !rtl);
Rect shrink = r.WithWidth(this->expand_shrink_width, !rtl); Rect shrink = r.WithWidth(this->expand_shrink_width, !rtl);
DrawString(text.left, text.right, y, GetString(str, cargo, cd->GetCount(), station)); DrawString(text.left, text.right, y, GetString(str, cargo, cd.GetCount(), station));
if (column < NUM_COLUMNS - 1) { if (column < NUM_COLUMNS - 1) {
const char *sym = nullptr; const char *sym = nullptr;
if (cd->GetNumChildren() > 0) { if (cd.GetNumChildren() > 0) {
sym = "-"; sym = "-";
} else if (auto_distributed && str != STR_STATION_VIEW_RESERVED) { } else if (auto_distributed && str != STR_STATION_VIEW_RESERVED) {
sym = "+"; sym = "+";
@ -1852,7 +1845,7 @@ struct StationViewWindow : public Window {
const GoodsEntry &ge = Station::Get(this->window_number)->goods[cargo]; const GoodsEntry &ge = Station::Get(this->window_number)->goods[cargo];
if (ge.HasData()) { if (ge.HasData()) {
const StationCargoList &cargo_list = ge.GetData().cargo; const StationCargoList &cargo_list = ge.GetData().cargo;
if (grouping == GR_CARGO && (cargo_list.ReservedCount() > 0 || cd->HasTransfers())) { if (grouping == GR_CARGO && (cargo_list.ReservedCount() > 0 || cd.HasTransfers())) {
sym = "+"; sym = "+";
} }
} }

View File

@ -1727,36 +1727,37 @@ static const char * const _name_czech_patmod[][3] = {
/* This way the substantive can choose only some adjectives/endings: /* This way the substantive can choose only some adjectives/endings:
* At least one of these flags must be satisfied: */ * At least one of these flags must be satisfied: */
enum CzechAllow : uint8_t { enum class CzechAllowFlag : uint8_t {
CZA_SHORT = 1, Short,
CZA_MIDDLE = 2, Middle,
CZA_LONG = 4, Long,
CZA_ALL = CZA_SHORT | CZA_MIDDLE | CZA_LONG,
}; };
DECLARE_ENUM_AS_BIT_SET(CzechAllow) using CzechAllowFlags = EnumBitSet<CzechAllowFlag, uint8_t>;
static constexpr CzechAllowFlags CZA_ALL = {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long};
/* All these flags must be satisfied (in the stem->others direction): */ /* All these flags must be satisfied (in the stem->others direction): */
enum CzechChoose : uint8_t { enum class CzechChooseFlag : uint8_t {
CZC_NONE = 0, // No requirements. Colour,
CZC_COLOR = 1, Postfix, // Matched if postfix was inserted.
CZC_POSTFIX = 2, // Matched if postfix was inserted. NoPostfix, // Matched if no postfix was inserted.
CZC_NOPOSTFIX = 4, // Matched if no postfix was inserted.
CZC_ANY = CZC_COLOR | CZC_POSTFIX | CZC_NOPOSTFIX,
}; };
DECLARE_ENUM_AS_BIT_SET(CzechChoose) using CzechChooseFlags = EnumBitSet<CzechChooseFlag, uint8_t>;
static constexpr CzechChooseFlags CZC_ANY = {CzechChooseFlag::Colour, CzechChooseFlag::Postfix, CzechChooseFlag::NoPostfix};
struct CzechNameSubst { struct CzechNameSubst {
CzechGender gender; CzechGender gender;
CzechAllow allow; CzechAllowFlags allow;
CzechChoose choose; CzechChooseFlags choose;
const char *name; const char *name;
}; };
struct CzechNameAdj { struct CzechNameAdj {
CzechPattern pattern; CzechPattern pattern;
CzechChoose choose; CzechChooseFlags choose;
const char *name; const char *name;
}; };
@ -1791,18 +1792,18 @@ static const CzechNameAdj _name_czech_adj[] = {
{ CZP_MLADY, CZC_ANY, "Kamenn" }, { CZP_MLADY, CZC_ANY, "Kamenn" },
{ CZP_MLADY, CZC_ANY, "Cihlov" }, { CZP_MLADY, CZC_ANY, "Cihlov" },
{ CZP_MLADY, CZC_ANY, "Divn" }, { CZP_MLADY, CZC_ANY, "Divn" },
{ CZP_MLADY, CZC_COLOR, "\u010cerven" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u010cerven" },
{ CZP_MLADY, CZC_COLOR, "\u010cerven" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u010cerven" },
{ CZP_MLADY, CZC_COLOR, "\u010cerven" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u010cerven" },
{ CZP_MLADY, CZC_COLOR, "Zelen" }, { CZP_MLADY, CzechChooseFlag::Colour, "Zelen" },
{ CZP_MLADY, CZC_COLOR, "\u017dlut" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u017dlut" },
{ CZP_MLADY, CZC_COLOR, "Siv" }, { CZP_MLADY, CzechChooseFlag::Colour, "Siv" },
{ CZP_MLADY, CZC_COLOR, "\u0160ed" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u0160ed" },
{ CZP_MLADY, CZC_COLOR, "B\u00edl" }, { CZP_MLADY, CzechChooseFlag::Colour, "B\u00edl" },
{ CZP_MLADY, CZC_COLOR, "B\u00edl" }, { CZP_MLADY, CzechChooseFlag::Colour, "B\u00edl" },
{ CZP_MLADY, CZC_COLOR, "Modr" }, { CZP_MLADY, CzechChooseFlag::Colour, "Modr" },
{ CZP_MLADY, CZC_COLOR, "R\u016f\u017eov" }, { CZP_MLADY, CzechChooseFlag::Colour, "R\u016f\u017eov" },
{ CZP_MLADY, CZC_COLOR, "\u010cern" }, { CZP_MLADY, CzechChooseFlag::Colour, "\u010cern" },
{ CZP_PRIVL, CZC_ANY, "Kr\u00e1l" }, { CZP_PRIVL, CZC_ANY, "Kr\u00e1l" },
{ CZP_PRIVL, CZC_ANY, "Jan" }, { CZP_PRIVL, CZC_ANY, "Jan" },
{ CZP_PRIVL, CZC_ANY, "Karl" }, { CZP_PRIVL, CZC_ANY, "Karl" },
@ -1814,68 +1815,68 @@ static const CzechNameAdj _name_czech_adj[] = {
/* Considered a stem for choose/allow matching purposes. */ /* Considered a stem for choose/allow matching purposes. */
static const CzechNameSubst _name_czech_subst_full[] = { static const CzechNameSubst _name_czech_subst_full[] = {
{ CZG_SMASC, CZA_ALL, CZC_COLOR, "Sedlec" }, { CZG_SMASC, CZA_ALL, CzechChooseFlag::Colour, "Sedlec" },
{ CZG_SMASC, CZA_ALL, CZC_COLOR, "Brod" }, { CZG_SMASC, CZA_ALL, CzechChooseFlag::Colour, "Brod" },
{ CZG_SMASC, CZA_ALL, CZC_COLOR, "Brod" }, { CZG_SMASC, CZA_ALL, CzechChooseFlag::Colour, "Brod" },
{ CZG_SMASC, CZA_ALL, CZC_NONE, "\u00daval" }, { CZG_SMASC, CZA_ALL, {}, "\u00daval" },
{ CZG_SMASC, CZA_ALL, CZC_COLOR, "\u017d\u010f\u00e1r" }, { CZG_SMASC, CZA_ALL, CzechChooseFlag::Colour, "\u017d\u010f\u00e1r" },
{ CZG_SMASC, CZA_ALL, CZC_COLOR, "Smrk" }, { CZG_SMASC, CZA_ALL, CzechChooseFlag::Colour, "Smrk" },
{ CZG_SFEM, CZA_ALL, CZC_COLOR, "Hora" }, { CZG_SFEM, CZA_ALL, CzechChooseFlag::Colour, "Hora" },
{ CZG_SFEM, CZA_ALL, CZC_COLOR, "Lhota" }, { CZG_SFEM, CZA_ALL, CzechChooseFlag::Colour, "Lhota" },
{ CZG_SFEM, CZA_ALL, CZC_COLOR, "Lhota" }, { CZG_SFEM, CZA_ALL, CzechChooseFlag::Colour, "Lhota" },
{ CZG_SFEM, CZA_ALL, CZC_COLOR, "Hlava" }, { CZG_SFEM, CZA_ALL, CzechChooseFlag::Colour, "Hlava" },
{ CZG_SFEM, CZA_ALL, CZC_COLOR, "L\u00edpa" }, { CZG_SFEM, CZA_ALL, CzechChooseFlag::Colour, "L\u00edpa" },
{ CZG_SNEUT, CZA_ALL, CZC_COLOR, "Pole" }, { CZG_SNEUT, CZA_ALL, CzechChooseFlag::Colour, "Pole" },
{ CZG_SNEUT, CZA_ALL, CZC_COLOR, "\u00dadol\u00ed" }, { CZG_SNEUT, CZA_ALL, CzechChooseFlag::Colour, "\u00dadol\u00ed" },
{ CZG_PMASC, CZA_ALL, CZC_NONE, "\u00davaly" }, { CZG_PMASC, CZA_ALL, {}, "\u00davaly" },
{ CZG_PFEM, CZA_ALL, CZC_COLOR, "Luka" }, { CZG_PFEM, CZA_ALL, CzechChooseFlag::Colour, "Luka" },
{ CZG_PNEUT, CZA_ALL, CZC_COLOR, "Pole" }, { CZG_PNEUT, CZA_ALL, CzechChooseFlag::Colour, "Pole" },
}; };
/* TODO: More stems needed. --pasky */ /* TODO: More stems needed. --pasky */
static const CzechNameSubst _name_czech_subst_stem[] = { static const CzechNameSubst _name_czech_subst_stem[] = {
{ CZG_SMASC, CZA_MIDDLE, CZC_COLOR, "Kostel" }, { CZG_SMASC, { CzechAllowFlag::Middle }, CzechChooseFlag::Colour, "Kostel" },
{ CZG_SMASC, CZA_MIDDLE, CZC_COLOR, "Kl\u00e1\u0161ter" }, { CZG_SMASC, { CzechAllowFlag::Middle }, CzechChooseFlag::Colour, "Kl\u00e1\u0161ter" },
{ CZG_SMASC, CZA_SHORT, CZC_COLOR, "Lhot" }, { CZG_SMASC, {CzechAllowFlag::Short }, CzechChooseFlag::Colour, "Lhot" },
{ CZG_SFEM, CZA_SHORT, CZC_COLOR, "Lhot" }, { CZG_SFEM, {CzechAllowFlag::Short }, CzechChooseFlag::Colour, "Lhot" },
{ CZG_SFEM, CZA_SHORT, CZC_COLOR, "Hur" }, { CZG_SFEM, {CzechAllowFlag::Short }, CzechChooseFlag::Colour, "Hur" },
{ CZG_FREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Sedl" }, { CZG_FREE, { CzechAllowFlag::Middle, CzechAllowFlag::Long}, {}, "Sedl" },
{ CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_COLOR, "Hrad" }, { CZG_FREE, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CzechChooseFlag::Colour, "Hrad" },
{ CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Pras" }, { CZG_NFREE, { CzechAllowFlag::Middle }, {}, "Pras" },
{ CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Ba\u017e" }, { CZG_NFREE, { CzechAllowFlag::Middle }, {}, "Ba\u017e" },
{ CZG_NFREE, CZA_MIDDLE, CZC_NONE, "Tes" }, { CZG_NFREE, { CzechAllowFlag::Middle }, {}, "Tes" },
{ CZG_NFREE, CZA_MIDDLE, CZC_NONE, "U\u017e" }, { CZG_NFREE, { CzechAllowFlag::Middle }, {}, "U\u017e" },
{ CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_POSTFIX, "B\u0159" }, { CZG_NFREE, { CzechAllowFlag::Middle, CzechAllowFlag::Long}, CzechChooseFlag::Postfix, "B\u0159" },
{ CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Vod" }, { CZG_NFREE, { CzechAllowFlag::Middle, CzechAllowFlag::Long}, {}, "Vod" },
{ CZG_NFREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Jan" }, { CZG_NFREE, { CzechAllowFlag::Middle, CzechAllowFlag::Long}, {}, "Jan" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Prach" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Prach" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Kunr" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Kunr" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Strak" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Strak" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "V\u00edt" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "V\u00edt" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Vy\u0161" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Vy\u0161" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "\u017dat" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "\u017dat" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "\u017der" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "\u017der" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "St\u0159ed" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "St\u0159ed" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Harv" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Harv" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Pruh" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Pruh" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Tach" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Tach" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "P\u00edsn" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "P\u00edsn" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Jin" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Jin" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Jes" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Jes" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Jar" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Jar" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Sok" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Sok" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Hod" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Hod" },
{ CZG_NFREE, CZA_LONG, CZC_NONE, "Net" }, { CZG_NFREE, { CzechAllowFlag::Long}, {}, "Net" },
{ CZG_FREE, CZA_LONG, CZC_NONE, "Pra\u017e" }, { CZG_FREE, { CzechAllowFlag::Long}, {}, "Pra\u017e" },
{ CZG_FREE, CZA_LONG, CZC_NONE, "Nerat" }, { CZG_FREE, { CzechAllowFlag::Long}, {}, "Nerat" },
{ CZG_FREE, CZA_LONG, CZC_NONE, "Kral" }, { CZG_FREE, { CzechAllowFlag::Long}, {}, "Kral" },
{ CZG_FREE, CZA_LONG, CZC_NONE, "Hut" }, { CZG_FREE, { CzechAllowFlag::Long}, {}, "Hut" },
{ CZG_FREE, CZA_LONG, CZC_NOPOSTFIX, "Pan" }, { CZG_FREE, { CzechAllowFlag::Long}, CzechChooseFlag::NoPostfix, "Pan" },
{ CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_NOPOSTFIX, "Odst\u0159ed" }, { CZG_FREE, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CzechChooseFlag::NoPostfix, "Odst\u0159ed" },
{ CZG_FREE, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_COLOR, "Mrat" }, { CZG_FREE, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CzechChooseFlag::Colour, "Mrat" },
{ CZG_FREE, CZA_LONG, CZC_COLOR, "Hlav" }, { CZG_FREE, { CzechAllowFlag::Long}, CzechChooseFlag::Colour, "Hlav" },
{ CZG_FREE, CZA_SHORT | CZA_MIDDLE, CZC_NONE, "M\u011b\u0159" }, { CZG_FREE, {CzechAllowFlag::Short, CzechAllowFlag::Middle }, {}, "M\u011b\u0159" },
{ CZG_FREE, CZA_MIDDLE | CZA_LONG, CZC_NONE, "Lip" }, { CZG_FREE, { CzechAllowFlag::Middle, CzechAllowFlag::Long}, {}, "Lip" },
}; };
/* Optional postfix inserted between stem and ending. */ /* Optional postfix inserted between stem and ending. */
@ -1887,26 +1888,26 @@ static const char * const _name_czech_subst_postfix[] = {
/* This array must have the both neutral genders at the end! */ /* This array must have the both neutral genders at the end! */
static const CzechNameSubst _name_czech_subst_ending[] = { static const CzechNameSubst _name_czech_subst_ending[] = {
{ CZG_SMASC, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "ec" }, { CZG_SMASC, {CzechAllowFlag::Short, CzechAllowFlag::Middle }, CZC_ANY, "ec" },
{ CZG_SMASC, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "\u00edn" }, { CZG_SMASC, {CzechAllowFlag::Short, CzechAllowFlag::Middle }, CZC_ANY, "\u00edn" },
{ CZG_SMASC, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "ov" }, { CZG_SMASC, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CZC_ANY, "ov" },
{ CZG_SMASC, CZA_SHORT | CZA_LONG, CZC_ANY, "kov" }, { CZG_SMASC, {CzechAllowFlag::Short, CzechAllowFlag::Long}, CZC_ANY, "kov" },
{ CZG_SMASC, CZA_LONG, CZC_POSTFIX, "\u00edn" }, { CZG_SMASC, { CzechAllowFlag::Long}, CzechChooseFlag::Postfix, "\u00edn" },
{ CZG_SMASC, CZA_LONG, CZC_POSTFIX, "n\u00edk" }, { CZG_SMASC, { CzechAllowFlag::Long}, CzechChooseFlag::Postfix, "n\u00edk" },
{ CZG_SMASC, CZA_LONG, CZC_ANY, "burk" }, { CZG_SMASC, { CzechAllowFlag::Long}, CZC_ANY, "burk" },
{ CZG_SFEM, CZA_SHORT, CZC_ANY, "ka" }, { CZG_SFEM, {CzechAllowFlag::Short }, CZC_ANY, "ka" },
{ CZG_SFEM, CZA_MIDDLE, CZC_ANY, "inka" }, { CZG_SFEM, { CzechAllowFlag::Middle }, CZC_ANY, "inka" },
{ CZG_SFEM, CZA_MIDDLE, CZC_ANY, "n\u00e1" }, { CZG_SFEM, { CzechAllowFlag::Middle }, CZC_ANY, "n\u00e1" },
{ CZG_SFEM, CZA_LONG, CZC_ANY, "ava" }, { CZG_SFEM, { CzechAllowFlag::Long}, CZC_ANY, "ava" },
{ CZG_PMASC, CZA_LONG, CZC_POSTFIX, "\u00edky" }, { CZG_PMASC, { CzechAllowFlag::Long}, CzechChooseFlag::Postfix, "\u00edky" },
{ CZG_PMASC, CZA_LONG, CZC_ANY, "upy" }, { CZG_PMASC, { CzechAllowFlag::Long}, CZC_ANY, "upy" },
{ CZG_PMASC, CZA_LONG, CZC_ANY, "olupy" }, { CZG_PMASC, { CzechAllowFlag::Long}, CZC_ANY, "olupy" },
{ CZG_PFEM, CZA_LONG, CZC_ANY, "avy" }, { CZG_PFEM, { CzechAllowFlag::Long}, CZC_ANY, "avy" },
{ CZG_PFEM, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "ice" }, { CZG_PFEM, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CZC_ANY, "ice" },
{ CZG_PFEM, CZA_SHORT | CZA_MIDDLE | CZA_LONG, CZC_ANY, "i\u010dky" }, { CZG_PFEM, {CzechAllowFlag::Short, CzechAllowFlag::Middle, CzechAllowFlag::Long}, CZC_ANY, "i\u010dky" },
{ CZG_PNEUT, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "na" }, { CZG_PNEUT, {CzechAllowFlag::Short, CzechAllowFlag::Middle }, CZC_ANY, "na" },
{ CZG_SNEUT, CZA_SHORT | CZA_MIDDLE, CZC_ANY, "no" }, { CZG_SNEUT, {CzechAllowFlag::Short, CzechAllowFlag::Middle }, CZC_ANY, "no" },
{ CZG_SNEUT, CZA_LONG, CZC_ANY, "i\u0161t\u011b" }, { CZG_SNEUT, { CzechAllowFlag::Long}, CZC_ANY, "i\u0161t\u011b" },
}; };
static const char * const _name_czech_suffix[] = { static const char * const _name_czech_suffix[] = {

View File

@ -602,8 +602,8 @@ static void MakeCzechTownName(StringBuilder &builder, uint32_t seed)
/* The select criteria. */ /* The select criteria. */
CzechGender gender; CzechGender gender;
CzechChoose choose; CzechChooseFlags choose;
CzechAllow allow; CzechAllowFlags allow;
if (do_prefix) prefix = SeedModChance(5, std::size(_name_czech_adj) * 12, seed) / 12; if (do_prefix) prefix = SeedModChance(5, std::size(_name_czech_adj) * 12, seed) / 12;
if (do_suffix) suffix = SeedModChance(7, std::size(_name_czech_suffix), seed); if (do_suffix) suffix = SeedModChance(7, std::size(_name_czech_suffix), seed);
@ -632,18 +632,18 @@ static void MakeCzechTownName(StringBuilder &builder, uint32_t seed)
/* Load the postfix (1:1 chance that a postfix will be inserted) */ /* Load the postfix (1:1 chance that a postfix will be inserted) */
postfix = SeedModChance(14, std::size(_name_czech_subst_postfix) * 2, seed); postfix = SeedModChance(14, std::size(_name_czech_subst_postfix) * 2, seed);
if (choose & CZC_POSTFIX) { if (choose.Test(CzechChooseFlag::Postfix)) {
/* Always get a real postfix. */ /* Always get a real postfix. */
postfix %= std::size(_name_czech_subst_postfix); postfix %= std::size(_name_czech_subst_postfix);
} }
if (choose & CZC_NOPOSTFIX) { if (choose.Test(CzechChooseFlag::NoPostfix)) {
/* Always drop a postfix. */ /* Always drop a postfix. */
postfix += std::size(_name_czech_subst_postfix); postfix += std::size(_name_czech_subst_postfix);
} }
if (postfix < std::size(_name_czech_subst_postfix)) { if (postfix < std::size(_name_czech_subst_postfix)) {
choose |= CZC_POSTFIX; choose.Set(CzechChooseFlag::Postfix);
} else { } else {
choose |= CZC_NOPOSTFIX; choose.Set(CzechChooseFlag::NoPostfix);
} }
/* Localize the array segment containing a good gender */ /* Localize the array segment containing a good gender */
@ -671,7 +671,7 @@ static void MakeCzechTownName(StringBuilder &builder, uint32_t seed)
for (ending = ending_start; ending <= ending_stop; ending++) { for (ending = ending_start; ending <= ending_stop; ending++) {
const CzechNameSubst *e = &_name_czech_subst_ending[ending]; const CzechNameSubst *e = &_name_czech_subst_ending[ending];
if ((e->choose & choose) == choose && (e->allow & allow) != 0) { if ((e->choose & choose) == choose && e->allow.Any(allow)) {
map[i++] = ending; map[i++] = ending;
} }
} }