From e722ea89f0ebda60fd251ee2ba33635df367acd4 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 12 Apr 2021 17:51:14 +0000 Subject: [PATCH 01/10] Update: Translations from eints norwegian (bokmal): 2 changes by Anolitt english (us): 2 changes by 2TallTyler korean: 3 changes by telk5093 german: 2 changes by danidoedel romanian: 35 changes by kneekoo finnish: 2 changes by hpiirai spanish: 4 changes by MontyMontana french: 3 changes by glx22 portuguese: 4 changes by azulcosta --- src/lang/english_US.txt | 2 ++ src/lang/finnish.txt | 2 ++ src/lang/french.txt | 4 ++- src/lang/german.txt | 2 ++ src/lang/korean.txt | 4 ++- src/lang/norwegian_bokmal.txt | 2 ++ src/lang/portuguese.txt | 6 +++-- src/lang/romanian.txt | 51 ++++++++++++++++++++++++----------- src/lang/spanish.txt | 6 +++-- 9 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index c9763aeeb0..eb32fbc55e 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1006,6 +1006,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Check this box to allow OpenTTD to try to use hardware acceleration. A changed setting will only be applied upon game restart STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}The setting will only take effect after a game restart +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Check this box to v-sync the screen. A changed setting will only be applied upon game restart. Only works with hardware acceleration enabled STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Interface size STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Select the interface element size to use diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 00173ff33e..3fea792d3c 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1006,6 +1006,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Laitteis STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Valitse tämä, jos haluat, että OpenTTD yrittää käyttää laitteistokiihdytystä. Muutettu asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Pystytahdistus +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Valitse tämä ottaaksesi käyttöön näytön pystytahdistuksen. Muutettu asetus tulee voimaan vasta pelin uudelleenkäynnistyksen jälkeen. Edellyttää, että laitteistokiihdytys on käytössä. STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Käyttöliittymän koko STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Valitse käyttöliittymäelementtien koko diff --git a/src/lang/french.txt b/src/lang/french.txt index 80ddd9833d..cf6763c8c1 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1007,6 +1007,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK} Accél STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Cochez cette case permet à OpenTTD d'utiliser l'accélération matérielle, si possible. Un paramètre modifié ne sera pris en compte qu'au redémarrage du jeu STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Les paramètres ne prendront effet qu'après le redémarrage du jeu +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Cochez cette case pour activer la synchronisation verticale de l'écran. La modification de ce paramètres ne sera effective qu'après le redémarrage du jeu. Fonctionne uniquement si l’accélération matérielle est active STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Taille d'interface STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Choisir la taille d'élément d'interface à utiliser @@ -3441,7 +3443,7 @@ STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Déména STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruire ailleurs le siège de la compagnie pour le prix de 1{NBSP}% de sa valeur.{}Shift-clic pour afficher seulement le coût estimé. STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Détails STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Afficher le détail des calculs d'infrastructure -STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :Donner de l’argent +STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Donner de l’argent STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Donner de l’argent à cette compagnie STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Nouveau visage diff --git a/src/lang/german.txt b/src/lang/german.txt index ea70ed2f2b..6fcc09166b 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1007,6 +1007,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardware STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um OpenTTD zu erlauben, die Hardwarebeschleunigung zu verwenden. Eine geänderte Einstellung wird nur beim Spielneustart wirksam STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Die Einstellung tritt nur nach einem Neustart des Spiels in Kraft +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um VSync zu aktivieren. Eine geänderte Einstellung wird nur beim Spielneustart wirksam. Funktioniert nur mit aktivierter Hardwarebeschleunigung STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Größe der Bedienelemente STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Wähle die Größe der Bedienelemente diff --git a/src/lang/korean.txt b/src/lang/korean.txt index a0190dd42f..2f8d593cde 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1004,9 +1004,11 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :기타 STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}하드웨어 가속 -STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}OpenTTD가 하드웨어 가속을 사용하게 하려면 체크하세요. 변경된 설정은 게임을 재시작한 뒤에 적용됩니다. +STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}OpenTTD가 하드웨어 가속을 사용하게 하려면 체크하세요. 변경한 설정은 게임을 재시작한 뒤에 적용될 것입니다. STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}이 설정은 게임을 재시작한 뒤에 적용될 것입니다 +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}수직 동기화 +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}화면과 수직 동기화하려면 체크하세요. 변경한 설정은 게임을 재시작한 뒤에 적용될 것입니다. 하드웨어 가속을 켠 경우에만 작동합니다. STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}인터페이스 크기 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}인터페이스의 크기를 선택합니다. diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index a32514a115..568f45972a 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1008,6 +1008,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Maskinva STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Merk av i denne boksen for å la OpenTTD prøve å bruke maskinvareakselerasjon. En endret innstilling blir bare brukt ved omstart av spillet STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Innstillingen vil ikke tre i kraft før spillet er restartet +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Merk av i denne boksen for å v-synkronisere skjermen. Endring av innstillinger krever omstart av spillet. Fungerer bare med maskinvareakselerasjon aktivert STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Grensesnitt-størrelse STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Velg grensesnitt-størrelsen som skal benyttes diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 431a69f809..d82a547295 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1007,6 +1007,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelera STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Marque esta caixa para permitir que o OpenTTD tente usar a aceleração por hardware. Uma configuração alterada só será aplicada após reiniciar o jogo STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}A definição só terá efeito após reiniciar o jogo +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marque esta caixa para ativar "V-Sync" no ecrã. Uma configuração alterada só terá efeito quando reiniciar o jogo. Só funciona com a aceleração por hardware ativada STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamanho interface STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccionar tamanho do elemento de interface a usar @@ -1270,7 +1272,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Se ativado, os STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Novas ordens são 'sem parar' por predefinição: {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normalmente, um veículo para em cada estação por onde passa. Ao ativar esta configuração, um veículo irá passar por todas as estações no seu percurso, parando apenas no destino final. Esta opção só tem efeito para novas rotas, mas as rotas existentes podem ser alteradas para funcionarem de forma igual. STR_CONFIG_SETTING_STOP_LOCATION :Ordens novas do comboio param {STRING} da plataforma -STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local onde um combóio parará na plataforma por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afecta o valor por omissão para novas encomendas. Encomendas individuais podem utilizar qualquer uma das opções independentemente desta +STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Local de paragem do comboio nas plataformas por omissão. A opção 'extremo mais próximo' significa perto do ponto de entrada, 'meio' significa no meio da plataforma e 'extremo mais distante' significa o mais distante possível do ponto de entrada. Esta opção apenas afeta o valor por omissão para novas ordens. Ordens individuais podem utilizar qualquer uma das opções independentemente desta STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :no extremo perto STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :no meio STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :no extremo longe @@ -1317,7 +1319,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activar esta pr STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avisar se o veículo está perdido: {STRING} STR_CONFIG_SETTING_WARN_LOST_VEHICLE_HELPTEXT :Mostrar mensagens sobre veículos que não conseguem encontrar o caminho para o seu próximo destino. STR_CONFIG_SETTING_ORDER_REVIEW :Analisar ordens dos veículos: {STRING} -STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Quando activo, as encomendas dos veículos são periodicamente revistas e algumas falhas óbvias são anunciadas através de notícias, quando detectadas +STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :Quando ativo, as ordens dos veículos são periodicamente revistas e algumas falhas óbvias são anunciadas através de notícias, quando detetadas STR_CONFIG_SETTING_ORDER_REVIEW_OFF :Não STR_CONFIG_SETTING_ORDER_REVIEW_EXDEPOT :Sim, mas excluir veículos parados STR_CONFIG_SETTING_ORDER_REVIEW_ON :De todos os veículos diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index ebe7bd4f89..002f7500ae 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -356,7 +356,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Salvează scena STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Încarcă scenariu STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Salvează harta înălţimilor STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Încarcă harta de înălţimi -STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Ieşire din editorul de scenarii +STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Ieșire din editorul de scenarii STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Ieşire din joc ############ range for SE file menu starts @@ -381,7 +381,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Nume staţii/se ############ range for file menu starts STR_FILE_MENU_SAVE_GAME :Salvează jocul STR_FILE_MENU_LOAD_GAME :Încarcă joc -STR_FILE_MENU_QUIT_GAME :Ieşire în meniul principal +STR_FILE_MENU_QUIT_GAME :Ieșire în meniul principal STR_FILE_MENU_SEPARATOR : STR_FILE_MENU_EXIT :Ieşire din joc ############ range ends here @@ -637,6 +637,7 @@ STR_MUSIC_EFFECTS_VOLUME :{TINY_FONT}{BLA STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}-- STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM} STR_MUSIC_TITLE_NONE :{TINY_FONT}{DKGREEN}------ +STR_MUSIC_TITLE_NOMUSIC :{TINY_FONT}{DKGREEN}Nu există muzică disponibilă STR_MUSIC_TITLE_NAME :{TINY_FONT}{DKGREEN}"{STRING}" STR_MUSIC_TRACK :{TINY_FONT}{BLACK}Piesa STR_MUSIC_XTITLE :{TINY_FONT}{BLACK}Titlul @@ -972,6 +973,7 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Alege re STR_GAME_OPTIONS_RESOLUTION_OTHER :(alta/nespecificată) STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} +STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Accelerare hardware STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Mărime interfată @@ -989,6 +991,7 @@ STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Mărime dublă STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}Alegeți rata de reîmprospătare dorită +STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_BASE_GRF :{BLACK}Set grafic de bază STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selectează setul grafic de bază utilizat în joc @@ -1162,7 +1165,8 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Comută dezastr STR_CONFIG_SETTING_CITY_APPROVAL :Atitudinea consiliului orașului cu privire la restructurarea zonei: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Alege în ce măsură poluarea fonică si deranjamentul local provocat de o companie va afecta impresia orașului despre aceasta, si viitoarele planuri de construcție in zonă -STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Nu poţi seta înălţimea maxima a hărţii la aceasta valoare. Cel puţin un munte pe hartă are o înălţime mai mare. +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Înălțimea limită a hărții: {STRING} +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Nu poți seta înălțimea maximă a hărții la această valoare. Cel puțin un munte de pe hartă este mai înalt de-atât. STR_CONFIG_SETTING_AUTOSLOPE :Permite terra-formarea sub clădiri, şine, etc. (auto-pante): {STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite terraformarea sub clădiri şi şine fără eliminarea acestora STR_CONFIG_SETTING_CATCHMENT :Permite arii de cuprindere mai realiste: {STRING} @@ -1176,7 +1180,7 @@ STR_CONFIG_SETTING_SMOKE_AMOUNT :Cantitatea de f STR_CONFIG_SETTING_SMOKE_AMOUNT_HELPTEXT :Configurează cât de mult fum sau cât de multe scântei sunt emise de vehicule STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL :Modelul de acceleraţie al trenurilor: {STRING} STR_CONFIG_SETTING_TRAIN_ACCELERATION_MODEL_HELPTEXT :Selectează modelul fizic pentru accelerarea trenurilor. Modelul "original" penalizează pantele în mod egal pentru toate vehiculele. Modelul "realistic" penalizează pantele şi curbele în funcţie de mai mulţi parametrii, cum ar fi lungimea şi efortul tractor -STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Modelul de acceleraţie al vehiculelor rutiere: {STRING} +STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL :Modelul de accelerație al vehiculelor rutiere: {STRING} STR_CONFIG_SETTING_ROAD_VEHICLE_ACCELERATION_MODEL_HELPTEXT :Selectează modelul fizic pentru accelerarea autovehiculelor. Modelul "original" penalizează pantele în mod egal pentru toate autovehiculele. Modelul "realistic" penalizează pantele şi curbele în funcţie de mai mulţi parametrii ai motorului, cum ar fi efortul tractor STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS :Înclinarea pantelor pentru trenuri: {STRING} STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :Înclinarea unui pătrăţel de pantă pentru trenuri. O valoare mai mare face urcarea mai dificilă @@ -1191,8 +1195,8 @@ STR_CONFIG_SETTING_INFLATION :Inflaţia: {STR STR_CONFIG_SETTING_INFLATION_HELPTEXT :Activează inflaţia în economie, unde costurile cresc ceva mai rapid decât plăţile STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH :Lungimea maximă a podurilor: {STRING} STR_CONFIG_SETTING_MAX_BRIDGE_LENGTH_HELPTEXT :Lungimea maximă pentru construcţia de poduri -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Întăltimea maximă a podurilor: {STRING} -STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Întăltimea maximă pentru construcţia de poduri +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT :Înălțimea maximă a podurilor: {STRING} +STR_CONFIG_SETTING_MAX_BRIDGE_HEIGHT_HELPTEXT :Înălțimea maximă pentru construcția de poduri STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :Lungimea maximă a tunelurilor: {STRING} STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH_HELPTEXT :Lungimea maximă pentru construcţia de tuneluri STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :Metoda manuală de construcţie a industriilor primare: {STRING} @@ -1298,7 +1302,9 @@ STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stabilește câ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Distanța maximă de la marginea hărții pentru rafinării: {STRING} STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Rafinăriile de petrol vor fi construite doar la marginea hărţii, sau pe coastă, în cazul harţilor insulare STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Grosimea stratului de zăpadă: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controlează înălțimea de la care zăpada apare în peisajul sub-arctic. De asemenea, zăpada afectează generarea industriilor și cerințele de creștere a orașelor. +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Controlează înălțimea de la care zăpada apare în peisajul sub-arctic. Zăpada afectează și generarea industriilor și cerințele de creștere a orașelor. Se poate modifica doar prin Editorul de scenarii sau este calculat prin „acoperirea cu zăpadă” +STR_CONFIG_SETTING_SNOW_COVERAGE :Acoperire cu zăpadă: {STRING} +STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Acoperire cu deșert: {STRING} STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Controlează întinderea aproximativă de deșert din peisajul tropical. Deșert afectează și generarea industriilor. Parametrul se folosește doar la generarea hărții STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% @@ -1338,6 +1344,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Verde închis STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Mov STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT :Comportamentul derulării hărții STR_CONFIG_SETTING_SCROLLMODE_RMB_LOCKED :Mută harta ținând apăsat click dreapta, poziția cursorului rămânând fixă +STR_CONFIG_SETTING_SCROLLMODE_RMB :Mută harta cu clic dreapta STR_CONFIG_SETTING_SCROLLMODE_LMB :Mută harta cu clic stânga STR_CONFIG_SETTING_SMOOTH_SCROLLING :Derulare uşoară ecran: {STRING} STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controlează modul de deplasare a imaginii din ecranul principal când se face click pe harta mică sau când se execută o comandă de deplasare către un obiect anume de pe hartă. Dacă este activată, imaginea se deplasează în mod fluid, altfel imaginea sare direct la zona dorită @@ -1576,6 +1583,7 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Liniar STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Poziţionarea copacilor în joc: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controlează apariția aleatoare a copacilor în joc. Este posibil ca această opțiune să afecteze industrii care depind de creșterea copacilor, cum ar fi fabricile de cherestea STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Cresc dar nu se extind {RED}(strică fabrica de cherestea) +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Cresc dar se extind doar în păduri tropicale STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Cresc și se extind peste tot STR_CONFIG_SETTING_TOOLBAR_POS :Poziţia barei principale de instrumente: {STRING} @@ -1597,6 +1605,7 @@ STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :x2 STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :x4 STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :x8 +STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2x STR_CONFIG_SETTING_TOWN_GROWTH :Viteza de dezvoltare a oraşului: {STRING} STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Viteza creşterii oraşelor STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Deloc @@ -1771,9 +1780,9 @@ STR_QUIT_YES :{BLACK}Da STR_QUIT_NO :{BLACK}Nu # Abandon game -STR_ABANDON_GAME_CAPTION :{WHITE}Ieşire din joc -STR_ABANDON_GAME_QUERY :{YELLOW}Eşti sigur că vrei să renunţi la acest joc? -STR_ABANDON_SCENARIO_QUERY :{YELLOW}Eşti sigur că vrei să renunţi la acest scenariu? +STR_ABANDON_GAME_CAPTION :{WHITE}Ieșire din joc +STR_ABANDON_GAME_QUERY :{YELLOW}Sigur vrei să renunți la acest joc? +STR_ABANDON_SCENARIO_QUERY :{YELLOW}Sigur vrei să renunți la acest scenariu? # Cheat window STR_CHEATS :{WHITE}Cheat-uri @@ -1783,8 +1792,8 @@ STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Joacă STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Buldozer magic (demolează industrii şi lucruri amovibile): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunelele se pot intersecta: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Avioanele cu reacţie nu se vor prăbuşi (frecvent) pe aeroporturile mici: {ORANGE}{STRING} -STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Schimbă înălţimea maximă a harţii: {ORANGE}{NUM} -STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Schimbă înălţimea maxima a munţilor pe hartă +STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Schimbă înălțimea maximă a hărții: {ORANGE}{NUM} +STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Schimbă înălțimea maximă a munților pe hartă STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :peisajul temperat STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :peisajul sub-arctic STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :peisajul sub-tropical @@ -1929,8 +1938,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Intră STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Actualizează serverul STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Actualizează informaţiile despre server +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Caută pe internet STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Caută servere publice în internet STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}Caută în LAN +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Caută servere în rețeaua locală STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Adaugă un server STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Adaugă un server la lista care va fi verificată pentru jocuri active STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Porneşte serverul @@ -2541,6 +2552,7 @@ STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cost: {Y STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Prospectează STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Construieşte STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Finanţează +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Elimină toate industriile # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Lanţ industrial pentru industria {STRING} @@ -2561,6 +2573,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Alege in # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Informaţii teren +STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Centrează vizorul principal pe locația dalei. Ctrl+clic deschide un vizor nou pe locația dalei STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Costul demolării: {LTBLUE}nu este cazul STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Costul demolării: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Încasări după curăţare: {LTBLUE}{CURRENCY_LONG} @@ -3308,6 +3321,7 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Industr STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}Necesită: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesită: STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}Schimba productia (multiplu de 8, până la 2040) @@ -3372,6 +3386,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Elimină toate STR_GROUP_RENAME_CAPTION :{BLACK}Redenumeşte un grup STR_GROUP_PROFIT_THIS_YEAR :Profitul pe anul acesta: +STR_GROUP_PROFIT_LAST_YEAR :Profitul anului trecut: STR_GROUP_OCCUPANCY :Utilizare curentă: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -3419,10 +3434,11 @@ STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Cumpără vehicul STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Cumpără vehicul -STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Cumpără navă +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Cumpără nava STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Cumpără aeronavă STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Cumpără și adaptează vehiculul +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Cumpără și repară vehiculul STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Cumpără și schimbă marfa transportată de aeronavă STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără vehiculul feroviar selectat. Shift+Click arată costul estimat fără să cumpere vehiculul @@ -3530,7 +3546,7 @@ STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Click pt STR_DEPOT_MASS_STOP_DEPOT_SHIP_TOOLTIP :{BLACK}Click pt oprirea tuturor vaselor din depou STR_DEPOT_MASS_STOP_HANGAR_TOOLTIP :{BLACK}Click pt oprirea tuturor aeronavelor din hangar -STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Click pt pornirea tuturor trenurilor din depou +STR_DEPOT_MASS_START_DEPOT_TRAIN_TOOLTIP :{BLACK}Clic pentru pornirea tuturor trenurilor din depou STR_DEPOT_MASS_START_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Click pt pornirea tuturor autovehiculelor din depou STR_DEPOT_MASS_START_DEPOT_SHIP_TOOLTIP :{BLACK}Click pt pornirea tuturor vaselor din depou STR_DEPOT_MASS_START_HANGAR_TOOLTIP :{BLACK}Click pt pornirea tuturor aeronavelor din hangar @@ -3619,7 +3635,7 @@ STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Acest bu STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forţează trenul să ignore semnalizarea de oprire STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Schimba tipul încãrcãturii cãratã de acest tren -STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adapteaza autovehiculul pentru o incarcatura diferita +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptează autovehiculul pentru o încărcătură diferită STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Schimbă tipul de marfă transportat de navă STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Schimbă tipul de marfă transportat de aeronavă @@ -3636,7 +3652,8 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Afişeaz STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Afişează detaliile navei STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Afişează detaliile aeronavei -STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea trenului actual - clic pentru oprirea/pornirea trenului +STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea trenului curent - clic pentru oprirea/pornirea trenului +STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea avionului curent - clic pentru oprirea/pornirea avionului # Messages in the start stop button in the vehicle view @@ -4308,6 +4325,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tip incorect de STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} este prea lung după înlocuire STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Nicio regulă autoînlocuire/reînnoire aplicată STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(fonduri limitate) +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Noul vehicul nu poate transporta {STRING} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Combinaţie de linii imposibilă @@ -4888,6 +4906,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Baliza STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Baliza #{COMMA} STR_FORMAT_COMPANY_NUM :(Companie {COMMA}) STR_FORMAT_GROUP_NAME :Grup {COMMA} +STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING} STR_FORMAT_WAYPOINT_NAME :Halta {TOWN} STR_FORMAT_WAYPOINT_NAME_SERIAL :Halta {TOWN} #{COMMA} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 28ec796454..0214ec0ef5 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1007,6 +1007,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Acelerac STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Marca esta casilla para permitir que OpenTTD intente usar aceleración por hardware. El cambio de configuración sólo tendrá efecto después de reiniciar el juego STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}El ajuste sólo tendrá efecto después de reiniciar el juego +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}Sincronización vertical +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Marca esta casilla para activar la sincronización vertical en la pantalla. El cambio sólo se aplicará después de reiniciar el juego. Sólo funciona si la aceleración por hardware está activada. STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Tamaño de la interfaz STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Selecciona el tamaño de los elementos de la interfaz a usar @@ -3224,9 +3226,9 @@ STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Financiar la co STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Comprar derechos de transporte exclusivos STR_LOCAL_AUTHORITY_ACTION_BRIBE :Sobornar a la autoridad local -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar una pequeña campaña publicitaria local para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio pequeño alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW}Iniciar una campaña publicitaria local pequeña para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio pequeño alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Iniciar una campaña publicitaria local mediana para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio mediano alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} -STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar una gran campaña publicitaria local para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio grande alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Iniciar una campaña publicitaria local grande para atraer más pasajeros y carga a sus servicios de transporte.{}Proporciona un incremento temporal en la calificación de las estaciones en un radio grande alrededor del centro del municipio.{}Coste: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Pagar la reconstrucción de las carreteras locales.{}Provoca considerables complicaciones de tráfico durante 6 meses.{}Coste: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Construye una estatua en honor a su empresa.{}Proporciona un incremento permanente en la calificación de las estaciones de este municipio.{}Coste: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Pagar la construcción de nuevos edificios comerciales en el municipio.{}Proporciona un incremento temporal en el crecimiento del municipio.{}Coste: {CURRENCY_LONG} From c4bccd4f70cc369d5b3867f8dac74b0ac1d9ea5c Mon Sep 17 00:00:00 2001 From: rubidium42 Date: Mon, 12 Apr 2021 20:53:04 +0200 Subject: [PATCH 02/10] Fix #8874: show a warning when a NewGRF scan is requested multiple times from the console (#9022) --- src/console_cmds.cpp | 4 +++- src/openttd.cpp | 6 +++++- src/openttd.h | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index f50644cf5b..cebf701981 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -1351,7 +1351,9 @@ DEF_CONSOLE_CMD(ConRescanNewGRF) return true; } - RequestNewGRFScan(); + if (!RequestNewGRFScan()) { + IConsoleWarning("NewGRF scanning is already running. Please wait until completed to run again."); + } return true; } diff --git a/src/openttd.cpp b/src/openttd.cpp index 250aa0db38..4d820d4db2 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1450,11 +1450,15 @@ static void DoAutosave() * done in the game-thread, and not in the draw-thread (which most often * triggers this request). * @param callback Optional callback to call when NewGRF scan is completed. + * @return True when the NewGRF scan was actually requested, false when the scan was already running. */ -void RequestNewGRFScan(NewGRFScanCallback *callback) +bool RequestNewGRFScan(NewGRFScanCallback *callback) { + if (_request_newgrf_scan) return false; + _request_newgrf_scan = true; _request_newgrf_scan_callback = callback; + return true; } void GameLoop() diff --git a/src/openttd.h b/src/openttd.h index 38c7f80644..77fafab1d1 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -81,6 +81,6 @@ void HandleExitGameRequest(); void SwitchToMode(SwitchMode new_mode); -void RequestNewGRFScan(struct NewGRFScanCallback *callback = nullptr); +bool RequestNewGRFScan(struct NewGRFScanCallback *callback = nullptr); #endif /* OPENTTD_H */ From ca6b9ad8b0a64ebc812cf2e748d8ea9c874b4860 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 11 Apr 2021 11:22:50 +0200 Subject: [PATCH 03/10] Change: move some things only relevant to UDP from network.cpp to network_udp.cpp --- src/network/network.cpp | 10 +--------- src/network/network_internal.h | 5 ----- src/network/network_udp.cpp | 11 +++++++++++ src/network/network_udp.h | 1 + 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 1d5563c3d9..f4640191c8 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -74,19 +74,12 @@ uint32 _sync_seed_2; ///< Second part of the seed. #endif uint32 _sync_frame; ///< The frame to perform the sync check. bool _network_first_time; ///< Whether we have finished joining or not. -bool _network_udp_server; ///< Is the UDP server started? -uint16 _network_udp_broadcast; ///< Timeout for the UDP broadcasts. -uint8 _network_advertise_retries; ///< The number of advertisement retries we did. CompanyMask _network_company_passworded; ///< Bitmask of the password status of all companies. /* Check whether NETWORK_NUM_LANDSCAPES is still in sync with NUM_LANDSCAPE */ static_assert((int)NETWORK_NUM_LANDSCAPES == (int)NUM_LANDSCAPE); static_assert((int)NETWORK_COMPANY_NAME_LENGTH == MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH); -extern NetworkUDPSocketHandler *_udp_client_socket; ///< udp client socket -extern NetworkUDPSocketHandler *_udp_server_socket; ///< udp server socket -extern NetworkUDPSocketHandler *_udp_master_socket; ///< udp master socket - /** The amount of clients connected */ byte _network_clients_connected = 0; @@ -724,7 +717,7 @@ bool NetworkServerStart() /* Try to start UDP-server */ DEBUG(net, 1, "starting listeners for incoming server queries"); - _network_udp_server = _udp_server_socket->Listen(); + NetworkUDPServerListen(); _network_company_states = CallocT(MAX_COMPANIES); _network_server = true; @@ -1060,7 +1053,6 @@ void NetworkStartUp() _network_available = NetworkCoreInitialize(); _network_dedicated = false; _network_need_advertise = true; - _network_advertise_retries = 0; /* Generate an server id when there is none yet */ if (StrEmpty(_settings_client.network.network_id)) NetworkGenerateServerId(); diff --git a/src/network/network_internal.h b/src/network/network_internal.h index 8cae502e10..290922f385 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -126,11 +126,6 @@ extern uint32 _network_join_bytes_total; extern uint8 _network_reconnect; -extern bool _network_udp_server; -extern uint16 _network_udp_broadcast; - -extern uint8 _network_advertise_retries; - extern CompanyMask _network_company_passworded; void NetworkTCPQueryServer(NetworkAddress address); diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 99939fab44..e4276c58f1 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -47,6 +47,10 @@ NetworkUDPSocketHandler *_udp_client_socket = nullptr; ///< udp client socket NetworkUDPSocketHandler *_udp_server_socket = nullptr; ///< udp server socket NetworkUDPSocketHandler *_udp_master_socket = nullptr; ///< udp master socket +static bool _network_udp_server; ///< Is the UDP server started? +static uint16 _network_udp_broadcast; ///< Timeout for the UDP broadcasts. +static uint8 _network_advertise_retries; ///< The number of advertisement retries we did. + /** * Helper function doing the actual work for querying the server. * @param address The address of the server. @@ -622,6 +626,13 @@ void NetworkUDPInitialize() _network_udp_server = false; _network_udp_broadcast = 0; + _network_advertise_retries = 0; +} + +/** Start the listening of the UDP server component. */ +void NetworkUDPServerListen() +{ + _network_udp_server = _udp_server_socket->Listen(); } /** Close all UDP related stuff. */ diff --git a/src/network/network_udp.h b/src/network/network_udp.h index c042bea404..189657bc87 100644 --- a/src/network/network_udp.h +++ b/src/network/network_udp.h @@ -19,6 +19,7 @@ void NetworkUDPQueryServer(NetworkAddress address, bool manually = false); void NetworkUDPAdvertise(); void NetworkUDPRemoveAdvertise(bool blocking); void NetworkUDPClose(); +void NetworkUDPServerListen(); void NetworkBackgroundUDPLoop(); #endif /* NETWORK_UDP_H */ From 7597740bff711d78e3f005bdfad214154281559a Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 11 Apr 2021 11:30:44 +0200 Subject: [PATCH 04/10] Fix: split the UDP blocking of sockets to only the socket involved, and when another thread is busy do not attempt to process the packets of that socket --- src/network/network_udp.cpp | 96 +++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index e4276c58f1..6d7e6ca698 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -33,9 +33,6 @@ #include "../safeguards.h" -/** Mutex for all out threaded udp resolution and such. */ -static std::mutex _network_udp_mutex; - /** Session key to register ourselves to the master server */ static uint64 _session_key = 0; @@ -43,14 +40,46 @@ static const std::chrono::minutes ADVERTISE_NORMAL_INTERVAL(15); ///< interval b static const std::chrono::seconds ADVERTISE_RETRY_INTERVAL(10); ///< re-advertise when no response after this amount of time. static const uint32 ADVERTISE_RETRY_TIMES = 3; ///< give up re-advertising after this much failed retries -NetworkUDPSocketHandler *_udp_client_socket = nullptr; ///< udp client socket -NetworkUDPSocketHandler *_udp_server_socket = nullptr; ///< udp server socket -NetworkUDPSocketHandler *_udp_master_socket = nullptr; ///< udp master socket - static bool _network_udp_server; ///< Is the UDP server started? static uint16 _network_udp_broadcast; ///< Timeout for the UDP broadcasts. static uint8 _network_advertise_retries; ///< The number of advertisement retries we did. +/** Some information about a socket, which exists before the actual socket has been created to provide locking and the likes. */ +struct UDPSocket { + const std::string name; ///< The name of the socket. + std::mutex mutex; ///< Mutex for everything that (indirectly) touches the sockets within the handler. + NetworkUDPSocketHandler *socket; ///< The actual socket, which may be nullptr when not initialized yet. + std::atomic receive_iterations_locked; ///< The number of receive iterations the mutex was locked. + + UDPSocket(const std::string &name_) : name(name_), socket(nullptr) {} + + void Close() + { + std::lock_guard lock(mutex); + socket->Close(); + delete socket; + socket = nullptr; + } + + void ReceivePackets() + { + std::unique_lock lock(mutex, std::defer_lock); + if (!lock.try_lock()) { + if (++receive_iterations_locked % 32 == 0) { + DEBUG(net, 0, "[udp] %s background UDP loop processing appears to be blocked. Your OS may be low on UDP send buffers.", name.c_str()); + } + return; + } + + receive_iterations_locked.store(0); + socket->ReceivePackets(); + } +}; + +static UDPSocket _udp_client("Client"); ///< udp client socket +static UDPSocket _udp_server("Server"); ///< udp server socket +static UDPSocket _udp_master("Master"); ///< udp master socket + /** * Helper function doing the actual work for querying the server. * @param address The address of the server. @@ -67,11 +96,11 @@ static void DoNetworkUDPQueryServer(NetworkAddress &address, bool needs_mutex, b item->manually = manually; NetworkGameListAddItemDelayed(item); - std::unique_lock lock(_network_udp_mutex, std::defer_lock); + std::unique_lock lock(_udp_client.mutex, std::defer_lock); if (needs_mutex) lock.lock(); /* Init the packet */ Packet p(PACKET_UDP_CLIENT_FIND_SERVER); - if (_udp_client_socket != nullptr) _udp_client_socket->SendPacket(&p, &address); + if (_udp_client.socket != nullptr) _udp_client.socket->SendPacket(&p, &address); } /** @@ -479,7 +508,8 @@ void NetworkUDPQueryMasterServer() p.Send_uint8(NETWORK_MASTER_SERVER_VERSION); p.Send_uint8(SLT_AUTODETECT); - _udp_client_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_client.mutex); + _udp_client.socket->SendPacket(&p, &out_addr, true); DEBUG(net, 2, "[udp] master server queried at %s", out_addr.GetAddressAsString().c_str()); } @@ -492,7 +522,7 @@ void NetworkUDPSearchGame() DEBUG(net, 0, "[udp] searching server"); - NetworkUDPBroadCast(_udp_client_socket); + NetworkUDPBroadCast(_udp_client.socket); _network_udp_broadcast = 300; // Stay searching for 300 ticks } @@ -512,8 +542,8 @@ static void NetworkUDPRemoveAdvertiseThread() p.Send_uint8 (NETWORK_MASTER_SERVER_VERSION); p.Send_uint16(_settings_client.network.server_port); - std::lock_guard lock(_network_udp_mutex); - if (_udp_master_socket != nullptr) _udp_master_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_master.mutex); + if (_udp_master.socket != nullptr) _udp_master.socket->SendPacket(&p, &out_addr, true); } /** @@ -564,8 +594,8 @@ static void NetworkUDPAdvertiseThread() p.Send_uint16(_settings_client.network.server_port); p.Send_uint64(_session_key); - std::lock_guard lock(_network_udp_mutex); - if (_udp_master_socket != nullptr) _udp_master_socket->SendPacket(&p, &out_addr, true); + std::lock_guard lock(_udp_master.mutex); + if (_udp_master.socket != nullptr) _udp_master.socket->SendPacket(&p, &out_addr, true); } /** @@ -607,22 +637,22 @@ void NetworkUDPAdvertise() void NetworkUDPInitialize() { /* If not closed, then do it. */ - if (_udp_server_socket != nullptr) NetworkUDPClose(); + if (_udp_server.socket != nullptr) NetworkUDPClose(); DEBUG(net, 1, "[udp] initializing listeners"); - assert(_udp_client_socket == nullptr && _udp_server_socket == nullptr && _udp_master_socket == nullptr); + assert(_udp_client.socket == nullptr && _udp_server.socket == nullptr && _udp_master.socket == nullptr); - std::lock_guard lock(_network_udp_mutex); + std::scoped_lock lock(_udp_client.mutex, _udp_server.mutex, _udp_master.mutex); - _udp_client_socket = new ClientNetworkUDPSocketHandler(); + _udp_client.socket = new ClientNetworkUDPSocketHandler(); NetworkAddressList server; GetBindAddresses(&server, _settings_client.network.server_port); - _udp_server_socket = new ServerNetworkUDPSocketHandler(&server); + _udp_server.socket = new ServerNetworkUDPSocketHandler(&server); server.clear(); GetBindAddresses(&server, 0); - _udp_master_socket = new MasterNetworkUDPSocketHandler(&server); + _udp_master.socket = new MasterNetworkUDPSocketHandler(&server); _network_udp_server = false; _network_udp_broadcast = 0; @@ -632,22 +662,16 @@ void NetworkUDPInitialize() /** Start the listening of the UDP server component. */ void NetworkUDPServerListen() { - _network_udp_server = _udp_server_socket->Listen(); + std::lock_guard lock(_udp_server.mutex); + _network_udp_server = _udp_server.socket->Listen(); } /** Close all UDP related stuff. */ void NetworkUDPClose() { - std::lock_guard lock(_network_udp_mutex); - _udp_server_socket->Close(); - _udp_master_socket->Close(); - _udp_client_socket->Close(); - delete _udp_client_socket; - delete _udp_server_socket; - delete _udp_master_socket; - _udp_client_socket = nullptr; - _udp_server_socket = nullptr; - _udp_master_socket = nullptr; + _udp_client.Close(); + _udp_server.Close(); + _udp_master.Close(); _network_udp_server = false; _network_udp_broadcast = 0; @@ -657,13 +681,11 @@ void NetworkUDPClose() /** Receive the UDP packets. */ void NetworkBackgroundUDPLoop() { - std::lock_guard lock(_network_udp_mutex); - if (_network_udp_server) { - _udp_server_socket->ReceivePackets(); - _udp_master_socket->ReceivePackets(); + _udp_server.ReceivePackets(); + _udp_master.ReceivePackets(); } else { - _udp_client_socket->ReceivePackets(); + _udp_client.ReceivePackets(); if (_network_udp_broadcast > 0) _network_udp_broadcast--; } } From d2fe8c2842c7930d5fca4f10bad276b706393946 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 11 Apr 2021 11:32:31 +0200 Subject: [PATCH 05/10] Change: warn the user about the resolving of an address being extra very slow --- src/network/core/address.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp index a45bd49142..8c69094385 100644 --- a/src/network/core/address.cpp +++ b/src/network/core/address.cpp @@ -239,7 +239,18 @@ SOCKET NetworkAddress::Resolve(int family, int socktype, int flags, SocketList * strecpy(this->hostname, fam == AF_INET ? "0.0.0.0" : "::", lastof(this->hostname)); } + static bool _resolve_timeout_error_message_shown = false; + auto start = std::chrono::steady_clock::now(); int e = getaddrinfo(StrEmpty(this->hostname) ? nullptr : this->hostname, port_name, &hints, &ai); + auto end = std::chrono::steady_clock::now(); + std::chrono::seconds duration = std::chrono::duration_cast(end - start); + if (!_resolve_timeout_error_message_shown && duration >= std::chrono::seconds(5)) { + DEBUG(net, 0, "getaddrinfo for hostname \"%s\", port %s, address family %s and socket type %s took %i seconds", + this->hostname, port_name, AddressFamilyAsString(family), SocketTypeAsString(socktype), (int)duration.count()); + DEBUG(net, 0, " this is likely an issue in the DNS name resolver's configuration causing it to time out"); + _resolve_timeout_error_message_shown = true; + } + if (reset_hostname) strecpy(this->hostname, "", lastof(this->hostname)); From 4fb1e34b1ed84d228ce5d88abe9a78437a3760d3 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Sun, 11 Apr 2021 11:39:43 +0200 Subject: [PATCH 06/10] Change: add some hints about the getaddrinfo warning to the troubleshooting part of the documentation --- docs/multiplayer.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/multiplayer.md b/docs/multiplayer.md index 89a490602e..daccbf06d6 100644 --- a/docs/multiplayer.md +++ b/docs/multiplayer.md @@ -211,3 +211,10 @@ Last updated: 2011-02-16 communication from an admin tool reach the programme. See section 1 'Starting a server' further up for the ports and protocols used by OpenTTD. The ports can be configured in the config file. + + - My advertising server warns a lot about getaddrinfo taking N seconds + This could be a transient issue with your (local) DNS server, but if the + problem persists there is likely a configuration issue in DNS resolving + on your computer. This seems to be a common configuration issue for + Docker instances, where the DNS resolving waits for a time out of usually + 5 seconds. From 64e830587455a3baa0354f550ce9b179a070215e Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 12 Apr 2021 19:57:08 +0200 Subject: [PATCH 07/10] Fix: [SDL] buffer_locked state not initialised, causing _screen.dst_ptr to be potentially not set --- src/video/sdl2_v.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/sdl2_v.h b/src/video/sdl2_v.h index bd43f71f89..d706cc6654 100644 --- a/src/video/sdl2_v.h +++ b/src/video/sdl2_v.h @@ -17,7 +17,7 @@ /** The SDL video driver. */ class VideoDriver_SDL_Base : public VideoDriver { public: - VideoDriver_SDL_Base() : sdl_window(nullptr) {} + VideoDriver_SDL_Base() : sdl_window(nullptr), buffer_locked(false) {} const char *Start(const StringList ¶m) override; From 856239541393df6d6a1443b15d7c4c8b213fbc5e Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 12 Apr 2021 20:52:00 +0200 Subject: [PATCH 08/10] Fix: [Video] fast forward boolean states not initialised, potentially causing unstoppable fast forward --- src/video/video_driver.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/video_driver.hpp b/src/video/video_driver.hpp index f143b61a80..4964e01cb3 100644 --- a/src/video/video_driver.hpp +++ b/src/video/video_driver.hpp @@ -36,7 +36,7 @@ class VideoDriver : public Driver { const uint DEFAULT_WINDOW_HEIGHT = 480u; ///< Default window height. public: - VideoDriver() : is_game_threaded(true), change_blitter(nullptr) {} + VideoDriver() : fast_forward_key_pressed(false), fast_forward_via_key(false), is_game_threaded(true), change_blitter(nullptr) {} /** * Mark a particular area dirty. From 468b1c6c5d1949f4d8aad90dad0f3d8770973113 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 12 Apr 2021 20:58:44 +0200 Subject: [PATCH 09/10] Fix: [win32] buffer_locked state not initialised, causing _screen.dst_ptr to be potentially not set --- src/video/win32_v.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/win32_v.h b/src/video/win32_v.h index 8c63aeedf4..4686df7160 100644 --- a/src/video/win32_v.h +++ b/src/video/win32_v.h @@ -17,7 +17,7 @@ /** Base class for Windows video drivers. */ class VideoDriver_Win32Base : public VideoDriver { public: - VideoDriver_Win32Base() : main_wnd(nullptr), fullscreen(false) {} + VideoDriver_Win32Base() : main_wnd(nullptr), fullscreen(false), buffer_locked(false) {} void Stop() override; From 433602b072aaf6a2c07a9989e7989f2dd0bb8317 Mon Sep 17 00:00:00 2001 From: Michael Lutz Date: Mon, 12 Apr 2021 21:44:32 +0200 Subject: [PATCH 10/10] Fix #9028: [OpenGL] Clear cursor cache on destroying the OpenGL backend. --- src/video/opengl.cpp | 22 +++++++++++++++------- src/video/opengl.h | 2 ++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/video/opengl.cpp b/src/video/opengl.cpp index c1c1afaaec..bb509bcd74 100644 --- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -510,7 +510,7 @@ OpenGLBackend::~OpenGLBackend() _glDeleteBuffers(1, &this->anim_pbo); } if (_glDeleteTextures != nullptr) { - ClearCursorCache(); + this->InternalClearCursorCache(); OpenGLSprite::Destroy(); _glDeleteTextures(1, &this->vid_texture); @@ -1082,12 +1082,7 @@ void OpenGLBackend::PopulateCursorCache() this->clear_cursor_cache = false; this->last_sprite_pal = (PaletteID)-1; - Sprite *sp; - while ((sp = this->cursor_cache.Pop()) != nullptr) { - OpenGLSprite *sprite = (OpenGLSprite *)sp->data; - sprite->~OpenGLSprite(); - free(sp); - } + this->InternalClearCursorCache(); } this->cursor_pos = _cursor.pos; @@ -1113,6 +1108,19 @@ void OpenGLBackend::PopulateCursorCache() /** * Clear all cached cursor sprites. */ +void OpenGLBackend::InternalClearCursorCache() +{ + Sprite *sp; + while ((sp = this->cursor_cache.Pop()) != nullptr) { + OpenGLSprite *sprite = (OpenGLSprite *)sp->data; + sprite->~OpenGLSprite(); + free(sp); + } +} + +/** + * Queue a request for cursor cache clear. + */ void OpenGLBackend::ClearCursorCache() { /* If the game loop is threaded, this function might be called diff --git a/src/video/opengl.h b/src/video/opengl.h index 7e42b20bed..b0318f9882 100644 --- a/src/video/opengl.h +++ b/src/video/opengl.h @@ -77,6 +77,8 @@ private: const char *Init(); bool InitShaders(); + void InternalClearCursorCache(); + void RenderOglSprite(OpenGLSprite *gl_sprite, PaletteID pal, int x, int y, ZoomLevel zoom); public: