1
0
Fork 0

Compare commits

...

5 Commits

Author SHA1 Message Date
Patric Stout e28edf6945
Remove: [Script] CONFIG_RANDOM from AddSetting flags (#11942)
It had a very weird interaction, and was only ever used by a single
AI.
2024-01-31 22:24:36 +00:00
merni-ns ccaa383e85
Fix #11938: Check infinite money setting in cases where it was missed (#11939) 2024-01-31 20:11:48 +01:00
Patric Stout 363e251a10
Change: make -dnet=9 give traces of the details of the network protocol (#11931) 2024-01-31 19:36:41 +01:00
translators bbae16574a Update: Translations from eints
english (au): 10 changes by krysclarke
english (us): 10 changes by 2TallTyler
vietnamese: 10 changes by KhoiCanDev
chinese (simplified): 62 changes by WenSimEHRP, 4 changes by XiaoJi-Game
korean: 11 changes by telk5093
russian: 5 changes by Ln-Wolf
finnish: 32 changes by hpiirai
portuguese (brazilian): 12 changes by pasantoro
2024-01-31 18:34:42 +00:00
Patric Stout 3e6ed6f44a
Fix #9697: don't extend the Online Players window too wide on opening (#11936) 2024-01-31 19:03:07 +01:00
83 changed files with 474 additions and 54 deletions

View File

@ -42,14 +42,14 @@ template <> const char *GetClassName<AIInfo, ScriptType::AI>() { return "AIInfo"
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting");
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels"); SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_RANDOM, "CONFIG_RANDOM"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_RANDOM"); // Deprecated, mapped to NONE.
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "CONFIG_BOOLEAN"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "CONFIG_BOOLEAN");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "CONFIG_INGAME"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "CONFIG_INGAME");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_DEVELOPER, "CONFIG_DEVELOPER"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_DEVELOPER, "CONFIG_DEVELOPER");
/* Pre 1.2 had an AI prefix */ /* Pre 1.2 had an AI prefix */
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "AICONFIG_NONE"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "AICONFIG_NONE");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_RANDOM, "AICONFIG_RANDOM"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "AICONFIG_RANDOM"); // Deprecated, mapped to NONE.
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "AICONFIG_BOOLEAN"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "AICONFIG_BOOLEAN");
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "AICONFIG_INGAME"); SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "AICONFIG_INGAME");

View File

@ -836,17 +836,21 @@ static void CompaniesPayInterest()
/* Over a year the paid interest should be "loan * interest percentage", /* Over a year the paid interest should be "loan * interest percentage",
* but... as that number is likely not dividable by 12 (pay each month), * but... as that number is likely not dividable by 12 (pay each month),
* one needs to account for that in the monthly fee calculations. * one needs to account for that in the monthly fee calculations.
*
* To easily calculate what one should pay "this" month, you calculate * To easily calculate what one should pay "this" month, you calculate
* what (total) should have been paid up to this month and you subtract * what (total) should have been paid up to this month and you subtract
* whatever has been paid in the previous months. This will mean one month * whatever has been paid in the previous months. This will mean one month
* it'll be a bit more and the other it'll be a bit less than the average * it'll be a bit more and the other it'll be a bit less than the average
* monthly fee, but on average it will be exact. * monthly fee, but on average it will be exact.
*
* In order to prevent cheating or abuse (just not paying interest by not * In order to prevent cheating or abuse (just not paying interest by not
* taking a loan we make companies pay interest on negative cash as well * taking a loan) we make companies pay interest on negative cash as well,
* except if infinite money is enabled.
*/ */
Money yearly_fee = c->current_loan * _economy.interest_rate / 100; Money yearly_fee = c->current_loan * _economy.interest_rate / 100;
if (c->money < 0) { Money available_money = GetAvailableMoney(c->index);
yearly_fee += -c->money *_economy.interest_rate / 100; if (available_money < 0) {
yearly_fee += -available_money * _economy.interest_rate / 100;
} }
Money up_to_previous_month = yearly_fee * TimerGameEconomy::month / 12; Money up_to_previous_month = yearly_fee * TimerGameEconomy::month / 12;
Money up_to_this_month = yearly_fee * (TimerGameEconomy::month + 1) / 12; Money up_to_this_month = yearly_fee * (TimerGameEconomy::month + 1) / 12;

View File

@ -40,7 +40,7 @@ template <> const char *GetClassName<GameInfo, ScriptType::GS>() { return "GSInf
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting");
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels"); SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels");
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_RANDOM, "CONFIG_RANDOM"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_RANDOM"); // Deprecated, mapped to NONE.
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "CONFIG_BOOLEAN"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_BOOLEAN, "CONFIG_BOOLEAN");
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "CONFIG_INGAME"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_INGAME, "CONFIG_INGAME");
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_DEVELOPER, "CONFIG_DEVELOPER"); SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_DEVELOPER, "CONFIG_DEVELOPER");

View File

@ -1334,6 +1334,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :As dit geaktive
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Outohernuwe voertuig as hy oud raak: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Outohernuwe voertuig as hy oud raak: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :As dit geaktiveer is, word 'n voertuig wat naby die einde van sy werkslewe kom outomaties vervang, wanneer die hernu voorwaardes vervul is. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :As dit geaktiveer is, word 'n voertuig wat naby die einde van sy werkslewe kom outomaties vervang, wanneer die hernu voorwaardes vervul is.

View File

@ -1269,6 +1269,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :المركبا
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :جدد العربات عندما تصبح قديمة : {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :جدد العربات عندما تصبح قديمة : {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :عند التمكين ، يتم استبدال العربة التي اقتربت من نهاية عمرها عند اكتمال شروط التجديد STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :عند التمكين ، يتم استبدال العربة التي اقتربت من نهاية عمرها عند اكتمال شروط التجديد

View File

@ -1290,6 +1290,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Gaitua dagoenea
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Ibilgailu bat zahartzen denean automatikoki berritu: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Ibilgailu bat zahartzen denean automatikoki berritu: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Gaitua dagoenean, Ibilgailuek bere lan-bizitza amaitzear dutenean eta beharrezko baldintzak betetzen badira automatikoki berrituko dira STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Gaitua dagoenean, Ibilgailuek bere lan-bizitza amaitzear dutenean eta beharrezko baldintzak betetzen badira automatikoki berrituko dira

View File

@ -1646,6 +1646,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Калі ўкл
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Аўтазамена старых транспартных сродкаў: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Аўтазамена старых транспартных сродкаў: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Калі ўключана, транспарт напрыканцы свайго пэўнага тэрміна службы будзе аўтаматычна заменены, калі ўмовы замены будуць выкананыя. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Калі ўключана, транспарт напрыканцы свайго пэўнага тэрміна службы будзе аўтаматычна заменены, калі ўмовы замены будуць выкананыя.

View File

@ -836,6 +836,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}Salvo Auto
STR_STATUSBAR_SAVING_GAME :{RED}* * SALVANDO JOGO * * STR_STATUSBAR_SAVING_GAME :{RED}* * SALVANDO JOGO * *
STR_STATUSBAR_SPECTATOR :{WHITE}(espectador) STR_STATUSBAR_SPECTATOR :{WHITE}(espectador)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(dinheiro infinito)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens STR_MESSAGE_HISTORY :{WHITE}Histórico de Mensagens
@ -1288,6 +1289,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Direita
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}segundo{P 0 "" s} STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}segundo{P 0 "" s}
STR_CONFIG_SETTING_INFINITE_MONEY :Dinheiro infinito: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Permitir gastos sem limite e desabilitar falência das companhias
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Empréstimo Inicial Máximo: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Empréstimo Inicial Máximo: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantia máxima a ser emprestada para uma companhia (sem levar em conta a inflação) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantia máxima a ser emprestada para uma companhia (sem levar em conta a inflação)
@ -1522,6 +1525,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativado, os veículos próximos do fim da vida útil são automaticamente substituídos quando as condições forem atingidas STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativado, os veículos próximos do fim da vida útil são automaticamente substituídos quando as condições forem atingidas
@ -1940,7 +1944,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Ao arrastar, co
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Define a distância a cada qual sinais serão construídos até o próximo obstáculo (sinal, intersecção), ao clicar e arrastar sinais STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Define a distância a cada qual sinais serão construídos até o próximo obstáculo (sinal, intersecção), ao clicar e arrastar sinais
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} quadrado{P "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} quadrado{P "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, manter distância fixa entre os sinais: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, manter distância fixa entre os sinais: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecione o comportamento da construção de sinais ao Ctrl+Arrastar. Se desativado, sinais são colocados ao redor de túneis ou pontes para evitar trechos compridos sem sinalização. Se ativado, sinais são colocados a cada N quadrados, tornando o alinhamento de sinais em trilhos paralelos mais fácil STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecione o comportamento da colocação de sinais ao usar Ctrl+Arrastar. Se desativado, sinais são colocados ao redor de túneis ou pontes para evitar trechos longos sem sinais. Se ativado, sinais são colocados a cada N quadrados, facilitando o alinhamento de sinais em linhas paralelas
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Construir sinaleiros até: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Construir sinaleiros até: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Seleciona o ano a partir do qual semáforos substituirão sinais. Antes desse ano, serão utilizados sinais de placa (diferença puramente estética) STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Seleciona o ano a partir do qual semáforos substituirão sinais. Antes desse ano, serão utilizados sinais de placa (diferença puramente estética)
@ -2394,7 +2398,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamanho
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para exibir por área STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para exibir por área
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Tempo de jogo STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Tempo de jogo
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Tempo jogando enquanto{}o jogo não estava pausado STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Tempo jogando enquanto{}o jogo não estava pausado
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versão do servidor, etc. STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versão do servidor, etc.
@ -2412,7 +2416,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}IP do s
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Código de convite: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Código de convite: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de inicio: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de inicio: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data atual: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data atual: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Tempo de jogo: {WHITE}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Tempo de jogo: {WHITE}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de jogo: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script de jogo: {WHITE}{STRING} (v{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protegido por senha! STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protegido por senha!
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESLIGADO STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESLIGADO
@ -2805,7 +2809,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construi
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito de trem (para aquisição e manutenção de trens). Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito de trem (para aquisição e manutenção de trens). Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controle na ferrovia. Ctrl+Clique para selecionar outro ponto de controle e unir com esse. Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construir ponto de controle na ferrovia. Ctrl+Clique para selecionar outro ponto de controle e unir com esse. Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl+Clique para selecionar outra estação e unir com essa. Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl+Clique para selecionar outra estação e unir com essa. Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Cosntruir sinal na ferrovia. Ctrl+Clique para construir o sinal com estilo diferente{}Clique+Arraste para preencher a seção de ferrovia selecionada com os sinais no espaçamento escolhido. Ctrl+Clique+Arraste para colocar sinais até a próxima, junção, estação ou sinal. Pressione Shift para somente mostrar o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinal na ferrovia. Ctrl+Clique para construir o sinal com estilo diferente{}Clique+Arraste para preencher a seção selecionada da ferrovia com os sinais no espaçamento escolhido. Ctrl+Clique+Arraste para colocar sinais até a próxima junção, estação ou sinal. Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna construir/mostrar custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift alterna construir/mostrar custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressionar Shift mostra o custo estimado
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de passagem e estações. Manter Ctrl pressionado também remove a linha férrea de pontos de passagem e estações STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de passagem e estações. Manter Ctrl pressionado também remove a linha férrea de pontos de passagem e estações
@ -5768,6 +5772,7 @@ STR_UNKNOWN_STATION :estação desco
STR_DEFAULT_SIGN_NAME :Placa STR_DEFAULT_SIGN_NAME :Placa
STR_COMPANY_SOMEONE :alguém STR_COMPANY_SOMEONE :alguém
STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}min
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Espectador, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :Espectador, {1:STRING}
@ -5801,6 +5806,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}k
STR_CURRENCY_SHORT_MEGA :{NBSP}m
STR_CURRENCY_SHORT_GIGA :{NBSP}bn
STR_CURRENCY_SHORT_TERA :{NBSP}tn
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -1313,6 +1313,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Ако тази
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автоматично поднови превозното средство, когато остарее: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автоматично поднови превозното средство, когато остарее: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ако тази опция бъде активирана, дадено превозно средство ще бъде автоматично заменено когато е към края на своя живот, стига условията за това да са налице STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ако тази опция бъде активирана, дадено превозно средство ще бъде автоматично заменено когато е към края на своя живот, стига условията за това да са налице

View File

@ -1484,6 +1484,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Rellotge de par
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenova el vehicle quan sigui vell: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenova el vehicle quan sigui vell: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quan està activat, un vehicle que arriba al final de la seva vida útil és automàticament substituït quan es compleixen les condicions d'autorenovació. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quan està activat, un vehicle que arriba al final de la seva vida útil és automàticament substituït quan es compleixen les condicions d'autorenovació.

View File

@ -663,6 +663,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Аэропор
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -1438,6 +1438,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kada je uključ
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatski obnovi vozilo kada postane staro: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatski obnovi vozilo kada postane staro: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kada je uključeno, vozilo kojem se bliži kraj vijeka trajanja se automatski obnavlja ukoliko su uvjeti za obnavljanje ispunjeni STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kada je uključeno, vozilo kojem se bliži kraj vijeka trajanja se automatski obnavlja ukoliko su uvjeti za obnavljanje ispunjeni

View File

@ -1504,6 +1504,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Pokud je zapnut
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automaticky nahradit dopravní prostředek, když zestárne: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automaticky nahradit dopravní prostředek, když zestárne: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Pokud je zapnuto, vozidla na konci své plánované životnosti budou automaticky nahrazena, když jsou splněny podmínky pro automatické obnovení. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Pokud je zapnuto, vozidla na konci své plánované životnosti budou automaticky nahrazena, když jsou splněny podmínky pro automatické obnovení.

View File

@ -1471,6 +1471,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Vægur
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatisk fornyelse af gamle køretøjer: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatisk fornyelse af gamle køretøjer: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Når aktiveret, bliver et køretøjder nærmer sig sin afslutning af livet automatisk udskiftet, når betingelserne er opfyldt STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Når aktiveret, bliver et køretøjder nærmer sig sin afslutning af livet automatisk udskiftet, når betingelserne er opfyldt

View File

@ -1485,6 +1485,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Muurklok
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Voertuig automatisch vernieuwen wanneer dit oud wordt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Voertuig automatisch vernieuwen wanneer dit oud wordt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Wanneer ingeschakeld, wordt een voertuig dat het einde van zijn levensduur nadert automatisch vervangen als aan de voorwaarden voor vernieuwing wordt voldaan STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Wanneer ingeschakeld, wordt een voertuig dat het einde van zijn levensduur nadert automatisch vervangen als aan de voorwaarden voor vernieuwing wordt voldaan

View File

@ -835,6 +835,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE
STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * *
STR_STATUSBAR_SPECTATOR :{WHITE}(spectator) STR_STATUSBAR_SPECTATOR :{WHITE}(spectator)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(infinite money)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}Message History STR_MESSAGE_HISTORY :{WHITE}Message History
@ -1287,6 +1288,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Right
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "" s} STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "" s}
STR_CONFIG_SETTING_INFINITE_MONEY :Infinite money: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Allow unlimited spending and disable bankruptcy of companies
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account)
@ -1521,6 +1524,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendar time frozen) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendar time frozen)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenew vehicle when it gets old: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenew vehicle when it gets old: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :When enabled, a vehicle nearing its end of life gets replaced automatically when the renew conditions are fulfilled STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :When enabled, a vehicle nearing its end of life gets replaced automatically when the renew conditions are fulfilled
@ -1939,7 +1943,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :When dragging,
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :When dragging, keep fixed distance between signals: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :When dragging, keep fixed distance between signals: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behaviour of signal placement when Ctrl+dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behaviour of signal placement when dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatically build semaphores before: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatically build semaphores before: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year when electric signals will be used for tracks. Before this year, non-electric signals will be used (which have the exact same function, but different looks) STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year when electric signals will be used for tracks. Before this year, non-electric signals will be used (which have the exact same function, but different looks)
@ -2804,7 +2808,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build ra
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and servicing trains). Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. Ctrl+Click to select another waypoint to join. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railway. Ctrl+Click to select another waypoint to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railway station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl+Click to build the alternate signal style{}Click+Drag to fill the selected section of rail with signals at the chosen spacing. Ctrl+Click+Drag to fill signals up to the next junction, station, or signal. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl+Click to build the alternate signal style{}Click+Drag to fill signals up to the next junction, station, or signal. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railway bridge. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railway tunnel. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. Ctrl+Click to also remove the rail of waypoints and stations STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railway track, signals, waypoints and stations. Ctrl+Click to also remove the rail of waypoints and stations
@ -5767,6 +5771,7 @@ STR_UNKNOWN_STATION :unknown station
STR_DEFAULT_SIGN_NAME :Sign STR_DEFAULT_SIGN_NAME :Sign
STR_COMPANY_SOMEONE :someone STR_COMPANY_SOMEONE :someone
STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Spectator, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :Spectator, {1:STRING}
@ -5800,6 +5805,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}k
STR_CURRENCY_SHORT_MEGA :{NBSP}m
STR_CURRENCY_SHORT_GIGA :{NBSP}bn
STR_CURRENCY_SHORT_TERA :{NBSP}tn
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -835,6 +835,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOSAVE
STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * * STR_STATUSBAR_SAVING_GAME :{RED}* * SAVING GAME * *
STR_STATUSBAR_SPECTATOR :{WHITE}(spectator) STR_STATUSBAR_SPECTATOR :{WHITE}(spectator)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(infinite money)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}Message History STR_MESSAGE_HISTORY :{WHITE}Message History
@ -1287,6 +1288,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Right
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "" s} STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}second{P 0 "" s}
STR_CONFIG_SETTING_INFINITE_MONEY :Infinite money: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Allow unlimited spending and disable bankruptcy of companies
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maximum initial loan: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maximum amount a company can loan (without taking inflation into account)
@ -1521,6 +1524,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendar time frozen) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendar time frozen)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenew vehicle when it gets old: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenew vehicle when it gets old: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :When enabled, a vehicle nearing its end of life gets automatically replaced when the renew conditions are fulfilled STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :When enabled, a vehicle nearing its end of life gets automatically replaced when the renew conditions are fulfilled
@ -1939,7 +1943,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :When dragging,
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Set the distance at which signals will be built on a track up to the next obstacle (signal, junction), if signals are dragged
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} tile{P 0 "" s}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :When dragging, keep fixed distance between signals: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :When dragging, keep fixed distance between signals: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behavior of signal placement when Ctrl+dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Select the behaviour of signal placement when dragging signals. If disabled, signals are placed around tunnels or bridges to avoid long stretches without signals. If enabled, signals are placed every n tiles, making alignment of signals at parallel tracks easier
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatically build semaphores before: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatically build semaphores before: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year when electric signals will be used for tracks. Before this year, non-electric signals will be used (which have the exact same function, but different looks) STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year when electric signals will be used for tracks. Before this year, non-electric signals will be used (which have the exact same function, but different looks)
@ -2804,7 +2808,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Build ra
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and maintaining trains). Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Build train depot (for buying and maintaining trains). Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railroad. Ctrl+Click to select another waypoint to join. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Build waypoint on railroad. Ctrl+Click to select another waypoint to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railroad station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Build railroad station. Ctrl+Click to select another station to join. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railroad. Ctrl+Click to build the alternate signal style{}Click+Drag to fill the selected section of rail with signals at the chosen spacing. Ctrl+Click+Drag to fill signals up to the next junction, station, or signal. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Build signal on railway. Ctrl+Click to build the alternate signal style{}Click+Drag to fill signals up to the next junction, station, or signal. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railroad bridge. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Build railroad bridge. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railroad tunnel. Also press Shift to show cost estimate only STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Build railroad tunnel. Also press Shift to show cost estimate only
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railroad track, signals, waypoints and stations. Ctrl+Click to also remove the rail of waypoints and stations STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Toggle build/remove for railroad track, signals, waypoints and stations. Ctrl+Click to also remove the rail of waypoints and stations
@ -5767,6 +5771,7 @@ STR_UNKNOWN_STATION :unknown station
STR_DEFAULT_SIGN_NAME :Sign STR_DEFAULT_SIGN_NAME :Sign
STR_COMPANY_SOMEONE :someone STR_COMPANY_SOMEONE :someone
STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Spectator, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :Spectator, {1:STRING}
@ -5800,6 +5805,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}K
STR_CURRENCY_SHORT_MEGA :{NBSP}M
STR_CURRENCY_SHORT_GIGA :{NBSP}B
STR_CURRENCY_SHORT_TERA :{NBSP}T
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -1486,6 +1486,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Se tiu ĉi agor
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Aŭtomate anstataŭu veturilon se malnoviĝas: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Aŭtomate anstataŭu veturilon se malnoviĝas: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Se tiu ĉi agordo estas aktiva, veturilo kiu alproksimiĝas al la fino de sia vivdaŭro estos aŭtomate anstataŭigita kiam la renovigkondiĉoj estas plenumitaj STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Se tiu ĉi agordo estas aktiva, veturilo kiu alproksimiĝas al la fino de sia vivdaŭro estos aŭtomate anstataŭigita kiam la renovigkondiĉoj estas plenumitaj

