diff --git a/.github/changelog.sh b/.github/changelog.sh index ea0da948c1..b057ad475f 100755 --- a/.github/changelog.sh +++ b/.github/changelog.sh @@ -4,9 +4,9 @@ tag=$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\ # If we are a tag, show the part of the changelog till (but excluding) the last stable if [ -n "$tag" ]; then - grep='^[0-9]\+\.[0-9]\+\.[0-9]\+[^-]' + grep='^[0-9]\+\.[0-9]\+[^-]' next=$(cat changelog.txt | grep '^[0-9]' | awk 'BEGIN { show="false" } // { if (show=="true") print $0; if ($1=="'$tag'") show="true"} ' | grep "$grep" | head -n1 | sed 's/ .*//') - cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }' + cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }' exit 0 fi diff --git a/changelog.txt b/changelog.txt index a661cab6ec..883560397e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,12 @@ +12.0-beta2 (2021-08-19) +------------------------------------------------------------------------ +Feature: [Linkgraph] Prioritize faster routes for passengers, mail and express cargo (#9457) +Fix: Wrong town window refreshed when building an airport with noise levels enabled (#9497) +Fix: Improve wording of network-related messages (#9494, #9495, #9500) +Fix: [Network] Report reuse of invite-code (#9487) +Fix: [Network] Connecting with the same client name thrice hangs the server (#9485) + + 12.0-beta1 (2021-08-15) ------------------------------------------------------------------------ Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467) diff --git a/docs/landscape_grid.html b/docs/landscape_grid.html index 428ac71f3b..de2d94fb0e 100644 --- a/docs/landscape_grid.html +++ b/docs/landscape_grid.html @@ -80,7 +80,7 @@ the array so you can quickly see what is used and what is not. 0 ground - XXXX XX XX + XXXX XX XX XXXX XXXX OOO1 OOOO OOOO OOOO OOOO OOOO diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 9f1f2742ad..502aaa133d 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -888,6 +888,12 @@ Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, siz linecache = new LineCache(); } + if (auto match = linecache->find(LineCacheQuery{state, std::string_view{str, len}}); + match != linecache->end()) { + return match->second; + } + + /* Create missing entry */ LineCacheKey key; key.state_before = state; key.str.assign(str, len); diff --git a/src/gfx_layout.h b/src/gfx_layout.h index 04461ecfc7..38e58e673c 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #ifdef WITH_ICU_LX @@ -155,14 +157,25 @@ class Layouter : public std::vector + bool operator()(const Key1 &lhs, const Key2 &rhs) const { - if (this->state_before.fontsize != other.state_before.fontsize) return this->state_before.fontsize < other.state_before.fontsize; - if (this->state_before.cur_colour != other.state_before.cur_colour) return this->state_before.cur_colour < other.state_before.cur_colour; - if (this->state_before.colour_stack != other.state_before.colour_stack) return this->state_before.colour_stack < other.state_before.colour_stack; - return this->str < other.str; + if (lhs.state_before.fontsize != rhs.state_before.fontsize) return lhs.state_before.fontsize < rhs.state_before.fontsize; + if (lhs.state_before.cur_colour != rhs.state_before.cur_colour) return lhs.state_before.cur_colour < rhs.state_before.cur_colour; + if (lhs.state_before.colour_stack != rhs.state_before.colour_stack) return lhs.state_before.colour_stack < rhs.state_before.colour_stack; + return lhs.str < rhs.str; } }; public: @@ -179,7 +192,7 @@ public: ~LineCacheItem() { delete layout; free(buffer); } }; private: - typedef std::map LineCache; + typedef std::map LineCache; static LineCache *linecache; static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state); diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 9d758d4089..ff7d7581d8 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}Salvo Automaticamente STR_STATUSBAR_SAVING_GAME :{RED}* * SALVANDO JOGO * * +STR_STATUSBAR_SPECTATOR :{WHITE}(espectador) # News message history STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens @@ -2120,7 +2121,7 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Jogadores onlin STR_NETWORK_COMPANY_LIST_SPECTATE :Assistir # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Multijogador +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Jogadores Online STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Servidor STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nome STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Nome do servidor que você está jogando @@ -2170,7 +2171,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Você t STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Você tem certeza que quer restaurar a senha da empresa '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Usar retransmissão? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Erro ao estabelecer uma conexão entre você e o servidor.{}Você gostaria de retransmitir essa sessão via '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Não STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sim, apenas dessa vez STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sim, não perguntar novamente diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index f032a88a64..db161797e8 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * E STR_STATUSBAR_AUTOSAVE :{RED}DESADA AUTOMÀTICA STR_STATUSBAR_SAVING_GAME :{RED}* * DESANT PARTIDA * * +STR_STATUSBAR_SPECTATOR :{WHITE}(espectador) # News message history STR_MESSAGE_HISTORY :{WHITE}Historial de missatges @@ -2170,7 +2171,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Esteu s STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Esteu segur que voleu restablir la contrasenya de la companyia «{COMPANY}»? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Voleu usar un servei de transmissió? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}No s'ha pogut establir una connexió entre el servidor i el vostre dispositiu.{}Voleu transmetre aquesta sessió via «{STRING}»? STR_NETWORK_ASK_RELAY_NO :{BLACK}No STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sí, aquest una vegada. STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sí, no ho preguntis més. @@ -2292,6 +2292,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servi STR_NETWORK_MESSAGE_KICKED :*** S'ha expulsat {STRING}. Motiu: {STRING} STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}El registre al servidor ha fallat. +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}S'ha registrat un altre servidor amb el mateix codi d'invitació. Es canvia a partida de tipus local. STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}El vostre servidor no permet connexions remotes. STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Els altres jugadors no podran connectar-se al vostre servidor. diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 4de4a4f5a9..d0bf56ed69 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -2169,7 +2169,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Weet je STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Weet je zeker dat je het wachtwoord voor bedrijf '{COMPANY}' wilt terugstellen? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Omleiden? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Kan geen verbinding maken tussen server en jou.{}Wil je deze sessie omleiden via '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Nee STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, deze keer STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, en vraag dit niet opnieuw diff --git a/src/lang/english.txt b/src/lang/english.txt index a70f07eb46..da7d5fe485 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -811,7 +811,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * P STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * -STR_STATUSBAR_SPECATOR :{WHITE}(spectator) +STR_STATUSBAR_SPECTATOR :{WHITE}(spectator) # News message history STR_MESSAGE_HISTORY :{WHITE}Message History @@ -2603,7 +2603,7 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Are you STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Are you sure you want to reset the password of company '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Use relay? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Failed to establish a connection between you and the server.{}Would you like to relay this session via '{RAW_STRING}'? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Failed to establish a connection between you and server '{RAW_STRING}'.{}Would you like to relay this session via '{RAW_STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}No STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Yes, this once STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Yes, don't ask again @@ -2642,7 +2642,7 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Enter te # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}No network devices found STR_NETWORK_ERROR_NOSERVER :{WHITE}Could not find any network games -STR_NETWORK_ERROR_NOCONNECTION :{WHITE}The server didn't answer the request +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Connection to the server timed out or was refused STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Could not connect due to NewGRF mismatch STR_NETWORK_ERROR_DESYNC :{WHITE}Network-Game synchronisation failed STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Network-Game connection lost @@ -2728,6 +2728,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}The serv STR_NETWORK_MESSAGE_KICKED :*** {RAW_STRING} was kicked. Reason: ({RAW_STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Server registration failed +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Another server with the same invite-code registered itself. Switching to "local" game-type. STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Your server doesn't allow remote connections STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Other players won't be able to connect to your server diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 7c1321b67f..37ac37336b 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -2193,7 +2193,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Are you STR_NETWORK_COMPANY_LIST_SPECTATE :Spectate STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Use relay? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Failed to establish a connection between you and the server.{}Would you like to relay this session via '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}No STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Yes, this once STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Yes, don't ask again diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 049000c464..5e9f203437 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * T STR_STATUSBAR_AUTOSAVE :{RED}AUTOMAATTITALLENNUS STR_STATUSBAR_SAVING_GAME :{RED}* * TALLENNETAAN PELIÄ * * +STR_STATUSBAR_SPECTATOR :{WHITE}(katsoja) # News message history STR_MESSAGE_HISTORY :{WHITE}Viestihistoria @@ -2119,7 +2120,7 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Kytkeytyneet pe STR_NETWORK_COMPANY_LIST_SPECTATE :Katsele # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Moninpeli +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Kytkeytyneet pelaajat STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Palvelin STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nimi STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Sen palvelimen nimi, jolla pelaat @@ -2169,7 +2170,7 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Haluatk STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Haluatko varmasti nollata yhtiön ”{COMPANY}” salasanan? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Käytetäänkö välityspalvelua? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Yhteyden muodostaminen sinun ja palvelimen välillä epäonnistui.{}Haluatko, että tämä istunto välitetään välityspalvelimen ”{STRING}” kautta? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Yhteyden muodostaminen sinun ja palvelimen ”{STRING}” välille epäonnistui.{}Haluatko, että tämä istunto välitetään välityspalvelimen ”{STRING}” kautta? STR_NETWORK_ASK_RELAY_NO :{BLACK}Ei STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Kyllä, tämän kerran STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Kyllä, älä kysy uudestaan @@ -2208,7 +2209,7 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Syötä # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Verkkolaitteita ei löytynyt STR_NETWORK_ERROR_NOSERVER :{WHITE}Verkkopelejä ei löytynyt -STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Palvelin ei vastannut pyyntöön +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Yhteys palvelimeen aikakatkaistiin tai torjuttiin STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Yhteyden muodostaminen epäonnistui NewGRF-virheen vuoksi STR_NETWORK_ERROR_DESYNC :{WHITE}Verkkopelin tahdistus epäonnistui STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Verkkopeliyhteys katkesi @@ -2291,6 +2292,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Palvelin STR_NETWORK_MESSAGE_KICKED :{STRING} potkaistiin ulos. Syy: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Palvelimen rekisteröinti epäonnistui +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Toinen palvelin rekisteröityi samalla kutsukoodilla. Pelin tyypiksi vaihdetaan ”paikallinen”. STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Palvelimesi ei salli etäyhteyksiä STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Muut pelaajat eivät voi saada yhteyttä palvelimeesi diff --git a/src/lang/french.txt b/src/lang/french.txt index f08f0f2b54..e3af117662 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -790,6 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * S STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTREMENT AUTOMATIQUE STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * * +STR_STATUSBAR_SPECTATOR :{WHITE}(spectateur) # News message history STR_MESSAGE_HISTORY :{WHITE}Historique des messages @@ -2120,7 +2121,7 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Joueurs en lign STR_NETWORK_COMPANY_LIST_SPECTATE :Spectateur # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Multijoueur +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Joueurs en ligne STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Serveur STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nom STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Nom du serveur sur lequel vous jouez @@ -2170,7 +2171,7 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Êtes-v STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Êtes-vous sûr de vouloir réinitialiser le mot de passe de la compagnie '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Utiliser un relai{NBSP}? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Aucune connexion n'a pu être établie entre vous et le serveur.{}Voudriez vous relayer cette session via '{STRING}'{NBSP}? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Aucune connexion n'a pu être établie entre vous et le serveur '{STRING}'.{}Voudriez vous que cette session soit relayée par '{STRING}'{NBSP}? STR_NETWORK_ASK_RELAY_NO :{BLACK}Non STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Oui, cette fois uniquement STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Oui, ne plus me demander @@ -2209,7 +2210,7 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Entrer l # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Aucun périphérique réseau trouvé STR_NETWORK_ERROR_NOSERVER :{WHITE}Aucune partie réseau n'a été trouvée -STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Le serveur n'a pas répondu à la requête +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}La connexion au serveur a dépassé le temps d'attente ou a été refusée STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Échec de la connexion{NBSP}: NewGRF requis STR_NETWORK_ERROR_DESYNC :{WHITE}La synchronisation de la partie réseau a échoué STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}La connexion de la partie réseau a été perdue @@ -2292,6 +2293,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Le serve STR_NETWORK_MESSAGE_KICKED :*** {STRING} a été exclu. Raison{NBSP}: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Échec de l'enregistrement du serveur +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Un autre serveur s'est enregistré avec le même code d'invitation. Le type de connexion est changé en "local". STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Votre serveur n'autorise pas les connexions distantes STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Les autres joueurs ne pourront pas se connecter à votre serveur diff --git a/src/lang/german.txt b/src/lang/german.txt index 3eebbdd164..225bd9c751 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -2480,7 +2480,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Sind Si STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Sind Sie sicher, dass Sie das Passwort der Firma '{COMPANY}' zurücksetzen möchten? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Weiterleitung benutzen? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Verbindung zwischen Ihnen und dem Server konnte nicht hergestellt werden.{}Möchten Sie für diese Sitzung eine Weiterleitung via „{STRING}” benutzen? STR_NETWORK_ASK_RELAY_NO :{BLACK}Nein STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, diesmal STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, nicht erneut fragen diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 4973d46ec0..571b712e29 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1151,6 +1151,7 @@ STR_CONFIG_SETTING_TYPE_GAME_MENU :Impostazione di STR_CONFIG_SETTING_TYPE_GAME_INGAME :Impostazione di gioco (conservata nel salvataggio; influenza solo la partita corrente) STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Impostazione della compagnia (conservata nei salvataggi; influenza solo le nuove partite) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Impostazione della compagnia (conservata nel salvataggio; influenza solo la compagnia corrente) +STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Questa azione resetterà tutti i settaggi ai loro valori predefiniti.{}Sei sicuro di voler procedere? STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoria: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo: @@ -1234,6 +1235,7 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Controlla l'att STR_CONFIG_SETTING_CITY_APPROVAL :Atteggiamento della città in merito alle modifiche: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Seleziona il modo in cui il rumore e i danni all'ambiente da parte delle compagnie possono influenzare la valutazione delle città e le successive operazioni di costruzione nell'area controllata +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Imposta l'altezza massima per il terreno. Con l'opzione "(auto)" un valore ottimale verrà scelto automaticamente dopo la generazione del terreno STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(automatico) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Impossibile impostare l'altezza massima della mappa a questo valore. Almeno una delle montagne della mappa è più alta @@ -1451,6 +1453,8 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Doppio clic STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Clic (con casella di testo attiva) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Clic (immediato) +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :Chiedi +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :Consenti STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Emulazione clic destro: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Seleziona il metodo per emulare i clic con il tasto destro del mouse @@ -2009,6 +2013,7 @@ STR_FACE_EARRING :Orecchino: STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Cambia la cravatta o l'orecchino ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Locale ############ End of leave-in-this-order # Network server list @@ -2112,6 +2117,9 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Elenco dei clie STR_NETWORK_COMPANY_LIST_SPECTATE :Diventa spettatore # Network client list +STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Giocatore +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP : {BLACK}Modifica il nome del tuo personaggio +STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Crea una nuova compagnia e controllala ############ Begin of ConnectionType ############ End of ConnectionType @@ -2231,6 +2239,8 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Il serve STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Il server si sta riavviando...{}Attendere prego... STR_NETWORK_MESSAGE_KICKED :*** {STRING} è stato espulso. Motivo: ({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Registrazione al server fallita +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Altri giocatori non saranno in grado di connettersi al tuo server # Content downloading window STR_CONTENT_TITLE :{WHITE}Download contenuti @@ -2866,6 +2876,8 @@ STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Numero industrie: STR_MAPGEN_HEIGHTMAP_HEIGHT :{WHITE}Picco massimo: STR_MAPGEN_SNOW_COVERAGE :{BLACK}Aree innevate: +STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Aumenta la copertura della neve del dieci per cento +STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Diminuisci la copertura della neve del dieci per cento STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_DESERT_COVERAGE :{BLACK}Aree desertiche: STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% @@ -3770,6 +3782,7 @@ STR_REPLACE_ROAD_VEHICLES :Veicoli stradal STR_REPLACE_TRAM_VEHICLES :Veicoli tranviari STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Fa sì che il rimpiazzamento automatico mantenga costante la lunghezza dei treni rimuovendo vagoni (iniziando dalla testa) nel caso in cui la sostituzione della locomotiva rendesse il treno più lungo +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Ctrl+Click per applicare anche ai sotto-gruppi # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index e7cbea59d8..e1d0275e45 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -2602,7 +2602,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}'{COMPA STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}'{COMPANY}' 회사의 비밀번호를 정말로 초기화하시겠습니까? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}중계를 이용할까요? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}서버와 연결을 수립하는 데 실패했습니다.{} '{0:STRING}'{G 0 "을" "를"} 통해 연결을 중계하시겠습니까? STR_NETWORK_ASK_RELAY_NO :{BLACK}아니요 STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}이번에만 사용 STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}항상 사용 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index de0af38c06..ba066f32c0 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2173,7 +2173,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Er du s STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Er du sikker på at du vil tilbakestille passordet til firma '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Vil du bruke videresending? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Kunne ikke opprette en kobling mellom deg og serveren.{}Vil du videresende denne økten via '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Nei STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Ja, denne STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Ja, ikke spør igjen diff --git a/src/lang/polish.txt b/src/lang/polish.txt index b202a18d3c..e8380c5934 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2549,7 +2549,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Czy na STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Czy na pewno chcesz zresetować hasło firmy „{COMPANY}”? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Używać przekaźnika? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Nie udało się nawiązać połączenia między tobą a serwerem.{}Czy chcesz przekazać tę sesję za pośrednictwem „{STRING}”? STR_NETWORK_ASK_RELAY_NO :{BLACK}Nie STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Tak, ten jeden raz STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Tak, nie pytaj ponownie diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index da3fc205cf..10d3e0de76 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -790,7 +790,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * E STR_STATUSBAR_AUTOSAVE :{RED}AUTOGUARDADO STR_STATUSBAR_SAVING_GAME :{RED}* * A GUARDAR JOGO * * -STR_STATUSBAR_SPECATOR :{WHITE}(espectador) +STR_STATUSBAR_SPECTATOR :{WHITE}(espectador) # News message history STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens @@ -2121,7 +2121,7 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Jogadores "onli STR_NETWORK_COMPANY_LIST_SPECTATE :Assistir # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Multi-jogador +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Jogadores "Online" STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Servidor STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Nome STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Nome do servidor onde está a jogar @@ -2171,7 +2171,7 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Tem a c STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Tem a certeza que quer restabelecer a palavra-chave da empresa '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Usar retransmissão? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Falha ao estabelecer a ligação entre si e o servidor.{}Deseja retransmitir esta sessão via '{STRING}'? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Falha ao estabelecer a ligação entre si e o servidor '{STRING}'.{}Deseja retransmitir esta sessão via '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Não STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sim, desta vez STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sim, não perguntar novamente @@ -2210,7 +2210,7 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Introduz # Network messages STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Não foram encontradas interfaces de rede STR_NETWORK_ERROR_NOSERVER :{WHITE}Não foram encontrados jogos de rede -STR_NETWORK_ERROR_NOCONNECTION :{WHITE}O servidor não respondeu ao pedido +STR_NETWORK_ERROR_NOCONNECTION :{WHITE}A ligação ao servidor atingiu o tempo limite ou foi recusada STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Impossível ligar devido a incompatibilidade de NewGRF STR_NETWORK_ERROR_DESYNC :{WHITE}A sincronização do jogo de rede falhou. STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}A conexão do jogo de rede perdeu-se. @@ -2293,6 +2293,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}O servid STR_NETWORK_MESSAGE_KICKED :*** {STRING} foi expulso. Motivo: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Falha ao registar o servidor +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}Já foi registado um servidor com o mesmo código de convite. A mudar o tipo de jogo para "local". STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}O seu servidor não permite conexões remotas STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Outros jogadores não conseguirão conetar ao seu servidor diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 7fd7f43f11..7c23f2271d 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -935,6 +935,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * П STR_STATUSBAR_AUTOSAVE :{RED}АВТОСОХРАНЕНИЕ STR_STATUSBAR_SAVING_GAME :{RED}* * СОХРАНЕНИЕ ИГРЫ * * +STR_STATUSBAR_SPECTATOR :{WHITE}(зритель) # News message history STR_MESSAGE_HISTORY :{WHITE}История сообщений @@ -2323,7 +2324,7 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Уда STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Сбросить пароль у компании «{COMPANY}»? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Использовать транслятор? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Не удалось установить соединение с сервером.{}Перенаправить соединение через «{STRING}»? +STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Не удалось установить соединение с сервером «{STRING}».{}Перенаправить соединение через «{STRING}»? STR_NETWORK_ASK_RELAY_NO :{BLACK}Нет STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Да, однократно STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Да, всегда diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 8044aea439..295b2aa1da 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -789,6 +789,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * STR_STATUSBAR_AUTOSAVE :{RED}自动保存 STR_STATUSBAR_SAVING_GAME :{RED}* * 保存游戏中 * * +STR_STATUSBAR_SPECTATOR :{WHITE}(旁观者) # News message history STR_MESSAGE_HISTORY :{WHITE}消息历史 @@ -955,7 +956,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :马来西亚林 STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :左侧通行 STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :右侧通行 -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}城镇名称 +STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}城镇名称: STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格 ############ start of townname region @@ -995,6 +996,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :每 12 个月 STR_GAME_OPTIONS_LANGUAGE :{BLACK}语言 STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}选择界面语言 +STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} (完成了 {NUM}%) STR_GAME_OPTIONS_FULLSCREEN :{BLACK}全屏幕 STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}选择此项可以在全屏幕模式下进行 OpenTTD 游戏 @@ -1204,6 +1206,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :车辆损坏: { STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :设置运输工具故障率 STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :补贴系数: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :设置线路补贴额度 +STR_CONFIG_SETTING_SUBSIDY_DURATION :财政补贴尺度:{STRING} +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :设置发放财政补贴的年数 +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} 年 +STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :没有财政补贴 STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建设费用: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :设置建设费用和交易费用难度 STR_CONFIG_SETTING_RECESSIONS :经济衰退: {STRING} @@ -1436,6 +1442,11 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :双击 STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :单击(当前焦点) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :单击 (立即) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :使用中继服务:{STRING} +STR_CONFIG_SETTING_USE_RELAY_SERVICE_HELPTEXT :连接服务器失败时,玩家可以使用中继服务来建立连接。“关闭”禁止中继服务,“询问”先进行询问,“打开”直接使用中继。 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :关闭 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ASK :询问 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :打开 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :右键模拟: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :选择模拟鼠标右键的方式 @@ -1789,6 +1800,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}工业 STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}货物分配 STR_CONFIG_SETTING_AI :{ORANGE}竞争 STR_CONFIG_SETTING_AI_NPC :{ORANGE}电脑玩家 +STR_CONFIG_SETTING_NETWORK :{ORANGE}网络 STR_CONFIG_SETTING_PATHFINDER_NPF :NPF STR_CONFIG_SETTING_PATHFINDER_YAPF_RECOMMENDED :YAPF {BLUE}(推荐) @@ -1994,6 +2006,9 @@ STR_FACE_EARRING :耳环 STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}选择领带或是耳环 ############ Next lines match ServerGameType +STR_NETWORK_SERVER_VISIBILITY_LOCAL :本地 +STR_NETWORK_SERVER_VISIBILITY_PUBLIC :公开 +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :仅限邀请 ############ End of leave-in-this-order # Network server list @@ -2011,7 +2026,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}地图 STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}游戏地图大小{}点击可以按地图大小排列 STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}日期 STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}当前日期 -STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}年 +STR_NETWORK_SERVER_LIST_YEARS_CAPTION :{BLACK}年数 STR_NETWORK_SERVER_LIST_YEARS_CAPTION_TOOLTIP :{BLACK}年数{}游戏正在运行的 STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}语言,服务器版本和其他信息 @@ -2028,6 +2043,7 @@ STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}服务 STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}该服IP: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}开始日期: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}当前日期: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}游戏脚本:{WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}有密码保护! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}服务器离线 STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}服务器满员 @@ -2043,11 +2059,12 @@ STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}搜索 STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}搜索局域网 STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}搜索局域网内的服务器 STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}添加服务器 -STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}添加一个永远显示在列表中的服务器 +STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}添加一个永远显示在列表中的服务器。可使用服务器地址或邀请码。 STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}启动服务器 STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}启动本机作为服务器 STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}输入姓名 +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}输入服务器地址或邀请码 # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}开始新的联机游戏 @@ -2057,6 +2074,8 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}游戏 STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}设置密码: STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}如果不希望你的游戏被外人加入,请设置一个密码 +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}可见度 +STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}其他玩家能否在公开列表中查看你的服务器 STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} 客户端 STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}玩家数目: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}选择可以参加的玩家上限(达不到此数量仍然可以开始游戏) @@ -2092,16 +2111,63 @@ STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}服务 STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}公司需要密码: # Network company list added strings -STR_NETWORK_COMPANY_LIST_CLIENT_LIST :客户端列表 +STR_NETWORK_COMPANY_LIST_CLIENT_LIST :在线玩家 STR_NETWORK_COMPANY_LIST_SPECTATE :旁观 # Network client list +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}在线玩家 +STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}服务器 +STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}名称 +STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}你正在游玩的服务器名称 +STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}编辑服务器名称 +STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :服务器名称 +STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}可见度 +STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}其他玩家能否在公开列表中查看你的服务器 +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}邀请码 +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}其他玩家可使用邀请码加入服务器 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}连接类型 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}其他玩家访问服务器的方式 +STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}玩家 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}名称 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}你的玩家名 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}编辑你的玩家名 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :你的玩家名 +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP :{BLACK}要在此客户端执行的管理命令 +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}要在此公司执行的管理命令 +STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}加入该公司 +STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}给这位玩家发消息 +STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}给公司中的所有玩家发消息 +STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}给所有旁观者发消息 +STR_NETWORK_CLIENT_LIST_SPECTATORS :旁观者 +STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(新公司) +STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}新建并加入公司 +STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}这是你 +STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}这里是游戏的主机 +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM}个客户端 / {NUM}个公司 ############ Begin of ConnectionType +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_UNKNOWN :{BLACK}本地 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}远程玩家无法加入 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}公开 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_STUN :{BLACK}NAT后 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TURN :{BLACK}使用中继 ############ End of ConnectionType +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :踢出 +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :封禁 +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :删除 +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :密码解锁 +STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}管理命令 +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}你确定要踢出名为 {STRING} 的玩家吗? +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}你确定要封禁名为 {STRING} 的玩家吗? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}你确定要删除 {COMPANY} 公司吗? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}你确定要重置 {COMPANY} 的公司密码吗? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}使用中继? +STR_NETWORK_ASK_RELAY_NO :{BLACK}否 +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}是,本次请求 +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}是,不要再次询问 STR_NETWORK_SERVER :服务器 STR_NETWORK_CLIENT :客户端 @@ -2146,6 +2212,8 @@ STR_NETWORK_ERROR_SERVER_START :{WHITE}无法 STR_NETWORK_ERROR_CLIENT_START :{WHITE}无法连接 STR_NETWORK_ERROR_TIMEOUT :{WHITE}连接 #{NUM} 超时 STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}传输协议错误,连接断开 +STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}你没有设置玩家名。玩家名可在联机游戏窗口的上面设置 +STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}你没有设置服务器名。玩家名可在联机游戏窗口的上面设置 STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}此客户端版本与服务器端不匹配 STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}密码错误 STR_NETWORK_ERROR_SERVER_FULL :{WHITE}服务器已经满员 @@ -2158,6 +2226,8 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}输入 STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}您的计算机联网超时 STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}您的计算机下载地图用时过长 STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}您的计算机加入服务器用时过长 +STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}您的玩家名不合法 +STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}请求的服务器版本过低 ############ Leave those lines in this order!! STR_NETWORK_ERROR_CLIENT_GENERAL :一般错误 @@ -2180,6 +2250,7 @@ STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :没有在规定 STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :超时 STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :下载地图用时过长 STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :处理地图用时过长 +STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME :非法客户端名称 ############ End of leave-in-this-order STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}失去链接 @@ -2214,6 +2285,9 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}服务 STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}服务器正在重新启动。{}请等待…… STR_NETWORK_MESSAGE_KICKED :*** {STRING} 被踢出服务器。原因:({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}服务器注册失败 +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}您的服务器不允许远程连接 +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{BLACK}其他玩家将无法连接你的服务器 # Content downloading window STR_CONTENT_TITLE :{WHITE}下载内容 @@ -3024,6 +3098,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}警告:{ STR_NEWGRF_ERROR_MSG_ERROR :{RED}错误:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}严重错误:{SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}发生了一个致命的NewGRF错误:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}发生了一个NewGRF错误:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} 不能与 OpenTTD 报告的 TTDPatch 版本兼容。 STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} 是为 {STRING} 版 TTD 开发的。 STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} 应当与 {STRING} 配合 @@ -3501,7 +3576,7 @@ STR_GROUP_CREATE_TOOLTIP :{BLACK}创建 STR_GROUP_DELETE_TOOLTIP :{BLACK}删除分组 STR_GROUP_RENAME_TOOLTIP :{BLACK}重命名该分组 STR_GROUP_LIVERY_TOOLTIP :{BLACK}改变所选组的配色方案 -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}点击以停止本组自动更新功能的使用 +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}点击以停止本组自动更新功能的使用。按下CTRL并点击来同样应用于子组。 STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}删除分组 STR_GROUP_DELETE_QUERY_TEXT :{WHITE}确定要删除这个分组及其下级分组么? @@ -3754,7 +3829,9 @@ STR_REPLACE_MAGLEV_VEHICLES :磁悬浮列车 STR_REPLACE_ROAD_VEHICLES :路面交通工具 STR_REPLACE_TRAM_VEHICLES :电车 +STR_REPLACE_REMOVE_WAGON :{BLACK}清理挂车({STRING}):{ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}当车辆升级可能造成列车变长时{}自动从最前面的挂车去掉若干节以保证列车长度不变 +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. 按下CTRL并点击来同样应用于子组 # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 277257d72b..a1c05a5670 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -2237,7 +2237,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Ste si STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Ste si istý, že chcete zresetovať heslo pre spoločnosť '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Použiť presmerovanie? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Nepodarilo sa uskutočniť pripojenie medzi Vami a servrom.{}Chceli by ste presmerovať toto pripojenie cez '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Nie STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Áno, tentokrát STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Áno, znova sa nepýtať diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 71bb7a4db7..ddc1641b2b 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -2170,7 +2170,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}¿Elimi STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}¿Restablecer contraseña de la empresa "{COMPANY}"? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}¿Utilizar servicio de retransmisión? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}No se pudo establecer una conexión con el servidor.{}¿Deseas retransmitir esta sesión a través de "{STRING}"? STR_NETWORK_ASK_RELAY_NO :{BLACK}No STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Sí, solo esta vez STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Sí, no volver a preguntar diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 7b02fed18a..fa450de3c7 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -2169,7 +2169,6 @@ STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Bạn c STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Bạn có muốn đặt lại mật khẩu cho công ty '{COMPANY}'? STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}Sử dụng chuyển tiếp? -STR_NETWORK_ASK_RELAY_TEXT :{YELLOW}Kết nối tới server thất bại.{}Bạn có muốn chuyển tiếp kết nối của bạn thông qua '{STRING}'? STR_NETWORK_ASK_RELAY_NO :{BLACK}Không STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Đồng ý, chỉ lần này STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Đồng ý, đừng hỏi lại diff --git a/src/network/core/config.h b/src/network/core/config.h index 68b5d10060..e5b16547a2 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -51,7 +51,7 @@ static const uint16 COMPAT_MTU = 1460; ///< Numbe static const byte NETWORK_GAME_ADMIN_VERSION = 1; ///< What version of the admin network do we use? static const byte NETWORK_GAME_INFO_VERSION = 6; ///< What version of game-info do we use? static const byte NETWORK_COMPANY_INFO_VERSION = 6; ///< What version of company info is this? -static const byte NETWORK_COORDINATOR_VERSION = 5; ///< What version of game-coordinator-protocol do we use? +static const byte NETWORK_COORDINATOR_VERSION = 6; ///< What version of game-coordinator-protocol do we use? static const uint NETWORK_NAME_LENGTH = 80; ///< The maximum length of the server name and map name, in bytes including '\0' static const uint NETWORK_COMPANY_NAME_LENGTH = 128; ///< The maximum length of the company name, in bytes including '\0' diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index dea61cdec1..9f2731b7c8 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -61,9 +61,10 @@ enum ConnectionType { * The type of error from the Game Coordinator. */ enum NetworkCoordinatorErrorType { - NETWORK_COORDINATOR_ERROR_UNKNOWN, ///< There was an unknown error. - NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED, ///< Your request for registration failed. - NETWORK_COORDINATOR_ERROR_INVALID_INVITE_CODE, ///< The invite code given is invalid. + NETWORK_COORDINATOR_ERROR_UNKNOWN, ///< There was an unknown error. + NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED, ///< Your request for registration failed. + NETWORK_COORDINATOR_ERROR_INVALID_INVITE_CODE, ///< The invite code given is invalid. + NETWORK_COORDINATOR_ERROR_REUSE_OF_INVITE_CODE, ///< The invite code is used by another (newer) server. }; /** Base socket handler for all Game Coordinator TCP sockets. */ diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index 95124548d7..24db5d9bcb 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -135,8 +135,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) return false; case NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED: - SetDParamStr(0, detail); - ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED, STR_JUST_RAW_STRING, WL_ERROR); + ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED, INVALID_STRING_ID, WL_ERROR); /* To prevent that we constantly try to reconnect, switch to local game. */ _settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL; @@ -159,6 +158,15 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p) return true; } + case NETWORK_COORDINATOR_ERROR_REUSE_OF_INVITE_CODE: + ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE, INVALID_STRING_ID, WL_ERROR); + + /* To prevent that we constantly battle for the same invite-code, switch to local game. */ + _settings_client.network.server_game_type = SERVER_GAME_TYPE_LOCAL; + + this->CloseConnection(); + return false; + default: DEBUG(net, 0, "Invalid error type %u received from Game Coordinator", error); this->CloseConnection(); @@ -271,7 +279,7 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p) } /* Now store it based on the token. */ - this->connecter[token] = connecter_pre_it->second; + this->connecter[token] = {invite_code, connecter_pre_it->second}; this->connecter_pre.erase(connecter_pre_it); return true; @@ -373,13 +381,20 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p) this->turn_handlers[token] = ClientNetworkTurnSocketHandler::Turn(token, tracking_number, ticket, connection_string); if (!_network_server) { + auto connecter_it = this->connecter.find(token); + if (connecter_it == this->connecter.end()) { + /* Make sure we are still interested in connecting to this server. */ + this->ConnectFailure(token, 0); + return true; + } + switch (_settings_client.network.use_relay_service) { case URS_NEVER: this->ConnectFailure(token, 0); break; case URS_ASK: - ShowNetworkAskRelay(connection_string, token); + ShowNetworkAskRelay(connecter_it->second.first, connection_string, token); break; case URS_ALLOW: @@ -571,7 +586,7 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to * processes of connecting us. */ auto connecter_it = this->connecter.find(token); if (connecter_it != this->connecter.end()) { - connecter_it->second->SetConnected(sock); + connecter_it->second.second->SetConnected(sock); this->connecter.erase(connecter_it); } } @@ -657,7 +672,7 @@ void ClientNetworkCoordinatorSocketHandler::CloseToken(const std::string &token) /* Close the caller of the connection attempt. */ auto connecter_it = this->connecter.find(token); if (connecter_it != this->connecter.end()) { - connecter_it->second->SetFailure(); + connecter_it->second.second->SetFailure(); this->connecter.erase(connecter_it); } } @@ -677,7 +692,7 @@ void ClientNetworkCoordinatorSocketHandler::CloseAllConnections() for (auto &[token, it] : this->connecter) { this->CloseStunHandler(token); this->CloseTurnHandler(token); - it->SetFailure(); + it.second->SetFailure(); /* Inform the Game Coordinator he can stop trying to connect us to the server. */ this->ConnectFailure(token, 0); diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h index 42e16d91dc..3977c4e634 100644 --- a/src/network/network_coordinator.h +++ b/src/network/network_coordinator.h @@ -54,7 +54,7 @@ class ClientNetworkCoordinatorSocketHandler : public NetworkCoordinatorSocketHandler { private: std::chrono::steady_clock::time_point next_update; ///< When to send the next update (if server and public). - std::map connecter; ///< Based on tokens, the current connecters that are pending. + std::map> connecter; ///< Based on tokens, the current (invite-code, connecter) that are pending. std::map connecter_pre; ///< Based on invite codes, the current connecters that are pending. std::map>> stun_handlers; ///< All pending STUN handlers, stored by token:family. std::map> turn_handlers; ///< Pending TURN handler (if any), stored by token. diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 1b3d99e6e5..c7a7cb41d1 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2094,7 +2094,7 @@ public: this->DrawCompany(c->index, r.left, r.right, r.top, line); } - /* Specators */ + /* Spectators */ this->DrawCompany(COMPANY_SPECTATOR, r.left, r.right, r.top, line); break; @@ -2376,13 +2376,18 @@ void ShowNetworkCompanyPasswordWindow(Window *parent) } /** - * Window used for asking the user if he is okay using a TURN server. + * Window used for asking the user if he is okay using a relay server. */ struct NetworkAskRelayWindow : public Window { - std::string connection_string; ///< The TURN server we want to connect to. - std::string token; ///< The token for this connection. + std::string server_connection_string; ///< The game server we want to connect to. + std::string relay_connection_string; ///< The relay server we want to connect to. + std::string token; ///< The token for this connection. - NetworkAskRelayWindow(WindowDesc *desc, Window *parent, const std::string &connection_string, const std::string &token) : Window(desc), connection_string(connection_string), token(token) + NetworkAskRelayWindow(WindowDesc *desc, Window *parent, const std::string &server_connection_string, const std::string &relay_connection_string, const std::string &token) : + Window(desc), + server_connection_string(server_connection_string), + relay_connection_string(relay_connection_string), + token(token) { this->parent = parent; this->InitNested(0); @@ -2415,7 +2420,8 @@ struct NetworkAskRelayWindow : public Window { { switch (widget) { case WID_NAR_TEXT: - SetDParamStr(0, this->connection_string); + SetDParamStr(0, this->server_connection_string); + SetDParamStr(1, this->relay_connection_string); break; } } @@ -2466,13 +2472,14 @@ static WindowDesc _network_ask_relay_desc( /** * Show a modal confirmation window with "no" / "yes, once" / "yes, always" buttons. - * @param connection_string The relay server we want to connect to. + * @param server_connection_string The game server we want to connect to. + * @param relay_connection_string The relay server we want to connect to. * @param token The token for this connection. */ -void ShowNetworkAskRelay(const std::string &connection_string, const std::string &token) +void ShowNetworkAskRelay(const std::string &server_connection_string, const std::string &relay_connection_string, const std::string &token) { DeleteWindowByClass(WC_NETWORK_ASK_RELAY); Window *parent = FindWindowById(WC_MAIN_WINDOW, 0); - new NetworkAskRelayWindow(&_network_ask_relay_desc, parent, connection_string, token); + new NetworkAskRelayWindow(&_network_ask_relay_desc, parent, server_connection_string, relay_connection_string, token); } diff --git a/src/network/network_gui.h b/src/network/network_gui.h index e5d2ad20ff..1a4cc635b4 100644 --- a/src/network/network_gui.h +++ b/src/network/network_gui.h @@ -24,6 +24,7 @@ void ShowJoinStatusWindow(); void ShowNetworkGameWindow(); void ShowClientList(); void ShowNetworkCompanyPasswordWindow(Window *parent); +void ShowNetworkAskRelay(const std::string &server_connection_string, const std::string &relay_connection_string, const std::string &token); /** Company information stored at the client side */ @@ -38,6 +39,5 @@ struct NetworkCompanyInfo : NetworkCompanyStats { std::string clients; ///< The clients that control this company (Name1, name2, ..) }; -void ShowNetworkAskRelay(const std::string &connection_string, const std::string &token); #endif /* NETWORK_GUI_H */ diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 4db82750bc..58de051b97 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -1714,13 +1714,12 @@ static void NetworkAutoCleanCompanies() bool NetworkMakeClientNameUnique(std::string &name) { bool is_name_unique = false; - uint number = 0; std::string original_name = name; - while (!is_name_unique) { + for (uint number = 1; !is_name_unique && number <= MAX_CLIENTS; number++) { // Something's really wrong when there're more names than clients is_name_unique = true; for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - if (ci->client_name.compare(name) == 0) { + if (ci->client_name == name) { /* Name already in use */ is_name_unique = false; break; @@ -1729,7 +1728,7 @@ bool NetworkMakeClientNameUnique(std::string &name) /* Check if it is the same as the server-name */ const NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(CLIENT_ID_SERVER); if (ci != nullptr) { - if (ci->client_name.compare(name) == 0) is_name_unique = false; // name already in use + if (ci->client_name == name) is_name_unique = false; // name already in use } if (!is_name_unique) { @@ -1833,10 +1832,10 @@ void NetworkServer_Tick(bool send_frame) /* Client did still not report in within the specified limit. */ IConsolePrintF(CC_ERROR, cs->last_packet + std::chrono::milliseconds(lag * MILLISECONDS_PER_TICK) > std::chrono::steady_clock::now() ? /* A packet was received in the last three game days, so the client is likely lagging behind. */ - "Client #%d is dropped because the client's game state is more than %d ticks behind" : + "Client #%d (IP: %s) is dropped because the client's game state is more than %d ticks behind" : /* No packet was received in the last three game days; sounds like a lost connection. */ - "Client #%d is dropped because the client did not respond for more than %d ticks", - cs->client_id, lag); + "Client #%d (IP: %s) is dropped because the client did not respond for more than %d ticks", + cs->client_id, cs->GetClientIP(), lag); cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER); continue; } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index e752484a82..a294352aa0 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2674,7 +2674,7 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint InvalidateWindowData(WC_STATION_VIEW, st->index, -1); if (_settings_game.economy.station_noise_level) { - SetWindowDirty(WC_TOWN_VIEW, st->town->index); + SetWindowDirty(WC_TOWN_VIEW, nearest->index); } } @@ -2716,6 +2716,10 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) Town *nearest = AirportGetNearestTown(as, it, dist); nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist); + if (_settings_game.economy.station_noise_level) { + SetWindowDirty(WC_TOWN_VIEW, nearest->index); + } + for (TileIndex tile_cur : st->airport) { DeleteAnimatedTile(tile_cur); DoClearSquare(tile_cur); @@ -2732,10 +2736,6 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags) InvalidateWindowData(WC_STATION_VIEW, st->index, -1); - if (_settings_game.economy.station_noise_level) { - SetWindowDirty(WC_TOWN_VIEW, st->town->index); - } - Company::Get(st->owner)->infrastructure.airport--; st->AfterStationTileSetChange(false, STATION_AIRPORT); diff --git a/src/statusbar_gui.cpp b/src/statusbar_gui.cpp index 36ef31b828..d8825157c8 100644 --- a/src/statusbar_gui.cpp +++ b/src/statusbar_gui.cpp @@ -149,7 +149,7 @@ struct StatusBarWindow : Window { case WID_S_RIGHT: { if (_local_company == COMPANY_SPECTATOR) { - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_SPECATOR, TC_FROMSTRING, SA_HOR_CENTER); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, text_top, STR_STATUSBAR_SPECTATOR, TC_FROMSTRING, SA_HOR_CENTER); } else { /* Draw company money, if any */ const Company *c = Company::GetIfValid(_local_company);