View File

@ -1454,6 +1454,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kui on aktiveer
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Vananenud sõidukite uuendamine: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Vananenud sõidukite uuendamine: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kui on sisse lülitatud, siis uuendatalse kõik kasutusaja lõpu lähedal olevad sõidukid automaatselt, järgides uuendamise tingimusi STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kui on sisse lülitatud, siis uuendatalse kõik kasutusaja lõpu lähedal olevad sõidukid automaatselt, järgides uuendamise tingimusi

View File

@ -1269,6 +1269,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Um gilda, eru
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Sjálvendurnýggja flutningstól tá ta gerst gamalt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Sjálvendurnýggja flutningstól tá ta gerst gamalt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Um gilda, verður eitt flutningstól tá tað nærkast endanum á sínum lívi sjálvirkandi umbýtt tá endurnýggjanar treytirnar eru nøktaðar STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Um gilda, verður eitt flutningstól tá tað nærkast endanum á sínum lívi sjálvirkandi umbýtt tá endurnýggjanar treytirnar eru nøktaðar

View File

@ -332,6 +332,7 @@ STR_SORT_BY_TYPE :Tyyppi
STR_SORT_BY_TRANSPORTED :Kuljetettu STR_SORT_BY_TRANSPORTED :Kuljetettu
STR_SORT_BY_NUMBER :Numero STR_SORT_BY_NUMBER :Numero
STR_SORT_BY_PROFIT_LAST_YEAR :Tuotto viime vuonna STR_SORT_BY_PROFIT_LAST_YEAR :Tuotto viime vuonna
STR_SORT_BY_PROFIT_LAST_PERIOD :Tuotto viime jaksolla
STR_SORT_BY_PROFIT_THIS_YEAR :Tuotto tänä vuonna STR_SORT_BY_PROFIT_THIS_YEAR :Tuotto tänä vuonna
STR_SORT_BY_PROFIT_THIS_PERIOD :Tuotto tällä jaksolla STR_SORT_BY_PROFIT_THIS_PERIOD :Tuotto tällä jaksolla
STR_SORT_BY_AGE :Ikä STR_SORT_BY_AGE :Ikä
@ -361,6 +362,7 @@ STR_SORT_BY_POPULATION :Asukasluku
STR_SORT_BY_RATING :Arvio STR_SORT_BY_RATING :Arvio
STR_SORT_BY_NUM_VEHICLES :Kulkuneuvojen määrä STR_SORT_BY_NUM_VEHICLES :Kulkuneuvojen määrä
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Kokonaistuotto viime vuonna STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Kokonaistuotto viime vuonna
STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kokonaistuotto viime jaksolla
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kokonaistuotto tänä vuonna STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kokonaistuotto tänä vuonna
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kokonaistuotto tällä jaksolla STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kokonaistuotto tällä jaksolla
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Keskimääräinen tuotto viime vuonna STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Keskimääräinen tuotto viime vuonna
@ -443,6 +445,7 @@ STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Asetukset
STR_SETTINGS_MENU_AI_SETTINGS :Tekoälyasetukset STR_SETTINGS_MENU_AI_SETTINGS :Tekoälyasetukset
STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Peliskriptiasetukset STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Peliskriptiasetukset
STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-asetukset STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF-asetukset
STR_SETTINGS_MENU_SANDBOX_OPTIONS :Hiekkalaatikkovalinnat
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Läpinäkyvyysasetukset STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Läpinäkyvyysasetukset
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Kuntien nimet näkyvissä STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Kuntien nimet näkyvissä
STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Asemien nimet näkyvissä STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Asemien nimet näkyvissä
@ -630,6 +633,7 @@ STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLA
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Rahtitaksat STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Rahtitaksat
STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Vuorokausia kuljetuksessa STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Vuorokausia kuljetuksessa
STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekunteja kuljetuksessa
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Maksu 10 yksikön (tai 10 000 litran) rahdin kuljettamisesta 20 ruudun päähän STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Maksu 10 yksikön (tai 10 000 litran) rahdin kuljettamisesta 20 ruudun päähän
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Ota kaikki käyttöön STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Ota kaikki käyttöön
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Poista kaikki käytöstä STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Poista kaikki käytöstä
@ -829,6 +833,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOMAATTI
STR_STATUSBAR_SAVING_GAME :{RED}* * TALLENNETAAN PELIÄ * * STR_STATUSBAR_SAVING_GAME :{RED}* * TALLENNETAAN PELIÄ * *
STR_STATUSBAR_SPECTATOR :{WHITE}(katsoja) STR_STATUSBAR_SPECTATOR :{WHITE}(katsoja)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(rahaa loputtomasti)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}Viestihistoria STR_MESSAGE_HISTORY :{WHITE}Viestihistoria
@ -1103,7 +1108,10 @@ STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Liitänn
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Käynnissä STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Käynnissä
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Alustus epäonnistui STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Alustus epäonnistui
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} ei ole käynnissä STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} ei ole käynnissä
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Poistettu käytöstä
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Liitännäinen kahdesti
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Versiota ei tueta STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Versiota ei tueta
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Allekirjoitus ei kelpaa
STR_BASESET_STATUS :{STRING} {RED}({NUM} puuttuvaa tai vioittunutta tiedosto{P "" a}) STR_BASESET_STATUS :{STRING} {RED}({NUM} puuttuvaa tai vioittunutta tiedosto{P "" a})
@ -1421,6 +1429,7 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Kaikissa näkym
STR_CONFIG_SETTING_BRIBE :Salli viranomaisten lahjominen: {STRING} STR_CONFIG_SETTING_BRIBE :Salli viranomaisten lahjominen: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_BRIBE_HELPTEXT :Salli yhtiöiden yrittää paikallisviranomaisten lahjontaa. Jos lahjontayritys paljastuu, yhtiö ei voi toimia kunnassa kuuteen kuukauteen STR_CONFIG_SETTING_BRIBE_HELPTEXT :Salli yhtiöiden yrittää paikallisviranomaisten lahjontaa. Jos lahjontayritys paljastuu, yhtiö ei voi toimia kunnassa kuuteen kuukauteen
STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Salli yhtiöiden yrittää paikallisviranomaisten lahjontaa. Jos lahjontayritys paljastuu, yhtiö ei voi toimia kunnassa kuuteen minuuttiin
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Salli kuljetusyksinoikeuksien ostaminen: {STRING} STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Salli kuljetusyksinoikeuksien ostaminen: {STRING}
###length 2 ###length 2
@ -1482,7 +1491,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :Kaikille kulkun
STR_CONFIG_SETTING_WARN_INCOME_LESS :Varoita, jos kulkuneuvon tulos on negatiivinen: {STRING} STR_CONFIG_SETTING_WARN_INCOME_LESS :Varoita, jos kulkuneuvon tulos on negatiivinen: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mikäli käytössä, uutisviesti lähetetään, jos kulkuneuvo ei ole tuottanut rahaa viimeisen kalenterivuoden aikana STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Mikäli käytössä, uutisviesti lähetetään, jos kulkuneuvo ei ole tuottanut rahaa vuoden aikana
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Mikäli käytössä, uutisviesti lähetetään, jos kulkuneuvo ei ole tuottanut rahaa jakson aikana
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Kulkuneuvot eivät vanhene: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Kulkuneuvot eivät vanhene: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Mikäli käytössä, kaikki kulkuneuvot ovat saatavilla ikuisesti niiden julkistamisen jälkeen STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Mikäli käytössä, kaikki kulkuneuvot ovat saatavilla ikuisesti niiden julkistamisen jälkeen
@ -1494,8 +1504,11 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalenteri
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Seinäkello STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Seinäkello
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuuttia vuodessa: {STRING} STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuuttia vuodessa: {STRING}
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Valitse minuuttien määrä kalenterivuodessa. Oletusarvo on 12 minuuttia. Aseta arvoksi 0, jos et halua kalenteriajan muuttuvan. Tämä asetus ei vaikuta pelin taloussimulaatioon, ja se on valittavissa vain seinäkelloaikaa käytettäessä.
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalenteriaika jäädytetty)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista kulkuneuvo automaattisesti, kun se vanhenee: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uudista kulkuneuvo automaattisesti, kun se vanhenee: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Mikäli käytössä, lähellä käyttöikänsä loppua oleva kulkuneuvo korvataan automaattisesti STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Mikäli käytössä, lähellä käyttöikänsä loppua oleva kulkuneuvo korvataan automaattisesti
@ -1754,7 +1767,8 @@ STR_CONFIG_SETTING_SOUND_NEW_YEAR :Vuoden loppu: {
STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Jakson loppu: {STRING} STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Jakson loppu: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Toista ääni vuoden lopussa verrattaessa yhtiön tulosta edelliseen vuoteen STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Toista ääni vuoden lopussa, kun esitetään yhteenveto yhtiön tuloksesta vuoden aikana verrattuna edelliseen vuoteen
STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Toista ääni jakson lopussa, kun esitetään yhteenveto yhtiön tuloksesta jakson aikana verrattuna edelliseen jaksoon
STR_CONFIG_SETTING_SOUND_CONFIRM :Rakentaminen: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM :Rakentaminen: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Toista ääni onnistuneen rakennus- tai muun toiminnon jälkeen STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Toista ääni onnistuneen rakennus- tai muun toiminnon jälkeen
@ -2384,6 +2398,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Palveli
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kutsukoodi: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kutsukoodi: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Aloitusvuosi: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Aloitusvuosi: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Päivämäärä: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Päivämäärä: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Peliaika: {WHITE}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Peliskripti: {WHITE}{STRING} (v.{NBSP}{NUM}) STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Peliskripti: {WHITE}{STRING} (v.{NBSP}{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Salasanasuojattu! STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Salasanasuojattu!
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}PALVELIN KIINNI STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}PALVELIN KIINNI
@ -2739,7 +2754,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}kuormittunut STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}kuormittunut
# Linkgraph tooltip # Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} minuutissa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}% kapasiteetista){STRING} STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} kuukaudessa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} minuutissa kuljetettavana asemalta {STATION} asemalle {STATION} ({COMMA}{NBSP}% kapasiteetista){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} kuljetettavana takaisin ({COMMA}{NBSP}% kapasiteetista) STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} kuljetettavana takaisin ({COMMA}{NBSP}% kapasiteetista)
# Base for station construction window(s) # Base for station construction window(s)
@ -2750,6 +2766,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Älä ko
STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Korosta ehdotetun tontin vaikutusalue STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Korosta ehdotetun tontin vaikutusalue
STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Vastaanottaa: {GOLD}{CARGO_LIST} STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Vastaanottaa: {GOLD}{CARGO_LIST}
STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Tuottaa: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Tuottaa: {GOLD}{CARGO_LIST}
STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}Ylläpitokustannukset: {GOLD}{CURRENCY_SHORT}/vuosi
STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}Ylläpitokustannukset: {GOLD}{CURRENCY_SHORT}/jakso STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}Ylläpitokustannukset: {GOLD}{CURRENCY_SHORT}/jakso
# Join station window # Join station window
@ -3905,6 +3922,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Asemat:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Asemaruudut STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Asemaruudut
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Lentokentät STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Lentokentät
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/vuosi STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/vuosi
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/jakso
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Teollisuuslaitokset STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Teollisuuslaitokset
@ -4234,11 +4252,16 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :raitiovaunu
STR_ENGINE_PREVIEW_AIRCRAFT :ilma-alus STR_ENGINE_PREVIEW_AIRCRAFT :ilma-alus
STR_ENGINE_PREVIEW_SHIP :laiva STR_ENGINE_PREVIEW_SHIP :laiva
STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
STR_ENGINE_PREVIEW_COST_WEIGHT :Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT} STR_ENGINE_PREVIEW_COST_WEIGHT :Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}
STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Nopeus: {VELOCITY} Teho: {POWER} Maksimivetovoima: {FORCE}
STR_ENGINE_PREVIEW_TYPE :Ilma-aluksen tyyppi: {STRING} STR_ENGINE_PREVIEW_TYPE :Ilma-aluksen tyyppi: {STRING}
STR_ENGINE_PREVIEW_TYPE_RANGE :Ilma-alustyyppi: {STRING} Toimintasäde: {COMMA} ruutua STR_ENGINE_PREVIEW_TYPE_RANGE :Ilma-alustyyppi: {STRING} Toimintasäde: {COMMA} ruutua
STR_ENGINE_PREVIEW_RUNCOST_YEAR :Käyttökustannukset: {CURRENCY_LONG}/vuosi
STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Käyttökustannukset: {CURRENCY_LONG}/jakso STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Käyttökustannukset: {CURRENCY_LONG}/jakso
STR_ENGINE_PREVIEW_CAPACITY :Kapasiteetti: {CARGO_LONG}
STR_ENGINE_PREVIEW_CAPACITY_2 :Kapasiteetti: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window # Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Korvaa {STRING} {STRING} STR_REPLACE_VEHICLES_WHITE :{WHITE}Korvaa {STRING} {STRING}
@ -4394,7 +4417,8 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Paino: {
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) {BLACK}Vähimmäissuorituskyky: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Tuotto tänä vuonna: {LTBLUE}{CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG}) {BLACK}Vähimmäissuorituskyky: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Tuotto tällä jaksolla: {LTBLUE}{CURRENCY_LONG} (viime jakso: {CURRENCY_LONG}) {BLACK}Vähimmäissuorituskyky: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Tuotto tällä jaksolla: {LTBLUE}{CURRENCY_LONG} (viime jaksolla: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Tuotto tällä jaksolla: {LTBLUE}{CURRENCY_LONG} (viime jaksolla: {CURRENCY_LONG}) {BLACK}Vähimmäissuorituskyky: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Luotettavuus: {LTBLUE}{COMMA}{NBSP}% {BLACK}Hajoamiset viime huollon jälkeen: {LTBLUE}{COMMA} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Luotettavuus: {LTBLUE}{COMMA}{NBSP}% {BLACK}Hajoamiset viime huollon jälkeen: {LTBLUE}{COMMA}
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Rakennettu: {LTBLUE}{NUM}{BLACK} Arvo: {LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Rakennettu: {LTBLUE}{NUM}{BLACK} Arvo: {LTBLUE}{CURRENCY_LONG}
@ -4410,10 +4434,13 @@ STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Viimeksi huolle
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Viimeksi huollettu: {LTBLUE}{NUM} minuuttia sitten STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Viimeksi huollettu: {LTBLUE}{NUM} minuuttia sitten
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Pidennä huoltoväliä 5 minuutilla. Ctrl+napsautus pidentää väliä 1 minuutilla STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Pidennä huoltoväliä 5 minuutilla. Ctrl+napsautus pidentää väliä 1 minuutilla
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Pidennä huoltoväliä 10 prosentilla. Ctrl+napsautus pidentää väliä 5 prosentilla STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Pidennä huoltoväliä 10 prosentilla. Ctrl+napsautus pidentää väliä 5 prosentilla
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Lyhennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus lyhentää väliä 5 vuorokaudella
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Lyhennä huoltoväliä 5 minuutilla. Ctrl+napsautus lyhentää väliä 1 minuutilla STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Lyhennä huoltoväliä 5 minuutilla. Ctrl+napsautus lyhentää väliä 1 minuutilla
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Lyhennä huoltoväliä 10 prosentilla. Ctrl+napsautus lyhentää väliä 5 prosentilla
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Muuta huoltovälien tyyppiä STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Muuta huoltovälien tyyppiä
STR_VEHICLE_DETAILS_DEFAULT :Oletus STR_VEHICLE_DETAILS_DEFAULT :Oletus
STR_VEHICLE_DETAILS_DAYS :Päiviä
STR_VEHICLE_DETAILS_MINUTES :Minuutteja STR_VEHICLE_DETAILS_MINUTES :Minuutteja
STR_VEHICLE_DETAILS_PERCENT :Prosentteja STR_VEHICLE_DETAILS_PERCENT :Prosentteja
@ -5713,6 +5740,7 @@ STR_UNKNOWN_STATION :tuntematon asem
STR_DEFAULT_SIGN_NAME :Kyltti STR_DEFAULT_SIGN_NAME :Kyltti
STR_COMPANY_SOMEONE :joku STR_COMPANY_SOMEONE :joku
STR_SAVEGAME_DURATION_REALTIME :{NUM} h {NUM} min
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Katsoja, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :Katsoja, {1:STRING}
@ -5746,6 +5774,7 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_TERA :{NBSP} t
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -1522,6 +1522,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendrier gelé) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendrier gelé)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renouveler automatiquement les véhicules vieillissants{NBSP}: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renouveler automatiquement les véhicules vieillissants{NBSP}: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quand il est actif, un véhicule approchant de la fin de sa durée de vie est automatiquement remplacé quand les conditions du renouvellement sont remplies STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quand il est actif, un véhicule approchant de la fin de sa durée de vie est automatiquement remplacé quand les conditions du renouvellement sont remplies

View File

@ -1325,6 +1325,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :By ynskeakeljen
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Ferfang âlde fiertugen automatysk: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Ferfang âlde fiertugen automatysk: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :By ynskeakeljen wurden fiertugen dy't hast op harren ein binne automatyske ferfongen STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :By ynskeakeljen wurden fiertugen dy't hast op harren ein binne automatyske ferfongen

View File

@ -1516,6 +1516,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Ma tha seo air,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fèin-nuadhaich carbad nuair a bhios e air fàs aosta: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fèin-nuadhaich carbad nuair a bhios e air fàs aosta: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Nuair a bhios seo air, nuair a bhios carbad air fàs ro aosta, thèid fear ùr a chur na àite gu fèin-obrachail ma dh'fhreagras e ri cumhan an fhèin-nuadhachaidh STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Nuair a bhios seo air, nuair a bhios carbad air fàs ro aosta, thèid fear ùr a chur na àite gu fèin-obrachail ma dh'fhreagras e ri cumhan an fhèin-nuadhachaidh

View File

@ -1455,6 +1455,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Cando se activa
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenova-los vehículos cando vaian vellos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autorenova-los vehículos cando vaian vellos: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Cando se activa, un vehículo que se achega ao fin da súa vida útil é reemprazado automáticamente se se cumplen as condicións de renovación STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Cando se activa, un vehículo que se achega ao fin da súa vida útil é reemprazado automáticamente se se cumplen as condicións de renovación

View File

@ -1454,6 +1454,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Erlauben, dass
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fahrzeuge automatisch erneuern, wenn sie alt werden: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fahrzeuge automatisch erneuern, wenn sie alt werden: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Erneuere Fahrzeuge automatisch gemäß der Regeln für Erneuerung, wenn sie ihr Maximalalter erreicht haben. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Erneuere Fahrzeuge automatisch gemäß der Regeln für Erneuerung, wenn sie ihr Maximalalter erreicht haben.

View File

@ -1502,6 +1502,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Όταν είν
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Αυτόματη ανανέωση όταν ένα όχημα παλιώνει: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Αυτόματη ανανέωση όταν ένα όχημα παλιώνει: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Όταν είναι ενεργοποιημένη, τα οχήματα που πλησιάζουν το τέλος της ζωής τους αντικαθίσταται αυτόματα όταν πληρούνται οι προϋποθέσεις αντικατάστασής του STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Όταν είναι ενεργοποιημένη, τα οχήματα που πλησιάζουν το τέλος της ζωής τους αντικαθίσταται αυτόματα όταν πληρούνται οι προϋποθέσεις αντικατάστασής του

View File

@ -1348,6 +1348,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :כאשר מאו
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :חידוש עצמי של רכב כשהוא נהיה ישן: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :חידוש עצמי של רכב כשהוא נהיה ישן: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :כאשר מאופשר, רכב המתקרב לסוף חייו מוחלף אוטומטית כאשר תנאי החידוש מתקיימים STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :כאשר מאופשר, רכב המתקרב לסוף חייו מוחלף אוטומטית כאשר תנאי החידוש מתקיימים

View File

@ -457,6 +457,7 @@ STR_CONFIG_SETTING_ORDER_REVIEW_OFF :नहीं
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -1516,6 +1516,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Bekapcsolva min
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatikusan felújítja a járművet ha elöregedik: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatikusan felújítja a járművet ha elöregedik: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Bekapcsolva a jármű élettartamának végén automatikusan cserére kerül, ha a lecserélési feltételek teljesülnek STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Bekapcsolva a jármű élettartamának végén automatikusan cserére kerül, ha a lecserélési feltételek teljesülnek

View File

@ -1268,6 +1268,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Ef þessi still
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uppfæra faratæki sjálfvirkt þegar þau eldast: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Uppfæra faratæki sjálfvirkt þegar þau eldast: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ef þessi stilling er virk, eru farartæki endurnýjuð sjálfvirkt þegar endingartími þeirra er komin STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ef þessi stilling er virk, eru farartæki endurnýjuð sjálfvirkt þegar endingartími þeirra er komin

View File

@ -637,6 +637,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normala
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -1453,6 +1453,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Jika dinyalakan
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Perbarui otomatis kendaraan yang telah tua: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Perbarui otomatis kendaraan yang telah tua: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Jika dinyalakan, kendaraan mendekati akhir usianya akan secara otomatis diperbarui jika masih tersedia kendaraan itu STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Jika dinyalakan, kendaraan mendekati akhir usianya akan secara otomatis diperbarui jika masih tersedia kendaraan itu

View File

@ -1372,6 +1372,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Má dhéantar
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Déan uathathnuachan ar an bhfeithicil nuair a éiríonn sé sean: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Déan uathathnuachan ar an bhfeithicil nuair a éiríonn sé sean: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Má tá sé cumasaithe, déantar feithicil atá ag teacht chuig deireadh a ré a ionadú go huathoibríoch má tá na coinníollacha athnuachana comhlíonta STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Má tá sé cumasaithe, déantar feithicil atá ag teacht chuig deireadh a ré a ionadú go huathoibríoch má tá na coinníollacha athnuachana comhlíonta

View File

@ -1492,6 +1492,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Se abilitata, d
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Rinnova un veicolo quando diventa vecchio: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Rinnova un veicolo quando diventa vecchio: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Se abilitata, un veicolo vicino alla sua età massima viene automaticamente sostituito quando si verificano le condizioni richieste per il rinnovo STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Se abilitata, un veicolo vicino alla sua età massima viene automaticamente sostituito quando si verificano le condizioni richieste per il rinnovo

View File

@ -1417,6 +1417,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :有効にする
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :老朽車両の自動交換: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :老朽車両の自動交換: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :有効にすると、耐用年数を越えた輸送機器は自動で更新されるようになります(交換には一度格納施設に戻る必要があります)。具体的な交換時期は下の設定で変更できます。 STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :有効にすると、耐用年数を越えた輸送機器は自動で更新されるようになります(交換には一度格納施設に戻る必要があります)。具体的な交換時期は下の設定で変更できます。

View File

@ -836,6 +836,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}자동 저
STR_STATUSBAR_SAVING_GAME :{RED}* * 게임 저장 중 * * STR_STATUSBAR_SAVING_GAME :{RED}* * 게임 저장 중 * *
STR_STATUSBAR_SPECTATOR :{WHITE}(관전자) STR_STATUSBAR_SPECTATOR :{WHITE}(관전자)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(돈 무제한)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}메시지 기록 STR_MESSAGE_HISTORY :{WHITE}메시지 기록
@ -1288,6 +1289,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :오른쪽
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}초 STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}초
STR_CONFIG_SETTING_INFINITE_MONEY :돈 무제한: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :돈을 무제한으로 만들고 회사가 파산하지 않게 만듭니다
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :최대 초기 대출금: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :최대 초기 대출금: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :한 회사가 최대한 빌릴 수 있는 대출금의 양을 조절할 수 있습니다. (여기서 설정한 값은 인플레이션에 의한 효과를 적용하지 않은 값입니다.) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :한 회사가 최대한 빌릴 수 있는 대출금의 양을 조절할 수 있습니다. (여기서 설정한 값은 인플레이션에 의한 효과를 적용하지 않은 값입니다.)
@ -1522,6 +1525,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (달력 시간 정지됨) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (달력 시간 정지됨)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :차량이 낡으면 차량을 자동으로 교체: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :차량이 낡으면 차량을 자동으로 교체: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 설정을 켜면, 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다 STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :이 설정을 켜면, 제한 수명에 다다른 차량이 교체 조건을 만족할 경우 자동으로 차량을 교체할 수 있게 됩니다
@ -1940,7 +1944,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :신호기를
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :신호기를 드래그할 때, 다음 장애물(신호기, 분기점 등)을 만날 때까지 신호기가 설치될 간격을 설정합니다 STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :신호기를 드래그할 때, 다음 장애물(신호기, 분기점 등)을 만날 때까지 신호기가 설치될 간격을 설정합니다
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA}칸 간격으로 설치 STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA}칸 간격으로 설치
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :드래그할 때, 신호기 사이의 거리를 계속 고정: {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :드래그할 때, 신호기 사이의 거리를 계속 고정: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 CTRL+드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다. STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :신호기를 드래그 하여 설치할 때의 행동을 선택합니다. 이 설정을 끄면, 신호기가 없는 긴 폐색을 만들지 않기 위해 터널이나 다리 주변에 먼저 신호기가 설치될 것입니다. 이 설정을 켜면, 신호기는 터널/다리와 상관없이 매 n개의 칸마다 설치될 것입니다
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :전자식 신호기의 사용: {STRING}년 이후에 STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :전자식 신호기의 사용: {STRING}년 이후에
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호기는 기능적으로는 동일하고 모습만 다릅니다.) STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신호기를 사용할 수 있는 연도를 설정합니다. 이 이전에는 구식 신호기만 사용 가능합니다. (두 신호기는 기능적으로는 동일하고 모습만 다릅니다.)
@ -5768,8 +5772,9 @@ STR_UNKNOWN_STATION :알 수 없는
STR_DEFAULT_SIGN_NAME :팻말 STR_DEFAULT_SIGN_NAME :팻말
STR_COMPANY_SOMEONE :누군가 STR_COMPANY_SOMEONE :누군가
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}의 게임 ({STRING}) STR_SAVEGAME_DURATION_REALTIME :{NUM}시간 {NUM}분
STR_SAVEGAME_NAME_SPECTATOR :관전자의 게임 ({1:STRING}) STR_SAVEGAME_NAME_DEFAULT :{COMPANY}의 게임, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :관전자의 게임, {1:STRING}
# Viewport strings # Viewport strings
STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA}) STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA})
@ -5801,6 +5806,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :k
STR_CURRENCY_SHORT_MEGA :m
STR_CURRENCY_SHORT_GIGA :bn
STR_CURRENCY_SHORT_TERA :tn
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -1509,6 +1509,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Electa, omnes v
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoredimere vehicula cum veterascunt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoredimere vehicula cum veterascunt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Electa, vehicula veterascentia automatice redimuntur, condicionibus satisfactis STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Electa, vehicula veterascentia automatice redimuntur, condicionibus satisfactis

View File

@ -1460,6 +1460,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kad ieslēgts,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automātiski atjaunot transportlīdzekļus, kad tie ir kļuvuši veci: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automātiski atjaunot transportlīdzekļus, kad tie ir kļuvuši veci: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ja ieslēgts, kad ir atbilstoši atjaunošanas apstākļi, automātiski tiek nomainīti transportlīdzekļi kuru kalpošanas laiks tuvojas beigām STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ja ieslēgts, kad ir atbilstoši atjaunošanas apstākļi, automātiski tiek nomainīti transportlīdzekļi kuru kalpošanas laiks tuvojas beigām

View File

@ -1589,6 +1589,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kartą atsirad
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatiškai atnaujinti transporto priemonę, kai ji pasensta: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatiškai atnaujinti transporto priemonę, kai ji pasensta: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Transporto priemonė, eksploatacijos laikotarpiui artėjant prie pabaigos, bus automatiškai bus atnaujinta, jei tik atnaujinimo sąlygos bus išpildytos STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Transporto priemonė, eksploatacijos laikotarpiui artėjant prie pabaigos, bus automatiškai bus atnaujinta, jei tik atnaujinimo sąlygos bus išpildytos

View File

@ -1398,6 +1398,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Wann ugeschalt,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Gefier automatesch erneiere wann et al gëtt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Gefier automatesch erneiere wann et al gëtt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Wann ugeschalt, gëtt e Gefier wat u säi Lafzäitenn kënnt automatesch ausgetosch STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Wann ugeschalt, gëtt e Gefier wat u säi Lafzäitenn kënnt automatesch ausgetosch

View File

@ -937,6 +937,7 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Инфраст
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -1261,6 +1261,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Kenderaan tidak
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Gunakan pembaharuan automatik apabila kenderaan usang : {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Gunakan pembaharuan automatik apabila kenderaan usang : {STRING}
###length 2 ###length 2

View File

@ -567,6 +567,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jinti
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -872,6 +872,7 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE : वाहन
###setting-zero-is-special ###setting-zero-is-special
###length 2 ###length 2

View File

@ -1382,6 +1382,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Når aktivert,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoforny kjøretøy når det blir gammelt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoforny kjøretøy når det blir gammelt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Når aktivert, blir et kjøretøy som nærmer seg slutten av sin levetid automatisk erstattet når betingelsene for fornyelse er oppfylt STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Når aktivert, blir et kjøretøy som nærmer seg slutten av sin levetid automatisk erstattet når betingelsene for fornyelse er oppfylt

View File

@ -1293,6 +1293,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Køyretøy utg
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoforny køyretøy når det vert gamalt: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoforny køyretøy når det vert gamalt: {STRING}
STR_CONFIG_SETTING_AUTORENEW_MONTHS :Automatisk fornying når køyretøy er {STRING} maks alder STR_CONFIG_SETTING_AUTORENEW_MONTHS :Automatisk fornying når køyretøy er {STRING} maks alder

View File

@ -1229,6 +1229,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :وسایل نق
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :نوکردن خودکار وسایل نقلیه کهنه شده: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :نوکردن خودکار وسایل نقلیه کهنه شده: {STRING}
###length 2 ###length 2

View File

@ -1842,6 +1842,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączon
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoodnawianie pojazdów gdy stają się stare: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Autoodnawianie pojazdów gdy stają się stare: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kiedy włączone, pojazd zbliżający się do końca swojej żywotności zostaje automatycznie zastąpiony, gdy warunki jego odnowienia są spełnione STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kiedy włączone, pojazd zbliżający się do końca swojej żywotności zostaje automatycznie zastąpiony, gdy warunki jego odnowienia są spełnione

View File

@ -1507,6 +1507,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativo, um veículo a chegar ao fim de vida é automaticamente substituído quando as condições de renovação estão reunidas STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativo, um veículo a chegar ao fim de vida é automaticamente substituído quando as condições de renovação estão reunidas

View File

@ -1457,6 +1457,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :După activare,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Înnoire automată pentru vehiculele învechite: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Înnoire automată pentru vehiculele învechite: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :După activare, orice vehicul care este învechit va fi înnoit automat când condițiile de înlocuire automată sunt îndeplinite STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :După activare, orice vehicul care este învechit va fi înnoit automat când condițiile de înlocuire automată sunt îndeplinite

View File

@ -487,6 +487,7 @@ STR_SORT_BY_RATING :Рейтинг
STR_SORT_BY_NUM_VEHICLES :Количество транспортных средств STR_SORT_BY_NUM_VEHICLES :Количество транспортных средств
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Общая прибыль в прошлом году STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Общая прибыль в прошлом году
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Общая прибыль в этом году STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Общая прибыль в этом году
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Прибыль в текущем цикле
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Средняя прибыль в прошлом году STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Средняя прибыль в прошлом году
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Средняя прибыль в этом году STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Средняя прибыль в этом году
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Средний доход в текущем периоде STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Средний доход в текущем периоде
@ -1638,9 +1639,11 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :При вклю
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Выбор системы отсчёта времени, используемой в игре. После старта сменить её невозможно.{}{}Календарь - это классическая система, изначально использовавшаяся в OpenTTD: год состоит из 12 месяцев, в каждом из которых 28-31{NBSP}день.{}{}В режиме реального времени расчёты производства, движения транспорта и финансовых показателей основаны на интервалах длительностью в 1{NBSP}минуту, что примерно соответствует 30{NBSP}дням в режиме календаря. Эти интервалы группируются в 12-минутные циклы, соответствующие 1{NBSP}году в классическом режиме.{}{}В любом случае, появление новых транспортных средств, зданий и инфраструктуры будет сопровождаться календарём с понятными датами. STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Выбор системы отсчёта времени, используемой в игре. После старта сменить её невозможно.{}{}Календарь - это классическая система, изначально использовавшаяся в OpenTTD: год состоит из 12 месяцев, в каждом из которых 28-31{NBSP}день.{}{}В режиме реального времени расчёты производства, движения транспорта и финансовых показателей основаны на интервалах длительностью в 1{NBSP}минуту, что примерно соответствует 30{NBSP}дням в режиме календаря. Эти интервалы группируются в 12-минутные циклы, соответствующие 1{NBSP}году в классическом режиме.{}{}В любом случае, появление новых транспортных средств, зданий и инфраструктуры будет сопровождаться календарём с понятными датами.
###length 2 ###length 2
STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Выберите, сколько минут реального времени длится год в игре. По умолчанию{NBSP}- 12{NBSP}минут. Установка «0» остановит календарное время. Эта настройка не влияет на расчёт экономической модели в игре, и работает только в режиме реального времени.
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автозамена изношенного транспорта: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автозамена изношенного транспорта: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Включает автоматическую замену устаревших транспортных средств STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Включает автоматическую замену устаревших транспортных средств
@ -4417,6 +4420,7 @@ STR_ENGINE_PREVIEW_COST_MAX_SPEED :Цена: {CURR
STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Скорость: {VELOCITY} Мощность: {POWER} Макс. ТУ: {FORCE} STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Скорость: {VELOCITY} Мощность: {POWER} Макс. ТУ: {FORCE}
STR_ENGINE_PREVIEW_TYPE_RANGE :Возд. судно: {STRING} Дальность: {COMMA}{NBSP}клет{P ка ки ок} STR_ENGINE_PREVIEW_TYPE_RANGE :Возд. судно: {STRING} Дальность: {COMMA}{NBSP}клет{P ка ки ок}
STR_ENGINE_PREVIEW_CAPACITY :Ёмкость: {CARGO_LONG} STR_ENGINE_PREVIEW_CAPACITY :Ёмкость: {CARGO_LONG}
STR_ENGINE_PREVIEW_CAPACITY_2 :Ёмкость: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window # Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Замена {STRING.gen} - {STRING} STR_REPLACE_VEHICLES_WHITE :{WHITE}Замена {STRING.gen} - {STRING}
@ -4591,6 +4595,8 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}ТО к
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}ТО при сниж. на {LTBLUE}{COMMA}%{BLACK}. {STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}ТО при сниж. на {LTBLUE}{COMMA}%{BLACK}. {STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :ТО: {LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :ТО: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :ТО: {LTBLUE}{NUM}{NBSP}мин. назад STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :ТО: {LTBLUE}{NUM}{NBSP}мин. назад
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Увеличить интервал ТО на 10%. Ctrl+щелчок - увеличить интервал на 5%.
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Уменьшить интервал ТО на 5{NBSP}минут. Ctrl+щелчок{NBSP}- уменьшить на 1{NBSP}минуту.
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Изменить тип интервала прохождения технического обслуживания STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Изменить тип интервала прохождения технического обслуживания
STR_VEHICLE_DETAILS_DEFAULT :По умолчанию STR_VEHICLE_DETAILS_DEFAULT :По умолчанию

View File

@ -1605,6 +1605,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Ako je omoguće
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatska zamena kada vozilo ostari: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatska zamena kada vozilo ostari: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kada je omogućeno, vozilo blizu kraja života će se automatski zameniti kada su ispunjeni uslovi obnavljanja STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Kada je omogućeno, vozilo blizu kraja života će se automatski zameniti kada su ispunjeni uslovi obnavljanja

View File

@ -334,6 +334,7 @@ STR_SORT_BY_NUMBER :序号
STR_SORT_BY_PROFIT_LAST_YEAR :去年利润 STR_SORT_BY_PROFIT_LAST_YEAR :去年利润
STR_SORT_BY_PROFIT_LAST_PERIOD :上期损益 STR_SORT_BY_PROFIT_LAST_PERIOD :上期损益
STR_SORT_BY_PROFIT_THIS_YEAR :今年利润 STR_SORT_BY_PROFIT_THIS_YEAR :今年利润
STR_SORT_BY_PROFIT_THIS_PERIOD :本期损益
STR_SORT_BY_AGE :年龄 STR_SORT_BY_AGE :年龄
STR_SORT_BY_RELIABILITY :可靠性 STR_SORT_BY_RELIABILITY :可靠性
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :每种货物的总装载能力 STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :每种货物的总装载能力
@ -361,8 +362,11 @@ STR_SORT_BY_POPULATION :人口
STR_SORT_BY_RATING :评价 STR_SORT_BY_RATING :评价
STR_SORT_BY_NUM_VEHICLES :载具数量 STR_SORT_BY_NUM_VEHICLES :载具数量
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :去年总利润 STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :去年总利润
STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :上期总损益
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :今年总利润 STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :今年总利润
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :本期总损益
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :去年平均利润 STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :去年平均利润
STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :上期平均损益
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :今年平均利润 STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :今年平均利润
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :本周期平均利润 STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :本周期平均利润
@ -402,7 +406,7 @@ STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}建设
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车轨道 STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车轨道
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}建设码头 STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}建设码头
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}建设机场 STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}建设机场
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}打开景观美化工具栏{}以修改地形、设置地貌等 STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}打开景观美化工具栏以修改地形、设置地貌等
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}显示 声音/音乐 控制菜单 STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}显示 声音/音乐 控制菜单
STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}显示最新消息、新闻,消息历史或删除所有消息 STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}显示最新消息、新闻,消息历史或删除所有消息
STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}查询地块信息、截图、关于 OpenTTD 和开发者工具 STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}查询地块信息、截图、关于 OpenTTD 和开发者工具
@ -418,7 +422,7 @@ STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}点击
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}显示地图和城镇列表 STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}显示地图和城镇列表
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}生成地形 STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}生成地形
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}城镇生成 STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}城镇生成
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}生成工业 STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}建造或生成工业
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}公路建设 STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}公路建设
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}电车道建设 STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}电车道建设
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}植树。按 Ctrl 沿对角线建造,按 Shift 显示预计花费。 STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}植树。按 Ctrl 沿对角线建造,按 Shift 显示预计花费。
@ -629,6 +633,8 @@ STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}公司
STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}最后 72 分 STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}最后 72 分
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}货物运输价格 STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}货物运输价格
STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}运输所用天数
STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}运输所用秒数
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}将 10 单位 (或 10,000 升) 货物运输 20 个方格 STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}将 10 单位 (或 10,000 升) 货物运输 20 个方格
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}全部启用 STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}全部启用
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}全部禁用 STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}全部禁用
@ -677,7 +683,11 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}贷款
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}总表现值: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}总表现值:
###next-name-looks-similar ###next-name-looks-similar
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}去年盈利的载具数量,包括公路载具、列车、船舶和飞机
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :上期盈利的载具数量,包括公路载具、列车、船舶和飞机
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}最近仍然使用的车站组件数量。车站的每个组件(火车站、公交站、机场)即使是连接成为一个车站,也会被独立计数。 STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}最近仍然使用的车站组件数量。车站的每个组件(火车站、公交站、机场)即使是连接成为一个车站,也会被独立计数。
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}收入最低的载具的利润(只考虑年龄超过两年的载具)
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}收入最低的载具的损益(只计算年龄超过两年的载具)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}在过去 12 个季度中{}利润最少的季度的现金收入 STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}在过去 12 个季度中{}利润最少的季度的现金收入
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}在过去 12 个季度中{}利润最多的季度的现金收入 STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}在过去 12 个季度中{}利润最多的季度的现金收入
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}在过去 4 个季度中运输的货物总数 STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}在过去 4 个季度中运输的货物总数
@ -825,6 +835,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}自动保
STR_STATUSBAR_SAVING_GAME :{RED}* * 保存游戏中 * * STR_STATUSBAR_SAVING_GAME :{RED}* * 保存游戏中 * *
STR_STATUSBAR_SPECTATOR :{WHITE}(旁观者) STR_STATUSBAR_SPECTATOR :{WHITE}(旁观者)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(无限)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}消息历史 STR_MESSAGE_HISTORY :{WHITE}消息历史
@ -909,6 +920,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} 已经达到报废年限,必须马上更新! STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} 已经达到报废年限,必须马上更新!
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} 无法找到道路 STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} 无法找到道路
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} 无法找到路线. STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} 无法找到路线.
STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}{VEHICLE} 的去年损益为 {CURRENCY_LONG}
STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE} 的上周期损益为 {CURRENCY_LONG} STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE} 的上周期损益为 {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} 由于航程过远,航班无法到达。 STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} 由于航程过远,航班无法到达。
@ -933,6 +945,8 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} 获得财政补贴!{}{}今后 {4:UNITS_YEARS_OR_MINUTES} 中将 {1:STRING} 从 {2:STRING} 运送到 {3:STRING} 将获得三倍的报酬! STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} 获得财政补贴!{}{}今后 {4:UNITS_YEARS_OR_MINUTES} 中将 {1:STRING} 从 {2:STRING} 运送到 {3:STRING} 将获得三倍的报酬!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} 获得财政补贴!{}{}今后 {4:UNITS_YEARS_OR_MINUTES} 中将 {1:STRING} 从 {2:STRING} 运送到 {3:STRING} 将获得四倍的报酬! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} 获得财政补贴!{}{}今后 {4:UNITS_YEARS_OR_MINUTES} 中将 {1:STRING} 从 {2:STRING} 运送到 {3:STRING} 将获得四倍的报酬!
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}{TOWN}的混乱交通!{}{}由{STRING}资助的道路重建计划将给驾车者带来长达 6 个月的堵塞!
STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}{TOWN}的混乱交通!{}{}由{STRING}资助的道路重建计划将给驾车者带来长达 6 分钟的堵塞!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}垄断运输! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}垄断运输!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}{TOWN} 地方当局与 {STRING} 签订了长为一年的独家运输合同! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}{TOWN} 地方当局与 {STRING} 签订了长为一年的独家运输合同!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}{TOWN} 地方当局与 {STRING} 签订了 12 分钟独家运输合同! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}{TOWN} 地方当局与 {STRING} 签订了 12 分钟独家运输合同!
@ -1274,6 +1288,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :右侧
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}秒 STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}秒
STR_CONFIG_SETTING_INFINITE_MONEY :无限资金: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :允许无限制的支出并禁止公司破产
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大初始贷款: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大初始贷款: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最大贷款额(不考虑通货膨胀的影响) STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最大贷款额(不考虑通货膨胀的影响)
@ -1299,6 +1315,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :设置获得财
STR_CONFIG_SETTING_SUBSIDY_DURATION :财政补贴尺度:{STRING} STR_CONFIG_SETTING_SUBSIDY_DURATION :财政补贴尺度:{STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :设置发放财政补贴的年数 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :设置发放财政补贴的年数
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :设置发放财政补贴的周期数
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special ###setting-zero-is-special
@ -1398,6 +1415,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :右侧
###length 2 ###length 2
STR_CONFIG_SETTING_SHOWFINANCES :在年终显示财务报表:{STRING} STR_CONFIG_SETTING_SHOWFINANCES :在年终显示财务报表:{STRING}
STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :在周期末显示财务报表:{STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :“打开”时,在年底显示财务报表窗口,方便查看公司财务状况 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :“打开”时,在年底显示财务报表窗口,方便查看公司财务状况
@ -1424,10 +1442,12 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :每个视角
STR_CONFIG_SETTING_BRIBE :允许贿赂地方政府:{STRING} STR_CONFIG_SETTING_BRIBE :允许贿赂地方政府:{STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_BRIBE_HELPTEXT :“打开”时,允许贿赂地方政府,如果被发现,在该城市将被限制经营活动六个月 STR_CONFIG_SETTING_BRIBE_HELPTEXT :“打开”时,允许贿赂地方政府,如果被发现,在该城市将被限制经营活动六个月
STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :允许公司尝试贿赂当地镇政府。如果贿赂被发现,公司在该城市将被限制经营活动 6 分钟。
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允许买断经营权: {STRING} STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允许买断经营权: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了城市独家经营权,其它公司的站台将在一年之内不再产生乘客或者货物。 STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了城市独家经营权,其它公司的站台将在一年之内不再产生乘客或者货物。
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了城市独家经营权,其它公司的站台将在 12 分钟之内不再产生乘客或者货物。
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :允许资助城镇建设: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :允许资助城镇建设: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :“打开”时,允许公司提供资助新建房屋 STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :“打开”时,允许公司提供资助新建房屋
@ -1486,12 +1506,13 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :检查 所有
STR_CONFIG_SETTING_WARN_INCOME_LESS :若线路亏损时发出提示: {STRING} STR_CONFIG_SETTING_WARN_INCOME_LESS :若线路亏损时发出提示: {STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :“打开”,当一辆车在一年内总体亏损,发出提示 STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :“打开”,当一辆车在一年内总体亏损,发出提示
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :启用时,若某载具在一周期内总体亏损,发出提示
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :载具永不过期:{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :载具永不过期:{STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :启用时,所有载具一经面世,就可以永远选择购买使用。 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :启用时,所有载具一经面世,就可以永远选择购买使用。
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :时间模式:{STRING} STR_CONFIG_SETTING_TIMEKEEPING_UNITS :时间模式:{STRING}
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :选择游戏的计时单位。 请注意此项无法在游戏进行时更改{}{}日历模式为经典 OpenTTD 体验,在此模式中,一年由 12 个月组成,每个月有 28-31 天。{}{}在挂钟模式中,车辆移动、货物生产和财务计算等都以分钟为单位,一分钟约等于日历模式中的一个月,即 30 天。两种模式都包含一个用来记录载具、房屋与其他基础设施引入日期的计时器。 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :选择游戏的计时模式。 请注意此项无法在游戏进行时更改{}{}日历模式为经典 OpenTTD 体验,在此模式中,一年由 12 个月组成,每个月有 28-31 天。{}{}在挂钟模式中,车辆移动、货物生产和财务计算等都以分钟为单位,一分钟约等于日历模式中的一个月,即 30 天。两种模式都包含一个用来记录载具、房屋与其他基础设施引入日期的计时器。
###length 2 ###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :日历 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :日历
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :挂钟 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :挂钟
@ -1501,6 +1522,8 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :选择在使用
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0日期停止
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :当车辆报废时自动更新:{STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :当车辆报废时自动更新:{STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :“打开”时,车辆在临近它的报废期限时自动更新 STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :“打开”时,车辆在临近它的报废期限时自动更新
@ -1756,9 +1779,11 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :显示报纸时
###length 2 ###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR :年终: {STRING} STR_CONFIG_SETTING_SOUND_NEW_YEAR :年终: {STRING}
STR_CONFIG_SETTING_SOUND_NEW_PERIOD :周期结束:{STRING}
###length 2 ###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :在年末弹出报表时,播放相应音效 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :在年末弹出报表时,播放相应音效
STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :在经济周期末弹出报表时,播放相应音效
STR_CONFIG_SETTING_SOUND_CONFIRM :建设: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM :建设: {STRING}
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :播放成功建设或执行其它动作时的音效 STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :播放成功建设或执行其它动作时的音效
@ -2060,6 +2085,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :英制(英里
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :公制(千米/小时) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :公制(千米/小时)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :国际单位制(米/秒) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :国际单位制(米/秒)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :游戏单位(格/日) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :游戏单位(格/日)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :游戏单位(格/秒)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :节 STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :节
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :载具功率单位:{STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :载具功率单位:{STRING}
@ -2372,6 +2398,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}游戏
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}日期 STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}日期
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}当前日期 STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}当前日期
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}时{NBSP}{NUM}{NBSP}分 STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}时{NBSP}{NUM}{NBSP}分
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :游戏时间
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}有戏已进行的时间,不计暂停的时间。 STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}有戏已进行的时间,不计暂停的时间。
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}语言,服务器版本和其他信息 STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}语言,服务器版本和其他信息
@ -2381,13 +2408,13 @@ STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST :{BLACK}点击
STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}游戏信息 STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}游戏信息
STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}客户端: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA} STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}客户端: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}场景类型: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}场景类型{WHITE}{STRING}
STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}地图尺寸: {WHITE}{COMMA}×{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}地图尺寸{WHITE}{COMMA}×{COMMA}
STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}游戏版本: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}游戏版本{WHITE}{STRING}
STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}该服IP: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}该服IP {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}邀请代码:{WHITE}{STRING} STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}邀请代码:{WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}开始日期: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}开始日期{WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}当前日期: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}当前日期{WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}游戏时间:{WHITE}{NUM} 时 {NUM} 分 STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}游戏时间:{WHITE}{NUM} 时 {NUM} 分
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}游戏脚本:{WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}游戏脚本:{WHITE}{STRING} (v{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}有密码保护! STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}有密码保护!
@ -2744,6 +2771,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}超载 STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}超载
# Linkgraph tooltip # Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}每月有 {CARGO_LONG} 需从 {STATION} 运至 {STATION} (运载能力的 {COMMA}%{STRING}
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}每分钟有 {CARGO_LONG} 需从 {STATION} 运至 {STATION} (运载能力的 {COMMA}%{STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}有{CARGO_LONG}要运回(运载能力的{COMMA}%) STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}有{CARGO_LONG}要运回(运载能力的{COMMA}%)
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}平均行驶时间: {UNITS_DAYS_OR_SECONDS} STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}平均行驶时间: {UNITS_DAYS_OR_SECONDS}
@ -2755,6 +2784,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}不显
STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}显示可以覆盖的区域 STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}显示可以覆盖的区域
STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}接受:{GOLD}{CARGO_LIST} STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}接受:{GOLD}{CARGO_LIST}
STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}供给: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}供给: {GOLD}{CARGO_LIST}
STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}维护成本:{GOLD}{CURRENCY_SHORT}/年
STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}维护成本:{GOLD}{CURRENCY_SHORT}/周期 STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}维护成本:{GOLD}{CURRENCY_SHORT}/周期
# Join station window # Join station window
@ -3057,7 +3087,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}选择
# Land area window # Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}地块信息 STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}地块信息
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}将屏幕中心移动到地块所在的位置。单击的同时按住Ctrl会在新视点中显示地块位置 STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}将屏幕中心移动到地块所在的位置。单击的同时按住 <Ctrl> 会在新视点中显示地块位置
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}清除费用:{LTBLUE}N/A 不能清除 STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}清除费用:{LTBLUE}N/A 不能清除
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}清除费用:{RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}清除费用:{RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}清除收入: {LTBLUE}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}清除收入: {LTBLUE}{CURRENCY_LONG}
@ -3652,9 +3682,11 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{Y
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}进行中型的广告宣传,以吸引更多的旅客和货物选择贵公司的服务。{}为位于该城镇中心中等距离内的车站提供暂时的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}进行中型的广告宣传,以吸引更多的旅客和货物选择贵公司的服务。{}为位于该城镇中心中等距离内的车站提供暂时的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}进行大型的广告宣传,以吸引更多的旅客和货物选择贵公司的服务。{}为位于该城镇中心较远距离内的车站提供暂时的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}进行大型的广告宣传,以吸引更多的旅客和货物选择贵公司的服务。{}为位于该城镇中心较远距离内的车站提供暂时的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}资助城镇路网重建。{}这将堵塞城镇交通 6 个月。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}资助城镇路网重建。{}这将堵塞城镇交通 6 个月。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}资助城镇路网重建。{}这将堵塞城镇交通 6 个月。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}以公司的名义设立一尊塑像。{}为位于该城镇的车站提供永久的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}以公司的名义设立一尊塑像。{}为位于该城镇的车站提供永久的评分增益。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}资助市内建设新的房屋建筑。{}为城镇提供暂时的成长速度增益。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}资助市内建设新的房屋建筑。{}为城镇提供暂时的成长速度增益。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}购买本城镇时长 12 个月的独家运输权。{}本城镇的乘客和货物将不会使用其他公司的车站。若竞争对手贿赂成功则此合同将被取消。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}购买本城镇时长 12 个月的独家运输权。{}本城镇的乘客和货物将不会使用其他公司的车站。若竞争对手贿赂成功则此合同将被取消。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}购买本城镇时长 12 分钟的独家运输权。{}本城镇的乘客和货物将不会使用其他公司的车站。若竞争对手贿赂成功则此合同将被取消。{}{POP_COLOUR}费用:{CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}贿赂地方政府以提高评价,并终止竞争者的运输专营权,但有被发现后严厉惩罚的风险。{}{POP_COLOUR}费用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}贿赂地方政府以提高评价,并终止竞争者的运输专营权,但有被发现后严厉惩罚的风险。{}{POP_COLOUR}费用:{CURRENCY_LONG}
# Goal window # Goal window
@ -3750,6 +3782,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}评价 STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}评价
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}显示车站评价 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}显示车站评价
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}每月供应数量与本地评价: STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}每月供应数量与本地评价:
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :每分钟供应量与本地评价:
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
STR_STATION_VIEW_GROUP :{BLACK}群组方式 STR_STATION_VIEW_GROUP :{BLACK}群组方式
@ -3810,6 +3843,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}编辑
# Finances window # Finances window
STR_FINANCES_CAPTION :{WHITE}{COMPANY} 财务报表 {BLACK}{COMPANY_NUM} STR_FINANCES_CAPTION :{WHITE}{COMPANY} 财务报表 {BLACK}{COMPANY_NUM}
STR_FINANCES_YEAR :{WHITE}{NUM} STR_FINANCES_YEAR :{WHITE}{NUM}
STR_FINANCES_YEAR_CAPTION :年份
STR_FINANCES_PERIOD_CAPTION :{WHITE}周期
###length 3 ###length 3
STR_FINANCES_REVENUE_TITLE :{WHITE}收入 STR_FINANCES_REVENUE_TITLE :{WHITE}收入
@ -3911,6 +3946,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}运河
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}站台: STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}站台:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}车站 STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}车站
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}机场 STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}机场
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/年
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/周期
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}工业设施 STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}工业设施
@ -3930,6 +3967,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :无
# Industry view # Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}上月产量: STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}上月产量:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}上分钟产量:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% 已运输) STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% 已运输)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}将屏幕中心移动到工厂所在的位置. 单击的同时按住Ctrl会在新视点中显示工厂位置 STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}将屏幕中心移动到工厂所在的位置. 单击的同时按住Ctrl会在新视点中显示工厂位置
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}生产等级: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}生产等级: {YELLOW}{COMMA}%
@ -4017,6 +4055,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :移除所有车
STR_GROUP_RENAME_CAPTION :{BLACK}重命名分组 STR_GROUP_RENAME_CAPTION :{BLACK}重命名分组
STR_GROUP_PROFIT_THIS_YEAR :今年利润: STR_GROUP_PROFIT_THIS_YEAR :今年利润:
STR_GROUP_PROFIT_THIS_PERIOD :本期损益:
STR_GROUP_PROFIT_LAST_YEAR :去年利润 STR_GROUP_PROFIT_LAST_YEAR :去年利润
STR_GROUP_PROFIT_LAST_PERIOD :上周期损益: STR_GROUP_PROFIT_LAST_PERIOD :上周期损益:
STR_GROUP_OCCUPANCY :当前使用量: STR_GROUP_OCCUPANCY :当前使用量:
@ -4046,6 +4085,7 @@ STR_PURCHASE_INFO_SPEED :{BLACK}速度
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}在海洋上的速度: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}在海洋上的速度: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}在河流上的速度: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}在河流上的速度: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}运行费用:{GOLD}{CURRENCY_LONG}/年 STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}运行费用:{GOLD}{CURRENCY_LONG}/年
STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}运行费用:{GOLD}{CURRENCY_LONG}/周期
STR_PURCHASE_INFO_CAPACITY :{BLACK}运载能力:{GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_CAPACITY :{BLACK}运载能力:{GOLD}{CARGO_LONG} {STRING}
STR_PURCHASE_INFO_REFITTABLE :(可改装) STR_PURCHASE_INFO_REFITTABLE :(可改装)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}设计日期:{GOLD}{NUM}{BLACK} 寿命:{GOLD}{COMMA} 年 STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}设计日期:{GOLD}{NUM}{BLACK} 寿命:{GOLD}{COMMA} 年
@ -4099,7 +4139,7 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}购买
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的列车。按住 <Shift> 键单击可以显示所需资金 STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的列车。按住 <Shift> 键单击可以显示所需资金
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的汽车。按住 Shift 键单击可以显示所需资金 STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的汽车。按住 Shift 键单击可以显示所需资金
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的船只。按住 Shift 键单击可以显示所需资金 STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的船只。按住 Shift 键单击可以显示所需资金
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :购买并改装选定的飞机,按住 Shift 键单击可以显示所需资金 STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}购买并改装选定的飞机,按住 Shift 键单击可以显示所需资金
###length VEHICLE_TYPES ###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}重命名 STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}重命名
@ -4238,9 +4278,13 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :电车
STR_ENGINE_PREVIEW_AIRCRAFT :飞机 STR_ENGINE_PREVIEW_AIRCRAFT :飞机
STR_ENGINE_PREVIEW_SHIP :船只 STR_ENGINE_PREVIEW_SHIP :船只
STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
STR_ENGINE_PREVIEW_COST_WEIGHT :售价:{CURRENCY_LONG} 重量:{WEIGHT_SHORT}
STR_ENGINE_PREVIEW_COST_MAX_SPEED :售价:{CURRENCY_LONG} 最大速度:{VELOCITY} STR_ENGINE_PREVIEW_COST_MAX_SPEED :售价:{CURRENCY_LONG} 最大速度:{VELOCITY}
STR_ENGINE_PREVIEW_SPEED_POWER :速度:{VELOCITY} 功率:{POWER}
STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :速度:{VELOCITY} 功率:{POWER} 最大牵引力:{FORCE} STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :速度:{VELOCITY} 功率:{POWER} 最大牵引力:{FORCE}
STR_ENGINE_PREVIEW_TYPE :飞机类型:{STRING}
STR_ENGINE_PREVIEW_TYPE_RANGE :飞机类别:{STRING} 航程:{COMMA} 格 STR_ENGINE_PREVIEW_TYPE_RANGE :飞机类别:{STRING} 航程:{COMMA} 格
STR_ENGINE_PREVIEW_RUNCOST_YEAR :运行费用:{CURRENCY_LONG}/年 STR_ENGINE_PREVIEW_RUNCOST_YEAR :运行费用:{CURRENCY_LONG}/年
STR_ENGINE_PREVIEW_RUNCOST_PERIOD :运行费用:{CURRENCY_LONG}/周期 STR_ENGINE_PREVIEW_RUNCOST_PERIOD :运行费用:{CURRENCY_LONG}/周期
@ -4401,6 +4445,8 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}重量
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}今年利润:{LTBLUE}{CURRENCY_LONG} (去年利润:{CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}今年利润:{LTBLUE}{CURRENCY_LONG} (去年利润:{CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}今年利润: {LTBLUE}{CURRENCY_LONG} (去年利润: {CURRENCY_LONG}) {BLACK}最小功率: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}今年利润: {LTBLUE}{CURRENCY_LONG} (去年利润: {CURRENCY_LONG}) {BLACK}最小功率: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}本期损益:{LTBLUE}{CURRENCY_LONG}(上期损益:{CURRENCY_LONG}
STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}本期损益:{LTBLUE}{CURRENCY_LONG}(上期损益:{CURRENCY_LONG}){BLACK}最小功率:{LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}可靠性:{LTBLUE}{COMMA}% {BLACK}上次保养后抛锚的次数:{LTBLUE}{COMMA} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}可靠性:{LTBLUE}{COMMA}% {BLACK}上次保养后抛锚的次数:{LTBLUE}{COMMA}
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}建造年份:{LTBLUE}{NUM}{BLACK} 价值:{LTBLUE}{CURRENCY_LONG} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}建造年份:{LTBLUE}{NUM}{BLACK} 价值:{LTBLUE}{CURRENCY_LONG}
@ -4416,12 +4462,17 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}服务
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}保养周期:{LTBLUE}{COMMA}%{BLACK} 上次保养:{LTBLUE}{STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}保养周期:{LTBLUE}{COMMA}%{BLACK} 上次保养:{LTBLUE}{STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :最近保养:{LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :最近保养:{LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :最近保养:{LTBLUE}{NUM}{NBSP}分钟前 STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :最近保养:{LTBLUE}{NUM}{NBSP}分钟前
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :将维修间隔增大 10 天。按住 <Ctrl> 点击可将维修间隔增大 5 天。
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}将维修间隔增大 5 分。按住 <Ctrl> 点击可将维修间隔增大 1 分 。
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}将维修间隔增大 10%。按住 <Ctrl> 点击可将维修间隔增大 5% 。
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}将维修间隔缩短 10 天。按住 <Ctrl> 点击可将维修间隔缩短 5 天。 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}将维修间隔缩短 10 天。按住 <Ctrl> 点击可将维修间隔缩短 5 天。
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}将维修间隔缩短 5 分。按住 <Ctrl> 点击可将维修间隔缩短 1 分 。 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}将维修间隔缩短 5 分。按住 <Ctrl> 点击可将维修间隔缩短 1 分 。
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}将维修间隔缩短 10%。按住 <Ctrl> 点击可将维修间隔缩短 5% 。 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}将维修间隔缩短 10%。按住 <Ctrl> 点击可将维修间隔缩短 5% 。
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}更改服务时间间隔类型 STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}更改服务时间间隔类型
STR_VEHICLE_DETAILS_DEFAULT :默认 STR_VEHICLE_DETAILS_DEFAULT :默认
STR_VEHICLE_DETAILS_DAYS :天
STR_VEHICLE_DETAILS_MINUTES :分钟
STR_VEHICLE_DETAILS_PERCENT :百分比 STR_VEHICLE_DETAILS_PERCENT :百分比
###length VEHICLE_TYPES ###length VEHICLE_TYPES
@ -5720,6 +5771,7 @@ STR_UNKNOWN_STATION :未知车站(
STR_DEFAULT_SIGN_NAME :标志 STR_DEFAULT_SIGN_NAME :标志
STR_COMPANY_SOMEONE :某人 STR_COMPANY_SOMEONE :某人
STR_SAVEGAME_DURATION_REALTIME :{NUM} 时 {NUM} 分
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :观众, {1:STRING} STR_SAVEGAME_NAME_SPECTATOR :观众, {1:STRING}
@ -5753,6 +5805,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE} STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT} STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}k
STR_CURRENCY_SHORT_MEGA :{NBSP}m
STR_CURRENCY_SHORT_GIGA :b
STR_CURRENCY_SHORT_TERA :t
STR_JUST_CARGO :{CARGO_LONG} STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}

View File

@ -1504,6 +1504,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Ak je zapnuté,
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatická obnova dopravných prostriedkov, keď sú staré: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automatická obnova dopravných prostriedkov, keď sú staré: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ak je zapnuté, vozidlá blížiace sa ku koncu svojej životnosti budú automaticky vymenené ak sú splnené podmienky na výmenu. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Ak je zapnuté, vozidlá blížiace sa ku koncu svojej životnosti budú automaticky vymenené ak sú splnené podmienky na výmenu.

View File

@ -1466,6 +1466,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Če je omogoče
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Samoobnovi vozila, ko se postarajo: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Samoobnovi vozila, ko se postarajo: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Če je omogočeno, se vozila ob koncu življenjske dobe avtomatsko zamenjajo pod pogoji samoobnove. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Če je omogočeno, se vozila ob koncu življenjske dobe avtomatsko zamenjajo pod pogoji samoobnove.

View File

@ -1522,6 +1522,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tiempo de calendario congelado) STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tiempo de calendario congelado)
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovación automática de vehículos cuando se vuelven viejos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovación automática de vehículos cuando se vuelven viejos: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Cuando se activa, los vehículos próximos al final de su vida útil serán reemplazados automáticamente, siempre y cuando se cumplan las condiciones de renovación STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Cuando se activa, los vehículos próximos al final de su vida útil serán reemplazados automáticamente, siempre y cuando se cumplan las condiciones de renovación

View File

@ -1399,6 +1399,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Todos los model
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automáticamente vehículos viejos: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renovar automáticamente vehículos viejos: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Los vehículos próximos al final de su vida útil serán renovados automáticamente, siempre y cuando se cumplan las condiciones de renovación STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Los vehículos próximos al final de su vida útil serán renovados automáticamente, siempre y cuando se cumplan las condiciones de renovación

View File

@ -1448,6 +1448,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Om det är akti
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Förnya fordon automatiskt när de blir gamla: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Förnya fordon automatiskt när de blir gamla: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Om det är aktiverat kommer ett fordon som närmar sig slutet av sin livslängd automatiskt att bytas ut när villkoren för förnyelse är uppfyllda STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Om det är aktiverat kommer ett fordon som närmar sig slutet av sin livslängd automatiskt att bytas ut när villkoren för förnyelse är uppfyllda

View File

@ -1304,6 +1304,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :வாகனங
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :வாகனங்கள் காலாவதியானால் தானாக மாற்றியமை: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :வாகனங்கள் காலாவதியானால் தானாக மாற்றியமை: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :செயலாக்க செய்யப்பட்டால், வாகனங்கள் காலாவதியாவதற்கு முன்னால் தானாக மாற்றியமைக்கப்படும் STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :செயலாக்க செய்யப்பட்டால், வாகனங்கள் காலாவதியாவதற்கு முன்னால் தானாக மாற்றியமைக்கப்படும்

View File

@ -1321,6 +1321,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :เมื่อ
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :เปลี่ยนยานพาหนะใหม่โดยอัตโนมัติเมื่อเก่าเกินไป: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :เปลี่ยนยานพาหนะใหม่โดยอัตโนมัติเมื่อเก่าเกินไป: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :เมื่อเปิดใช้งาน พาหนะที่ใกล้หมดอายุการใช้งาน จะทำการแทนที่ใหม่เอง STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :เมื่อเปิดใช้งาน พาหนะที่ใกล้หมดอายุการใช้งาน จะทำการแทนที่ใหม่เอง

View File

@ -1442,6 +1442,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :如啟用此選
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :車輛達到使用年限時自動更新:{STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :車輛達到使用年限時自動更新:{STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :如啟用此選項,所有在符合替換條件時進入維修設施的車輛會被替換。 STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :如啟用此選項,所有在符合替換條件時進入維修設施的車輛會被替換。

View File

@ -1458,6 +1458,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Etkinleştirild
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Araç eskiyince otomatik olarak yenile: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Araç eskiyince otomatik olarak yenile: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Etkinleştirildiğinde, yenileme koşulları sağlandığı takdirde ömrünün sonuna yaklaşan bir araç otomatik olarak yenilenir. STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Etkinleştirildiğinde, yenileme koşulları sağlandığı takdirde ömrünün sonuna yaklaşan bir araç otomatik olarak yenilenir.

View File

@ -1546,6 +1546,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :При вклю
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автозаміна зношених транспортних засобів: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Автозаміна зношених транспортних засобів: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :При включенні транспортні засоби з вичерпаним строком служби автоматично замінюються на нові (при виконанні умов автозаміни). STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :При включенні транспортні засоби з вичерпаним строком служби автоматично замінюються на нові (при виконанні умов автозаміни).

View File

@ -1174,6 +1174,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :گاڑیوں ک
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :گاڑی پرانی ہونے کی صورت میں خودکار طریقے سے بدل دیں: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :گاڑی پرانی ہونے کی صورت میں خودکار طریقے سے بدل دیں: {STRING}
###length 2 ###length 2

View File

@ -261,6 +261,7 @@ STR_UNITS_DAYS :{COMMA}{NBSP}ng
STR_UNITS_SECONDS :{COMMA}{NBSP}giây STR_UNITS_SECONDS :{COMMA}{NBSP}giây
STR_UNITS_TICKS :{COMMA}{NBSP}tick STR_UNITS_TICKS :{COMMA}{NBSP}tick
STR_UNITS_MONTHS :{NUM}{NBSP}tháng
# Common window strings # Common window strings
@ -817,6 +818,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}LƯU TỰ
STR_STATUSBAR_SAVING_GAME :{RED}* * ĐANG LƯU GAME * * STR_STATUSBAR_SAVING_GAME :{RED}* * ĐANG LƯU GAME * *
STR_STATUSBAR_SPECTATOR :{WHITE}(người xem) STR_STATUSBAR_SPECTATOR :{WHITE}(người xem)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(tiền vô hạn)
# News message history # News message history
STR_MESSAGE_HISTORY :{WHITE}Lịch Sử Thông Điệp STR_MESSAGE_HISTORY :{WHITE}Lịch Sử Thông Điệp
@ -918,6 +920,10 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Lời đề nghị trợ cấp đã hết hạn:{}{}{STRING} từ {STRING} đến {STRING} bây giờ sẽ không có trợ cấp. STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Lời đề nghị trợ cấp đã hết hạn:{}{}{STRING} từ {STRING} đến {STRING} bây giờ sẽ không có trợ cấp.
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Trợ cấp đã hết:{}{}Dịch vụ vận chuyển {STRING} từ {STRING} đến {STRING} sẽ không được trợ cấp nữa. STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Trợ cấp đã hết:{}{}Dịch vụ vận chuyển {STRING} từ {STRING} đến {STRING} sẽ không được trợ cấp nữa.
###length 4 ###length 4
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Trợ cấp dịch vụ được trao cho {STRING}!{}{}{STRING} từ {STRING} đến {STRING} sẽ thu lợi cao hơn 50% trong vòng {UNITS_YEARS_OR_MINUTES} năm tới!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Trợ cấp dịch vụ được trao cho {STRING}!{}{}{STRING} từ {STRING} đến {STRING} sẽ thu lợi gấp đôi trong vòng {UNITS_YEARS_OR_MINUTES} năm tới!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Trợ cấp dịch vụ được trao cho {STRING}!{}{}{STRING} từ {STRING} đến {STRING} sẽ thu lợi gấp ba trong vòng {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Trợ cấp dịch vụ được trao cho {STRING}!{}{}{STRING} từ {STRING} đến {STRING} sẽ thu lợi gấp tư trong vòng {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Độc quyền vận tải! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Độc quyền vận tải!
@ -1269,6 +1275,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Thời hạn tr
###length 2 ###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Đặt số năm được hưởng trợ cấp dịch vụ STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Đặt số năm được hưởng trợ cấp dịch vụ
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Không có trợ cấp STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Không có trợ cấp
@ -1458,10 +1465,12 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Phương tiện
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Nếu bật, tất cả các model phương tiện sẽ không bị lỗi thời STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Nếu bật, tất cả các model phương tiện sẽ không bị lỗi thời
###length 2 ###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Lịch
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Tự thay mới phương tiện nếu hết hạn sử dụng: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Tự thay mới phương tiện nếu hết hạn sử dụng: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Nếu bật, phương tiện gần hết hạn sẽ được tự động thay mới và điều kiện thay mới được thỏa mãn STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Nếu bật, phương tiện gần hết hạn sẽ được tự động thay mới và điều kiện thay mới được thỏa mãn
@ -2690,6 +2699,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
# Linkgraph tooltip # Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} sẽ được hoàn chuyển ({COMMA}% dung lượng) STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} sẽ được hoàn chuyển ({COMMA}% dung lượng)
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Thời gian đi lại trung bình: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s) # Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Hiện rõ vùng phủ ảnh hưởng STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Hiện rõ vùng phủ ảnh hưởng
@ -4167,6 +4177,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :toa xe điện
STR_ENGINE_PREVIEW_AIRCRAFT :máy bay STR_ENGINE_PREVIEW_AIRCRAFT :máy bay
STR_ENGINE_PREVIEW_SHIP :tàu thuỷ STR_ENGINE_PREVIEW_SHIP :tàu thuỷ
STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
# Autoreplace window # Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Thay thế {STRING} - {STRING} STR_REPLACE_VEHICLES_WHITE :{WHITE}Thay thế {STRING} - {STRING}

View File

@ -1347,6 +1347,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Pan fo wedi'i a
###setting-zero-is-special ###setting-zero-is-special
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Awtoadnewyddu cerbyd pan aiff yn hen: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Awtoadnewyddu cerbyd pan aiff yn hen: {STRING}
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Pan fo wedi'i alluogi, bydd cerbyd sy'n agos at ddiwedd ei oes yn cael ei ddisodli'n ddiofyn pan y caiff yr amodau adnewyddu eu cyflawni STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Pan fo wedi'i alluogi, bydd cerbyd sy'n agos at ddiwedd ei oes yn cael ei ddisodli'n ddiofyn pan y caiff yr amodau adnewyddu eu cyflawni

View File

@ -96,7 +96,7 @@ CommandCost CmdDecreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
loan = std::min(c->current_loan, (Money)LOAN_INTERVAL); loan = std::min(c->current_loan, (Money)LOAN_INTERVAL);
break; break;
case LoanCommand::Max: // Pay back as much as possible case LoanCommand::Max: // Pay back as much as possible
loan = std::max(std::min(c->current_loan, c->money), (Money)LOAN_INTERVAL); loan = std::max(std::min(c->current_loan, GetAvailableMoneyForCommand()), (Money)LOAN_INTERVAL);
loan -= loan % LOAN_INTERVAL; loan -= loan % LOAN_INTERVAL;
break; break;
case LoanCommand::Amount: // Repay the given amount of loan case LoanCommand::Amount: // Repay the given amount of loan
@ -105,7 +105,7 @@ CommandCost CmdDecreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
break; break;
} }
if (c->money < loan) { if (GetAvailableMoneyForCommand() < loan) {
SetDParam(0, loan); SetDParam(0, loan);
return_cmd_error(STR_ERROR_CURRENCY_REQUIRED); return_cmd_error(STR_ERROR_CURRENCY_REQUIRED);
} }

View File

@ -633,6 +633,8 @@ public:
void OnFailure() override void OnFailure() override
{ {
Debug(net, 9, "Query::OnFailure(): connection_string={}", this->connection_string);
NetworkGameList *item = NetworkGameListAddItem(connection_string); NetworkGameList *item = NetworkGameListAddItem(connection_string);
item->status = NGLS_OFFLINE; item->status = NGLS_OFFLINE;
item->refreshing = false; item->refreshing = false;
@ -642,6 +644,8 @@ public:
void OnConnect(SOCKET s) override void OnConnect(SOCKET s) override
{ {
Debug(net, 9, "Query::OnConnect(): connection_string={}", this->connection_string);
QueryNetworkGameSocketHandler::QueryServer(s, this->connection_string); QueryNetworkGameSocketHandler::QueryServer(s, this->connection_string);
} }
}; };
@ -654,6 +658,8 @@ void NetworkQueryServer(const std::string &connection_string)
{ {
if (!_network_available) return; if (!_network_available) return;
Debug(net, 9, "NetworkQueryServer(): connection_string={}", connection_string);
/* Mark the entry as refreshing, so the GUI can show the refresh is pending. */ /* Mark the entry as refreshing, so the GUI can show the refresh is pending. */
NetworkGameList *item = NetworkGameListAddItem(connection_string); NetworkGameList *item = NetworkGameListAddItem(connection_string);
item->refreshing = true; item->refreshing = true;
@ -730,11 +736,15 @@ public:
void OnFailure() override void OnFailure() override
{ {
Debug(net, 9, "Client::OnFailure(): connection_string={}", this->connection_string);
ShowNetworkError(STR_NETWORK_ERROR_NOCONNECTION); ShowNetworkError(STR_NETWORK_ERROR_NOCONNECTION);
} }
void OnConnect(SOCKET s) override void OnConnect(SOCKET s) override
{ {
Debug(net, 9, "Client::OnConnect(): connection_string={}", this->connection_string);
_networking = true; _networking = true;
new ClientNetworkGameSocketHandler(s, this->connection_string); new ClientNetworkGameSocketHandler(s, this->connection_string);
IConsoleCmdExec("exec scripts/on_client.scr 0"); IConsoleCmdExec("exec scripts/on_client.scr 0");
@ -761,6 +771,8 @@ public:
*/ */
bool NetworkClientConnectGame(const std::string &connection_string, CompanyID default_company, const std::string &join_server_password, const std::string &join_company_password) bool NetworkClientConnectGame(const std::string &connection_string, CompanyID default_company, const std::string &join_server_password, const std::string &join_company_password)
{ {
Debug(net, 9, "NetworkClientConnectGame(): connection_string={}", connection_string);
CompanyID join_as = default_company; CompanyID join_as = default_company;
std::string resolved_connection_string = ServerAddress::Parse(connection_string, NETWORK_DEFAULT_PORT, &join_as).connection_string; std::string resolved_connection_string = ServerAddress::Parse(connection_string, NETWORK_DEFAULT_PORT, &join_as).connection_string;
@ -797,6 +809,7 @@ void NetworkClientJoinGame()
NetworkInitialize(); NetworkInitialize();
_settings_client.network.last_joined = _network_join.connection_string; _settings_client.network.last_joined = _network_join.connection_string;
Debug(net, 9, "status = CONNECTING");
_network_join_status = NETWORK_JOIN_STATUS_CONNECTING; _network_join_status = NETWORK_JOIN_STATUS_CONNECTING;
ShowJoinStatusWindow(); ShowJoinStatusWindow();

View File

@ -338,7 +338,11 @@ static_assert(NETWORK_SERVER_ID_LENGTH == MD5_HASH_BYTES * 2 + 1);
/** Tell the server we would like to join. */ /** Tell the server we would like to join. */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin() NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin()
{ {
Debug(net, 9, "Client::SendJoin()");
Debug(net, 9, "Client::status = JOIN");
my_client->status = STATUS_JOIN; my_client->status = STATUS_JOIN;
Debug(net, 9, "Client::join_status = AUTHORIZING");
_network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING; _network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@ -355,6 +359,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin()
/** Tell the server we got all the NewGRFs. */ /** Tell the server we got all the NewGRFs. */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk() NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk()
{ {
Debug(net, 9, "Client::SendNewGRFsOk()");
Packet *p = new Packet(PACKET_CLIENT_NEWGRFS_CHECKED); Packet *p = new Packet(PACKET_CLIENT_NEWGRFS_CHECKED);
my_client->SendPacket(p); my_client->SendPacket(p);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
@ -366,6 +372,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk()
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::string &password) NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::string &password)
{ {
Debug(net, 9, "Client::SendGamePassword()");
Packet *p = new Packet(PACKET_CLIENT_GAME_PASSWORD); Packet *p = new Packet(PACKET_CLIENT_GAME_PASSWORD);
p->Send_string(password); p->Send_string(password);
my_client->SendPacket(p); my_client->SendPacket(p);
@ -378,6 +386,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::st
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std::string &password) NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std::string &password)
{ {
Debug(net, 9, "Client::SendCompanyPassword()");
Packet *p = new Packet(PACKET_CLIENT_COMPANY_PASSWORD); Packet *p = new Packet(PACKET_CLIENT_COMPANY_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
my_client->SendPacket(p); my_client->SendPacket(p);
@ -387,6 +397,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std:
/** Request the map from the server. */ /** Request the map from the server. */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap() NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap()
{ {
Debug(net, 9, "Client::SendGetMap()");
Debug(net, 9, "Client::status = MAP_WAIT");
my_client->status = STATUS_MAP_WAIT; my_client->status = STATUS_MAP_WAIT;
Packet *p = new Packet(PACKET_CLIENT_GETMAP); Packet *p = new Packet(PACKET_CLIENT_GETMAP);
@ -397,6 +410,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap()
/** Tell the server we received the complete map. */ /** Tell the server we received the complete map. */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk() NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk()
{ {
Debug(net, 9, "Client::SendMapOk()");
Debug(net, 9, "Client::status = ACTIVE");
my_client->status = STATUS_ACTIVE; my_client->status = STATUS_ACTIVE;
Packet *p = new Packet(PACKET_CLIENT_MAP_OK); Packet *p = new Packet(PACKET_CLIENT_MAP_OK);
@ -407,6 +423,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk()
/** Send an acknowledgement from the server's ticks. */ /** Send an acknowledgement from the server's ticks. */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck() NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
{ {
Debug(net, 9, "Client::SendAck()");
Packet *p = new Packet(PACKET_CLIENT_ACK); Packet *p = new Packet(PACKET_CLIENT_ACK);
p->Send_uint32(_frame_counter); p->Send_uint32(_frame_counter);
@ -421,6 +439,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket *cp) NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
{ {
Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd);
Packet *p = new Packet(PACKET_CLIENT_COMMAND); Packet *p = new Packet(PACKET_CLIENT_COMMAND);
my_client->NetworkGameSocketHandler::SendCommand(p, cp); my_client->NetworkGameSocketHandler::SendCommand(p, cp);
@ -431,6 +451,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacke
/** Send a chat-packet over the network */ /** Send a chat-packet over the network */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, DestType type, int dest, const std::string &msg, int64_t data) NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, DestType type, int dest, const std::string &msg, int64_t data)
{ {
Debug(net, 9, "Client::SendChat(): action={}, type={}, dest={}", action, type, dest);
Packet *p = new Packet(PACKET_CLIENT_CHAT); Packet *p = new Packet(PACKET_CLIENT_CHAT);
p->Send_uint8 (action); p->Send_uint8 (action);
@ -446,6 +468,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
/** Send an error-packet over the network */ /** Send an error-packet over the network */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode errorno) NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode errorno)
{ {
Debug(net, 9, "Client::SendError(): errorno={}", errorno);
Packet *p = new Packet(PACKET_CLIENT_ERROR); Packet *p = new Packet(PACKET_CLIENT_ERROR);
p->Send_uint8(errorno); p->Send_uint8(errorno);
@ -459,6 +483,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode err
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::string &password) NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::string &password)
{ {
Debug(net, 9, "Client::SendSetPassword()");
Packet *p = new Packet(PACKET_CLIENT_SET_PASSWORD); Packet *p = new Packet(PACKET_CLIENT_SET_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
@ -472,6 +498,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::str
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string &name) NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string &name)
{ {
Debug(net, 9, "Client::SendSetName()");
Packet *p = new Packet(PACKET_CLIENT_SET_NAME); Packet *p = new Packet(PACKET_CLIENT_SET_NAME);
p->Send_string(name); p->Send_string(name);
@ -484,6 +512,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit() NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit()
{ {
Debug(net, 9, "Client::SendSetName()");
Packet *p = new Packet(PACKET_CLIENT_QUIT); Packet *p = new Packet(PACKET_CLIENT_QUIT);
my_client->SendPacket(p); my_client->SendPacket(p);
@ -497,6 +527,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit()
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pass, const std::string &command) NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pass, const std::string &command)
{ {
Debug(net, 9, "Client::SendRCon()");
Packet *p = new Packet(PACKET_CLIENT_RCON); Packet *p = new Packet(PACKET_CLIENT_RCON);
p->Send_string(pass); p->Send_string(pass);
p->Send_string(command); p->Send_string(command);
@ -511,6 +543,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pa
*/ */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendMove(CompanyID company, const std::string &password) NetworkRecvStatus ClientNetworkGameSocketHandler::SendMove(CompanyID company, const std::string &password)
{ {
Debug(net, 9, "Client::SendMove(): company={}", company);
Packet *p = new Packet(PACKET_CLIENT_MOVE); Packet *p = new Packet(PACKET_CLIENT_MOVE);
p->Send_uint8(company); p->Send_uint8(company);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed)); p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
@ -537,6 +571,8 @@ extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, Detaile
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
{ {
Debug(net, 9, "Client::Receive_SERVER_FULL()");
/* We try to join a server which is full */ /* We try to join a server which is full */
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_FULL, INVALID_STRING_ID, WL_CRITICAL); ShowErrorMessage(STR_NETWORK_ERROR_SERVER_FULL, INVALID_STRING_ID, WL_CRITICAL);
@ -545,6 +581,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
{ {
Debug(net, 9, "Client::Receive_SERVER_BANNED()");
/* We try to join a server where we are banned */ /* We try to join a server where we are banned */
ShowErrorMessage(STR_NETWORK_ERROR_SERVER_BANNED, INVALID_STRING_ID, WL_CRITICAL); ShowErrorMessage(STR_NETWORK_ERROR_SERVER_BANNED, INVALID_STRING_ID, WL_CRITICAL);
@ -560,6 +598,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac
ClientID client_id = (ClientID)p->Recv_uint32(); ClientID client_id = (ClientID)p->Recv_uint32();
CompanyID playas = (CompanyID)p->Recv_uint8(); CompanyID playas = (CompanyID)p->Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_CLIENT_INFO(): client_id={}, playas={}", client_id, playas);
std::string name = p->Recv_string(NETWORK_NAME_LENGTH); std::string name = p->Recv_string(NETWORK_NAME_LENGTH);
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@ -639,6 +679,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8(); NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_ERROR(): error={}", error);
StringID err = STR_NETWORK_ERROR_LOSTCONNECTION; StringID err = STR_NETWORK_ERROR_LOSTCONNECTION;
if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error]; if (error < (ptrdiff_t)lengthof(network_error_strings)) err = network_error_strings[error];
/* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */ /* In case of kicking a client, we assume there is a kick message in the packet if we can read one byte */
@ -662,6 +704,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
uint grf_count = p->Recv_uint8(); uint grf_count = p->Recv_uint8();
NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY; NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY;
Debug(net, 9, "Client::Receive_SERVER_CHECK_NEWGRFS(): grf_count={}", grf_count);
/* Check all GRFs */ /* Check all GRFs */
for (; grf_count > 0; grf_count--) { for (; grf_count > 0; grf_count--) {
GRFIdentifier c; GRFIdentifier c;
@ -689,8 +733,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *)
{ {
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_GAME) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_GAME) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTH_GAME");
this->status = STATUS_AUTH_GAME; this->status = STATUS_AUTH_GAME;
Debug(net, 9, "Client::Receive_SERVER_NEED_GAME_PASSWORD()");
if (!_network_join.server_password.empty()) { if (!_network_join.server_password.empty()) {
return SendGamePassword(_network_join.server_password); return SendGamePassword(_network_join.server_password);
} }
@ -703,8 +750,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSW
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p)
{ {
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_COMPANY) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_JOIN || this->status >= STATUS_AUTH_COMPANY) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTH_COMPANY");
this->status = STATUS_AUTH_COMPANY; this->status = STATUS_AUTH_COMPANY;
Debug(net, 9, "Client::Receive_SERVER_NEED_COMPANY_PASSWORD()");
_password_game_seed = p->Recv_uint32(); _password_game_seed = p->Recv_uint32();
_password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH); _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->HasClientQuit()) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@ -721,10 +771,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *p) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *p)
{ {
if (this->status < STATUS_JOIN || this->status >= STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_JOIN || this->status >= STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = AUTHORIZED");
this->status = STATUS_AUTHORIZED; this->status = STATUS_AUTHORIZED;
_network_own_client_id = (ClientID)p->Recv_uint32(); _network_own_client_id = (ClientID)p->Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_WELCOME(): client_id={}", _network_own_client_id);
/* Initialize the password hash salting variables, even if they were previously. */ /* Initialize the password hash salting variables, even if they were previously. */
_password_game_seed = p->Recv_uint32(); _password_game_seed = p->Recv_uint32();
_password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH); _password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
@ -738,7 +791,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
/* We set the internal wait state when requesting the map. */ /* We set the internal wait state when requesting the map. */
if (this->status != STATUS_MAP_WAIT) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status != STATUS_MAP_WAIT) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::Receive_SERVER_WAIT()");
/* But... only now we set the join status to waiting, instead of requesting. */ /* But... only now we set the join status to waiting, instead of requesting. */
Debug(net, 9, "Client::join_status = WAITING");
_network_join_status = NETWORK_JOIN_STATUS_WAITING; _network_join_status = NETWORK_JOIN_STATUS_WAITING;
_network_join_waiting = p->Recv_uint8(); _network_join_waiting = p->Recv_uint8();
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@ -749,6 +805,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *p) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *p)
{ {
if (this->status < STATUS_AUTHORIZED || this->status >= STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_AUTHORIZED || this->status >= STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::status = MAP");
this->status = STATUS_MAP; this->status = STATUS_MAP;
if (this->savegame != nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->savegame != nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@ -757,9 +814,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe
_frame_counter = _frame_counter_server = _frame_counter_max = p->Recv_uint32(); _frame_counter = _frame_counter_server = _frame_counter_max = p->Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_MAP_BEGIN(): frame_counter={}", _frame_counter);
_network_join_bytes = 0; _network_join_bytes = 0;
_network_join_bytes_total = 0; _network_join_bytes_total = 0;
Debug(net, 9, "Client::join_status = DOWNLOADING");
_network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING; _network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@ -774,6 +834,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet
_network_join_bytes_total = p->Recv_uint32(); _network_join_bytes_total = p->Recv_uint32();
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
Debug(net, 9, "Client::Receive_SERVER_MAP_SIZE(): bytes_total={}", _network_join_bytes_total);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }
@ -796,6 +858,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::Receive_SERVER_MAP_DONE()");
Debug(net, 9, "Client::join_status = PROCESSING");
_network_join_status = NETWORK_JOIN_STATUS_PROCESSING; _network_join_status = NETWORK_JOIN_STATUS_PROCESSING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
@ -837,6 +902,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
if (_network_join.company != COMPANY_SPECTATOR) { if (_network_join.company != COMPANY_SPECTATOR) {
/* We have arrived and ready to start playing; send a command to make a new company; /* We have arrived and ready to start playing; send a command to make a new company;
* the server will give us a client-id and let us in */ * the server will give us a client-id and let us in */
Debug(net, 9, "Client::join_status = REGISTERING");
_network_join_status = NETWORK_JOIN_STATUS_REGISTERING; _network_join_status = NETWORK_JOIN_STATUS_REGISTERING;
ShowJoinStatusWindow(); ShowJoinStatusWindow();
Command<CMD_COMPANY_CTRL>::SendNet(STR_NULL, _local_company, CCA_NEW, INVALID_COMPANY, CRR_NONE, INVALID_CLIENT_ID); Command<CMD_COMPANY_CTRL>::SendNet(STR_NULL, _local_company, CCA_NEW, INVALID_COMPANY, CRR_NONE, INVALID_CLIENT_ID);
@ -875,8 +941,6 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p
/* Receive the token. */ /* Receive the token. */
if (p->CanReadFromPacket(sizeof(uint8_t))) this->token = p->Recv_uint8(); if (p->CanReadFromPacket(sizeof(uint8_t))) this->token = p->Recv_uint8();
Debug(net, 7, "Received FRAME {}", _frame_counter_server);
/* Let the server know that we received this frame correctly /* Let the server know that we received this frame correctly
* We do this only once per day, to save some bandwidth ;) */ * We do this only once per day, to save some bandwidth ;) */
if (!_network_first_time && last_ack_frame < _frame_counter) { if (!_network_first_time && last_ack_frame < _frame_counter) {
@ -898,6 +962,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
_sync_seed_2 = p->Recv_uint32(); _sync_seed_2 = p->Recv_uint32();
#endif #endif
Debug(net, 9, "Client::Receive_SERVER_SYNC(): sync_frame={}, sync_seed_1={}", _sync_frame, _sync_seed_1);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }
@ -910,6 +976,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet
cp.frame = p->Recv_uint32(); cp.frame = p->Recv_uint32();
cp.my_cmd = p->Recv_bool(); cp.my_cmd = p->Recv_bool();
Debug(net, 9, "Client::Receive_SERVER_COMMAND(): cmd={}, frame={}", cp.cmd, cp.frame);
if (err != nullptr) { if (err != nullptr) {
IConsolePrint(CC_WARNING, "Dropping server connection due to {}.", err); IConsolePrint(CC_WARNING, "Dropping server connection due to {}.", err);
return NETWORK_RECV_STATUS_MALFORMED_PACKET; return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@ -933,6 +1001,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
int64_t data = p->Recv_uint64(); int64_t data = p->Recv_uint64();
Debug(net, 9, "Client::Receive_SERVER_CHAT(): action={}, client_id={}, self_send={}", action, client_id, self_send);
ci_to = NetworkClientInfo::GetByClientID(client_id); ci_to = NetworkClientInfo::GetByClientID(client_id);
if (ci_to == nullptr) return NETWORK_RECV_STATUS_OKAY; if (ci_to == nullptr) return NETWORK_RECV_STATUS_OKAY;
@ -978,6 +1048,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(P
std::string user = p->Recv_string(NETWORK_CHAT_LENGTH); std::string user = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
Debug(net, 9, "Client::Receive_SERVER_EXTERNAL_CHAT(): source={}", source);
if (!IsValidConsoleColour(colour)) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (!IsValidConsoleColour(colour)) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source); NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source);
@ -991,6 +1063,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack
ClientID client_id = (ClientID)p->Recv_uint32(); ClientID client_id = (ClientID)p->Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_ERROR_QUIT(): client_id={}", client_id);
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
if (ci != nullptr) { if (ci != nullptr) {
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p->Recv_uint8())); NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", GetNetworkErrorMsg((NetworkErrorCode)p->Recv_uint8()));
@ -1008,6 +1082,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
ClientID client_id = (ClientID)p->Recv_uint32(); ClientID client_id = (ClientID)p->Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_QUIT(): client_id={}", client_id);
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
if (ci != nullptr) { if (ci != nullptr) {
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", STR_NETWORK_MESSAGE_CLIENT_LEAVING); NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, "", STR_NETWORK_MESSAGE_CLIENT_LEAVING);
@ -1028,6 +1104,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
ClientID client_id = (ClientID)p->Recv_uint32(); ClientID client_id = (ClientID)p->Recv_uint32();
Debug(net, 9, "Client::Receive_SERVER_JOIN(): client_id={}", client_id);
NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id); NetworkClientInfo *ci = NetworkClientInfo::GetByClientID(client_id);
if (ci != nullptr) { if (ci != nullptr) {
NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, ci->client_name); NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, ci->client_name);
@ -1040,6 +1118,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *)
{ {
Debug(net, 9, "Client::Receive_SERVER_SHUTDOWN()");
/* Only when we're trying to join we really /* Only when we're trying to join we really
* care about the server shutting down. */ * care about the server shutting down. */
if (this->status >= STATUS_JOIN) { if (this->status >= STATUS_JOIN) {
@ -1053,6 +1133,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *) NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *)
{ {
Debug(net, 9, "Client::Receive_SERVER_NEWGAME()");
/* Only when we're trying to join we really /* Only when we're trying to join we really
* care about the server shutting down. */ * care about the server shutting down. */
if (this->status >= STATUS_JOIN) { if (this->status >= STATUS_JOIN) {
@ -1072,6 +1154,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet *p)
{ {
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
Debug(net, 9, "Client::Receive_SERVER_RCON()");
TextColour colour_code = (TextColour)p->Recv_uint16(); TextColour colour_code = (TextColour)p->Recv_uint16();
if (!IsValidConsoleColour(colour_code)) return NETWORK_RECV_STATUS_MALFORMED_PACKET; if (!IsValidConsoleColour(colour_code)) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@ -1090,6 +1174,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
ClientID client_id = (ClientID)p->Recv_uint32(); ClientID client_id = (ClientID)p->Recv_uint32();
CompanyID company_id = (CompanyID)p->Recv_uint8(); CompanyID company_id = (CompanyID)p->Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_MOVE(): client_id={}, comapny_id={}", client_id, company_id);
if (client_id == 0) { if (client_id == 0) {
/* definitely an invalid client id, debug message and do nothing. */ /* definitely an invalid client id, debug message and do nothing. */
Debug(net, 1, "Received invalid client index = 0"); Debug(net, 1, "Received invalid client index = 0");
@ -1118,6 +1204,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P
_network_server_name = p->Recv_string(NETWORK_NAME_LENGTH); _network_server_name = p->Recv_string(NETWORK_NAME_LENGTH);
SetWindowClassesDirty(WC_CLIENT_LIST); SetWindowClassesDirty(WC_CLIENT_LIST);
Debug(net, 9, "Client::Receive_SERVER_CONFIG_UPDATE(): max_companies={}", _network_server_max_companies);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }
@ -1129,6 +1217,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(
_network_company_passworded = p->Recv_uint16(); _network_company_passworded = p->Recv_uint16();
SetWindowClassesDirty(WC_COMPANY); SetWindowClassesDirty(WC_COMPANY);
Debug(net, 9, "Client::Receive_SERVER_COMPANY_UPDATE()");
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }
@ -1168,6 +1258,9 @@ void NetworkClient_Connected()
_frame_counter = 0; _frame_counter = 0;
_frame_counter_server = 0; _frame_counter_server = 0;
last_ack_frame = 0; last_ack_frame = 0;
Debug(net, 9, "Client::NetworkClient_Connected()");
/* Request the game-info */ /* Request the game-info */
MyClient::SendJoin(); MyClient::SendJoin();
} }

View File

@ -1677,6 +1677,18 @@ public:
void UpdateWidgetSize(WidgetID widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override void UpdateWidgetSize(WidgetID widget, Dimension *size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension *fill, [[maybe_unused]] Dimension *resize) override
{ {
switch (widget) { switch (widget) {
case WID_CL_SERVER_NAME:
case WID_CL_CLIENT_NAME:
if (widget == WID_CL_SERVER_NAME) {
SetDParamStr(0, _network_server ? _settings_client.network.server_name : _network_server_name);
} else {
const NetworkClientInfo *own_ci = NetworkClientInfo::GetByClientID(_network_own_client_id);
SetDParamStr(0, own_ci != nullptr ? own_ci->client_name : _settings_client.network.client_name);
}
*size = GetStringBoundingBox(STR_JUST_RAW_STRING);
size->width = std::min(size->width, static_cast<uint>(ScaleGUITrad(200))); // By default, don't open the window too wide.
break;
case WID_CL_SERVER_VISIBILITY: case WID_CL_SERVER_VISIBILITY:
*size = maxdim(maxdim(GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_LOCAL), GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_PUBLIC)), GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY)); *size = maxdim(maxdim(GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_LOCAL), GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_PUBLIC)), GetStringBoundingBox(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY));
size->width += padding.width; size->width += padding.width;

View File

@ -81,12 +81,16 @@ void QueryNetworkGameSocketHandler::Send()
*/ */
NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo() NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo()
{ {
Debug(net, 9, "Query::SendGameInfo()");
this->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO)); this->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO));
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
} }
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
{ {
Debug(net, 9, "Query::Receive_SERVER_FULL()");
NetworkGameList *item = NetworkGameListAddItem(this->connection_string); NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
item->status = NGLS_FULL; item->status = NGLS_FULL;
item->refreshing = false; item->refreshing = false;
@ -98,6 +102,8 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
{ {
Debug(net, 9, "Query::Receive_SERVER_BANNED()");
NetworkGameList *item = NetworkGameListAddItem(this->connection_string); NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
item->status = NGLS_BANNED; item->status = NGLS_BANNED;
item->refreshing = false; item->refreshing = false;
@ -109,6 +115,8 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p) NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p)
{ {
Debug(net, 9, "Query::Receive_SERVER_GAME_INFO()");
NetworkGameList *item = NetworkGameListAddItem(this->connection_string); NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
/* Clear any existing GRFConfig chain. */ /* Clear any existing GRFConfig chain. */
@ -130,6 +138,8 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
{ {
NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8(); NetworkErrorCode error = (NetworkErrorCode)p->Recv_uint8();
Debug(net, 9, "Query::Receive_SERVER_ERROR(): error={}", error);
NetworkGameList *item = NetworkGameListAddItem(this->connection_string); NetworkGameList *item = NetworkGameListAddItem(this->connection_string);
if (error == NETWORK_ERROR_NOT_EXPECTED) { if (error == NETWORK_ERROR_NOT_EXPECTED) {

View File

@ -215,6 +215,8 @@ ServerNetworkGameSocketHandler::ServerNetworkGameSocketHandler(SOCKET s) : Netwo
this->client_id = _network_client_id++; this->client_id = _network_client_id++;
this->receive_limit = _settings_client.network.bytes_per_frame_burst; this->receive_limit = _settings_client.network.bytes_per_frame_burst;
Debug(net, 9, "client[{}] status = INACTIVE", this->client_id);
/* The Socket and Info pools need to be the same in size. After all, /* The Socket and Info pools need to be the same in size. After all,
* each Socket will be associated with at most one Info object. As * each Socket will be associated with at most one Info object. As
* such if the Socket was allocated the Info object can as well. */ * such if the Socket was allocated the Info object can as well. */
@ -345,6 +347,8 @@ static void NetworkHandleCommandQueue(NetworkClientSocket *cs);
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientInfo *ci) NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientInfo *ci)
{ {
Debug(net, 9, "client[{}] SendClientInfo(): client_id={}", this->client_id, ci->client_id);
if (ci->client_id != INVALID_CLIENT_ID) { if (ci->client_id != INVALID_CLIENT_ID) {
Packet *p = new Packet(PACKET_SERVER_CLIENT_INFO); Packet *p = new Packet(PACKET_SERVER_CLIENT_INFO);
p->Send_uint32(ci->client_id); p->Send_uint32(ci->client_id);
@ -359,6 +363,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientIn
/** Send the client information about the server. */ /** Send the client information about the server. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo() NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo()
{ {
Debug(net, 9, "client[{}] SendGameInfo()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_GAME_INFO, TCP_MTU); Packet *p = new Packet(PACKET_SERVER_GAME_INFO, TCP_MTU);
SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo()); SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo());
@ -374,6 +380,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo()
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error, const std::string &reason) NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error, const std::string &reason)
{ {
Debug(net, 9, "client[{}] SendError(): error={}", this->client_id, error);
Packet *p = new Packet(PACKET_SERVER_ERROR); Packet *p = new Packet(PACKET_SERVER_ERROR);
p->Send_uint8(error); p->Send_uint8(error);
@ -417,6 +425,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
/** Send the check for the NewGRFs. */ /** Send the check for the NewGRFs. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck() NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
{ {
Debug(net, 9, "client[{}] SendNewGRFCheck()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU); Packet *p = new Packet(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
const GRFConfig *c; const GRFConfig *c;
uint grf_count = 0; uint grf_count = 0;
@ -437,9 +447,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
/** Request the game password. */ /** Request the game password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword() NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
{ {
Debug(net, 9, "client[{}] SendNeedGamePassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_GAME or higher */ /* Invalid packet when status is STATUS_AUTH_GAME or higher */
if (this->status >= STATUS_AUTH_GAME) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET); if (this->status >= STATUS_AUTH_GAME) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET);
Debug(net, 9, "client[{}] status = AUTH_GAME", this->client_id);
this->status = STATUS_AUTH_GAME; this->status = STATUS_AUTH_GAME;
/* Reset 'lag' counters */ /* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter; this->last_frame = this->last_frame_server = _frame_counter;
@ -452,9 +465,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
/** Request the company password. */ /** Request the company password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword() NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
{ {
Debug(net, 9, "client[{}] SendNeedCompanyPassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_COMPANY or higher */ /* Invalid packet when status is STATUS_AUTH_COMPANY or higher */
if (this->status >= STATUS_AUTH_COMPANY) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET); if (this->status >= STATUS_AUTH_COMPANY) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET);
Debug(net, 9, "client[{}] status = AUTH_COMPANY", this->client_id);
this->status = STATUS_AUTH_COMPANY; this->status = STATUS_AUTH_COMPANY;
/* Reset 'lag' counters */ /* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter; this->last_frame = this->last_frame_server = _frame_counter;
@ -469,11 +485,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
/** Send the client a welcome message with some basic information. */ /** Send the client a welcome message with some basic information. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome() NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
{ {
Debug(net, 9, "client[{}] SendWelcome()", this->client_id);
Packet *p; Packet *p;
/* Invalid packet when status is AUTH or higher */ /* Invalid packet when status is AUTH or higher */
if (this->status >= STATUS_AUTHORIZED) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET); if (this->status >= STATUS_AUTHORIZED) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET);
Debug(net, 9, "client[{}] status = AUTHORIZED", this->client_id);
this->status = STATUS_AUTHORIZED; this->status = STATUS_AUTHORIZED;
/* Reset 'lag' counters */ /* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter; this->last_frame = this->last_frame_server = _frame_counter;
@ -499,6 +518,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
/** Tell the client that its put in a waiting queue. */ /** Tell the client that its put in a waiting queue. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait() NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
{ {
Debug(net, 9, "client[{}] SendWait()", this->client_id);
int waiting = 1; // current player getting the map counts as 1 int waiting = 1; // current player getting the map counts as 1
Packet *p; Packet *p;
@ -516,6 +537,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
void ServerNetworkGameSocketHandler::CheckNextClientToSendMap(NetworkClientSocket *ignore_cs) void ServerNetworkGameSocketHandler::CheckNextClientToSendMap(NetworkClientSocket *ignore_cs)
{ {
Debug(net, 9, "client[{}] CheckNextClientToSendMap()", this->client_id);
/* Find the best candidate for joining, i.e. the first joiner. */ /* Find the best candidate for joining, i.e. the first joiner. */
NetworkClientSocket *best = nullptr; NetworkClientSocket *best = nullptr;
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
@ -550,6 +573,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
} }
if (this->status == STATUS_AUTHORIZED) { if (this->status == STATUS_AUTHORIZED) {
Debug(net, 9, "client[{}] SendMap(): first_packet", this->client_id);
WaitTillSaved(); WaitTillSaved();
this->savegame = new PacketWriter(this); this->savegame = new PacketWriter(this);
@ -559,6 +584,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
this->SendPacket(p); this->SendPacket(p);
NetworkSyncCommandQueue(this); NetworkSyncCommandQueue(this);
Debug(net, 9, "client[{}] status = MAP", this->client_id);
this->status = STATUS_MAP; this->status = STATUS_MAP;
/* Mark the start of download */ /* Mark the start of download */
this->last_frame = _frame_counter; this->last_frame = _frame_counter;
@ -571,12 +597,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
if (this->status == STATUS_MAP) { if (this->status == STATUS_MAP) {
bool last_packet = this->savegame->TransferToNetworkQueue(this); bool last_packet = this->savegame->TransferToNetworkQueue(this);
if (last_packet) { if (last_packet) {
Debug(net, 9, "client[{}] SendMap(): last_packet", this->client_id);
/* Done reading, make sure saving is done as well */ /* Done reading, make sure saving is done as well */
this->savegame->Destroy(); this->savegame->Destroy();
this->savegame = nullptr; this->savegame = nullptr;
/* Set the status to DONE_MAP, no we will wait for the client /* Set the status to DONE_MAP, no we will wait for the client
* to send it is ready (maybe that happens like never ;)) */ * to send it is ready (maybe that happens like never ;)) */
Debug(net, 9, "client[{}] status = DONE_MAP", this->client_id);
this->status = STATUS_DONE_MAP; this->status = STATUS_DONE_MAP;
this->CheckNextClientToSendMap(); this->CheckNextClientToSendMap();
@ -591,6 +620,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendJoin(ClientID client_id) NetworkRecvStatus ServerNetworkGameSocketHandler::SendJoin(ClientID client_id)
{ {
Debug(net, 9, "client[{}] SendJoin(): client_id={}", this->client_id, client_id);
Packet *p = new Packet(PACKET_SERVER_JOIN); Packet *p = new Packet(PACKET_SERVER_JOIN);
p->Send_uint32(client_id); p->Send_uint32(client_id);
@ -625,6 +656,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame()
/** Request the client to sync. */ /** Request the client to sync. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync() NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync()
{ {
Debug(net, 9, "client[{}] SendSync(), frame_counter={}, sync_seed_1={}", this->client_id, _frame_counter, _sync_seed_1);
Packet *p = new Packet(PACKET_SERVER_SYNC); Packet *p = new Packet(PACKET_SERVER_SYNC);
p->Send_uint32(_frame_counter); p->Send_uint32(_frame_counter);
p->Send_uint32(_sync_seed_1); p->Send_uint32(_sync_seed_1);
@ -642,6 +675,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync()
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket *cp) NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
{ {
Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp->cmd);
Packet *p = new Packet(PACKET_SERVER_COMMAND); Packet *p = new Packet(PACKET_SERVER_COMMAND);
this->NetworkGameSocketHandler::SendCommand(p, cp); this->NetworkGameSocketHandler::SendCommand(p, cp);
@ -662,6 +697,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacke
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action, ClientID client_id, bool self_send, const std::string &msg, int64_t data) NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action, ClientID client_id, bool self_send, const std::string &msg, int64_t data)
{ {
Debug(net, 9, "client[{}] SendChat(): action={}, client_id={}, self_send={}", this->client_id, action, client_id, self_send);
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY; if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(PACKET_SERVER_CHAT); Packet *p = new Packet(PACKET_SERVER_CHAT);
@ -685,6 +722,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action,
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg) NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
{ {
Debug(net, 9, "client[{}] SendExternalChat(): source={}", this->client_id, source);
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY; if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(PACKET_SERVER_EXTERNAL_CHAT); Packet *p = new Packet(PACKET_SERVER_EXTERNAL_CHAT);
@ -705,6 +744,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::st
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_id, NetworkErrorCode errorno) NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_id, NetworkErrorCode errorno)
{ {
Debug(net, 9, "client[{}] SendErrorQuit(): client_id={}, errorno={}", this->client_id, client_id, errorno);
Packet *p = new Packet(PACKET_SERVER_ERROR_QUIT); Packet *p = new Packet(PACKET_SERVER_ERROR_QUIT);
p->Send_uint32(client_id); p->Send_uint32(client_id);
@ -720,6 +761,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendQuit(ClientID client_id) NetworkRecvStatus ServerNetworkGameSocketHandler::SendQuit(ClientID client_id)
{ {
Debug(net, 9, "client[{}] SendQuit(): client_id={}", this->client_id, client_id);
Packet *p = new Packet(PACKET_SERVER_QUIT); Packet *p = new Packet(PACKET_SERVER_QUIT);
p->Send_uint32(client_id); p->Send_uint32(client_id);
@ -731,6 +774,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendQuit(ClientID client_id)
/** Tell the client we're shutting down. */ /** Tell the client we're shutting down. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown() NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown()
{ {
Debug(net, 9, "client[{}] SendShutdown()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_SHUTDOWN); Packet *p = new Packet(PACKET_SERVER_SHUTDOWN);
this->SendPacket(p); this->SendPacket(p);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
@ -739,6 +784,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown()
/** Tell the client we're starting a new game. */ /** Tell the client we're starting a new game. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame() NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame()
{ {
Debug(net, 9, "client[{}] SendNewGame()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_NEWGAME); Packet *p = new Packet(PACKET_SERVER_NEWGAME);
this->SendPacket(p); this->SendPacket(p);
return NETWORK_RECV_STATUS_OKAY; return NETWORK_RECV_STATUS_OKAY;
@ -751,6 +798,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame()
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour, const std::string &command) NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour, const std::string &command)
{ {
Debug(net, 9, "client[{}] SendRConResult()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_RCON); Packet *p = new Packet(PACKET_SERVER_RCON);
p->Send_uint16(colour); p->Send_uint16(colour);
@ -766,6 +815,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour
*/ */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, CompanyID company_id) NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, CompanyID company_id)
{ {
Debug(net, 9, "client[{}] SendMove(): client_id={}", this->client_id, client_id);
Packet *p = new Packet(PACKET_SERVER_MOVE); Packet *p = new Packet(PACKET_SERVER_MOVE);
p->Send_uint32(client_id); p->Send_uint32(client_id);
@ -777,6 +828,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, C
/** Send an update about the company password states. */ /** Send an update about the company password states. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate() NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate()
{ {
Debug(net, 9, "client[{}] SendCompanyUpdate()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_COMPANY_UPDATE); Packet *p = new Packet(PACKET_SERVER_COMPANY_UPDATE);
static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t)); static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
@ -788,6 +841,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate()
/** Send an update about the max company/spectator counts. */ /** Send an update about the max company/spectator counts. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate() NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate()
{ {
Debug(net, 9, "client[{}] SendConfigUpdate()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE); Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE);
p->Send_uint8(_settings_client.network.max_companies); p->Send_uint8(_settings_client.network.max_companies);
@ -803,6 +858,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate()
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *) NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *)
{ {
Debug(net, 9, "client[{}] Receive_CLIENT_GAME_INFO()", this->client_id);
return this->SendGameInfo(); return this->SendGameInfo();
} }
@ -813,6 +870,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED
return this->SendError(NETWORK_ERROR_NOT_EXPECTED); return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id);
NetworkClientInfo *ci = this->GetInfo(); NetworkClientInfo *ci = this->GetInfo();
/* We now want a password from the client else we do not allow them in! */ /* We now want a password from the client else we do not allow them in! */
@ -842,6 +901,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH); std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH);
uint32_t newgrf_version = p->Recv_uint32(); uint32_t newgrf_version = p->Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_JOIN(): client_revision={}, newgrf_version={}", this->client_id, client_revision, newgrf_version);
/* Check if the client has revision control enabled */ /* Check if the client has revision control enabled */
if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) { if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) {
/* Different revisions!! */ /* Different revisions!! */
@ -892,6 +953,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
/* Make sure companies to which people try to join are not autocleaned */ /* Make sure companies to which people try to join are not autocleaned */
if (Company::IsValidID(playas)) _network_company_states[playas].months_empty = 0; if (Company::IsValidID(playas)) _network_company_states[playas].months_empty = 0;
Debug(net, 9, "client[{}] status = NEWGRFS_CHECK", this->client_id);
this->status = STATUS_NEWGRFS_CHECK; this->status = STATUS_NEWGRFS_CHECK;
if (_grfconfig == nullptr) { if (_grfconfig == nullptr) {
@ -908,6 +970,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P
return this->SendError(NETWORK_ERROR_NOT_EXPECTED); return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_GAME_PASSWORD()", this->client_id);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
/* Check game password. Allow joining if we cleared the password meanwhile */ /* Check game password. Allow joining if we cleared the password meanwhile */
@ -932,6 +996,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR
return this->SendError(NETWORK_ERROR_NOT_EXPECTED); return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_COMPANY_PASSWORD()", this->client_id);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
/* Check company password. Allow joining if we cleared the password meanwhile. /* Check company password. Allow joining if we cleared the password meanwhile.
@ -955,10 +1021,13 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *
return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED); return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_GETMAP()", this->client_id);
/* Check if someone else is receiving the map */ /* Check if someone else is receiving the map */
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) { for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
if (new_cs->status == STATUS_MAP) { if (new_cs->status == STATUS_MAP) {
/* Tell the new client to wait */ /* Tell the new client to wait */
Debug(net, 9, "client[{}] status = MAP_WAIT", this->client_id);
this->status = STATUS_MAP_WAIT; this->status = STATUS_MAP_WAIT;
return this->SendWait(); return this->SendWait();
} }
@ -972,6 +1041,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *
{ {
/* Client has the map, now start syncing */ /* Client has the map, now start syncing */
if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) { if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) {
Debug(net, 9, "client[{}] Receive_CLIENT_MAP_OK()", this->client_id);
std::string client_name = this->GetClientName(); std::string client_name = this->GetClientName();
NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, "", this->client_id); NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, "", this->client_id);
@ -981,6 +1052,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *
/* Mark the client as pre-active, and wait for an ACK /* Mark the client as pre-active, and wait for an ACK
* so we know it is done loading and in sync with us */ * so we know it is done loading and in sync with us */
Debug(net, 9, "client[{}] status = PRE_ACTIVE", this->client_id);
this->status = STATUS_PRE_ACTIVE; this->status = STATUS_PRE_ACTIVE;
NetworkHandleCommandQueue(this); NetworkHandleCommandQueue(this);
this->SendFrame(); this->SendFrame();
@ -1027,6 +1099,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS); return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id);
CommandPacket cp; CommandPacket cp;
const char *err = this->ReceiveCommand(p, &cp); const char *err = this->ReceiveCommand(p, &cp);
@ -1086,6 +1160,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
* to us. Display the error and report it to the other clients */ * to us. Display the error and report it to the other clients */
NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8(); NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
Debug(net, 9, "client[{}] Receive_CLIENT_ERROR(): errorno={}", this->client_id, errorno);
/* The client was never joined.. thank the client for the packet, but ignore it */ /* The client was never joined.. thank the client for the packet, but ignore it */
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) { if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
@ -1116,6 +1192,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *)
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT); return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_QUIT()", this->client_id);
/* The client wants to leave. Display this and report it to the other clients. */ /* The client wants to leave. Display this and report it to the other clients. */
std::string client_name = this->GetClientName(); std::string client_name = this->GetClientName();
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", STR_NETWORK_MESSAGE_CLIENT_LEAVING); NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", STR_NETWORK_MESSAGE_CLIENT_LEAVING);
@ -1140,12 +1218,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
uint32_t frame = p->Recv_uint32(); uint32_t frame = p->Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_ACK(): frame={}", this->client_id, frame);
/* The client is trying to catch up with the server */ /* The client is trying to catch up with the server */
if (this->status == STATUS_PRE_ACTIVE) { if (this->status == STATUS_PRE_ACTIVE) {
/* The client is not yet caught up? */ /* The client is not yet caught up? */
if (frame + Ticks::DAY_TICKS < _frame_counter) return NETWORK_RECV_STATUS_OKAY; if (frame + Ticks::DAY_TICKS < _frame_counter) return NETWORK_RECV_STATUS_OKAY;
/* Now it is! Unpause the game */ /* Now it is! Unpause the game */
Debug(net, 9, "client[{}] status = ACTIVE", this->client_id);
this->status = STATUS_ACTIVE; this->status = STATUS_ACTIVE;
this->last_token_frame = _frame_counter; this->last_token_frame = _frame_counter;
@ -1324,6 +1405,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p)
DestType desttype = (DestType)p->Recv_uint8(); DestType desttype = (DestType)p->Recv_uint8();
int dest = p->Recv_uint32(); int dest = p->Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_CHAT(): action={}, desttype={}, dest={}", this->client_id, action, desttype, dest);
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH); std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
int64_t data = p->Recv_uint64(); int64_t data = p->Recv_uint64();
@ -1348,6 +1431,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Pa
return this->SendError(NETWORK_ERROR_NOT_EXPECTED); return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_SET_PASSWORD()", this->client_id);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
const NetworkClientInfo *ci = this->GetInfo(); const NetworkClientInfo *ci = this->GetInfo();
@ -1362,6 +1447,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
return this->SendError(NETWORK_ERROR_NOT_EXPECTED); return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
} }
Debug(net, 9, "client[{}] Receive_CLIENT_SET_NAME()", this->client_id);
NetworkClientInfo *ci; NetworkClientInfo *ci;
std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH); std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
@ -1393,6 +1480,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
if (_settings_client.network.rcon_password.empty()) return NETWORK_RECV_STATUS_OKAY; if (_settings_client.network.rcon_password.empty()) return NETWORK_RECV_STATUS_OKAY;
Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH); std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH); std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
@ -1415,6 +1504,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
CompanyID company_id = (Owner)p->Recv_uint8(); CompanyID company_id = (Owner)p->Recv_uint8();
Debug(net, 9, "client[{}] Receive_CLIENT_MOVE(): company_id={}", this->client_id, company_id);
/* Check if the company is valid, we don't allow moving to AI companies */ /* Check if the company is valid, we don't allow moving to AI companies */
if (company_id != COMPANY_SPECTATOR && !Company::IsValidHumanID(company_id)) return NETWORK_RECV_STATUS_OKAY; if (company_id != COMPANY_SPECTATOR && !Company::IsValidHumanID(company_id)) return NETWORK_RECV_STATUS_OKAY;

View File

@ -38,6 +38,8 @@ public:
void OnFailure() override void OnFailure() override
{ {
Debug(net, 9, "Stun::OnFailure(): family={}", this->family);
this->stun_handler->connecter = nullptr; this->stun_handler->connecter = nullptr;
/* Connection to STUN server failed. For example, the client doesn't /* Connection to STUN server failed. For example, the client doesn't
@ -48,6 +50,8 @@ public:
void OnConnect(SOCKET s) override void OnConnect(SOCKET s) override
{ {
Debug(net, 9, "Stun::OnConnect(): family={}", this->family);
this->stun_handler->connecter = nullptr; this->stun_handler->connecter = nullptr;
assert(this->stun_handler->sock == INVALID_SOCKET); assert(this->stun_handler->sock == INVALID_SOCKET);
@ -71,6 +75,8 @@ void ClientNetworkStunSocketHandler::Connect(const std::string &token, uint8_t f
this->token = token; this->token = token;
this->family = family; this->family = family;
Debug(net, 9, "Stun::Connect(): family={}", this->family);
this->connecter = TCPConnecter::Create<NetworkStunConnecter>(this, NetworkStunConnectionString(), token, family); this->connecter = TCPConnecter::Create<NetworkStunConnecter>(this, NetworkStunConnectionString(), token, family);
} }

View File

@ -32,6 +32,8 @@ public:
void OnFailure() override void OnFailure() override
{ {
Debug(net, 9, "Turn::OnFailure()");
this->handler->connecter = nullptr; this->handler->connecter = nullptr;
this->handler->ConnectFailure(); this->handler->ConnectFailure();
@ -39,6 +41,8 @@ public:
void OnConnect(SOCKET s) override void OnConnect(SOCKET s) override
{ {
Debug(net, 9, "Turn::OnConnect()");
this->handler->connecter = nullptr; this->handler->connecter = nullptr;
this->handler->sock = s; this->handler->sock = s;
@ -47,6 +51,8 @@ public:
bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
{ {
Debug(net, 9, "Receive_TURN_ERROR()");
this->ConnectFailure(); this->ConnectFailure();
return false; return false;
@ -54,6 +60,8 @@ bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p) bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p)
{ {
Debug(net, 9, "Receive_TURN_CONNECTED()");
std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH); std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH);
/* Act like we no longer have a socket, as we are handing it over to the /* Act like we no longer have a socket, as we are handing it over to the
@ -72,6 +80,8 @@ bool ClientNetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *p)
*/ */
void ClientNetworkTurnSocketHandler::Connect() void ClientNetworkTurnSocketHandler::Connect()
{ {
Debug(net, 9, "Turn::Connect()");
this->connect_started = true; this->connect_started = true;
this->connecter = TCPConnecter::Create<NetworkTurnConnecter>(this, this->connection_string); this->connecter = TCPConnecter::Create<NetworkTurnConnecter>(this, this->connection_string);
} }

View File

@ -24,6 +24,7 @@
* *
* API removals: * API removals:
* \li AIError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore. * \li AIError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore.
* \li AIInfo::CONFIG_RANDOM, no longer used.
* *
* Other changes: * Other changes:
* \li AIGroupList accepts an optional filter function * \li AIGroupList accepts an optional filter function

View File

@ -90,6 +90,7 @@
* *
* API removals: * API removals:
* \li GSError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore. * \li GSError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore.
* \li AIInfo::CONFIG_RANDOM, no longer used.
* *
* Other changes: * Other changes:
* \li GSGroupList accepts an optional filter function * \li GSGroupList accepts an optional filter function

View File

@ -203,7 +203,6 @@ public:
/** Miscellaneous flags for Script settings. */ /** Miscellaneous flags for Script settings. */
enum ScriptConfigFlags { enum ScriptConfigFlags {
CONFIG_NONE, ///< Normal setting. CONFIG_NONE, ///< Normal setting.
CONFIG_RANDOM, ///< When randomizing the Script, pick any value between min_value and max_value (inclusive).
CONFIG_BOOLEAN, ///< This value is a boolean (either 0 (false) or 1 (true) ). CONFIG_BOOLEAN, ///< This value is a boolean (either 0 (false) or 1 (true) ).
CONFIG_INGAME, ///< This setting can be changed while the Script is running. CONFIG_INGAME, ///< This setting can be changed while the Script is running.
CONFIG_DEVELOPER, ///< This setting will only be visible when the Script development tools are active. CONFIG_DEVELOPER, ///< This setting will only be visible when the Script development tools are active.

View File

@ -34,14 +34,6 @@ void ScriptConfig::Change(std::optional<const std::string> name, int version, bo
this->ClearConfigList(); this->ClearConfigList();
if (_game_mode == GM_NORMAL && this->info != nullptr) { if (_game_mode == GM_NORMAL && this->info != nullptr) {
/* If we're in an existing game and the Script is changed, set all settings
* for the Script that have the random flag to a random value. */
for (const auto &item : *this->info->GetConfigList()) {
if (item.flags & SCRIPTCONFIG_RANDOM) {
this->SetSetting(item.name, ScriptObject::GetRandomizer(OWNER_NONE).Next(item.max_value + 1 - item.min_value) + item.min_value);
}
}
this->AddRandomDeviation(); this->AddRandomDeviation();
} }
} }

View File

@ -20,7 +20,7 @@ static const int INT32_DIGITS_WITH_SIGN_AND_TERMINATION = 10 + 1 + 1;
/** Bitmask of flags for Script settings. */ /** Bitmask of flags for Script settings. */
enum ScriptConfigFlags { enum ScriptConfigFlags {
SCRIPTCONFIG_NONE = 0x0, ///< No flags set. SCRIPTCONFIG_NONE = 0x0, ///< No flags set.
SCRIPTCONFIG_RANDOM = 0x1, ///< When randomizing the Script, pick any value between min_value and max_value when on custom difficulty setting. // Unused flag 0x1.
SCRIPTCONFIG_BOOLEAN = 0x2, ///< This value is a boolean (either 0 (false) or 1 (true) ). SCRIPTCONFIG_BOOLEAN = 0x2, ///< This value is a boolean (either 0 (false) or 1 (true) ).
SCRIPTCONFIG_INGAME = 0x4, ///< This setting can be changed while the Script is running. SCRIPTCONFIG_INGAME = 0x4, ///< This setting can be changed while the Script is running.
SCRIPTCONFIG_DEVELOPER = 0x8, ///< This setting will only be visible when the Script development tools are active. SCRIPTCONFIG_DEVELOPER = 0x8, ///< This setting will only be visible when the Script development tools are active.

View File

@ -162,12 +162,6 @@ SQInteger ScriptInfo::AddSetting(HSQUIRRELVM vm)
} }
sq_pop(vm, 1); sq_pop(vm, 1);
/* Don't allow both random_deviation and SCRIPTCONFIG_RANDOM to
* be set for the same config item. */
if ((items & 0x200) != 0 && (config.flags & SCRIPTCONFIG_RANDOM) != 0) {
this->engine->ThrowError("Setting both random_deviation and SCRIPTCONFIG_RANDOM is not allowed");
return SQ_ERROR;
}
/* Reset the bit for random_deviation as it's optional. */ /* Reset the bit for random_deviation as it's optional. */
items &= ~0x200; items &= ~0x200;

View File

@ -3435,7 +3435,7 @@ TownActions GetMaskOfTownActions(CompanyID cid, const Town *t)
if (cid != COMPANY_SPECTATOR && !(_settings_game.economy.bribe && t->unwanted[cid])) { if (cid != COMPANY_SPECTATOR && !(_settings_game.economy.bribe && t->unwanted[cid])) {
/* Actions worth more than this are not able to be performed */ /* Actions worth more than this are not able to be performed */
Money avail = Company::Get(cid)->money; Money avail = GetAvailableMoney(cid);
/* Check the action bits for validity and /* Check the action bits for validity and
* if they are valid add them */ * if they are valid add them */

View File

@ -245,7 +245,7 @@ public:
case WID_TA_ACTION_INFO: case WID_TA_ACTION_INFO:
if (this->sel_index != -1) { if (this->sel_index != -1) {
Money action_cost = _price[PR_TOWN_ACTION] * _town_action_costs[this->sel_index] >> 8; Money action_cost = _price[PR_TOWN_ACTION] * _town_action_costs[this->sel_index] >> 8;
bool affordable = Company::IsValidID(_local_company) && action_cost < Company::Get(_local_company)->money; bool affordable = Company::IsValidID(_local_company) && action_cost < GetAvailableMoney(_local_company);
SetDParam(0, action_cost); SetDParam(0, action_cost);
DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect), DrawStringMultiLine(r.Shrink(WidgetDimensions::scaled.framerect),