Compare commits

...
25 Commits
Author SHA1 Message Date
b085f610e2 Doc: Prepare for 14.0-beta3 release (#12018)
Co-authored-by: Michael Lutz <michi@icosahedron.de>
2024-02-06 21:48:07 +01:00
Loïc GuillouxandGitHub b0f3417025 Add: [Script] ScriptTileList_StationCoverage (#12015) 2024-02-06 20:22:18 +01:00
Loïc GuillouxandGitHub 0858377e9e Fix: [Script] Don't kill GS misusing GSText (#12009) 2024-02-06 19:58:30 +01:00
merni-nsandGitHub 34b05465d5 Fix 5a88027: [Script] Avoid overflow in scripts when infinite money is enabled (#12016) 2024-02-06 19:54:38 +01:00
translators 02cdd5ba8b Update: Translations from eints
spanish (mexican): 7 changes by Skinazo
english (us): 4 changes by 2TallTyler
czech: 37 changes by justidan4
chinese (simplified): 1 change by WenSimEHRP
finnish: 50 changes by Finjet-cyber, 22 changes by hpiirai
spanish: 13 changes by MontyMontana
french: 4 changes by ottdfevr
portuguese (brazilian): 141 changes by pasantoro
polish: 68 changes by pAter-exe
2024-02-06 18:35:32 +00:00
Peter NelsonandGitHub e9ea837311 Fix #12012: Crash when opening orders of another company. (#12013)
Orders window changes tooltip depending on vehicle type but did check if widget exists.
2024-02-06 12:53:23 +00:00
dPandGitHub e2d36f626b Fix: Focus hotkey in road/tram stop building window (#12008) 2024-02-05 18:14:21 -05:00
Peter NelsonandGitHub ae30ad7802 Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up. (#12006) 2024-02-05 23:12:56 +00:00
Peter NelsonandGitHub 5c630e10b7 Fix 2fd90960: Missing default vehicles and industry acceptance/production. (#12000)
* Fix 2fd90960: Missing default vehicles and industry acceptance/production.

Some default definitions are used across multiple climate types and relied on climate-independent cargo slot even though they specified a climate-dependent cargo type.

Add MixedCargoType that indirectly allows multiple labels to be specified for these.
2024-02-05 23:11:32 +00:00
Tyler TrahanandGitHub b2b4cceb49 Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007) 2024-02-05 18:09:29 -05:00
translators 05e23f8fc9 Update: Translations from eints
english (au): 4 changes by krysclarke
chinese (simplified): 21 changes by WenSimEHRP
korean: 4 changes by CoconutKR
finnish: 94 changes by hpiirai
catalan: 20 changes by J0anJosep
danish: 7 changes by bscargo
latvian: 4 changes by lexuslatvia
esperanto: 31 changes by JadedCtrl
portuguese (brazilian): 283 changes by pasantoro
polish: 75 changes by pAter-exe
2024-02-05 18:35:45 +00:00
Rubidiumandrubidium42 3534214dfc Codechange: use reference instead of pointer for CommandPacket 2024-02-05 18:57:58 +01:00
Rubidiumandrubidium42 cb588d8d3f Codechange: use std::vector for the incoming command queue 2024-02-05 18:57:58 +01:00
Rubidiumandrubidium42 b3aa8a9c35 Codechange: use std::vector for the outgoing command "queues" 2024-02-05 18:57:58 +01:00
Peter NelsonandGitHub 09a12f230f Fix: Signals were incorrectly shifted by 1 pixel when selected. (#12005)
Most shifting when pressed was removed by 884b9e66.
2024-02-05 17:55:04 +00:00
Rubidiumandrubidium42 63708609fb Codechange: define the size of the PacketType enumerations 2024-02-05 17:10:35 +01:00
Rubidiumandrubidium42 6f77c2eaa2 Codechange: use size_t for the MTU limits and remove default parameter 2024-02-05 17:10:35 +01:00
Rubidiumandrubidium42 72a44b0df6 Codechange: use references for handling received TCP packets 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 794f12dc24 Codechange: cascade through SendNeedGame/CompanyPassword functions, instead of duplicating logic for determining whether to call these functions 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 8add0bf8ec Codechange: use references for game info serialization 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 84623d2123 Codechange: use references for UDP packets 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 031a9d4e26 Codechange: use std::unique_ptr for the Packets created to send via TCP 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 36e1b32ccf Codechange: use std::deque of std::unique_ptr to queue packets 2024-02-05 16:30:49 +01:00
Rubidiumandrubidium42 c77a45ed86 Codechange: use std::unique_ptr for receiving network packets 2024-02-05 16:30:49 +01:00
Richard WheelerandGitHub 4ba62594e5 Change: Update OpenTTD TTF fonts to v0.5 (#11994)
Corrects line height in Windows to the exact intended pixel values, along with change of OpenTTD Sans to use tabular lining numerals and minor bugfixes.
2024-02-05 10:09:18 -05:00
81 changed files with 2172 additions and 1807 deletions
+16 -2
View File
@@ -1,4 +1,18 @@
14.0-beta2 (2023-02-04)
14.0-beta3 (2024-02-06)
------------------------------------------------------------------------
Add: [Script] ScriptTileList_StationCoverage to get station coverage area (#12015)
Change: Update OpenTTD TTF fonts to v0.5 (#11994)
Fix #12012: Crash when opening orders of another company (#12013)
Fix #12001: Use correct valid cargo check for old-style NewGRF town house 3rd cargo set up (#12006)
Fix #11997: Adjust economy date by 1920 when loading TTD/TTO savegames (#12007)
Fix: Focus hotkey in road/tram stop building window (#12008)
Fix: Signals were incorrectly shifted by 1 pixel when selected (#12005)
Fix: Missing default vehicles and industry acceptance/production (#12000)
Fix: [Script] Avoid overflow in scripts when infinite money is enabled (#12016)
Fix: [Script] Don't kill GS misusing GSText (#12009)
14.0-beta2 (2024-02-04)
------------------------------------------------------------------------
Change: [NewGRF] Improved support for redefining default cargo types (#11719)
Fix #11982: Crash when trying to place signals on things other than plain rails (#11977)
@@ -10,7 +24,7 @@ Fix #11802: Made determining water region edge traversability more robust (#1198
Fix: Second colour vehicle-type default liveries were not being updated (#11971)
14.0-beta1 (2023-02-03)
14.0-beta1 (2024-02-03)
------------------------------------------------------------------------
Feature: Order option to unbunch vehicles at depot (#11945)
Feature: Infinite money mode (#11902)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -3,4 +3,4 @@
The OpenTTD TrueType font was created by Zephyris and is maintained on [Github](https://github.com/zephyris/openttd-ttf).
It is licensed under GPL-2.0.
The currently included files correspond to release v0.4.
The currently included files correspond to release v0.5.
+16
View File
@@ -1358,6 +1358,21 @@ function Regression::Station()
}
}
function Regression::StationList()
{
print("");
print("--StationList--");
local road_stations = AIStationList(AIStation.STATION_TRUCK_STOP);
for (local st = road_stations.Begin(); !road_stations.IsEnd(); st = road_stations.Next()) {
print(" GetName(): " + AIStation.GetName(st));
print(" TileList_StationCoverage:");
local coverage = AITileList_StationCoverage(st);
for (local i = coverage.Begin(); !coverage.IsEnd(); i = coverage.Next()) {
print(" " + i);
}
}
}
function Regression::Tile()
{
print("");
@@ -1989,6 +2004,7 @@ function Regression::Start()
this.Road();
this.Sign();
this.Station();
this.StationList();
this.Tile();
this.TileList();
this.Town();
+150 -3
View File
@@ -7761,6 +7761,153 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetCargoPlannedFromVia(1000, 1000, 0, 1000): -1
GetCargoPlannedFromVia(1000, 1000, 1000, 1000): -1
--StationList--
GetName(): Little Frutford Valley
TileList_StationCoverage:
34192
34191
34190
34189
34188
34187
34186
33936
33935
33934
33933
33932
33931
33930
33680
33679
33678
33677
33676
33675
33674
33424
33423
33422
33421
33420
33419
33418
33168
33167
33166
33165
33164
33163
33162
32912
32911
32910
32909
32908
32907
32906
32656
32655
32654
32653
32652
32651
32650
GetName(): Little Frutford Woods
TileList_StationCoverage:
34439
34438
34437
34436
34435
34434
34433
34432
34187
34186
34185
34184
34183
34182
34181
34180
34179
34178
34177
34176
33931
33930
33929
33928
33927
33926
33925
33924
33923
33922
33921
33920
33675
33674
33673
33672
33671
33670
33669
33668
33667
33666
33665
33664
33419
33418
33417
33416
33415
33414
33413
33412
33411
33410
33409
33408
33163
33162
33161
33160
33159
33158
33157
33156
33155
33154
33153
33152
32907
32906
32905
32904
32903
32902
32901
32900
32899
32898
32897
32896
32651
32650
32649
32648
32647
32646
32645
32644
32643
32642
32641
32640
--Tile--
HasTreeOnTile(): false
IsFarmTile(): true
@@ -9589,9 +9736,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
--Valuate() with excessive CPU usage--
Your script made an error: excessive CPU usage in valuator function
*FUNCTION [unknown()] regression/main.nut line [2034]
*FUNCTION [unknown()] regression/main.nut line [2050]
*FUNCTION [Valuate()] NATIVE line [-1]
*FUNCTION [Start()] regression/main.nut line [2035]
*FUNCTION [Start()] regression/main.nut line [2051]
[id] 0
[this] TABLE
@@ -9600,7 +9747,7 @@ Your script made an error: excessive CPU usage in valuator function
[this] INSTANCE
Your script made an error: excessive CPU usage in valuator function
*FUNCTION [Start()] regression/main.nut line [2035]
*FUNCTION [Start()] regression/main.nut line [2051]
[Infinite] CLOSURE
[list] INSTANCE
+7
View File
@@ -79,6 +79,13 @@ static const CargoID CARGO_NO_REFIT = 0xFE; ///< Do not refit cargo of a vehicle
static const CargoID INVALID_CARGO = UINT8_MAX;
/** Mixed cargo types for definitions with cargo that can vary depending on climate. */
enum MixedCargoType {
MCT_LIVESTOCK_FRUIT, ///< Cargo can be livestock or fruit.
MCT_GRAIN_WHEAT_MAIZE, ///< Cargo can be grain, wheat or maize.
MCT_VALUABLES_GOLD_DIAMONDS, ///< Cargo can be valuables, gold or diamonds.
};
/**
* Special cargo filter criteria.
* These are used by user interface code only and must not be assigned to any entity. Not all values are valid for every UI filter.
+1 -1
View File
@@ -149,7 +149,7 @@ struct EngineInfo {
byte load_amount;
byte climates; ///< Climates supported by the engine.
CargoID cargo_type;
CargoLabel cargo_label;
std::variant<CargoLabel, MixedCargoType> cargo_label;
CargoTypes refit_mask;
byte refit_cost;
byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags
+3 -3
View File
@@ -110,7 +110,7 @@ struct IndustrySpec {
IndustryType conflicting[3]; ///< Industries this industry cannot be close to
byte check_proc; ///< Index to a procedure to check for conflicting circumstances
CargoID produced_cargo[INDUSTRY_NUM_OUTPUTS];
CargoLabel produced_cargo_label[INDUSTRY_NUM_OUTPUTS];
std::variant<CargoLabel, MixedCargoType> produced_cargo_label[INDUSTRY_NUM_OUTPUTS];
byte production_rate[INDUSTRY_NUM_OUTPUTS];
/**
* minimum amount of cargo transported to the stations.
@@ -118,7 +118,7 @@ struct IndustrySpec {
*/
byte minimal_cargo;
CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 accepted cargoes.
CargoLabel accepts_cargo_label[INDUSTRY_NUM_INPUTS];
std::variant<CargoLabel, MixedCargoType> accepts_cargo_label[INDUSTRY_NUM_INPUTS];
uint16_t input_cargo_multiplier[INDUSTRY_NUM_INPUTS][INDUSTRY_NUM_OUTPUTS]; ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargoes)
IndustryLifeType life_type; ///< This is also known as Industry production flag, in newgrf specs
byte climate_availability; ///< Bitmask, giving landscape enums as bit position
@@ -155,7 +155,7 @@ struct IndustrySpec {
*/
struct IndustryTileSpec {
std::array<CargoID, INDUSTRY_NUM_INPUTS> accepts_cargo; ///< Cargo accepted by this tile
std::array<CargoLabel, INDUSTRY_NUM_INPUTS> accepts_cargo_label;
std::array<std::variant<CargoLabel, MixedCargoType>, INDUSTRY_NUM_INPUTS> accepts_cargo_label;
std::array<int8_t, INDUSTRY_NUM_INPUTS> acceptance; ///< Level of acceptance per cargo type (signed, may be negative!)
Slope slopes_refused; ///< slope pattern on which this tile cannot be built
byte anim_production; ///< Animation frame to start when goods are produced
File diff suppressed because it is too large Load Diff
+20 -1
View File
@@ -668,6 +668,8 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Total:
###next-name-looks-similar
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Nombre d'estacions visitades recentment per algun vehicle. Estacions, parades d'autobús, aeroports, etc. es compten per separat, fins i tot si pertanyen a la mateixa estació.
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos anys de servei).
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}El benefici del vehicle que pitjors ingressos ha tingut (només es tenen en compte els vehicles amb més de dos períodes de servei).
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el mínim benefici dels darrers 12 trimestres
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Quantitat de diners guanyats durant el trimestre amb el màxim benefici dels darrers 12 trimestres
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Unitats de càrrega entregades en els darrers quatre trimestres
@@ -925,7 +927,10 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el triple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES}
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} de {STRING} fins a {STRING} ingressarà el quàdruple de la tarifa habitual durant {UNITS_YEARS_OR_MINUTES}
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 mesos de misèria als motoristes!
STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}!{}{}El programa de millora de carrers pagat per {STRING} provoca 6 minuts de misèria als motoristes!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopoli de transports
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Les autoritats locals de {TOWN} signen un contracte amb {STRING} per a obtenir 12 mesos de drets de transport exclusius!
# Extra view window
STR_EXTRA_VIEWPORT_TITLE :{WHITE}Vista {COMMA}
@@ -1416,7 +1421,8 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :Qualsevol vista
STR_CONFIG_SETTING_BRIBE :Permet subornar les autoritats locals: {STRING}
###length 2
STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet a les companyies intentar subornar l'autoritat local. Si el suborn és detectat per un inspector, la companyia no podrà actuar a la població durant sis mesos.
STR_CONFIG_SETTING_BRIBE_HELPTEXT :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis mesos.
STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Permet que les companyies subornin l'autoritat local. Si algun inspector ho detecta, la companyia no podrà actuar a la població durant sis minuts.
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Permet comprar els drets del transport en exclusiva: {STRING}
###length 2
@@ -2367,6 +2373,7 @@ STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data actual
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}h{NBSP}{NUM}{NBSP}m
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Temps de joc
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Temps de joc{}sense contar pauses
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Idioma, versió de servidor, etc.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Clica en una partida de la llista per triar-la
@@ -3646,6 +3653,7 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Suborna les aut
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una petita campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi petit al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una mitjana campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins un radi mitjà al voltant del centre de la població.{}{PUSH_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Inicia una gran campanya de publicitat, per atraure més passatgers i càrregues als teus serveis de transport.{}Proporciona una millora temporal dels ratis de les estacions dins d'un radi gran al voltant del centre de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Finança la reconstrucció de la xarxa de carreteres urbanes.{}Provoca molèsties considerables al trànsit de vehicles per carretera durant 6 mesos.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Construeix una estàtua en honor a la teva companyia.{}Proporciona una millora permanent dels ratis d'estació de la població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finança la construcció de nous edificis comercials a la població.{}Proporciona una millora temporal del creixement d'aquesta població.{}{POP_COLOUR}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Suborna les autoritats locals per a incrementar el vostre rati i cancel·lar els drets exclusius de transport del competidor, amb el risc de sancions greus si us pesquen.{}{POP_COLOUR}Cost:{NBSP}{CURRENCY_LONG}
@@ -4356,6 +4364,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Acció a
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Carregant / Descarregant
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Sortint
STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}S'espera per a separar
STR_VEHICLE_STATUS_CRASHED :{RED}Vehicle sinistrat!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariat
STR_VEHICLE_STATUS_STOPPED :{RED}Parat
@@ -4369,6 +4378,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sense o
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Cap a {WAYPOINT}, a {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Cap a {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Revisió a {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Separa i revisa a {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}No pot arribar a {STATION}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}No pot arribar a {WAYPOINT}, {VELOCITY}
@@ -4423,6 +4433,11 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Interval
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Interval de les revisions: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Última revisió: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Última revisió: fa {LTBLUE}{NUM} minut{P "" s}
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Augmenta l'interval de servei 10 dies. Amb Ctrl+Clic, s'augmenta l'interval només 5 dies.
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Augmenta l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, s'augmenta només un 5{NBSP}%.
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Redueix l'interval de servei 10 dies. Amb Ctrl+Clic, es redueix l'interval només 5 dies.
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Redueix l'interval de servei 5 minuts. Amb Ctrl+Clic, es redueix l'interval només 1 minut.
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Redueix l'interval de servei un 10{NBSP}%. Amb Ctrl+Clic, es redueix l'interval només un 5{NBSP}%.
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Canvia el tipus d'interval de les revisions
STR_VEHICLE_DETAILS_DEFAULT :{G=Masculin}Predeterminat
@@ -4534,6 +4549,9 @@ STR_ORDER_DROP_UNBUNCH :Separa
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest dipòsit.
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquesta cotxera.
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Trieu l'acció que cal fer en aquest hangar.
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dades del vehicle on basar el salt a
@@ -5077,6 +5095,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipus de cotxer
# Depot unbunching related errors
STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... només pot tenir una ordre de separar.
STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... no es poden fer servir ordres de càrrega completa quan el vehicle té una ordre de separació.
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... no es pot separar un vehicle amb una ordre de càrrega completa.
STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... no pot fer servir ordres condicionals quan un vehicle té una ordre de separació.
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... no es pot separar un vehicle que té ordres condicionals.
+37
View File
@@ -267,6 +267,11 @@ STR_COLOUR_RANDOM :Náhodná
###length 17
STR_COLOUR_SECONDARY_DARK_BLUE :Tmavomodrá
STR_COLOUR_SECONDARY_SECONDARY_PINK :Růžová
STR_COLOUR_SECONDARY_LIGHT_BLUE :Světle modrá
STR_COLOUR_SECONDARY_GREEN :Zelená
STR_COLOUR_SECONDARY_PURPLE :Purpurová
STR_COLOUR_SECONDARY_ORANGE :Oranžová
STR_COLOUR_SECONDARY_BROWN :Hnědá
STR_COLOUR_SECONDARY_GREY :Šedá
STR_COLOUR_SECONDARY_WHITE :Bílá
@@ -276,6 +281,7 @@ STR_COLOUR_SECONDARY_WHITE :Bílá
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}m{P íle íle il}/h
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}uz{P el ly lů}
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp
STR_UNITS_POWER_METRIC :{DECIMAL}{NBSP}hp
@@ -317,7 +323,9 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}
# Time units used in string control characters
STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""}
STR_UNITS_YEARS :{NUM}{NBSP}{P rok roky let}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtrovat řetězec:
@@ -412,7 +420,9 @@ STR_SORT_BY_POPULATION :Podle populace
STR_SORT_BY_RATING :Hodnocení
STR_SORT_BY_NUM_VEHICLES :Počet vozidel
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Letošní celkový zisk
STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Celkový zisk v minulém období
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Celkový letošní zisk
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Celkový zisk v tomto období
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Loňský průměrný zisk
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Průměrný letošní zisk
@@ -772,6 +782,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Skladba
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Hudební stopu odstraníš ze současného programu (pouze u vlastního) kliknutím na ni
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Nejlepší společnosti
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Obchodník
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Manažer
@@ -864,6 +875,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}Automatick
STR_STATUSBAR_SAVING_GAME :{RED}* * HRA SE UKLÁDÁ * *
STR_STATUSBAR_SPECTATOR :{WHITE}(spectator)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(neomezené peníze)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Historie zpráv
@@ -986,6 +998,8 @@ STR_GAME_OPTIONS_VOLUME :Hlasitost
STR_GAME_OPTIONS_MUSIC_VOLUME :Hudba
STR_GAME_OPTIONS_VOLUME_0 :0%
STR_GAME_OPTIONS_VOLUME_25 :25 %
STR_GAME_OPTIONS_VOLUME_50 :50 %
STR_GAME_OPTIONS_VOLUME_75 :75%
STR_GAME_OPTIONS_VOLUME_100 :100%
@@ -1082,6 +1096,8 @@ STR_GAME_OPTIONS_GUI_SCALE_3X :3x
STR_GAME_OPTIONS_GUI_SCALE_4X :4x
STR_GAME_OPTIONS_GUI_SCALE_5X :5x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Účastnit se automatického průzkumu
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}O anketě a ochraně soukromí
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Náhled výsledků průzkumu
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Zobrazovat výsledek průzkumu z aktuálně běžící hry
@@ -1105,6 +1121,7 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Vyberte
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Další informace o základním hudebním setu
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stav zásuvného modulu:
@@ -1216,6 +1233,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbalit
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sbalit vše
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Vymazat všechny hodnoty
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(žádné vysvětlení není k dispozici)
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Výchozí hodnota: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Typ nastavení: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE_CLIENT :Nastavení klienta (není uchováno v uložených hrách; ovlivní všechny hry)
@@ -1397,6 +1415,7 @@ STR_CONFIG_SETTING_SHOWFINANCES :Ukazovat finan
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Na konci každého roku zobrazit okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti.
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Pokud je zapnuto, na konci každého období se zobrazí okno s finančním přehledem pro snadnou kontrolu hospodaření společnosti.
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Vydávat nové příkazy jako 'bez zastavení': {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normálně vozidlo zastavuje v každé stanici, kterou projíždí. Zapnutím této možnosti budou všechny nově vydané příkazy "Jet do" vydávány jako "bez zastavení" a vozidlo tak každou stanicí po cestě do cíle pouze projede bez odbavení. U jednotlivých příkazů nicméně lze ručně nastavit odlišné chování.
@@ -1447,6 +1466,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Žádná*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Redukovaný
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Obvyklý
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Povolit výstavbu železničních přejezdů na silnicích nebo železničních tratích vlastněných jinými společnostmi
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Stavba průjezdných zastávek na obecních silnicích: {STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Povoluje stavbu průjezdných stanic na městem vlastněných silnicích
@@ -1483,6 +1503,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Pokud je zapnut
###length 2
STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minut v roce: {STRING}
###setting-zero-is-special
@@ -1696,6 +1717,7 @@ STR_CONFIG_SETTING_LOADING_INDICATORS :Používat ukaz
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vyber jestli budou zobrazovány ukazatele naložení nad nakládajícími a vykládajícími vozidly.
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekundy
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Ukazovat v jízdním řádu příjezdy a odjezdy: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazit předpokládané časy příjezdu a odjezdu v jízdních řádech.
@@ -1803,6 +1825,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Vypnuto
STR_CONFIG_SETTING_NOSERVICE :Vypnout servisy, když jsou vypnuty poruchy: {STRING}
STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pokud je zapnuto a zároveň jsou vypnuty poruchy, vozidla nebudou vůbec jezdit do servisu, protože se nemohou nikdy porouchat
STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Pomalejší nakládání u vlaků delších než stanice: {STRING}
STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :Pokud je zapnuto, u vlaků delší než stanice je nakládání pomalejší než u vlaků, které se do stanice vejdou. Nastavení neovlivňuje hledání cesty.
STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Zapnout omezení rychlosti vagonů: {STRING}
STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pokud zapnuto, použije rychlostní omezení vagónů při stanovení maximální rychlosti vlaku
@@ -2023,6 +2047,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kdykoliv se ryc
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperiální (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrické (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :uzly
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednotky výkonu vozidla: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kdykoliv se výkon vozidla zobrazí v uživatelském rozhraní, bude ve zvolených jednotkách
@@ -2072,6 +2097,7 @@ STR_CONFIG_SETTING_ACCOUNTING :Účetnictví
STR_CONFIG_SETTING_VEHICLES :Dopravní prostředky
STR_CONFIG_SETTING_VEHICLES_PHYSICS :Fyzika
STR_CONFIG_SETTING_VEHICLES_ROUTING :Směrování
STR_CONFIG_SETTING_VEHICLES_ORDERS :Příkazy
STR_CONFIG_SETTING_LIMITATIONS :Omezení
STR_CONFIG_SETTING_ACCIDENTS :Katastrofy / Nehody
STR_CONFIG_SETTING_GENWORLD :Generování krajiny
@@ -2080,6 +2106,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Městská sprá
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Města
STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Průmysl
STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Distribuce nákladu
STR_CONFIG_SETTING_ENVIRONMENT_TREES :Stromy
STR_CONFIG_SETTING_AI :Konkurenti
STR_CONFIG_SETTING_AI_NPC :Umělá inteligence
STR_CONFIG_SETTING_NETWORK :Síť
@@ -2203,6 +2230,7 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Zobrazit
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Zobrazit barevná schémata pro silniční vozidla
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Zobrazit barevná schémata pro lodě
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Zobrazit barevná schémata pro letadla
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Zobrazit barvy skupin lodí
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Vybrat primární barvu označeného schématu. Ctrl+kliknutí nastaví tuto barvu každému schématu
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Vybrat sekundární barvu označeného schématu. Ctrl+Kliknutí nastaví tuto barvu každému schématu
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Vyber, které barevné schéma chceš změnit (více označíš s Ctrl). Schéma změníš kliknutím na tlačítko
@@ -3820,6 +3848,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Průplav
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stanice:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Staniční oblasti
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Letiště
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/období
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Průmysl
@@ -4145,6 +4174,9 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramvaj
STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}letadlo
STR_ENGINE_PREVIEW_SHIP :{G=f}loď
STR_ENGINE_PREVIEW_SPEED_POWER :Rychlost: {VELOCITY} Výkon: {POWER}
STR_ENGINE_PREVIEW_TYPE_RANGE :Typ letadla: {STRING} Dosah: {COMMA} políč{P ko ka ek}
STR_ENGINE_PREVIEW_RUNCOST_YEAR :Provozní náklady: {CURRENCY_LONG}/rok
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Vyměňování {STRING} - {STRING}
@@ -4309,6 +4341,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapacita
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Podíl za převoz: {LTBLUE}{CURRENCY_LONG}
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Prodloužit interval údržby o 5 minut. Ctrl+kliknutí prodlouží interval údržby o 1 minutu.
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Změnit typ servisního intervalu
STR_VEHICLE_DETAILS_DEFAULT :Defaultní
@@ -4416,6 +4449,7 @@ STR_ORDER_DROP_HALT_DEPOT :Zastavit
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Vyber příkaz k provedení v této garáži
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vlastnost vozidla, podle které přeskakovat
@@ -4562,6 +4596,8 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Vozidlo
STR_TIMETABLE_STATUS_LATE :{BLACK}Vozidlo má {STRING} zpoždění
STR_TIMETABLE_STATUS_EARLY :{BLACK}Vozidlo jede {STRING} napřed
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tento jízdní řád ještě nezačal
STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Tento jízdní řád začne {STRING}
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Tento jízdní řád začne za {COMMA} sekund{P u y ""}
@@ -5716,6 +5752,7 @@ STR_UNKNOWN_STATION :neznámá stani
STR_DEFAULT_SIGN_NAME :Nápis
STR_COMPANY_SOMEONE :někdo
STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Pozorovatel, {1:STRING}
+7
View File
@@ -329,6 +329,7 @@ STR_SORT_BY_TRANSPORTED :Transporteret
STR_SORT_BY_NUMBER :Nummer
STR_SORT_BY_PROFIT_LAST_YEAR :Afkast sidste år
STR_SORT_BY_PROFIT_THIS_YEAR :Afkast i år
STR_SORT_BY_PROFIT_THIS_PERIOD :Profit denne periode
STR_SORT_BY_AGE :Alder
STR_SORT_BY_RELIABILITY :Pålidelighed
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Total kapacitet for hver lasttype
@@ -651,7 +652,9 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Lån:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}I alt:
###next-name-looks-similar
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Antal køretøjer, der gav overskud sidste år. Dette omfatter vejkøretøjer, tog, skibe og fly
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Antal nyligt servicerede stationer. Togstationer, busstoppesteder, lufthavne og så videre tælles separat, selv om de tilhører den samme station
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Fortjenesten af køretøjet med den laveste indkomst (kun køretøjer ældre end to år tages i betragtning)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det laveste afkast i de sidste 12 kvartaler
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Indkomst i kvartallet med det højeste afkast i de sidste 12 kvartaler
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Antal enheder fragtet i de sidste 4 kvartaler
@@ -2315,6 +2318,7 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kortstø
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kortstørrelse for spillet{}Klik for at sortere efter område
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Dato
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Aktuel dato
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Sprog, server version, osv.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Klik på et spil fra listen for at vælge det
@@ -2686,6 +2690,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
# Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transporteres tilbage ({COMMA}% of capacity)
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Gennemsnitlig rejsetid: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vis dækningsområde
@@ -4165,6 +4170,7 @@ STR_ENGINE_PREVIEW_AIRCRAFT :fly
STR_ENGINE_PREVIEW_SHIP :skib
STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
STR_ENGINE_PREVIEW_COST_WEIGHT :Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING}
@@ -4334,6 +4340,7 @@ STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Last service: {
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ændre serviceintervallets type
STR_VEHICLE_DETAILS_DEFAULT :Standard
STR_VEHICLE_DETAILS_MINUTES :Minutter
STR_VEHICLE_DETAILS_PERCENT :Procent
###length VEHICLE_TYPES
+4
View File
@@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :Unbunch
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
+4
View File
@@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :Unbunch
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Select the action to take at this hangar
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
+31 -10
View File
@@ -320,8 +320,13 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m
# Time units used in string control characters
STR_UNITS_DAYS :{COMMA}{NBSP}tago{P "" j}
STR_UNITS_SECONDS :{COMMA}{NBSP}sekundo{P "" j}
STR_UNITS_MONTHS :{NUM}{NBSP}monato{P "" j}
STR_UNITS_MINUTES :{NUM}{NBSP}minuto{P "" j}
STR_UNITS_YEARS :{NUM}{NBSP}jaro{P "" j}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtroteksto:
@@ -430,7 +435,7 @@ STR_GOTO_ORDER_VIEW :{BLACK}Itinero
###length 31
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Paŭzigu la ludon
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Rapide pluirigu la ludon
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcioj kaj agordoj
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Agordoj
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Konservu ludon, foriru ludo, forlasi
STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Montru mapon, ekstran vidujon, fluon de ŝarĝoj aŭ liston de ŝildoj
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Montru urbaron
@@ -489,7 +494,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Forlasi
# Settings menu
###length 16
STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj opcioj
STR_SETTINGS_MENU_GAME_OPTIONS :Ludaj agordoj
STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Agordoj
STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ludoskriptaj agordoj
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Agordoj de NewGRF
@@ -506,7 +511,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Travideblaj sig
# File menu
STR_FILE_MENU_SAVE_GAME :Konservu ludon
STR_FILE_MENU_LOAD_GAME :Ŝarĝu ludon
STR_FILE_MENU_LOAD_GAME :Enlegi ludon
STR_FILE_MENU_QUIT_GAME :Foriru de la ludo
STR_FILE_MENU_EXIT :Fermu
@@ -947,7 +952,12 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Nova {ST
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subvencia oferto ne plu validas:{}{}Transportado de {STRING} de {STRING} al {STRING} ne estos subvenciata.
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvencio retiriĝis:{}{}Servo de {STRING} de {STRING} al {STRING} ne plu estas subvenciata.
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Subvencia proponiĝas:{}{}Unua {STRING} de {STRING} al {STRING} ricevos {UNITS_YEARS_OR_MINUTES} subvencion de la lokaj estroj!
###length 4
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kun aldono je 50% dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos duoble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos trioble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Suvencion gajnis {STRING}!{}{}{STRING} de {STRING} al {STRING} pagiĝos kvaroble dum la sekvontaj {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transporta monopolo!
@@ -959,7 +969,7 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Gluu de
STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Gluu la lokon de ĉi tiu vidujo al la ĉefvido
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj Opcioj
STR_GAME_OPTIONS_CAPTION :{WHITE}Ludaj agordoj
STR_GAME_OPTIONS_TAB_GENERAL :Ĝenerale
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}Elektu ĝeneralajn agordojn
@@ -1287,6 +1297,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Daŭro de subve
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Indiku por kiom da jaroj validas subvencio
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}n
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Neniuj subvencioj
@@ -1464,6 +1475,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veturiloj nenia
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Se tiu ĉi agordo estas aktiva, ĉiuj modeloj de veturiloj restos aĉeteblaj por ĉiam post ekhaveblo
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendaro
###setting-zero-is-special
@@ -2078,14 +2090,14 @@ STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... ne t
# Intro window
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
STR_INTRO_NEW_GAME :{BLACK}Nova Ludo
STR_INTRO_NEW_GAME :{BLACK}Novan ludon
STR_INTRO_LOAD_GAME :{BLACK}Ŝarĝu ludon
STR_INTRO_PLAY_SCENARIO :{BLACK}Ludu Scenaron
STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludu Altecmapon
STR_INTRO_PLAY_SCENARIO :{BLACK}Ludi scenaron
STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Ludi altecmapon
STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenarkreilo
STR_INTRO_MULTIPLAYER :{BLACK}Pluraj Ludantoj
STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj Opcioj
STR_INTRO_GAME_OPTIONS :{BLACK}Ludaj agordoj
STR_INTRO_HIGHSCORE :{BLACK}Altpoentara tabelo
STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Agordoj
STR_INTRO_NEWGRF_SETTINGS :{BLACK}Agordoj de NewGRF
@@ -2106,7 +2118,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Elektu '
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Elektu 'sub-tropikan' landstilon
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Elektu 'ludlandan' landstilon
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montru ludajn opciojn
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Montri ludajn agordojn
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Montru altpoentara tabelo
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Montru agordojn
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Montri NewGRF-agordojn
@@ -2394,7 +2406,7 @@ STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}Jes, ĉi
STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}Jes, ne demandu denove
STR_NETWORK_ASK_SURVEY_CAPTION :Partopreni aŭtomatan sondadon?
STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj Opcioj".
STR_NETWORK_ASK_SURVEY_TEXT :Ĉu vi volas partopreni la aŭtomatan sondadon?{}OpenTTD sendos sondaĵon post foriro el ludo.{}Vi povas ŝanĝi tion ĉi iam ajn sub "Ludaj agordoj".
STR_NETWORK_ASK_SURVEY_PREVIEW :Antaŭmontru sondaĵrezulton
STR_NETWORK_ASK_SURVEY_LINK :Pri sondado kaj privateco
STR_NETWORK_ASK_SURVEY_NO :Ne
@@ -2614,6 +2626,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
# Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} transportenda reen ({COMMA}% de la kapacito)
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Meznombra veturtempo: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Ŝarĝregiona marko
@@ -3428,6 +3441,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} liverita
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (ankoraŭ bezonata)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (liverita)
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS}
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}La urbo kreskas ĉiun {ORANGE}{UNITS_DAYS_OR_SECONDS} (pagata)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}La urbo {RED}ne{BLACK} kreskas
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Urba brulimo: {ORANGE}{COMMA}{BLACK} maks: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centri ĉefvidon ĉe la urbo. Stir+Klak por malfermi novan vidujon ĉe la urba loko.
@@ -3504,8 +3519,10 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Fermu
# Subsidies window
STR_SUBSIDIES_CAPTION :{WHITE}Subvencioj
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Subvencioj haveblas por jenaj servoj:
STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({STRING})
STR_SUBSIDIES_NONE :{ORANGE}- Neniu -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Servoj subvenciataj:
STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} de {STRING} al {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING})
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klaku servon por centri vidpunkto ĉe la industrio/urbo. Ctrl+Klak por malfermi novan vidujon ĉe la loko
# Story book window
@@ -4184,6 +4201,8 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Enhaveco
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transigaj Kreditoj: {LTBLUE}{CURRENCY_LONG}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}{NBSP}tagoj{BLACK} {STRING}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Prizorga intertempo: {LTBLUE}{COMMA}%{BLACK} {STRING}
STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Ŝanĝi la tipo de servon intervalon
STR_VEHICLE_DETAILS_DEFAULT :Defaŭlto
@@ -4252,6 +4271,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Montri h
STR_ORDERS_LIST_TOOLTIP :{BLACK}Ordonlisto - klaku ordonon por elekti. Ctrl+Klak rulumas al la celstacio
STR_ORDER_INDEX :{COMMA}:{NBSP}
STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Fino de Ordonoj - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Fino de Kunhavitaj Ordonoj - -
@@ -4549,6 +4569,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Ludoskripto
STR_AI_SETTINGS_CLOSE :{BLACK}Fermi
STR_AI_SETTINGS_RESET :{BLACK}Reŝargo
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
# Textfile window
+165 -108
View File
@@ -366,6 +366,7 @@ STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kokonaistuotto
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_AVERAGE_PROFIT_LAST_YEAR :Keskimääräinen tuotto viime vuonna
STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Keskimääräinen tuotto viime jaksolla
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Keskimääräinen tuotto tänä vuonna
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Keskimääräinen tuotto tällä jaksolla
@@ -383,32 +384,32 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Tauko
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Nopeuta peliä
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Valinnat ja asetukset
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Tallenna, lataa tai hylkää peli, lopeta ohjelma
STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Näytä kartta, lisänäkymä, rahtivirrat tai kylttilista
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto
STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Näytä tukitarjoukset
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Näytä luettelo yhtiön asemista
STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Avaa kartta, lisänäkymä, rahtivirrat tai kylttilista
STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Näytä kuntahakemisto tai perusta kunta
STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Avaa lista tuista
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Avaa luettelo yhtiön asemista
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Näytä yhtiön taloustiedot
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Näytä yhtiön yleiset tiedot
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Näytä yhtiöhistoria
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Näytä tavoitteet
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Avaa tarinakirja
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Avaa tavoiteluettelo
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Näytä yhtiökuvaajat ja rahtitaksat
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Näytä yhtiökilpataulukko
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Tutki teollisuuslaitoksia tai rahoita uuden teollisuuden rakentamista
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Näytä luettelo yhtiön junista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Näytä luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Näytä luettelo yhtiön laivoista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttää luettelon ilman ryhmäluetteloa.
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä näkymää
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna näkymää
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Avaa yhtiökilpataulukko
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Avaa teollisuushakemisto, teollisuusketjut, tai rahoita uuden teollisuuden rakentaminen
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Avaa luettelo yhtiön junista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät päinvastoin kuin valitussa asetuksessa.
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Avaa luettelo yhtiön ajoneuvoista. Ctrl+napsautus näyttää tai piilottaa ajoneuvoryhmät päinvastoin kuin valitussa asetuksessa
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Avaa luettelo yhtiön laivoista. Ctrl+napsautus näyttää tai piilottaa kulkuneuvoryhmät, päinvastoin kuin valitussa asetuksessa
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Näytä luettelo yhtiön ilma-aluksista. Ctrl+napsautus näyttääksesi näyttää tai piilottaa ajoneuvoryhmiä, päinvastoin kuin valitussa asetuksessa
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Lähennä
STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Loitonna
STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Rakenna teitä
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Rakenna raitioteitä
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Rakenna satamia
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Tieinfrastruktuurin rakentaminen
STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Raitiotieinfrastruktuurin rakentaminen
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Vesiväyläinfrastruktuurin rakentaminen
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Rakenna lentokenttiä
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkaustyökalupalkki maan kohottamiseen/madaltamiseen, puiden istuttamiseen, jne.
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Näytä ääni- ja musiikkiasetukset
STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Näytä viimeisin viesti/uutisraportti, näytä viestihistoria tai poista kaikki viestit
STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Maa-aluetiedot, kuvakaappaus, tietoja OpenTTD:stä, kehittäjätyökalut
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Avaa maastonmuokkausvalikko, puuvalikko, tai aseta kyltti
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Avaa ääni- ja musiikkiasetukset
STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Avaa viimeisin viesti tai uutisraportti, avaa viestihistoria, tai poista kaikki viestit
STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Avaa maa-aluetiedot, kuvakaappausvalikko, OpenTTD:n tekijäluettelo tai kehittäjätyökalut
STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Vaihda työkalupalkkeja
# Extra tooltips for the scenario editor toolbar
@@ -418,15 +419,15 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Skenaar
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Siirrä aloituspäivää vuodella taaksepäin
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Siirrä aloituspäivää vuodella eteenpäin
STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Aseta aloitusvuosi napsauttamalla
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Näytä kartta, kuntahakemisto
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Maaston luonti
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien luonti
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Teollisuuden luonti
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tienrakennus
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotien rakentaminen
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Avaa kartta, lisänäkymä, kylttiluettelo tai kunta- tai teollisuushakemisto
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Avaa maastonmuokkausvalikko tai luo uusi maailma
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Kuntien rakentaminen tai luominen
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Rakenna tai luo teollisuutta
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Tieinfrastruktuurin rakentaminen
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Raitiotieinfrastruktuurin rakentaminen
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Istuta puita. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Sijoita kyltti
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Sijoita objekti. Ctrl+napsautus+vedä valitsee alueen vinottain. Painettaessa Shit näyttää vain kustannusarvion
# Scenario editor file menu
###length 7
@@ -633,6 +634,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Napsauta
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Yhtiökilpataulukko
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} ”{STRING}”
STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}.
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Veturinkuljettaja
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Liikennepäällikkö
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Kuljetusjohtaja
@@ -664,6 +666,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Laina:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Yhteensä:
###next-name-looks-similar
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Viime vuonna voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Viime jaksolla voittoa tuottaneiden kulkuneuvojen lukumäärä. Tähän sisältyvät ajoneuvot, junat, laivat ja lentokoneet
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Asemien osien määrä. Kaikki osat asemista (esim. rautatieasema, bussipysäkki, lentokenttä) lasketaan, vaikka ne olisivat yhdistettynä yhdeksi asemaksi
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Vähiten tuottaneen kulkuneuvon tuotto (huomioon otetaan vain yli kahden vuoden ikäiset kulkuneuvot)
@@ -901,6 +904,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} ei löydä reittiä päämäärään
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} on eksynyt
STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime vuonna oli {CURRENCY_LONG}
STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Kulkuneuvon {VEHICLE} tuotto viime jaksolla oli {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} ei pääse seuraavaan määränpäähän koska se on toimintasäteen ulkopuolella
STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Korvauksen epäonnistuminen pysäytti kulkuneuvon {VEHICLE}
@@ -917,11 +921,17 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Tukitarjous päättynyt:{}{}{STRING} välillä {STRING} {STRING} ei enää tulla tukemaan
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Tuki vedetty pois:{}{}{STRING} välillä {STRING}-{STRING} ei enää tueta
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Tuki tarjolla:{}{}Paikallisviranomaiset tukevat ensimmäistä {STRING} välillä {STRING} {STRING} {UNITS_YEARS_OR_MINUTES}!
###length 4
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} {STRING} tuottaa puolitoistakertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} {STRING} tuottaa kaksinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} {STRING} tuottaa kolminkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} sai tuen!{}{}{STRING} välillä {STRING} {STRING} tuottaa nelinkertaisesti seuraavat {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 kuukautta kärsimystä!
STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Liikennekaaos paikkakunnalla {TOWN}!{}{}Yhtiön {STRING} rahoittama tienrakennusohjelma tuo autoilijoille 6 minuuttia kärsimystä!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Kuljetusmonopoli!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 kuukauden kuljetusyksinoikeudesta!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}Kunnan {TOWN} viranomaiset ovat sopineet yhtiön {STRING} kanssa 12 minuutin kuljetusyksinoikeudesta!
# Extra view window
@@ -1261,6 +1271,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :oikealla
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekunti{P 0 "" a}
STR_CONFIG_SETTING_INFINITE_MONEY :Loputon raha: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Salli rajaton rahankäyttö ja estä yritysten konkurssit
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Suurin mahdollinen laina alussa: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Suurin mahdollinen yhtiön ottama laina (ottamatta huomioon inflaatiota)
@@ -1288,6 +1300,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Tuen kesto: {ST
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Aseta myönnettävän tuen kesto vuosina
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Aseta myönnettävän tuen kesto jaksoina
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Ei tukia
@@ -1349,7 +1362,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :90 asteen kää
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 asteen käännöksiä esiintyy kun vaakasuuntaista rataa seuraa pystysuuntainen rata viereisellä ruudulla, tämä vaatii junan kääntymään 90 astetta ruutujen reunalla normaalin 45 asteen sijasta.
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Salli ei-vierekkäisten asemien yhdistäminen: {STRING}
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin. Vaatii Ctrl-näppäimen painamisen rakennettaessa
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Mahdollistaa aseman osien rakentamisen vaikka ne eivät olisi kosketuksissa olemassaoleviin aseman osiin painamalla Ctrl-näppäintä rakennettaessa
STR_CONFIG_SETTING_INFLATION :Inflaatio: {STRING}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Ota talouden inflaatio käyttöön. Mikäli käytössä, hinnat nousevat hieman nopeammin kuin kuljetusmaksut
@@ -1389,6 +1402,7 @@ STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Näytä talousi
###length 2
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Mikäli käytössä, talousikkuna näytetään jokaisen vuoden lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Mikäli käytössä, talousikkuna näytetään jokaisen jakson lopussa yhtiön taloudellisen tilanteen seurannan helpottamiseksi
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Uudet käskyt ovat oletusarvoisesti ilman välipysähdyksiä: {STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Normaalisti kulkuneuvo pysähtyy jokaisella läpikulkemallaan asemalla. Mikäli tämä asetus on käytössä kulkuneuvot eivät pysähdy ajaessaan asemien läpi. Huomioi, että tämä asetus määrittää oletusarvoisen toiminnon uusille kulkuneuvoille. Asetusta voidaan muuttaa erikseen kunkin kulkuneuvon kohdalla
@@ -1415,7 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Salli yhtiöide
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Salli kuljetusyksinoikeuksien ostaminen: {STRING}
###length 2
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät vastaanota rahtia seuraavan vuoden ajan
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista kuukauteen
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Jos yhtiö ostaa kuljetusyksinoikeudet kuntaan, vastustajien matkustaja- ja rahtiasemat eivät ota vastaan rahtia kahteentoista minuuttiin
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Salli rakennusten rahoittaminen: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Sallii yhtiöiden rahoittaa uusien talojen rakentamista kunnissa
@@ -1424,7 +1439,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Salli paikallis
STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Salli yritysten antaa kunnille rahaa tiestön peruskorjaukseen tiestöön perustuvien palvelujen sabotoimiseksi kunnassa
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Salli rahan lähettäminen muille yhtiöille: {STRING}
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Sallii rahan siirtämisen yhtiöiden välillä moninpelitilassa
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Salli rahan siirtäminen yhtiöiden välillä moninpelitilassa
STR_CONFIG_SETTING_FREIGHT_TRAINS :Rahdin painokerroin raskaiden junien simulointia varten: {STRING}
STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Määritä rahdin kuljettamisen vaikutus junissa. Korkeammat arvot tekevät rahdin kuljettamisesta raskaampaa junille, erityisesti mäissä
@@ -1488,9 +1503,15 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Seinäkello
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ä.
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalenteriaika jäädytetty)
STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Skaalaa taajamarahdin tuotantoa: {STRING}
STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Skaalaa kuntien tuottaman rahdin määrää tällä prosenttiluvulla.
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Skaalaa teollisuusrahdin tuotantoa: {STRING}
STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Skaalaa tuotantolaitosten tuottaman rahdin määrää tällä prosenttiluvulla.
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}{NBSP}%
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
@@ -1811,7 +1832,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lentokoneiden o
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Määritä oletushuoltoväli uusille lentokoneille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä
STR_CONFIG_SETTING_SERVINT_SHIPS :Laivojen oletushuoltoväli: {STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Määritä oletushuoltoväli uusille laivoille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}päivä{P 0 "" ä}/%
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}Päivä{P 0 "" s}/Minuutti{P 0 "" s}/%
###setting-zero-is-special
STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöstä
@@ -1903,7 +1924,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Opastimien väl
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Määrittää etäisyyden opastimien välillä seuraavaan esteeseen saakka (opastin, risteys) opastimia vedettäessä
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} ruutu{P 0 "" a}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Pidä opastimien etäisyys vakiona vedettäessä: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse käyttäytyminen vedettäessä opastimia Ctrl-näppäin pohjassa. Mikäli pois käytöstä, opastimia rakennetaan siltojen ja tunnelien ympärille pitkien opastimista vapaiden alueiden välttämiseksi. Mikäli käytössä, opastimia rakennetaan n ruudun välein, tehden vierekkäisten ratojen opastimien kohdistamisesta helpompaa
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Valitse opastimien sijoittelun käyttäytyminen opastimia vedettäessä. Mikäli poissa käytöstä, opastimia sijoitetaan tunneleiden ja siltojen ympärille pitkien opastimettomien osuuksien välttämiseksi. Mikäli käytössä, opastimet sijoitetaan n ruudun välein, mikä helpottaa opastimien kohdistamista rinnakkaisilla raiteilla
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Rakenna ensisijaisesti siipiopastimia ennen vuotta: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi jonka jälkeen käytetään valo-opastimia. Ennen tätä vuotta käytetään siipiopastimia (joilla on sama toiminnallisuus mutta eri ulkonäkö)
@@ -1911,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Valitse vuosi j
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Vaihda opastintyyppien välillä: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Valitse, mitkä opastintyypit ovat käytössä painettaessa Ctrl-näppäintä opastimia rakennettaessa
###length 2
STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Vain nykyinen ryhmä
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Näytä kaikki
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Näytä opastintyypit: {STRING}
@@ -2181,14 +2203,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Valitse
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Valitse subtrooppinen maastotyyppi
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Valitse lelumaan maastotyyppi
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Näytä pelin valinnat
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Näytä pistetaulukko
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Avaa pelin valinnat
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Avaa pistetaulukko
STR_INTRO_TOOLTIP_HELP :{BLACK}Tutustu dokumentaatioon ja online-resursseihin
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Näytä asetukset
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Näytä NewGRF-asetukset
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tarkista uutta ja päivitettyä sisältöä ladattavaksi
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Näytä tekoälyasetukset
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Näytä peliskriptiasetukset
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Avaa tekoälyasetukset
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Avaa peliskriptiasetukset
STR_INTRO_TOOLTIP_QUIT :{BLACK}Lopeta OpenTTD
STR_INTRO_BASESET :{BLACK}Valitusta perusgrafiikkapaketista puuttuu {NUM} sprite{P "" ä}. Tarkista, onko sille päivityksiä.
@@ -2245,7 +2267,7 @@ STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Näytä
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Näytä laivaryhmien värit
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Näytä ilma-alusryhmien värit
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Valitse valitun kaavan ensisijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille.
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaa tämän värin kaikille kaavoille.
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Valitse valitun kaavan toissijainen väri. Ctrl+napsautus asettaaksesi tämän värin kaikille kaavoille.
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Valitse muutettava väriteema, tai valitse useita Ctrl pohjassa. Paina valintalaatikkoa valitaksesi teeman
STR_LIVERY_TRAIN_GROUP_EMPTY :Junaryhmiä ei ole muodostettu
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Ajoneuvoryhmiä ei ole muodostettu
@@ -2356,6 +2378,8 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartan k
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kartan koko{}Valitse lajitellaksesi koon mukaan
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Päiväys
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Nykyinen päivämäärä
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Peliaika
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Peliaika, kun peli{}ei ollut pysäytettynä
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Kieli, palvelimen versio, jne.
@@ -2731,6 +2755,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA
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_TIME_EXTENSION :{}Keskimääräinen matka-aika: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Vaikutusalueen korostus
@@ -2759,16 +2784,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Sähköradan ra
STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Yksiraiteisen rakentaminen
STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Maglevin rakentaminen
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautateitä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna veturitalli (junien ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl mahdollistaa reittipisteiden yhdistämisen. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi Shiftiä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Pidä pohjassa Ctrl-näppäintä poistaaksesi myös aseman tai reittipisteen alla olevat raiteet
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Rakenna rautatietä. Ctrl+napsautus poistaa rautatietä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Rakenna rautatietä automaattisesti valittuun suuntaan. Ctrl+napsautus poistaaksesi rautatietä. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Rakenna junavarikko (junien ostamista ja huoltoa varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Rakenna reittipiste rautatielle. Ctrl+napsautus valitsee toisen reittipisteen, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Rakenna rautatieasema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Rakenna opastin rautatielle. Ctrl+napsautus rakentaa vaihtoehtoista opastintyyliä{}Ctrl+veto täyttää valitun rataosuuden opastimilla määrätyin välein. Ctrl+napsautus+veto täyttää seuraavaan risteykseen, asemaan tai opastimeen asti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Rakenna rautatiesilta. Painettaessa Shift näyttää vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Rakenna rautatietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Rautatien, opastimien, reittipisteiden ja asemien rakentaminen/poisto päälle/pois. Ctrl+napsautus poistaa myös reittipisteiden ja asemien raiteet
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Muunna/päivitä raidetyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_RAIL_NAME_RAILROAD :Rautatie
STR_RAIL_NAME_ELRAIL :Sähköistetty rautatie
@@ -2844,25 +2869,25 @@ STR_BRIDGE_TUBULAR_SILICON :Putkirakenne, p
# Road construction toolbar
STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Tien rakentaminen
STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Raitiotien rakentaminen
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Rakenna tieosuus. Ctrl+napsautus poistaa tieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Rakenna raitiotietä. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Rakenna tieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl vaihtaa rakennus-/poistotilan välillä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna autovarikko (ajoneuvojen ostamista ja huoltoa varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl mahdollistaa laitureiden yhdistämisen yhdeksi asemaksi. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Rakenna raitiotieosuus automaattisesti valittuun suuntaan. Ctrl+napsautus poistaa raitiotieosuuden. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Rakenna ajoneuvovarikko (ajoneuvojen ostamista ja huoltoa varten). Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Rakenna raitiotievarikko (vaunujen ostamiseen ja korjaamiseen). Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Rakenna linja-autoasema. Ctrl+napsautus liittää asemat. Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Rakenna raitiotien matkustaja-asema. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Rakenna lastauslaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Rakenna raitiotien rahtiasema. Ctrl+napsautus valitaksesi toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ota yksisuuntaiset tiet käyttöön/pois käytöstä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Rakenna maantiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Rakenna raitiotiesilta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Rakenna maantietunneli. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Rakenna raitiotietunneli. Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Tien rakentaminen/siirtäminen päälle/pois
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Vaihda raitiotien rakentamisen ja purkamisen välillä
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Shift vaihtaa muuntotilan ja kustannusarvion välillä
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Muunna tai päivitä tien tyyppi. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Muunna tai päivitä raitiotien tyyppi. Painettaessa Shift näyttää vain kustannusarvion
STR_ROAD_NAME_ROAD :Tie
STR_ROAD_NAME_TRAM :Raitiotie
@@ -2886,12 +2911,12 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Valitse
# Waterways toolbar (last two for SE only)
STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Vesireittien rakentaminen
STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Vesireitit
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulku. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satama. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Rakenna kanavia. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Rakenna sulkuja. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Rakenna telakka (laivojen ostamista ja huoltamista varten). Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Rakenna satamalaituri. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Sijoita poiju, jota voi käyttää reittipisteenä. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Rakenna akvedukti. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Rakenna kanava. Merenpinnan tasolla Ctrl+napsautus täyttää alueen merivedellä kanavan rakentamisen sijaan.
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Sijoita jokia. Ctrl valitsee alueen vinottain.
@@ -2904,7 +2929,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Satama
# Airport toolbar
STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Lentokentät
STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl liittää asemat. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Rakenna lentokenttä. Ctrl+napsautus valitsee toisen aseman, johon haluat tämän liitettävän. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
# Airport construction window
STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lentokentän valinta
@@ -2931,14 +2956,14 @@ STR_STATION_BUILD_NOISE :{BLACK}Aiheutet
# Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}Maastonmuokkaus
STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske ruudun kulmaa. Vetäminen laskee ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta ruudun kulmaa. Vetäminen nostaa ensimmäistä valittua kulmaa ja tasoittaa valitun alueen kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl valitsee alueen vinottain. Shift vaihtaa muokkaustilan ja kustannusarvion välillä
STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl valitsee alueen vinottain. Shift vaihtaa ostotilan ja kustannusarvion välillä
STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Laske maaruudun kulmaa. Napsautus+veto laskee ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Nosta maaruudun kulmaa. Napsautus+veto nostaa ensimmäisenä valittua kulmaa ja tasaa valitun alueen tämän kulman uudelle korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Tasoita maata ensimmäisen valitun kulman korkeudelle. Ctrl+napsautus+veto valitsee alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Osta maata tulevaa käyttöä varten. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Objektin valinta
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl valitsee alueen vinottain. Shift vaihtaa rakennustilan ja kustannusarvion välillä
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Valitse rakennettava objekti. Ctrl+napsautus+veto valitaksesi alueen vinottain. Painettaessa Shift näyttää vain kustannusarvion
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Valitse rakennettavan objektin luokka
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objektin esikatselu
STR_OBJECT_BUILD_SIZE :{BLACK}Koko: {GOLD}{NUM}×{NUM} ruutua
@@ -2950,7 +2975,7 @@ STR_OBJECT_CLASS_TRNS :Lähettimet
STR_PLANT_TREE_CAPTION :{WHITE}Puita
STR_PLANT_TREE_TOOLTIP :{BLACK}Valitse istutettava puutyyppi. Jos ruudussa on jo puu, tämä lisää uusia puita riippumatta valitun puun tyypistä
STR_TREES_RANDOM_TYPE :{BLACK}Sattumanvaraisia puita
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl valitsee alueen vinottain. Shift vaihtaa istutustilan ja kustannusarvion välillä
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Istuta sattumanvaraisia puulajeja. Ctrl+napsautus+veto valitsee alueen vinottain. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Satunnaisia puita.
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Istuta puita satunnaisesti maastoon
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Tavallinen
@@ -3292,9 +3317,9 @@ STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Luo maai
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset
STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Näytä tekoälyasetukset
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Avaa tekoälyasetukset
STR_MAPGEN_GS_SETTINGS :{BLACK}Peliskriptiasetukset
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Näytä peliskriptiasetukset
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Avaa peliskriptiasetukset
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Englantilainen
@@ -3570,7 +3595,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Kytke ki
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Muokkaa kyltin tekstiä
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin.
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä kyltin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kyltin sijaintiin
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Siirry seuraavaan kylttiin
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Siirry edelliseen kylttiin
@@ -3596,6 +3621,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} kuljetettu
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (tarvitaan lisää)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (kuljetettu)
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Kunta kasvaa {ORANGE}{UNITS_DAYS_OR_SECONDS} välein (rahoitettu)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Kunta {RED}ei{BLACK} kasva
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Meluraja kunnassa: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Keskitä päänäkymä kunnan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan kunnan sijaintiin.
@@ -3639,7 +3666,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Rahoita taajamien tieverkon peruskorjausta.{}Aiheuttaa huomattavia häiriöitä tieliikenteelle jopa 6 minuutin ajan.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Rakenna patsas yhtiösi kunniaksi.{}Parantaa asemien arvioita pysyvästi tässä kunnassa.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Rahoita uusien rakennusten rakentamista kunnassa.{}Tämä kiihdyttää tämän kunnan kasvua tilapäisesti.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Kilpailijan onnistunut lahjonta purkaa tämän sopimuksen.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 kuukaudeksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Osta kuljetusyksinoikeus kuntaan 12 minuutiksi.{}Kunnan viranomaiset eivät salli matkustajien ja rahdin käyttävän kilpailijoittesi asemia. Sopimus purkautuu, jos kilpailija onnistuu lahjomaan viranomaiset.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Lahjo viranomaisia parantaaksesi arviotasi ja keskeyttääksesi kilpailijan kuljetusyksinoikeuden; rangaistus voi kuitenkin olla ankara, jos jäät kiinni.{}{POP_COLOUR}Kustannus: {CURRENCY_LONG}
# Goal window
@@ -3686,11 +3714,15 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Sulje
# Subsidies window
STR_SUBSIDIES_CAPTION :{WHITE}Tuet
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Tarjotut tuet:
STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} välille {STRING} {STRING}{YELLOW} ({STRING})
STR_SUBSIDIES_NONE :{ORANGE}- Ei mitään -
STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Käytetyt tuet:
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän laitokseen/kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen/kunnan sijaintiin.
STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} kohteesta {STRING} kohteeseen {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING})
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Napsauta kuljetusyhteyttä keskittääksesi päänäkymän tuotantolaitokseen tai kuntaan. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen tai kunnan sijaintiin.
STR_SUBSIDIES_OFFERED_EXPIRY_DATE :viimeistään {DATE_SHORT}
STR_SUBSIDIES_OFFERED_EXPIRY_TIME :jäljellä {UNITS_MONTHS_OR_MINUTES}
STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :{DATE_SHORT} asti
STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} jäljellä
# Story book window
STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY}: historia
@@ -3831,7 +3863,7 @@ STR_FINANCES_BANK_BALANCE :{WHITE}{CURRENC
STR_FINANCES_BORROW_BUTTON :{BLACK}Nosta lainaa {CURRENCY_LONG}
STR_FINANCES_BORROW_TOOLTIP :{BLACK}Ota lisää lainaa. Ctrl+napsautus nostaa lainaa niin paljon kuin mahdollista.
STR_FINANCES_REPAY_BUTTON :{BLACK}Lyhennä lainaa {CURRENCY_LONG}
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentää lainaa niin paljon kuin mahdollista.
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Lyhennä lainaa. Ctrl+napsautus lyhentääksesi lainaa niin paljon kuin mahdollista.
STR_FINANCES_INFRASTRUCTURE_BUTTON :{BLACK}Infrastruktuuri
# Company view
@@ -3860,7 +3892,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Rakenna
STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Näytä päämaja
STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Näytä yhtiön päämaja
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Siirrä päämaja
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Vaihto+napsautus näyttää kustannusarvion sijoittamatta pääkonttoria uudelleen.
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Rakenna yhtiön pääkonttori muualle, kustannus 1{NBSP}% yhtiön arvosta. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Yksityiskohdat
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Näytä tarkka infrastruktuurin määrä
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Anna rahaa
@@ -3918,7 +3950,7 @@ STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTR
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Tuotanto viime kuussa:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Tuotanto viime minuutissa:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}{NBSP}% kuljetettu)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan laitoksen sijaintiin.
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä tuotantolaitoksen sijaintiin. Ctrl+napsautus avataksesi uuden näkymäikkunan laitoksen sijaintiin.
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Tuotantotaso: {YELLOW}{COMMA}{NBSP}%
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Teollisuuslaitos ilmoittaa välittömästä lakkautuksesta!
@@ -3958,6 +3990,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneu
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon
STR_VEHICLE_LIST_CREATE_GROUP :Luo ryhmä
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG})
STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Tuotto tällä jaksolla: {CURRENCY_LONG} (viime jaksolla: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -4062,8 +4095,8 @@ STR_CARGO_TYPE_FILTER_NONE :Ei mikään
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Raideliikennevälineiden valintaluettelo. Napsauta kulkuneuvoa saadaksesi lisää tietoa. Ctrl+napsautus näyttää tai piilottaa kulkuneuvon tyypin.
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Ajoneuvojen valintaluettelo. Napsauta ajoneuvoa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ajoneuvon tyypin.
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa laivan tyypin.
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa ilma-aluksen tyypin.
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Laivojen valintaluettelo. Napsauta laivaa saadaksesi lisää tietoja. Ctrl+napsautus näyttää/piilottaa tämän laivatyypin
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Ilma-alusten valintaluettelo. Napsauta ilma-alusta saadaksesi lisää tietoja. Ctrl+napsautus näyttää tai piilottaa tämän ilma-alustyypin
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Osta yksikkö
@@ -4079,15 +4112,15 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Osta ja
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ajoneuvo. Painettaessa Shift näyyää vain kustannusarvion.
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Osta valittu ilma-alus. Painettaessa Shift näyttää vain kustannusarvion
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Vaihto+napsautus näyttää kustannusarvion ostamatta.
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu raideliikenneväline. Painettaessa Shift näyttää vain kustannusarvion
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ajoneuvo. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu laiva. Paina lisäksi vaihtonäppäintä näyttääksesi vain kustannusarvion
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Osta ja sovita valittu ilma-alus. Shift+napsautus näyttää vain kustannusarvion
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nimeä
@@ -4179,15 +4212,15 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Kloonaa
STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Kloonaa ilma-alus
###length VEHICLE_TYPES
STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tämä ostaa kopion laivasta. Napsauta tätä painiketta ja sen jälkeen laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tämä ostaa kopion lentokoneesta. Napsauta tätä painiketta ja sen jälkeen lentokonetta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Napsauta tätä painiketta ja sen jälkeen junaa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Napsauta tätä painiketta ja sen jälkeen ajoneuvoa varikon sisä- tai ulkopuolella. Ctrl+napsautus jakaa käskyt. Painettaessa Shift näyttää vain kustannusarvion
STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Osta laivan kopio. Napsauta tätä painiketta ja sitten laivaa telakan sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Osta ilma-aluksen kopio. Napsauta tätä painiketta ja sitten ilma-alusta lentokonehallin sisä- tai ulkopuolella. Ctrl+napsautus jakaa komennot. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä veturitallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan veturitallin sijaintiin.
STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä ajoneuvovarikon sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan varikon sijaintiin.
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin.
STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä telakan sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan telakan sijaintiin
STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Keskitä päänäkymä lentokonehallin sijaintiin. Ctrl+napsautus avaa uuden näkymäikkunan lentokonehallin sijaintiin.
###length VEHICLE_TYPES
@@ -4229,6 +4262,8 @@ 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_COST_WEIGHT :Hinta: {CURRENCY_LONG} Paino: {WEIGHT_SHORT}
STR_ENGINE_PREVIEW_COST_MAX_SPEED :Hinta: {CURRENCY_LONG} Huippunopeus: {VELOCITY}
STR_ENGINE_PREVIEW_SPEED_POWER :Nopeus: {VELOCITY} Teho: {POWER}
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_RANGE :Ilma-alustyyppi: {STRING} Toimintasäde: {COMMA} ruutua
@@ -4304,10 +4339,10 @@ STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä
STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Lähetä ilma-alus lentokonehalliin. Ctrl+napsautus suorittaa vain huollon.
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tämä ostaa kopion junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Osta kopio junasta kaikkine vaunuineen. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tämä ostaa kopion ajoneuvosta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tämä ostaa kopion laivasta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tämä ostaa kopion lentokoneesta. Ctrl+napsautus jakaa käskyt. Vaihto+napsautus näyttää kustannusarvion ostamatta kopiota.
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Osta laivan kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Osta ilma-aluksen kopio. Ctrl+napsautus jakaa käskyt. Paina lisäksi vaihtonäppäintä nähdäksesi vain kustannusarvion.
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Anna junalle lupa ohittaa punainen opastin
STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Käännä junan suunta
@@ -4341,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Nykyisen
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Lastataan/puretaan
STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Poistuu
STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Odottamassa suman purkautumista
STR_VEHICLE_STATUS_CRASHED :{RED}Kolaroitu!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Hajonnut
STR_VEHICLE_STATUS_STOPPED :{RED}Pysäytetty
@@ -4354,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Ei pys
STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Kohde: {WAYPOINT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Suuntana {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Huolto kohteessa {DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Sumanpurku ja huolto kohteessa{DEPOT}, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{STATION} ei saavutettavissa, {VELOCITY}
STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{WAYPOINT} ei saavutettavissa, {VELOCITY}
@@ -4380,7 +4417,7 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nimeä i
STR_VEHICLE_INFO_AGE :{COMMA} vuo{P si tta} ({COMMA})
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} vuo{P si tta} ({COMMA})
STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/v
STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/vuosi
STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Ikä: {LTBLUE}{STRING}{BLACK} Käyttökustannukset: {LTBLUE}{CURRENCY_LONG}/jakso
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Huippunopeus: {LTBLUE}{VELOCITY}
@@ -4403,9 +4440,12 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapasite
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Siirron arvo: {LTBLUE}{CURRENCY_LONG}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}vrk{BLACK} {STRING}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}minuuttia{BLACK} {STRING}
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Huoltoväli: {LTBLUE}{COMMA}{NBSP}%{BLACK} {STRING}
STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Viimeksi huollettu: {LTBLUE}{DATE_LONG}
STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Viimeksi huollettu: {LTBLUE}{NUM} minuuttia sitten
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Pidennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus pidentää väliä 5 vuorokaudella
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_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Lyhennä huoltoväliä 10 vuorokaudella. Ctrl+napsautus lyhentää väliä 5 vuorokaudella
@@ -4454,7 +4494,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Uusi kap
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Sovituksen kustannus: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Uusi kapasiteetti: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Tulot sovittamisesta: {GREEN}{CURRENCY_LONG}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Hiirellä vetämällä voit valita useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun.
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Valitse sovitettavat kulkuneuvot. Napsautus+vedä valitaksesi useamman kulkuneuvon. Tyhjän alueen napsautus valitsee koko kulkuneuvon. Ctrl+napsautus valitsee kulkuneuvon ja sitä seuraavan ketjun.
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Valitse junan rahtityyppi
@@ -4481,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Näytä
STR_ORDERS_LIST_TOOLTIP :{BLACK}Käskyt napsauta käskyä korostaaksesi sen. Ctrl+napsautus siirtää näkymän käskyn kohteeseen.
STR_ORDER_INDEX :{COMMA}:{NBSP}
STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Käskyjen loppu - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Jaettujen käskyjen loppu - -
@@ -4517,9 +4558,14 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Saatavilla olev
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mene aina
STR_ORDER_DROP_SERVICE_DEPOT :Huolto, jos tarpeen
STR_ORDER_DROP_HALT_DEPOT :Pysähdy
STR_ORDER_DROP_UNBUNCH :Pura sumaa
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä varikolla tehtävä toimenpide
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Valitse tällä telakalla tehtävä toimenpide
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Valitse tässä lentokonehallissa tehtävä toimenpide
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kulkuneuvon tiedot, joiden perusteella hypätään
@@ -4550,7 +4596,7 @@ STR_ORDER_CONDITIONAL_VALUE_TOOLTIP :{BLACK}Arvo, jo
STR_ORDER_CONDITIONAL_VALUE_CAPT :{WHITE}Syötä arvo, johon verrataan
STR_ORDERS_SKIP_BUTTON :{BLACK}Ohita
STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn.
STR_ORDERS_SKIP_TOOLTIP :{BLACK}Ohita nykyinen käsky ja aloita seuraava. Ctrl+napsautus hyppää valittuun käskyyn
STR_ORDERS_DELETE_BUTTON :{BLACK}Poista
STR_ORDERS_DELETE_TOOLTIP :{BLACK}Poista korostettu käsky
@@ -4563,7 +4609,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Mene lähimmäl
STR_ORDER_GO_TO_NEAREST_HANGAR :Mene lähimpään lentokonehalliin
STR_ORDER_CONDITIONAL :Ehdollinen hyppykäsky
STR_ORDER_SHARE :Jaa käskyt
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl:n painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja varikkokäskyistä ”huolto”. ”Jaa käskyt” tai Ctrl jakaa käskyt valitun kulkuneuvon kanssa. Kulkuneuvon napsauttaminen kopioi käskyt kyseisestä kulkuneuvosta. Varikkokäsky estää kulkuneuvon automaattiset huollot
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Lisää uuden käskyn ennen valittua, tai lisää listan viimeiseksi. Ctrl+painalluksella asemakäskyistä tulee ”lastaa täyteen mikä tahansa rahti”, reittipistekäskyistä ”pysähtymättä” ja veturitallikäskyistä ”huolto”. Napsauta toista ajoneuvoa kopioidaksesi sen käskyt tai Ctrl+napsauta luodaksesi jaetun käskyn. Tallikäsky poistaa automaattiset huollot
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Näytä kaikki kulkuneuvot, jotka jakavat nämä käskyt
@@ -4589,13 +4635,14 @@ STR_ORDER_REFIT_ORDER :(Sovita {STRING
STR_ORDER_REFIT_STOP_ORDER :(Sovita rahtityypille {STRING} ja pysähdy)
STR_ORDER_STOP_ORDER :(Pysähdy)
STR_ORDER_WAIT_TO_UNBUNCH :(odota suman purkamiseksi)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Asema ei käytettävissä){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Ehdoton)
STR_ORDER_FULL_LOAD :(Täysi lastaus)
STR_ORDER_FULL_LOAD :(Lastaa täyteen)
STR_ORDER_FULL_LOAD_ANY :(Lastaa täyteen mitä tahansa rahtia)
STR_ORDER_NO_LOAD :(Ei lastausta)
STR_ORDER_UNLOAD :(Pura lasti ja lastaa uusi rahti)
@@ -4684,7 +4731,7 @@ STR_TIMETABLE_CHANGE_SPEED :{BLACK}Muuta no
STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Muuta suurinta sallittua nopeutta valitulle käskylle. Ctrl+napsautus asettaa nopeusrajoituksen kaikille käskyille
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Tyhjennä nopeusrajoitus
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaa kaikkien käskyjen nopeusrajoitukset
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Poista suurin sallittu nopeus valitulta käskyltä. Ctrl+napsautus poistaaksesi kaikkien käskyjen nopeusrajoitukset
STR_TIMETABLE_RESET_LATENESS :{BLACK}Nollaa myöhästymislaskuri
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Nollaa myöhästymislaskuri, jotta kulkuneuvo olisi taas aikataulussa. Ctrl+napsautus nollaa koko ryhmän, minkä jälkeen eniten myöhässä ollut kulkuneuvo on aikataulussa ja muut ovat etuajassa
@@ -4792,6 +4839,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Peliskripti
STR_AI_SETTINGS_CLOSE :{BLACK}Sulje
STR_AI_SETTINGS_RESET :{BLACK}Palauta
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -5058,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Paikalli
STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Väärä varikkotyyppi
# Depot unbunching related errors
STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}… vain yksi sumanpurkukäsky mahdollinen
STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}… kulkuneuvon sumanpurkukäsky estää täyteenlastaamiskäskyjen käytön
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on täyteenlastaamiskäsky
STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}… kulkuneuvon sumanpurkukäsky estää ehdollisten käskyjen käytön
STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}… sumaa ei voida purkaa kulkuneuvolla, jolla on ehdollinen käsky
# Autoreplace related errors
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} on liian pitkä korvaamisen jälkeen
@@ -5752,6 +5806,9 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}000
STR_CURRENCY_SHORT_MEGA :{NBSP}milj.
STR_CURRENCY_SHORT_GIGA :{NBSP}mrd.
STR_CURRENCY_SHORT_TERA :{NBSP} t
STR_JUST_CARGO :{CARGO_LONG}
+4
View File
@@ -4563,6 +4563,10 @@ STR_ORDER_DROP_UNBUNCH :Répartir
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce dépôt
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Séléctionner l'action à effectuer sur ce hangar
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Données du véhicule servant de base au saut
+4
View File
@@ -4563,6 +4563,10 @@ STR_ORDER_DROP_UNBUNCH :배차 간격
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}차량기지에서 수행할 작업을 선택합니다
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}차고지에서 수행할 작업을 선택합니다.
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}정박소에서 수행할 작업을 선택합니다
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}격납고에서 수행할 작업을 선택합니다.
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}경로를 건너뛰기 위한 비교 조건을 선택합니다
+4
View File
@@ -4573,6 +4573,10 @@ STR_ORDER_DROP_UNBUNCH :Atdalīt
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā depo
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Atlasiet darbību, kas jāveic šajā angārā
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Vehicle data to base jumping on
+143 -51
View File
@@ -593,6 +593,8 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Taki jak podsta
STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}mph
STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h
STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s
STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}p{P ole ola ól}/dzień
STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}p{P ole ola ól}/s
STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}w.
STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}hp
@@ -638,7 +640,11 @@ STR_UNITS_DAYS :{COMMA}{NBSP}d{
STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P a y ""}
STR_UNITS_TICKS :{COMMA}{NBSP}tyknię{P cie cia ć}
STR_UNITS_MONTHS :{NUM}{NBSP}miesi{P ąc ące ęcy}
STR_UNITS_MINUTES :{NUM}{NBSP}minut{P a y ""}
STR_UNITS_YEARS :{NUM}{NBSP}{P rok lata lat}
STR_UNITS_PERIODS :{NUM}{NBSP}okres{P "" y ów}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtr:
@@ -704,8 +710,10 @@ STR_SORT_BY_PRODUCTION :Produkcja
STR_SORT_BY_TYPE :Typ
STR_SORT_BY_TRANSPORTED :Przetransportowano
STR_SORT_BY_NUMBER :Numer
STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w ostatnim roku
STR_SORT_BY_PROFIT_LAST_YEAR :Zysk w poprzednim roku
STR_SORT_BY_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie
STR_SORT_BY_PROFIT_THIS_YEAR :Zysk w tym roku
STR_SORT_BY_PROFIT_THIS_PERIOD :Zysk w tym okresie
STR_SORT_BY_AGE :Wiek
STR_SORT_BY_RELIABILITY :Niezawodność
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Całkowita ładowność po typie ładunku
@@ -732,10 +740,14 @@ STR_SORT_BY_RANGE :Zasięg
STR_SORT_BY_POPULATION :Liczba mieszkańców
STR_SORT_BY_RATING :Ocena
STR_SORT_BY_NUM_VEHICLES :Ilość pojazdów
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w zeszłym roku
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Całkowity zysk w poprzednim roku
STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Całkowity zysk w poprzednim okresie
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Całkowity zysk w obecnym roku
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w zeszłym roku
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w obecnym roku
STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Całkowity zysk w tym okresie
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Średni zysk w poprzednim roku
STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Średni zysk w poprzednim okresie
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Średni zysk w tym roku
STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Średni zysk w tym okresie
# Group by options for vehicle list
STR_GROUP_BY_NONE :Brak
@@ -786,12 +798,12 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}Edytor
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Zmień datę początkową do tyłu o 1 rok
STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Zmień datę początkową do przodu o 1 rok
STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Kliknij aby wpisać datę początkową
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Wyświetl mapę, listę miast
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Tworzenie krajobrazu
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Tworzenie miast
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Tworzenie przedsiębiorstw
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Konstrukcja dróg
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Konstrukcja torów tramwajowych
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Otwórz mapę, dodatkowy podgląd, listę napisów, miast lub spis przedsiębiorstw
STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Otwórz menu kształtowania krajobrazu lub wygeneruj nowy świat
STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Budowanie oraz generowanie miast
STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Budowanie lub generowanie przedsiębiorstw
STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Budowa infrastruktury drogowej
STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Budowanie infrastruktury tramwajowej
STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Posadź drzewa. Ctrl zaznacza teren po przekątnej. Shift przełącza pomiędzy trybem sadzenia a szacowaniem jego kosztów
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Umieść napis
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Umieść obiekt. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
@@ -813,6 +825,7 @@ STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Ustawienia
STR_SETTINGS_MENU_AI_SETTINGS :Ustawienia SI
STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :Ustawienia Game Script
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Ustawienia NewGRF
STR_SETTINGS_MENU_SANDBOX_OPTIONS :Opcje swobodnej rozgrywki
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Opcje przeźroczystości
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Wyświetlanie nazw miast
STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :Wyświetlanie nazw stacji
@@ -978,8 +991,11 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Dostarcz
STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Ocena wydajności firmy (maks. ocena=1000)
STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Wykres wartości firmy
STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Ostatnie 72 minuty
STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Stawki płatności za ładunek
STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dni w transporcie
STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekund w transporcie
STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Dochód z przewozu 10 jednostek (lub 10,000 litrów) ładunku na odległość 20 pól
STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Włącz wszystko
STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Wyłącz wszystko
@@ -997,6 +1013,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Kliknij
# Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Ranking firm
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} „{STRING}”
STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}{NUM}.
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Inżynier
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Administrator Ruchu
STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Koordynator Transportu
@@ -1021,18 +1038,22 @@ STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Stacje:
STR_PERFORMANCE_DETAIL_MIN_PROFIT :{BLACK}Min. zysk:
STR_PERFORMANCE_DETAIL_MIN_INCOME :{BLACK}Min. przychód:
STR_PERFORMANCE_DETAIL_MAX_INCOME :{BLACK}Maks. przychód:
STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Przewieziono:
STR_PERFORMANCE_DETAIL_DELIVERED :{BLACK}Dostarczono:
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Ładunek:
STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Pieniądze:
STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Pożyczka:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Łącznie:
###next-name-looks-similar
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim roku. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów
STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Liczba pojazdów, które przyniosły zysk w poprzednim okresie. Dotyczy to pojazdów drogowych, pociągów, statków i samolotów
STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Liczba ostatnio obsłużonych stacji. Dworce, przystanki, lotniska itp. są liczone osobno, nawet jeśli są połączone w jedną stację
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z najmniejszym zyskiem z ostatnich 12 kwartałów
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Ilość zarobionych pieniędzy w kwartale z największym zyskiem z ostatnich 12 kwartałów
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku przewiezionego w poprzednich 4 kwartałach
STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku przewiezionych w ostatnim kwartale
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa lata)
STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Zysk pojazdu o najniższym przychodzie (pod uwagę brane są tylko pojazdy starsze niż dwa okresy)
STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najniższym zyskiem spośród poprzednich 12 kwartałów
STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Kwota pieniędzy zarobionych w kwartale z najwyższym zyskiem spośród poprzednich 12 kwartałów
STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Ilość ładunku dostarczonego w poprzednich 4 kwartałach
STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP :{BLACK}Ilość różnych typów ładunku dostarczonych w poprzednim kwartale
STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP :{BLACK}Ilość dostępnych środków pieniężnych
STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP :{BLACK}Wielkość pożyczki wziętej przez firmę
STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP :{BLACK}Suma przyznanych punktów
@@ -1177,6 +1198,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOZAPIS
STR_STATUSBAR_SAVING_GAME :{RED}* * ZAPISYWANIE GRY * *
STR_STATUSBAR_SPECTATOR :{WHITE}(obserwator)
STR_STATUSBAR_INFINITE_MONEY :{WHITE}(nieskończone pieniądze)
# News message history
STR_MESSAGE_HISTORY :{WHITE}Poprzednie wiadomości
@@ -1261,6 +1283,8 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} bardzo się starzeje i potrzebuje natychmiastowej wymiany
STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} nie potrafi znaleźć trasy, aby kontynuować
STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} się zgubił
STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}Dochód {VEHICLE} w poprzednim roku wyniósł {CURRENCY_LONG}
STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}Dochód {VEHICLE} w poprzednim okresie wyniósł {CURRENCY_LONG}
STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} nie może dotrzeć do kolejnego punktu docelowego, ponieważ punkt ten leży poza jego zasięgiem
STR_NEWS_ORDER_REFIT_FAILED :{WHITE}Zaplanowane przeładowanie zatrzymane {VEHICLE}
@@ -1277,7 +1301,12 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Dotacja wygasła:{}{}{STRING} z {STRING} do {STRING} nie będzie już dotowane
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Koniec dotacji:{}{}Przewóz {STRING.d} z {STRING} do {STRING} nie jest już dotowany
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Oferta usługi dotowanej:{}{}Pierwszy przewóz {STRING.d} z {STRING} do {STRING} będzie dotowany przez następn{P 3 y e ych} {UNITS_YEARS_OR_MINUTES} przez lokalne władze!
###length 4
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany o 50% więcej przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany podwójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany potrójnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Przyznano dotację dla {STRING}!{}{}Przewóz {STRING.d} z {STRING} do {STRING} będzie opłacany poczwórnie przez następn{P 4 y e ych} {UNITS_YEARS_OR_MINUTES}!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopol transportowy!
@@ -1297,6 +1326,8 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Wybierz opcje grafiki
STR_GAME_OPTIONS_TAB_SOUND :Dźwięk
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Wybierz opcje dźwięku i muzyki
STR_GAME_OPTIONS_TAB_SOCIAL :Społeczność
STR_GAME_OPTIONS_TAB_SOCIAL_TT :{BLACK}Wybierz ustawienia integracji sieci społecznościowych
STR_GAME_OPTIONS_VOLUME :Głośność
STR_GAME_OPTIONS_SFX_VOLUME :Efekty dźwiękowe
@@ -1391,7 +1422,7 @@ STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaznacz
STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Bieżący sterownik: {STRING}
STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Rozmiar interfejsu
STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Przytrzymaj Ctrl, aby uzyskać płynną regulację
STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Przeciągnij suwak, aby ustawić rozmiar interfejsu. Ctrl+przeciągnij, aby uzyskać płynną regulację
STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Wykryj rozmiar automatycznie
STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Zaznacz to pole, aby rozmiar interfejsu był wykrywany automatycznie
@@ -1436,8 +1467,19 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Podstawo
STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Wybierz podstawowy zestaw muzyki do użycia
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Dodatkowe informacje o muzyce podstawowej
STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(brak zainstalowanych wtyczek do integracji z platformami społecznościowymi)
STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING})
STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Platforma:
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Stan wtyczki:
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Uruchomiona
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Inicjalizacja nie powiodła się
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} nie uruchomiona
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Niezaładowana
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Zdublowana wtyczka
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Wersja nieobsługiwana
STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Nieprawidłowa sygnatura
STR_BASESET_STATUS :{STRING} {RED}({NUM} brakując{P y e ych}/uszkodzon{P y e ych} plik{P "" i ów})
@@ -1605,6 +1647,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :z prawej strony
STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 ę y ""}
STR_CONFIG_SETTING_INFINITE_MONEY :Nieskończona ilość pieniędzy: {STRING}
STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Pozwól na nieograniczone wydatki i wyłącz bankructwa firm
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksymalna wysokość początkowej pożyczki: {STRING}
STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Maksymalna wysokość pożyczki, jaką firma może zaciągnąć (bez uwzględnienia inflacji)
@@ -1631,6 +1675,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Czas trwania do
###length 2
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Określ liczbę lat, na które przyznawana jest dotacja
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS}
###setting-zero-is-special
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Brak dotacji
@@ -1638,7 +1683,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Koszty konstruk
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Ustaw poziom kosztów konstrukcji i kupna
STR_CONFIG_SETTING_RECESSIONS :Kryzys: {STRING}
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może wystąpić co kilka lat. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy)
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jeśli włączone, kryzys może występować okresowo. Podczas kryzysu produkcja jest znacznie niższa (powraca do poprzedniego poziomu, kiedy kryzys się kończy)
STR_CONFIG_SETTING_TRAIN_REVERSING :Nie pozwalaj pociągom zawracać na stacjach: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Jeśli włączone, pociągi nie będą zawracać na stacjach dwu-wjazdowych, nawet jeśli droga do następnego celu jest krótsza po zawróceniu
@@ -1692,7 +1737,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Zabroń pociąg
STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90-stopniowy zakręt występuje wtedy, gdy bezpośrednio po poziomym odcinku toru występuje odcinek pionowy (lub na odwrót), zmuszając pociąg do ostrzejszego skrętu (zamiast normalnego, 45-stopniowego skrętu w innych kombinacjach torów)
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Pozwól na łączenie stacji nie sąsiadujących bezpośrednio: {STRING}
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwalaj na dodawanie części stacji nie stykających się ze sobą. Naciśnij Ctrl przed postawieniem nowej części
STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Pozwala na dołączanie części stacji nie stykających się ze sobą, wciskając Ctrl+klik przy stawianiu nowej części
STR_CONFIG_SETTING_INFLATION :Inflacja: {STRING}
STR_CONFIG_SETTING_INFLATION_HELPTEXT :Włącz lub wyłącz inflację (sytuacja ekonomiczna, w związku z którą koszty rosną nieco szybciej niż zapłaty)
@@ -1756,7 +1801,7 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Pozwalaj firmom
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Pozwól na kupno wyłączności transportowej: {STRING}
###length 2
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymają żadnego ładunku przez cały rok
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Kiedy firma wykupuje wyłączność na transport w mieście, to przystanki i stacje przeciwników (pasażerskie i towarowe) nie otrzymują żadnego ładunku przez dwanaście miesięcy
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Pozwól na fundowanie budynków: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Pozwalaj firmom na sponsorowanie budowy nowych budynków w miastach
@@ -1814,16 +1859,23 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :Wszystkich poja
STR_CONFIG_SETTING_WARN_INCOME_LESS :Powiadom, jeśli pojazd przynosi straty: {STRING}
###length 2
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, otrzymasz wiadomość o tym, że pojazd nie przyniósł żadnych zysków w całym roku kalendarzowym
STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Kiedy włączone, wiadomość zostanie wyświetlona, gdy pojazd nie osiągnie zysku w ciągu roku
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Pojazdy nigdy nie są wycofywane: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kiedy włączone, wszystkie modele pojazdów pozostają dostępne na zawsze od daty ich wprowadzenia
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Miara czasu: {STRING}
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Wybierz jednostki pomiaru czasu w grze. Nie można tego zmienić później.{}{}Kalendarz jest klasycznym trybem OpenTTD, z rokiem składającym się z 12 miesięcy, a każdy miesiąc ma 28-31 dni.{}{}W trybie opartym na zegarze ruch pojazdów, produkcja ładunków i finanse są natomiast oparte na jednominutowych przyrostach, czyli mniej więcej tak długo, jak trwa 30-dniowy miesiąc w trybie opartym na kalendarzu. Są one pogrupowane w 12-minutowe okresy, co odpowiada rokowi w trybie opartym na kalendarzu.{}{}W obu trybach zawsze funkcjonuje klasyczny kalendarz, który jest używany do dat wprowadzenia pojazdów, domów i innej infrastruktury.
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendarz
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Zegar
STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM}
###setting-zero-is-special
STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (zamrożenie czasu kalendarza)
STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}%
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
@@ -2079,6 +2131,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Odtwarzaj dźwi
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Koniec roku: {STRING}
STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Koniec okresu: {STRING}
###length 2
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Odtwarzaj dźwięk na koniec roku podsumowując roczną sytuację przedsiębiorstwa w porównaniu do roku poprzedniego
@@ -2142,7 +2195,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Domyślny inter
STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych maszyn latających, jeśli takowy nie istnieje dla określonego pojazdu
STR_CONFIG_SETTING_SERVINT_SHIPS :Domyślny interwał serwisowania statków: {STRING}
STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych statków, jeśli takowy nie istnieje dla określonego pojazdu
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}d{P zień ni ni}/%
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}D{P zień ni ni}/Minut{P a y ""}/%
###setting-zero-is-special
STR_CONFIG_SETTING_SERVINT_DISABLED :Wyłączone
@@ -2234,7 +2287,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Podczas przeci
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Ustaw dystans, na jakim semafory będą budowane przy torach aż do następnej przeszkody (semafor, zwrotnica), przy przeciąganiu
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} p{P ole ola ól}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Zachowaj stały odstęp między semaforami przy przeciąganiu: {STRING}
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób budowania semaforów przy przeciąganiu z wciśniętym Ctrl. Kiedy wyłączone, semafory są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, semafory są stawiane co X pól, sprawiając, że stawianie semaforów na rownoległych torach jest łatwiejsze
STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Wybierz sposób rozmieszczania sygnalizacji podczas przeciągania. Kiedy wyłączone, sygnały są stawiane przy tunelach lub mostach, by nie zostawiać długich odcinków bez sygnałów. Kiedy włączone, sygnały są umieszczane co X pól, sprawiając że stawianie sygnalizacji na równoległych torach jest łatwiejsze
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automatycznie buduj semafory przed: {STRING}
STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w którym semafory świetlne będą używane. Przed tym rokiem w użyciu będą semafory kształtowe (które mają te same właściwości, tylko inny wygląd)
@@ -2242,6 +2295,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Ustaw rok, w kt
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Przełączaj typy sygnalizatorów: {STRING}
STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Wybierz, między jakimi typami sygnalizatorów przełączać po naciśnięciu Ctrl+klik przy budowaniu sygnalizatorów
###length 2
STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Tylko bieżąca grupa
STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Wszystkie widoczne
STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Pokazuj typy sygnalizatorów: {STRING}
@@ -2374,6 +2428,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kiedy prędkoś
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperialne (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metryczne (km/h)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Jednostki gry (pola/dzień)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Jednostki gry (pola/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Węzły
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Jednostka mocy pojazdów: {STRING}
@@ -2510,14 +2566,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Wybierz
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Wybierz krajobraz „tropikalny”
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Wybierz krajobraz „zabawkowy”
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Wyświetl opcje gry
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Wyświetl tabelę wyników
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Otwórz opcje gry
STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Otwórz tabelę wyników
STR_INTRO_TOOLTIP_HELP :{BLACK}Uzyskaj dostęp do dokumentacji i zasobów online
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Wyświetl ustawienia gry
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Wyświetl ustawienia NewGRF
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Otwórz ustawienia gry
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Otwórz ustawienia NewGRF
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Poszukaj nowych lub zaktualizowanych dodatków do pobrania
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Wyświetl ustawienia SI
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Wyświetl ustawienia Game Script
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Otwórz ustawienia SI
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Otwórz ustawienia Game Script
STR_INTRO_TOOLTIP_QUIT :{BLACK}Wyjdź z „OpenTTD”
STR_INTRO_BASESET :{BLACK}Aktualnie używany podstawowy zestaw graficzny nie posiada {NUM} wymagan{P ego ych ych} sprite{P 'u 'ów 'ów}. Proszę poszukać aktualizacji dla zestawu podstawowego.
@@ -2548,7 +2604,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Zgłoś
STR_HELP_WINDOW_COMMUNITY :{BLACK}Społeczność
# Cheat window
STR_CHEATS :{WHITE}Oszustwa
STR_CHEATS :{WHITE}Opcje Swobodnej Rozgrywki
STR_CHEAT_MONEY :{LTBLUE}Zwiększ ilość pieniędzy o {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Grasz jako firma: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magiczny buldożer (usuwanie przedsiębiorstw, nieprzesuwalnych obiektów): {ORANGE}{STRING}
@@ -2685,6 +2741,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Rozmiar
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Rozmiar mapy{}Kliknij, by sortować wg powierzchni
STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data
STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Bieżąca data
STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Czas gry
STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Czas rozgrywki,{}gdy gra nie była wstrzymana
STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Język, wersja serwera, itp.
STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Kliknij na grze z listy by ją wybrać
@@ -2700,6 +2759,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adres s
STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Kod zaproszenia: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data uruchomienia: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktualna data: {WHITE}{DATE_SHORT}
STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Czas gry: {WHITE}{NUM}h {NUM}min
STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Game Script: {WHITE}{STRING} (v{NUM})
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Chronione hasłem!
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERWER WYŁĄCZONY
@@ -3055,7 +3115,10 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}przeładowany
# Linkgraph tooltip
STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG} do przetransportowania w ciągu miesiąca z {STATION} do {STATION} ({COMMA}% przepustowości){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} do przetransportowania w ciągu minuty z {STATION} do {STATION} ({COMMA}% przepustowości){STRING}
STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} do przetransportowania z powrotem ({COMMA}% przepustowości)
STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Średni czas podróży: {UNITS_DAYS_OR_SECONDS}
# Base for station construction window(s)
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Podświetlaj zasięg
@@ -3090,7 +3153,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Zbuduj s
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Zbuduj sygnały na torach. Ctrl przełącza semafory/sygnały świetlne{}Przeciąganie buduje sygnały wzdłuż prostej linii torów, z Ctrl buduje sygnały aż do najbliższego skrzyżowania lub sygnału{}Ctrl+klik przełącza wyświetlanie okna wyboru sygnałów. Shift przełącza pomiędzy budowaniem a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Zbuduj most kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Zbuduj tunel kolejowy. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz buduj/usuń dla torów kolejowych, sygnałów, posterunków i stacji. Przetrzymanie Ctrl usuwa także tory kolejowe z posterunków i stacji
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Przełącz budowanie/usuwanie torów kolejowych, sygnałów, posterunków i stacji. Ctrl+klik usuwa także tory kolejowe z posterunków i stacji
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Zamiana typu torów. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_RAIL_NAME_RAILROAD :Kolej
@@ -3141,7 +3204,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sygnaliz
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sygnalizator złożony (elektryczny){}Sygnalizator złożony działa jako sygnał wejściowy i wyjściowy. Umożliwia to budowę wielkich „drzew” presygnalizatorów
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Zwykłe sygnalizatory trasy mogą być mijane w przeciwnym kierunku
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Jednokierunkowy sygnalizator trasy (elektryczny){}Sygnalizator trasy umożliwiający wejście więcej niż jednemu pociagowi do bloku sygnalizatorów, o ile pociąg może zarezerwować trasę do bezpiecznego punktu zatrzymania. Sygnalizatory jednokierunkowe nie mogą być mijane w przeciwnym kierunku
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Jeżeli włączone, kliknięcie na istniejący sygnał spowoduje zamianę go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zamiana sygnałów{}Kliknij na istniejący sygnał, aby zamienić go na wybrany typ i wariant. Ctrl+klik przełącza istniejący wariant. Shift+klik pokazuje szacowany koszt zamiany
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Odległość między sygnałami przy przeciąganiu
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Zmniejsz odległość między sygnałami przy przeciąganiu
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zwiększ odległość między sygnałami przy przeciąganiu
@@ -3215,8 +3278,8 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Wybuduj
STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Zbuduj port. Ctrl umożliwia łączenie stacji. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Ustaw boję, która może być użyta jako punkt orientacyjny. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Zbuduj akwedukt. Shift przełącza pomiędzy trybem budowania a szacowaniem jego kosztów
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Stwórz akwen wodny.{}Tworzy kanał, chyba że przytrzymany jest CTRL na poziomie morza, wtedy pobliski teren zostanie zatopiony
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl zaznacza obszar po przekątnej.
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Zbuduj kanał. Ctrl+klik na poziomie morza spowoduje zatopienie terenu
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umieszczanie rzek. Ctrl+klik zaznacza obszar po przekątnej
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Ukierunkowanie stoczni
@@ -3261,7 +3324,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Zakup te
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Wybór obiektu
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl zaznacza obszar po przekątnej. Shift przełącza pomiędzy trybem budowy a szacowaniem jej kosztów
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Wybierz obiekt do budowy. Ctrl+klik+przeciągnięcie zaznacza obszar po przekątnej. Dodatkowo wciśnięcie Shift wyświetli jedynie szacunkowy koszt
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Wybierz rodzaj obiektu do budowy
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Podgląd obiektu
STR_OBJECT_BUILD_SIZE :{BLACK}Rozmiar: {GOLD}{NUM} x {NUM} pól
@@ -3613,11 +3676,11 @@ STR_MAPGEN_VARIETY :{BLACK}Różnor
STR_MAPGEN_GENERATE :{WHITE}Stwórz
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Stwórz świat i graj w OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia SI
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia SI
STR_MAPGEN_GS_SETTINGS :{BLACK}Ustawienia Game Script
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia Game Script
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Otwórz ustawienia Game Script
###length 21
STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angielskie (Oryginalne)
@@ -3911,13 +3974,16 @@ STR_TOWN_POPULATION :{BLACK}Populacj
STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Metropolia)
STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}Populacja: {ORANGE}{COMMA}{BLACK} Domów: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w ostatnim miesiącu: {ORANGE}{COMMA}{BLACK} najwięcej: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} w poprzednim miesiącu: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} w poprzedniej minucie: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Ładunek potrzebny do rozwoju miasta:
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}Wymagana {ORANGE}{STRING}
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} wymagane zimą
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{G=f}{ORANGE}{STRING}{GREEN} dostarczona
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (wciąż wymagany)
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{G=m}{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (dostarczony)
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS}
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Miasto rośnie co {ORANGE}{UNITS_DAYS_OR_SECONDS} (ufundowane)
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Miasto {RED}nie{BLACK} rośnie
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limit hałasu w mieście: {ORANGE}{COMMA}{BLACK} maksymalnie: {ORANGE}{COMMA}
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji miasta. Ctrl+klik otwiera nowy podgląd na jego lokalizację
@@ -3973,7 +4039,7 @@ STR_GOALS_TEXT :{ORANGE}{STRING
STR_GOALS_NONE :{ORANGE}- Brak -
STR_GOALS_PROGRESS :{ORANGE}{STRING}
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu by wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Kliknij na celu, aby wyśrodkować widok na przedsiębiorstwie/mieście/polu. Ctrl+klik otwiera nowe okno podglądu
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Pytanie
@@ -4109,6 +4175,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Edytuj n
# Finances window
STR_FINANCES_CAPTION :{WHITE}Finanse {COMPANY} {BLACK}{COMPANY_NUM}
STR_FINANCES_YEAR :{WHITE}{NUM}
STR_FINANCES_YEAR_CAPTION :{WHITE}Rok
STR_FINANCES_PERIOD_CAPTION :{WHITE}Okres
###length 3
STR_FINANCES_REVENUE_TITLE :{WHITE}Przychody
@@ -4210,6 +4278,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanały
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stacje:
STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Pola stacji
STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Lotniska
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/rok
STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/okres
# Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Przedsiębiorstwa
@@ -4228,7 +4298,8 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Żadne
# Industry view
STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY}
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w ostatnim miesiącu:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Wyprodukowano w poprzednim miesiącu:
STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Wyprodukowano w poprzedniej minucie:
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% przetransportowano)
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Wyśrodkuj widok główny na lokalizacji przedsiębiorstwa. Ctrl+klik otwiera nowy podgląd na jego lokalizację
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Poziom produkcji: {YELLOW}{COMMA}%
@@ -4269,7 +4340,7 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Wyślij
STR_VEHICLE_LIST_REPLACE_VEHICLES :Zastąp pojazdy
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Wyślij do serwisu
STR_VEHICLE_LIST_CREATE_GROUP :Stwórz grupę
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG})
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG})
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
@@ -4315,7 +4386,9 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Usuń wszystkie
STR_GROUP_RENAME_CAPTION :{BLACK}Zmień nazwę grupy
STR_GROUP_PROFIT_THIS_YEAR :Zysk w tym roku:
STR_GROUP_PROFIT_LAST_YEAR :Zysk w zeszłym roku:
STR_GROUP_PROFIT_THIS_PERIOD :Zysk w tym okresie:
STR_GROUP_PROFIT_LAST_YEAR :Zysk w poprzednim roku:
STR_GROUP_PROFIT_LAST_PERIOD :Zysk w poprzednim okresie:
STR_GROUP_OCCUPANCY :Aktualne wykorzystanie:
STR_GROUP_OCCUPANCY_VALUE :{NUM}%
@@ -4342,6 +4415,8 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Prędko
STR_PURCHASE_INFO_SPEED :{BLACK}Prędkość: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Prędkość na oceanie: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Prędkość na kanale/rzece: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/rok
STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Kosz Utrzymania: {GOLD}{CURRENCY_LONG}/okres
STR_PURCHASE_INFO_CAPACITY :{BLACK}Ładowność: {GOLD}{CARGO_LONG} {STRING}
STR_PURCHASE_INFO_REFITTABLE :(przebudowywalny)
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Zaprojektowany: {GOLD}{NUM}{BLACK} Żywotność: {GOLD}{COMMA} lat
@@ -4368,10 +4443,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Fracht
STR_CARGO_TYPE_FILTER_NONE :Żaden
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów - kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu pojazdu
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych - kliknij na pojazd, aby uzyskać więcej informacji. Ctrl+klik przełącza ukrywanie typu pojazdu
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków - kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu statku
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów - kliknij na samolocie, aby uzyskać informacje. Ctrl+klik przełącza ukrywanie typu samolotu
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista wyboru pociągów. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista wyboru pojazdów drogowych. Kliknij na pojazd, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu pojazdu
STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista wyboru statków. Kliknij na statek, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu statku
STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista wyboru samolotów. Kliknij na samolot, aby uzyskać informacje. Ctrl+klik przełącza wyświetlanie/ukrywanie typu samolotu
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Kup tabor kolejowy
@@ -4445,7 +4520,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} po
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon przytrzymując lewy klawisz myszy, aby go dodać/usunąć ze składu pociągu, kliknij na pociągu prawym aby uzyskać informacje. Przytrzymanie Ctrl dla podanych akcji stosuje zmiany do całego składu pociągu
STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Pociągi - przeciągnij pojazd/wagon lewym przyciskiem myszy, aby go dodać/usunąć ze składu pociągu; kliknij prawym, aby uzyskać o nim informacje. Ctrl+klik wykona te funkcje dla ciągu wagonów aż do ostatniego
STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Pojazdy - prawy klik na pojeździe pozwala uzyskać więcej informacji
STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Statki - prawy klik pozwala uzyskać informacje o statku
STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Samolot - prawy klik na samolocie pozwala uzyskać informacje
@@ -4540,6 +4615,11 @@ STR_ENGINE_PREVIEW_AIRCRAFT.b :samolot
STR_ENGINE_PREVIEW_SHIP :{G=m}statek
STR_ENGINE_PREVIEW_SHIP.b :statek
STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING}
STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING}
STR_ENGINE_PREVIEW_RUNCOST_YEAR :Kosz Utrzymania: {CURRENCY_LONG}/rok
STR_ENGINE_PREVIEW_CAPACITY :Ładowność: {CARGO_LONG}
STR_ENGINE_PREVIEW_CAPACITY_2 :Ładowność: {CARGO_LONG}, {CARGO_LONG}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Zastąp {STRING} - {STRING}
@@ -4692,8 +4772,8 @@ STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. pr
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Masa: {LTBLUE}{WEIGHT_SHORT} {BLACK}Moc: {LTBLUE}{POWER}{BLACK} Prędkość maksymalna: {LTBLUE}{VELOCITY} {BLACK}Maksymalna siła pociągowa: {LTBLUE}{FORCE}
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG})
STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Zysk w tym roku: {LTBLUE}{CURRENCY_LONG} (poprzedni rok: {CURRENCY_LONG}) {BLACK}Min. wydajność: {LTBLUE}{POWER_TO_WEIGHT}
STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Niezawodność: {LTBLUE}{COMMA}% {BLACK}Awarie od ostatniego serwisowania: {LTBLUE}{COMMA}
STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Zakupiony: {LTBLUE}{NUM}{BLACK} Wartość: {LTBLUE}{CURRENCY_LONG}
@@ -4747,7 +4827,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nowa ła
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Koszt przebudowy: {RED}{CURRENCY_LONG}
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nowa ładowność: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Przychód z przebudowy: {GREEN}{CURRENCY_LONG}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy do przebudowania. Przeciągając myszkę można wybierać więcej pojazdów. Klikając na puste pole zaznaczysz cały pojazd. Ctrl+klik zaznaczy pojazd i dołączony skład
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Wybierz pojazdy/wagony do przebudowania. Klik+przeciągnięcie zaznacza wiele pojazdów/wagonów. Kliknięcie na puste pole zaznacza cały pojazd. Ctrl+klik zaznacza pojazd/wagon i następne aż do ostatniego
###length VEHICLE_TYPES
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Wybierz jaki ładunek ma przewozić pociąg
@@ -4774,6 +4854,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Otwórz
STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista poleceń - kliknij na poleceniu, aby zaznaczyć. Ctrl+klik przenosi do stacji docelowej
STR_ORDER_INDEX :{COMMA}:{NBSP}
STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING}
STR_ORDERS_END_OF_ORDERS :- - Koniec poleceń - -
STR_ORDERS_END_OF_SHARED_ORDERS :- - Koniec współdzielonych poleceń - -
@@ -4813,6 +4894,10 @@ STR_ORDER_DROP_HALT_DEPOT :Zatrzymaj
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tych warsztatach
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej zajezdni
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tej stoczni
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Wybierz akcję do wykonania w tym hangarze
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dane pojazdu wykorzystane w warunku
@@ -4856,7 +4941,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Idź do najbli
STR_ORDER_GO_TO_NEAREST_HANGAR :Leć do najbliższego hangaru
STR_ORDER_CONDITIONAL :Warunkowy skok poleceń
STR_ORDER_SHARE :Współdzielenie poleceń
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl ustawi polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia. „Współdzielenie poleceń” lub Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie zajezdni wyłącza automatyczne serwisowanie tego pojazdu
STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Dodaj nowe polecenie na końcu listy lub przed zaznaczonym poleceniem. Ctrl+klik ustawia polecenie stacji na „pełny załadunek któregoś z towarów”, posterunku na „bez zatrzymywania się”, a zajezdni na „serwisuj”. Kliknięcie innego pojazdu kopiuje jego polecenia, a Ctrl+klik pozwala na współdzielenie z nim poleceń. Polecenie do zajezdni wyłącza automatyczne serwisowanie tego pojazdu
STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Pokaż wszystkie pojazdy współdzielące te polecenia
@@ -5085,6 +5170,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Game Script
STR_AI_SETTINGS_CLOSE :{BLACK}Zamknij
STR_AI_SETTINGS_RESET :{BLACK}Resetuj
STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING}
STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}]
STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}]
# Textfile window
@@ -6054,6 +6141,7 @@ STR_COMPANY_SOMEONE.n :kimś
STR_COMPANY_SOMEONE.m :kimś
STR_COMPANY_SOMEONE.w :ktoś
STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}min
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}
STR_SAVEGAME_NAME_SPECTATOR :Obserwator, {1:STRING}
@@ -6087,6 +6175,10 @@ STR_TOWN_NAME :{TOWN}
STR_VEHICLE_NAME :{VEHICLE}
STR_WAYPOINT_NAME :{WAYPOINT}
STR_CURRENCY_SHORT_KILO :{NBSP}k
STR_CURRENCY_SHORT_MEGA :{NBSP}M
STR_CURRENCY_SHORT_GIGA :{NBSP}G
STR_CURRENCY_SHORT_TERA :{NBSP}T
STR_JUST_CARGO :{CARGO_LONG}
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
+22 -18
View File
@@ -1308,7 +1308,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建设费用: {
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :设定建造的成本水平。
STR_CONFIG_SETTING_RECESSIONS :经济衰退: {STRING}
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用,经济衰退将每隔几年就出现。在衰退期内,所有产出将大幅下降直至衰退结束。
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :启用,经济衰退将每隔几经济周期发生一次。经济衰退时所有工业货物产量都将大幅下降直至衰退结束为止
STR_CONFIG_SETTING_TRAIN_REVERSING :禁止列车在站台调头: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :启用后,如果列车有到下一站的捷径,列车将不在非终点站台调头,
@@ -1429,8 +1429,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :允许公司尝
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允许买断经营权: {STRING}
###length 2
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一家公司购买了城市独家经营权,其公司的站台将在一年之内不再产生乘客或者货物
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一家公司购买了城市独家经营权,其公司的站台将在 12 分钟之内不再产生乘客或者货物
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_HELPTEXT :“打开”时,允许公司提供资助新建房屋
@@ -2209,7 +2209,7 @@ STR_INTRO_TOOLTIP_HELP :{BLACK}获取
STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}显示设置
STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}显示 NewGRF 设定
STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}连接服务器并查找扩展包
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示AI设置
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}显示 AI 设置
STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}显示游戏脚本设置
STR_INTRO_TOOLTIP_QUIT :{BLACK}退出 'OpenTTD'
@@ -2661,9 +2661,9 @@ STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}更新
STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}取消全选
STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}取消全部选择
STR_CONTENT_SEARCH_EXTERNAL :{BLACK}在外部网站搜索
STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与OpenTTD没有联系的网站搜寻没有纳入OpenTTD內容服务的內容
STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在与 OpenTTD 没有联系的网站搜寻没有纳入 OpenTTD 內容服务的內容
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}正在离开游戏!
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟OpenTTD引用的规则及条款不同。{}您需要参照有关网站以取得在OpenTTD安装有关內容的资讯。{}您要継续吗?
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部网站下载內容的规则及条款可能跟 OpenTTD 引用的规则及条款不同。{}您需要参照有关网站以取得在 OpenTTD 安装有关內容的资讯。{}您要継续吗?
STR_CONTENT_FILTER_TITLE :{BLACK}标签/名称过滤器
STR_CONTENT_OPEN_URL :{BLACK}主页
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}打开该扩展包主页
@@ -2843,7 +2843,7 @@ STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}出口
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}复合信号(电子){}复合信号灯是入口和出口信号灯的组合,这样允许建立大型“树状”预警信号灯系统
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}单向路径信号灯(电子){}路径信号灯为列车预留一条到安全停车位的路径,而其它路径仍然可以使用,从而允许一列以上的列车同时进入一个信号区间
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换工具{}按下此按钮,可以将已存在的信号转化为选择的信号类型,按下Ctrl键单击,可以在电子信号和悬臂信号之间换。按住Shift键单击显示预估成本
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}信号转换{}使用此工具时可以将现有的信号机转换成选择的信号种类及风格。按住 <Ctrl> 键单击以仅在灯式/悬臂式之间换。按住 <Shift> 键单击显示预计费用
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}拖拽布置信号灯的间隔距离
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}减少拖拽布置信号的间隔距离
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}增加拖拽布置信号灯的间隔距离
@@ -2877,7 +2877,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}建设
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}建造电车车库(可以购买与维护车辆)
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}建设公共汽车站。按住 Ctrl 键允许合并站台
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}建设客运电车站。按住 Ctrl 键允许合并站台
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 Ctrl 键允许合并站台
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}建设汽车货场。按住 <Ctrl>点击以合并站台,按住 <Shift> 键以显示预计费用。
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}建设货运电车站。按住 <Ctrl> 键单击以合并站台。按住 <Shift> 键以显示预计费用。
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}选择是否建设单行道
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}建设公路桥梁
@@ -2963,7 +2963,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}购买
# Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}物体选单
STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择建设项目.。按住Ctrl可沿对角线选择区域。按住Shift键建设可以显示建设费用
STR_OBJECT_BUILD_TOOLTIP :{BLACK}选择建设的物体。按住 <Ctrl> 键以沿对角线建设,按住 <Shift> 键操作以显示预计成本。
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}选择要建造的物件类型
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}物件预览
STR_OBJECT_BUILD_SIZE :{BLACK}大小: {GOLD}{NUM} x {NUM} 瓦
@@ -3313,11 +3313,11 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流
STR_MAPGEN_SMOOTHNESS :{BLACK}平滑程度:
STR_MAPGEN_VARIETY :{BLACK}多样地形:
STR_MAPGEN_GENERATE :{WHITE}生成
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩OpenTTD
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}创建世界并开始游玩 OpenTTD
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示 NewGRF 设置
STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示AI设置
STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}显示 AI 设置
STR_MAPGEN_GS_SETTINGS :{BLACK}游戏脚本设置
STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}显示游戏脚本设置
@@ -4340,8 +4340,8 @@ STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}命令
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}复制这列火车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击以显示所需资金
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击以显示所需资金
STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}复制这辆汽车。按住 <Ctrl> 键单击共享调度计划,按住 <Shift> 键单击以显示预计费用。
STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 <Ctrl> 键单击共享调度计划,按住 <Shift> 键单击以显示所需资金
STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}复制这架飞机。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金
STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}命令列车强行通过信号
@@ -4532,21 +4532,21 @@ STR_ORDER_GO_TO :前往
STR_ORDER_GO_NON_STOP_TO :不停车前往
STR_ORDER_GO_VIA :经由
STR_ORDER_GO_NON_STOP_VIA :经由(不停车)
STR_ORDER_TOOLTIP_NON_STOP :{BLACK}改变当前选中车站停车时的执行动作
STR_ORDER_TOOLTIP_NON_STOP :{BLACK}修改当前指令在车站的停靠措施
STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}装满任意货物
STR_ORDER_DROP_LOAD_IF_POSSIBLE :若有的话就装载
STR_ORDER_DROP_FULL_LOAD_ALL :装满所有货物
STR_ORDER_DROP_FULL_LOAD_ANY :装满任意货物
STR_ORDER_DROP_NO_LOADING :不装载
STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}改变当前选中车站装载时的执行动作
STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}修改当前指令在车站装载措施
STR_ORDER_TOGGLE_UNLOAD :{BLACK}卸载全部
STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :若接受的话就卸载
STR_ORDER_DROP_UNLOAD :卸载全部
STR_ORDER_DROP_TRANSFER :联运
STR_ORDER_DROP_NO_UNLOADING :不卸载
STR_ORDER_TOOLTIP_UNLOAD :{BLACK}改变当前选中车站卸载时的执行动作
STR_ORDER_TOOLTIP_UNLOAD :{BLACK}修改当前指令在车站卸载措施
STR_ORDER_REFIT :{BLACK}改装
STR_ORDER_REFIT_TOOLTIP :{BLACK}选择要在调度计划中改装的货物类型{}CTRL+单击 可以去掉改装计划
@@ -4562,6 +4562,10 @@ STR_ORDER_DROP_UNBUNCH :班次均匀
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施
STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此车库采取的措施
STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}选择在此船坞采取的措施
STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}选择在此机库采取的措施
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳过所需的车辆数据值
@@ -4854,9 +4858,9 @@ STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :查看此项目
STR_TEXTFILE_VIEW_LICENCE :{BLACK}版权信息
STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :查看此项目的许可证
###length 5
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} 的说明
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的说明
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING} 的更新日志
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} 的版权信息
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} {WHITE}的版权信息
STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}预览调查结果
STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD 文档 '{STRING}'
+13 -13
View File
@@ -536,7 +536,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'Open
STR_ABOUT_MENU_SPRITE_ALIGNER :Alineador de sprites
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activar cajas delimitadoras
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activar/Desactivar coloreado de bloques modificados
STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activar/desactivar los bordes de los "widgets"
STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Activa/Desactiva los bordes de los "widgets"
###length 31
STR_DAY_NUMBER_1ST :1
@@ -758,9 +758,9 @@ STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Muestra
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Muestra las rutas de transporte en el mapa
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Muestra la vegetación en el mapa
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Muestra los propietarios de terreno en el mapa
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Haz clic en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Haz clic en una empresa para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Haz clic en una carga para mostrar u ocultar sus bienes. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clica en un tipo de industria para mostrarlo u ocultarlo. Ctrl+Clic alterna entre mostrar todos los tipos, con excepción del elegido, o mostrar solo el elegido
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clica en una empresa para mostrar u ocultar sus propiedades. Ctrl+Clic alterna entre mostrar todas las empresas, con excepción de la elegida, o mostrar solo la elegida
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clica en una carga para mostrar u ocultar sus flujos. Ctrl+Clic alterna entre mostrar todas las cargas, con excepción de la elegida, o mostrar solo la elegida
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Carreteras
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrocarriles
@@ -1065,11 +1065,11 @@ STR_GAME_OPTIONS_GUI_SCALE_5X :5x
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Encuesta automática
STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Participar en la encuesta automática
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al finalizar el juego
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}Si está activado, OpenTTD enviará una encuesta al salir el juego
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}Acerca de la encuesta y la privacidad
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá un navegador web con más información sobre la encuesta automática
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Visualizar el resultado de la encuesta
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Mostrar el resultado de la encuesta del juego actual
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}Se abrirá el navegador web con más información sobre la encuesta automática
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}Vista previa del resultado
STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}Muestra el resultado de la encuesta para el juego actual
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Gráficos
@@ -1452,8 +1452,8 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Ninguno*
STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :Reducida
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :Normal
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir intersecciones con carreteras o ferrocarriles que sean propiedad de otras empresas: {STRING}
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permitir construir intersecciones en carreteras o ferrocarriles que sean propiedad de otras empresas
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :Permitir pasos a nivel con carreteras o ferrocarriles propiedad de otras empresas: {STRING}
STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :Permite construir pasos a nivel en carreteras o ferrocarriles que sean propiedad de otras empresas
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :Permitir construir paradas sobre carreteras de los municipios: {STRING}
STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :Permite construir estaciones de paso en carreteras que sean propiedad de los municipios
@@ -1467,8 +1467,8 @@ STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Si se activa, l
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la empresa: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Selecciona el color inicial de la empresa
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario inicial de la empresa: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :Color secundario de la empresa inicial: {STRING}
STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :Selecciona un color secundario para la empresa, si usas un NewGRF que lo permita.
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Aeropuertos nunca caducan: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Permite a todos los aeropuertos estar disponibles permanentemente una vez han sido introducidos
@@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Cuando se activ
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Los vehículos nunca caducan: {STRING}
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Cuando se activa, todos los modelos de vehículos permanecen disponibles para siempre una vez han sido introducidos
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Control de horarios: {STRING}
STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Cronometraje: {STRING}
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Selecciona las unidades de gestión temporal del juego. Este ajuste no puede ser cambiado más adelante.{}{}"Basado en calendario" es la experiencia clásica de OpenTTD, donde un año tiene 12 meses y cada mes entre 28 y 31 días.{}{}En "Basado en reloj", el movimiento de los vehículos, la producción de carga y la gestión financiera se basan en incrementos de un minuto, que es similar a lo que tarda un mes de 30 días en el modo "basado en calendario". Estos se agrupan en períodos de 12 minutos, que equivalen a un año en el modo "basado en calendario".{}{}En uno y otro modo siempre hay un calendario clásico que es usado para las fechas de aparición de vehículos, casas y otras infraestructuras.
###length 2
STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Calendario
+7
View File
@@ -239,6 +239,7 @@ STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}
# Time units used in string control characters
STR_UNITS_MONTHS :{NUM}{NBSP}mes{P "" es}
# Common window strings
@@ -493,6 +494,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Eliminar todos
# About menu
STR_ABOUT_MENU_LAND_BLOCK_INFO :Información sobre área de terreno
STR_ABOUT_MENU_HELP :Ayuda y manuales
STR_ABOUT_MENU_TOGGLE_CONSOLE :Activar consola
STR_ABOUT_MENU_AI_DEBUG :Depuración de scripts de IA o juego
STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla
@@ -973,6 +975,8 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Detectar
STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Ajustar biseles
STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Ajustar el tamaño de los biseles respecto a la interfaz
STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Usar la fuente sprite tradicional
STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Marca esta casilla si prefieres usar la fuente de letra tradicional.
STR_GAME_OPTIONS_GUI_SCALE_1X :1x
STR_GAME_OPTIONS_GUI_SCALE_2X :2x
@@ -4015,6 +4019,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tranvía
STR_ENGINE_PREVIEW_AIRCRAFT :{G=f}aeronave
STR_ENGINE_PREVIEW_SHIP :{G=m}barco
STR_ENGINE_PREVIEW_SPEED_POWER :Velocidad: {VELOCITY} Potencia: {POWER}
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Reemplazar {STRING} - {STRING}
@@ -4286,6 +4291,7 @@ STR_ORDER_DROP_HALT_DEPOT :Detenerse
# Depot action tooltips, one per vehicle type
###length VEHICLE_TYPES
STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :Seleccione una acción que quiera realizar en este depósito.
###next-name-looks-similar
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo para recorridos condicionales
@@ -4999,6 +5005,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... la a
# Extra messages which go on the third line of errors, explaining why orders failed
STR_ERROR_NO_BUS_STATION :{WHITE}No hay una estación de autobus
STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}No hay paradas con un tipo de tramo compatible
STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}El helicóptero no puede aterrizar en este aeropuerto
# Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}No se pueden asignar itinerarios al vehículo...
+3 -3
View File
@@ -25,7 +25,7 @@ static const uint16_t NETWORK_CONTENT_SERVER_PORT = 3978; ///< The
static const uint16_t NETWORK_DEFAULT_PORT = 3979; ///< The default port of the game server (TCP & UDP)
static const uint16_t NETWORK_ADMIN_PORT = 3977; ///< The default port for admin network
static const uint16_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet
static const size_t UDP_MTU = 1460; ///< Number of bytes we can pack in a single UDP packet
static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.org/participate"; ///< Link with more details & privacy statement of the survey.
/*
@@ -42,8 +42,8 @@ static const std::string NETWORK_SURVEY_DETAILS_LINK = "https://survey.openttd.o
* Send_uint16(GB(size, 16, 14) | 0b10 << 14)
* Send_uint16(GB(size, 0, 16))
*/
static const uint16_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet
static const uint16_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility
static const size_t TCP_MTU = 32767; ///< Number of bytes we can pack in a single TCP packet
static const size_t COMPAT_MTU = 1460; ///< Number of bytes we can pack in a single packet for backward compatibility
static const byte NETWORK_GAME_ADMIN_VERSION = 3; ///< What version of the admin network do we use?
static const byte NETWORK_GAME_INFO_VERSION = 7; ///< What version of game-info do we use?
+71 -71
View File
@@ -141,7 +141,7 @@ void FillStaticNetworkServerGameInfo()
* Get the NetworkServerGameInfo structure with the latest information of the server.
* @return The current NetworkServerGameInfo.
*/
const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo()
const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo()
{
/* These variables are updated inside _network_game_info as if they are global variables:
* - clients_on
@@ -152,7 +152,7 @@ const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo()
_network_game_info.spectators_on = NetworkSpectatorCount();
_network_game_info.calendar_date = TimerGameCalendar::date;
_network_game_info.ticks_playing = TimerGameTick::counter;
return &_network_game_info;
return _network_game_info;
}
/**
@@ -184,9 +184,9 @@ static void HandleIncomingNetworkGameInfoGRFConfig(GRFConfig *config, std::strin
* @param p the packet to write the data to.
* @param info the NetworkGameInfo struct to serialize from.
*/
void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names)
void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names)
{
p->Send_uint8 (NETWORK_GAME_INFO_VERSION);
p.Send_uint8 (NETWORK_GAME_INFO_VERSION);
/*
* Please observe the order.
@@ -197,15 +197,15 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
* to the NetworkGameInfo wire-protocol! */
/* NETWORK_GAME_INFO_VERSION = 7 */
p->Send_uint64(info->ticks_playing);
p.Send_uint64(info.ticks_playing);
/* NETWORK_GAME_INFO_VERSION = 6 */
p->Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5);
p.Send_uint8(send_newgrf_names ? NST_GRFID_MD5_NAME : NST_GRFID_MD5);
/* NETWORK_GAME_INFO_VERSION = 5 */
GameInfo *game_info = Game::GetInfo();
p->Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion());
p->Send_string(game_info == nullptr ? "" : game_info->GetName());
p.Send_uint32(game_info == nullptr ? -1 : (uint32_t)game_info->GetVersion());
p.Send_string(game_info == nullptr ? "" : game_info->GetName());
/* NETWORK_GAME_INFO_VERSION = 4 */
{
@@ -217,40 +217,40 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
uint count = 0;
/* Count number of GRFs to send information about */
for (c = info->grfconfig; c != nullptr; c = c->next) {
for (c = info.grfconfig; c != nullptr; c = c->next) {
if (!HasBit(c->flags, GCF_STATIC)) count++;
}
p->Send_uint8 (count); // Send number of GRFs
p.Send_uint8 (count); // Send number of GRFs
/* Send actual GRF Identifications */
for (c = info->grfconfig; c != nullptr; c = c->next) {
for (c = info.grfconfig; c != nullptr; c = c->next) {
if (HasBit(c->flags, GCF_STATIC)) continue;
SerializeGRFIdentifier(p, &c->ident);
if (send_newgrf_names) p->Send_string(c->GetName());
SerializeGRFIdentifier(p, c->ident);
if (send_newgrf_names) p.Send_string(c->GetName());
}
}
/* NETWORK_GAME_INFO_VERSION = 3 */
p->Send_uint32(info->calendar_date.base());
p->Send_uint32(info->calendar_start.base());
p.Send_uint32(info.calendar_date.base());
p.Send_uint32(info.calendar_start.base());
/* NETWORK_GAME_INFO_VERSION = 2 */
p->Send_uint8 (info->companies_max);
p->Send_uint8 (info->companies_on);
p->Send_uint8 (info->clients_max); // Used to be max-spectators
p.Send_uint8 (info.companies_max);
p.Send_uint8 (info.companies_on);
p.Send_uint8 (info.clients_max); // Used to be max-spectators
/* NETWORK_GAME_INFO_VERSION = 1 */
p->Send_string(info->server_name);
p->Send_string(info->server_revision);
p->Send_bool (info->use_password);
p->Send_uint8 (info->clients_max);
p->Send_uint8 (info->clients_on);
p->Send_uint8 (info->spectators_on);
p->Send_uint16(info->map_width);
p->Send_uint16(info->map_height);
p->Send_uint8 (info->landscape);
p->Send_bool (info->dedicated);
p.Send_string(info.server_name);
p.Send_string(info.server_revision);
p.Send_bool (info.use_password);
p.Send_uint8 (info.clients_max);
p.Send_uint8 (info.clients_on);
p.Send_uint8 (info.spectators_on);
p.Send_uint16(info.map_width);
p.Send_uint16(info.map_height);
p.Send_uint8 (info.landscape);
p.Send_bool (info.dedicated);
}
/**
@@ -258,9 +258,9 @@ void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool
* @param p the packet to read the data from.
* @param info the NetworkGameInfo to deserialize into.
*/
void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table)
void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table)
{
byte game_info_version = p->Recv_uint8();
byte game_info_version = p.Recv_uint8();
NewGRFSerializationType newgrf_serialisation = NST_GRFID_MD5;
/*
@@ -273,17 +273,17 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
switch (game_info_version) {
case 7:
info->ticks_playing = p->Recv_uint64();
info.ticks_playing = p.Recv_uint64();
[[fallthrough]];
case 6:
newgrf_serialisation = (NewGRFSerializationType)p->Recv_uint8();
newgrf_serialisation = (NewGRFSerializationType)p.Recv_uint8();
if (newgrf_serialisation >= NST_END) return;
[[fallthrough]];
case 5: {
info->gamescript_version = (int)p->Recv_uint32();
info->gamescript_name = p->Recv_string(NETWORK_NAME_LENGTH);
info.gamescript_version = (int)p.Recv_uint32();
info.gamescript_name = p.Recv_string(NETWORK_NAME_LENGTH);
[[fallthrough]];
}
@@ -292,23 +292,23 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
* protocol are matched to eachother. If that is not the case anymore a
* check must be added to ensure the received data is still valid. */
static_assert(std::numeric_limits<uint8_t>::max() == NETWORK_MAX_GRF_COUNT);
uint num_grfs = p->Recv_uint8();
uint num_grfs = p.Recv_uint8();
GRFConfig **dst = &info->grfconfig;
GRFConfig **dst = &info.grfconfig;
for (uint i = 0; i < num_grfs; i++) {
NamedGRFIdentifier grf;
switch (newgrf_serialisation) {
case NST_GRFID_MD5:
DeserializeGRFIdentifier(p, &grf.ident);
DeserializeGRFIdentifier(p, grf.ident);
break;
case NST_GRFID_MD5_NAME:
DeserializeGRFIdentifierWithName(p, &grf);
DeserializeGRFIdentifierWithName(p, grf);
break;
case NST_LOOKUP_ID: {
if (newgrf_lookup_table == nullptr) return;
auto it = newgrf_lookup_table->find(p->Recv_uint32());
auto it = newgrf_lookup_table->find(p.Recv_uint32());
if (it == newgrf_lookup_table->end()) return;
grf = it->second;
break;
@@ -330,40 +330,40 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
}
case 3:
info->calendar_date = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
info->calendar_start = Clamp(p->Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
info.calendar_date = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
info.calendar_start = Clamp(p.Recv_uint32(), 0, CalendarTime::MAX_DATE.base());
[[fallthrough]];
case 2:
info->companies_max = p->Recv_uint8 ();
info->companies_on = p->Recv_uint8 ();
p->Recv_uint8(); // Used to contain max-spectators.
info.companies_max = p.Recv_uint8 ();
info.companies_on = p.Recv_uint8 ();
p.Recv_uint8(); // Used to contain max-spectators.
[[fallthrough]];
case 1:
info->server_name = p->Recv_string(NETWORK_NAME_LENGTH);
info->server_revision = p->Recv_string(NETWORK_REVISION_LENGTH);
if (game_info_version < 6) p->Recv_uint8 (); // Used to contain server-lang.
info->use_password = p->Recv_bool ();
info->clients_max = p->Recv_uint8 ();
info->clients_on = p->Recv_uint8 ();
info->spectators_on = p->Recv_uint8 ();
info.server_name = p.Recv_string(NETWORK_NAME_LENGTH);
info.server_revision = p.Recv_string(NETWORK_REVISION_LENGTH);
if (game_info_version < 6) p.Recv_uint8 (); // Used to contain server-lang.
info.use_password = p.Recv_bool ();
info.clients_max = p.Recv_uint8 ();
info.clients_on = p.Recv_uint8 ();
info.spectators_on = p.Recv_uint8 ();
if (game_info_version < 3) { // 16 bits dates got scrapped and are read earlier
info->calendar_date = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
info->calendar_start = p->Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
info.calendar_date = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
info.calendar_start = p.Recv_uint16() + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
}
if (game_info_version < 6) while (p->Recv_uint8() != 0) {} // Used to contain the map-name.
info->map_width = p->Recv_uint16();
info->map_height = p->Recv_uint16();
info->landscape = p->Recv_uint8 ();
info->dedicated = p->Recv_bool ();
if (game_info_version < 6) while (p.Recv_uint8() != 0) {} // Used to contain the map-name.
info.map_width = p.Recv_uint16();
info.map_height = p.Recv_uint16();
info.landscape = p.Recv_uint8 ();
info.dedicated = p.Recv_bool ();
if (info->landscape >= NUM_LANDSCAPE) info->landscape = 0;
if (info.landscape >= NUM_LANDSCAPE) info.landscape = 0;
}
/* For older servers, estimate the ticks running based on the calendar date. */
if (game_info_version < 7) {
info->ticks_playing = static_cast<uint64_t>(std::max(0, info->calendar_date.base() - info->calendar_start.base())) * Ticks::DAY_TICKS;
info.ticks_playing = static_cast<uint64_t>(std::max(0, info.calendar_date.base() - info.calendar_start.base())) * Ticks::DAY_TICKS;
}
}
@@ -372,11 +372,11 @@ void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfo
* @param p the packet to write the data to.
* @param grf the GRFIdentifier to serialize.
*/
void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf)
void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf)
{
p->Send_uint32(grf->grfid);
for (size_t j = 0; j < grf->md5sum.size(); j++) {
p->Send_uint8(grf->md5sum[j]);
p.Send_uint32(grf.grfid);
for (size_t j = 0; j < grf.md5sum.size(); j++) {
p.Send_uint8(grf.md5sum[j]);
}
}
@@ -385,11 +385,11 @@ void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf)
* @param p the packet to read the data from.
* @param grf the GRFIdentifier to deserialize.
*/
void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf)
void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf)
{
grf->grfid = p->Recv_uint32();
for (size_t j = 0; j < grf->md5sum.size(); j++) {
grf->md5sum[j] = p->Recv_uint8();
grf.grfid = p.Recv_uint32();
for (size_t j = 0; j < grf.md5sum.size(); j++) {
grf.md5sum[j] = p.Recv_uint8();
}
}
@@ -398,8 +398,8 @@ void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf)
* @param p the packet to read the data from.
* @param grf the NamedGRFIdentifier to deserialize.
*/
void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf)
void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf)
{
DeserializeGRFIdentifier(p, &grf->ident);
grf->name = p->Recv_string(NETWORK_GRF_NAME_LENGTH);
DeserializeGRFIdentifier(p, grf.ident);
grf.name = p.Recv_string(NETWORK_GRF_NAME_LENGTH);
}
+6 -6
View File
@@ -141,13 +141,13 @@ bool IsNetworkCompatibleVersion(std::string_view other);
void CheckGameCompatibility(NetworkGameInfo &ngi);
void FillStaticNetworkServerGameInfo();
const NetworkServerGameInfo *GetCurrentNetworkServerGameInfo();
const NetworkServerGameInfo &GetCurrentNetworkServerGameInfo();
void DeserializeGRFIdentifier(Packet *p, GRFIdentifier *grf);
void DeserializeGRFIdentifierWithName(Packet *p, NamedGRFIdentifier *grf);
void SerializeGRFIdentifier(Packet *p, const GRFIdentifier *grf);
void DeserializeGRFIdentifier(Packet &p, GRFIdentifier &grf);
void DeserializeGRFIdentifierWithName(Packet &p, NamedGRFIdentifier &grf);
void SerializeGRFIdentifier(Packet &p, const GRFIdentifier &grf);
void DeserializeNetworkGameInfo(Packet *p, NetworkGameInfo *info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr);
void SerializeNetworkGameInfo(Packet *p, const NetworkServerGameInfo *info, bool send_newgrf_names = true);
void DeserializeNetworkGameInfo(Packet &p, NetworkGameInfo &info, const GameInfoNewGRFLookupTable *newgrf_lookup_table = nullptr);
void SerializeNetworkGameInfo(Packet &p, const NetworkServerGameInfo &info, bool send_newgrf_names = true);
#endif /* NETWORK_CORE_GAME_INFO_H */
+4 -29
View File
@@ -28,7 +28,7 @@
* loose some the data of the packet, so there you pass the maximum
* size for the packet you expect from the network.
*/
Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : next(nullptr), pos(0), limit(limit)
Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size) : pos(0), limit(limit)
{
assert(cs != nullptr);
@@ -44,45 +44,20 @@ Packet::Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size)
* the limit as it might break things if the other side is not expecting
* much larger packets than what they support.
*/
Packet::Packet(PacketType type, size_t limit) : next(nullptr), pos(0), limit(limit), cs(nullptr)
Packet::Packet(PacketType type, size_t limit) : pos(0), limit(limit), cs(nullptr)
{
/* Allocate space for the the size so we can write that in just before sending the packet. */
this->Send_uint16(0);
this->Send_uint8(type);
}
/**
* Add the given Packet to the end of the queue of packets.
* @param queue The pointer to the begin of the queue.
* @param packet The packet to append to the queue.
*/
/* static */ void Packet::AddToQueue(Packet **queue, Packet *packet)
{
while (*queue != nullptr) queue = &(*queue)->next;
*queue = packet;
}
/**
* Pop the packet from the begin of the queue and set the
* begin of the queue to the second element in the queue.
* @param queue The pointer to the begin of the queue.
* @return The Packet that used to be a the begin of the queue.
*/
/* static */ Packet *Packet::PopFromQueue(Packet **queue)
{
Packet *p = *queue;
*queue = p->next;
p->next = nullptr;
return p;
}
/**
* Writes the packet size from the raw packet from packet->size
*/
void Packet::PrepareToSend()
{
assert(this->cs == nullptr && this->next == nullptr);
assert(this->cs == nullptr);
this->buffer[0] = GB(this->Size(), 0, 8);
this->buffer[1] = GB(this->Size(), 8, 8);
@@ -268,7 +243,7 @@ size_t Packet::Size() const
*/
bool Packet::ParsePacketSize()
{
assert(this->cs != nullptr && this->next == nullptr);
assert(this->cs != nullptr);
size_t size = (size_t)this->buffer[0];
size += (size_t)this->buffer[1] << 8;
-5
View File
@@ -41,8 +41,6 @@ typedef uint8_t PacketType; ///< Identifier for the packet
*/
struct Packet {
private:
/** The next packet. Used for queueing packets before sending. */
Packet *next;
/** The current read/write position in the packet */
PacketSize pos;
/** The buffer of this packet. */
@@ -57,9 +55,6 @@ public:
Packet(NetworkSocketHandler *cs, size_t limit, size_t initial_read_size = sizeof(PacketSize));
Packet(PacketType type, size_t limit = COMPAT_MTU);
static void AddToQueue(Packet **queue, Packet *packet);
static Packet *PopFromQueue(Packet **queue);
/* Sending/writing of packets */
void PrepareToSend();
+20 -38
View File
@@ -22,29 +22,15 @@
*/
NetworkTCPSocketHandler::NetworkTCPSocketHandler(SOCKET s) :
NetworkSocketHandler(),
packet_queue(nullptr), packet_recv(nullptr),
sock(s), writable(false)
{
}
NetworkTCPSocketHandler::~NetworkTCPSocketHandler()
{
this->EmptyPacketQueue();
this->CloseSocket();
}
/**
* Free all pending and partially received packets.
*/
void NetworkTCPSocketHandler::EmptyPacketQueue()
{
while (this->packet_queue != nullptr) {
delete Packet::PopFromQueue(&this->packet_queue);
}
delete this->packet_recv;
this->packet_recv = nullptr;
}
/**
* Close the actual socket of the connection.
* Please make sure CloseConnection is called before CloseSocket, as
@@ -67,7 +53,8 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool
this->MarkClosed();
this->writable = false;
this->EmptyPacketQueue();
this->packet_queue.clear();
this->packet_recv = nullptr;
return NETWORK_RECV_STATUS_OKAY;
}
@@ -78,12 +65,12 @@ NetworkRecvStatus NetworkTCPSocketHandler::CloseConnection([[maybe_unused]] bool
* if the OS-network-buffer is full)
* @param packet the packet to send
*/
void NetworkTCPSocketHandler::SendPacket(Packet *packet)
void NetworkTCPSocketHandler::SendPacket(std::unique_ptr<Packet> &&packet)
{
assert(packet != nullptr);
packet->PrepareToSend();
Packet::AddToQueue(&this->packet_queue, packet);
this->packet_queue.push_back(std::move(packet));
}
/**
@@ -98,15 +85,13 @@ void NetworkTCPSocketHandler::SendPacket(Packet *packet)
*/
SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
{
ssize_t res;
Packet *p;
/* We can not write to this socket!! */
if (!this->writable) return SPS_NONE_SENT;
if (!this->IsConnected()) return SPS_CLOSED;
while ((p = this->packet_queue) != nullptr) {
res = p->TransferOut<int>(send, this->sock, 0);
while (!this->packet_queue.empty()) {
Packet &p = *this->packet_queue.front();
ssize_t res = p.TransferOut<int>(send, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -126,9 +111,9 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
}
/* Is this packet sent? */
if (p->RemainingBytesToTransfer() == 0) {
if (p.RemainingBytesToTransfer() == 0) {
/* Go to the next packet */
delete Packet::PopFromQueue(&this->packet_queue);
this->packet_queue.pop_front();
} else {
return SPS_PARTLY_SENT;
}
@@ -141,22 +126,22 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
* Receives a packet for the given client
* @return The received packet (or nullptr when it didn't receive one)
*/
Packet *NetworkTCPSocketHandler::ReceivePacket()
std::unique_ptr<Packet> NetworkTCPSocketHandler::ReceivePacket()
{
ssize_t res;
if (!this->IsConnected()) return nullptr;
if (this->packet_recv == nullptr) {
this->packet_recv = new Packet(this, TCP_MTU);
this->packet_recv = std::make_unique<Packet>(this, TCP_MTU);
}
Packet *p = this->packet_recv;
Packet &p = *this->packet_recv.get();
/* Read packet size */
if (!p->HasPacketSizeData()) {
while (p->RemainingBytesToTransfer() != 0) {
res = p->TransferIn<int>(recv, this->sock, 0);
if (!p.HasPacketSizeData()) {
while (p.RemainingBytesToTransfer() != 0) {
res = p.TransferIn<int>(recv, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -176,15 +161,15 @@ Packet *NetworkTCPSocketHandler::ReceivePacket()
}
/* Parse the size in the received packet and if not valid, close the connection. */
if (!p->ParsePacketSize()) {
if (!p.ParsePacketSize()) {
this->CloseConnection();
return nullptr;
}
}
/* Read rest of packet */
while (p->RemainingBytesToTransfer() != 0) {
res = p->TransferIn<int>(recv, this->sock, 0);
while (p.RemainingBytesToTransfer() != 0) {
res = p.TransferIn<int>(recv, this->sock, 0);
if (res == -1) {
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
@@ -203,11 +188,8 @@ Packet *NetworkTCPSocketHandler::ReceivePacket()
}
}
/* Prepare for receiving a new packet */
this->packet_recv = nullptr;
p->PrepareToRead();
return p;
p.PrepareToRead();
return std::move(this->packet_recv);
}
/**
+5 -5
View File
@@ -30,8 +30,8 @@ enum SendPacketsState {
/** Base socket handler for all TCP sockets */
class NetworkTCPSocketHandler : public NetworkSocketHandler {
private:
Packet *packet_queue; ///< Packets that are awaiting delivery
Packet *packet_recv; ///< Partially received packet
std::deque<std::unique_ptr<Packet>> packet_queue; ///< Packets that are awaiting delivery. Cannot be std::queue as that does not have a clear() function.
std::unique_ptr<Packet> packet_recv; ///< Partially received packet
void EmptyPacketQueue();
public:
@@ -47,10 +47,10 @@ public:
virtual NetworkRecvStatus CloseConnection(bool error = true);
void CloseSocket();
virtual void SendPacket(Packet *packet);
virtual void SendPacket(std::unique_ptr<Packet> &&packet);
SendPacketsState SendPackets(bool closing_down = false);
virtual Packet *ReceivePacket();
virtual std::unique_ptr<Packet> ReceivePacket();
bool CanSendReceive();
@@ -58,7 +58,7 @@ public:
* Whether there is something pending in the send queue.
* @return true when something is pending in the send queue.
*/
bool HasSendQueue() { return this->packet_queue != nullptr; }
bool HasSendQueue() { return !this->packet_queue.empty(); }
NetworkTCPSocketHandler(SOCKET s = INVALID_SOCKET);
~NetworkTCPSocketHandler();
+39 -40
View File
@@ -43,9 +43,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool)
* @param p the packet to handle.
* @return #NetworkRecvStatus of handling.
*/
NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet &p)
{
PacketAdminType type = (PacketAdminType)p->Recv_uint8();
PacketAdminType type = (PacketAdminType)p.Recv_uint8();
if (this->HasClientQuit()) {
Debug(net, 0, "[tcp/admin] Received invalid packet from '{}' ({})", this->admin_name, this->admin_version);
@@ -108,10 +108,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
*/
NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets()
{
Packet *p;
std::unique_ptr<Packet> p;
while ((p = this->ReceivePacket()) != nullptr) {
NetworkRecvStatus res = this->HandlePacket(p);
delete p;
NetworkRecvStatus res = this->HandlePacket(*p);
if (res != NETWORK_RECV_STATUS_OKAY) return res;
}
@@ -129,40 +128,40 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminTyp
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_JOIN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_QUIT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_FULL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_BANNED); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_ERROR); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PROTOCOL(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PROTOCOL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_WELCOME); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_NEWGAME); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_SHUTDOWN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet *) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_DATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_DATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_JOIN); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_INFO); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_UPDATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_QUIT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CLIENT_ERROR); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_NEW(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_NEW); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_INFO(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_INFO); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_UPDATE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_REMOVE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_REMOVE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_ECONOMY(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_COMPANY_STATS(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_COMPANY_STATS); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_PONG(Packet &) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_PONG); }
+37 -37
View File
@@ -21,7 +21,7 @@
* Enum with types of TCP packets specific to the admin network.
* This protocol may only be extended to ensure stability.
*/
enum PacketAdminType {
enum PacketAdminType : uint8_t {
ADMIN_PACKET_ADMIN_JOIN, ///< The admin announces and authenticates itself to the server.
ADMIN_PACKET_ADMIN_QUIT, ///< The admin tells the server that it is quitting.
ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY, ///< The admin tells the server the update frequency of a particular piece of information.
@@ -125,14 +125,14 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p);
/**
* Notification to the server that this admin is quitting.
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p);
/**
* Register updates to be sent at certain frequencies (as announced in the PROTOCOL packet):
@@ -141,7 +141,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p);
/**
* Poll the server for certain updates, an invalid poll (e.g. not existent id) gets silently dropped:
@@ -152,7 +152,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_POLL(Packet &p);
/**
* Send chat as the server:
@@ -163,7 +163,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p);
/**
* Send chat from the external source:
@@ -174,7 +174,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p);
/**
* Execute a command on the servers console:
@@ -182,7 +182,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_RCON(Packet &p);
/**
* Send a JSON string to the current active GameScript.
@@ -190,7 +190,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p);
/**
* Ping the server, requiring the server to reply with a pong packet.
@@ -198,21 +198,21 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_PING(Packet *p);
virtual NetworkRecvStatus Receive_ADMIN_PING(Packet &p);
/**
* The server is full (connection gets closed).
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p);
/**
* The source IP address is banned (connection gets closed).
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p);
/**
* An error was caused by this admin connection (connection gets closed).
@@ -220,7 +220,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p);
/**
* Inform a just joined admin about the protocol specifics:
@@ -231,7 +231,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_PROTOCOL(Packet &p);
/**
* Welcome a connected admin to the game:
@@ -247,21 +247,21 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p);
/**
* Notification about a newgame.
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p);
/**
* Notification about the server shutting down.
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p);
/**
* Send the current date of the game:
@@ -269,7 +269,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_DATE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_DATE(Packet &p);
/**
* Notification of a new client:
@@ -277,7 +277,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_JOIN(Packet &p);
/**
* Client information of a specific client:
@@ -290,7 +290,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p);
/**
* Client update details on a specific client (e.g. after rename or move):
@@ -300,7 +300,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_UPDATE(Packet &p);
/**
* Notification about a client leaving the game.
@@ -308,7 +308,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_QUIT(Packet &p);
/**
* Notification about a client error (and thus the clients disconnection).
@@ -317,7 +317,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_ERROR(Packet &p);
/**
* Notification of a new company:
@@ -325,7 +325,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_NEW(Packet &p);
/**
* Company information on a specific company:
@@ -339,7 +339,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_INFO(Packet &p);
/**
* Company information of a specific company:
@@ -356,7 +356,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p);
/**
* Notification about a removed company (e.g. due to bankruptcy).
@@ -365,7 +365,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_REMOVE(Packet &p);
/**
* Economy update of a specific company:
@@ -383,7 +383,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_ECONOMY(Packet &p);
/**
* Company statistics on stations and vehicles:
@@ -401,7 +401,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_STATS(Packet &p);
/**
* Send chat from the game into the admin network:
@@ -413,7 +413,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p);
/**
* Result of an rcon command:
@@ -422,7 +422,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p);
/**
* Send what would be printed on the server's console also into the admin network.
@@ -431,7 +431,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CONSOLE(Packet &p);
/**
* Send DoCommand names to the bot upon request only.
@@ -450,7 +450,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CMD_NAMES(Packet &p);
/**
* Send incoming command packets to the admin network.
@@ -470,7 +470,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet &p);
/**
* Send a ping-reply (pong) to the admin that sent us the ping packet.
@@ -478,7 +478,7 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_PONG(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_PONG(Packet &p);
/**
* Notify the admin connection that the rcon command has finished.
@@ -486,9 +486,9 @@ protected:
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet &p);
NetworkRecvStatus HandlePacket(Packet *p);
NetworkRecvStatus HandlePacket(Packet &p);
public:
NetworkRecvStatus CloseConnection(bool error = true) override;
+11 -12
View File
@@ -98,9 +98,9 @@ std::optional<std::string> ContentInfo::GetTextfile(TextfileType type) const
* @param p the packet to handle
* @return true if we should immediately handle further packets, false otherwise
*/
bool NetworkContentSocketHandler::HandlePacket(Packet *p)
bool NetworkContentSocketHandler::HandlePacket(Packet &p)
{
PacketContentType type = (PacketContentType)p->Recv_uint8();
PacketContentType type = (PacketContentType)p.Recv_uint8();
switch (this->HasClientQuit() ? PACKET_CONTENT_END : type) {
case PACKET_CONTENT_CLIENT_INFO_LIST: return this->Receive_CLIENT_INFO_LIST(p);
@@ -146,12 +146,11 @@ bool NetworkContentSocketHandler::ReceivePackets()
*
* What arbitrary number to choose is the ultimate question though.
*/
Packet *p;
std::unique_ptr<Packet> p;
static const int MAX_PACKETS_TO_RECEIVE = 42;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
bool cont = this->HandlePacket(p);
delete p;
bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -170,13 +169,13 @@ bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type)
return false;
}
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); }
bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); }
bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); }
bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_LIST(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_LIST); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_ID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_ID); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID); }
bool NetworkContentSocketHandler::Receive_CLIENT_INFO_EXTID_MD5(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_INFO_EXTID_MD5); }
bool NetworkContentSocketHandler::Receive_SERVER_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_INFO); }
bool NetworkContentSocketHandler::Receive_CLIENT_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_CLIENT_CONTENT); }
bool NetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CONTENT_SERVER_CONTENT); }
/**
* Helper to get the subdirectory a #ContentInfo is located in.
+8 -8
View File
@@ -34,7 +34,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_INFO_LIST(Packet *p);
virtual bool Receive_CLIENT_INFO_LIST(Packet &p);
/**
* Client requesting a list of content info:
@@ -43,7 +43,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_INFO_ID(Packet *p);
virtual bool Receive_CLIENT_INFO_ID(Packet &p);
/**
* Client requesting a list of content info based on an external
@@ -57,7 +57,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_INFO_EXTID(Packet *p);
virtual bool Receive_CLIENT_INFO_EXTID(Packet &p);
/**
* Client requesting a list of content info based on an external
@@ -72,7 +72,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet *p);
virtual bool Receive_CLIENT_INFO_EXTID_MD5(Packet &p);
/**
* Server sending list of content info:
@@ -90,7 +90,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERVER_INFO(Packet *p);
virtual bool Receive_SERVER_INFO(Packet &p);
/**
* Client requesting the actual content:
@@ -99,7 +99,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_CONTENT(Packet *p);
virtual bool Receive_CLIENT_CONTENT(Packet &p);
/**
* Server sending list of content info:
@@ -111,9 +111,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERVER_CONTENT(Packet *p);
virtual bool Receive_SERVER_CONTENT(Packet &p);
bool HandlePacket(Packet *p);
bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs
+1 -1
View File
@@ -32,7 +32,7 @@ enum ContentType {
};
/** Enum with all types of TCP content packets. The order MUST not be changed **/
enum PacketContentType {
enum PacketContentType : uint8_t {
PACKET_CONTENT_CLIENT_INFO_LIST, ///< Queries the content server for a list of info of a given content type
PACKET_CONTENT_CLIENT_INFO_ID, ///< Queries the content server for information about a list of internal IDs
PACKET_CONTENT_CLIENT_INFO_EXTID, ///< Queries the content server for information about a list of external IDs
+21 -22
View File
@@ -22,9 +22,9 @@
* @param p The packet to handle.
* @return True iff we should immediately handle further packets.
*/
bool NetworkCoordinatorSocketHandler::HandlePacket(Packet *p)
bool NetworkCoordinatorSocketHandler::HandlePacket(Packet &p)
{
PacketCoordinatorType type = (PacketCoordinatorType)p->Recv_uint8();
PacketCoordinatorType type = (PacketCoordinatorType)p.Recv_uint8();
switch (type) {
case PACKET_COORDINATOR_GC_ERROR: return this->Receive_GC_ERROR(p);
@@ -64,12 +64,11 @@ bool NetworkCoordinatorSocketHandler::ReceivePackets()
*
* What arbitrary number to choose is the ultimate question though.
*/
Packet *p;
std::unique_ptr<Packet> p;
static const int MAX_PACKETS_TO_RECEIVE = 42;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
bool cont = this->HandlePacket(p);
delete p;
bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -87,20 +86,20 @@ bool NetworkCoordinatorSocketHandler::ReceiveInvalidPacket(PacketCoordinatorType
return false;
}
bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); }
bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); }
bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); }
bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); }
bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); }
bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); }
bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); }
bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); }
bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); }
bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_ERROR); }
bool NetworkCoordinatorSocketHandler::Receive_SERVER_REGISTER(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_REGISTER); }
bool NetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_REGISTER_ACK); }
bool NetworkCoordinatorSocketHandler::Receive_SERVER_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERVER_UPDATE); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_LISTING); }
bool NetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_LISTING); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECTING); }
bool NetworkCoordinatorSocketHandler::Receive_SERCLI_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED); }
bool NetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_CONNECT_FAILED); }
bool NetworkCoordinatorSocketHandler::Receive_CLIENT_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_CLIENT_CONNECTED); }
bool NetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_DIRECT_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_REQUEST); }
bool NetworkCoordinatorSocketHandler::Receive_SERCLI_STUN_RESULT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_SERCLI_STUN_RESULT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_STUN_CONNECT); }
bool NetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_NEWGRF_LOOKUP); }
bool NetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_COORDINATOR_GC_TURN_CONNECT); }
+19 -19
View File
@@ -25,7 +25,7 @@
* CLIENT -> packets from Client to Game Coordinator.
* SERCLI -> packets from either the Server or Client to Game Coordinator.
**/
enum PacketCoordinatorType {
enum PacketCoordinatorType : uint8_t {
PACKET_COORDINATOR_GC_ERROR, ///< Game Coordinator indicates there was an error.
PACKET_COORDINATOR_SERVER_REGISTER, ///< Server registration.
PACKET_COORDINATOR_GC_REGISTER_ACK, ///< Game Coordinator accepts the registration.
@@ -83,7 +83,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_ERROR(Packet *p);
virtual bool Receive_GC_ERROR(Packet &p);
/**
* Server is starting a multiplayer game and wants to let the
@@ -98,7 +98,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERVER_REGISTER(Packet *p);
virtual bool Receive_SERVER_REGISTER(Packet &p);
/**
* Game Coordinator acknowledges the registration.
@@ -110,7 +110,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_REGISTER_ACK(Packet *p);
virtual bool Receive_GC_REGISTER_ACK(Packet &p);
/**
* Send an update of the current state of the server to the Game Coordinator.
@@ -121,7 +121,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERVER_UPDATE(Packet *p);
virtual bool Receive_SERVER_UPDATE(Packet &p);
/**
* Client requests a list of all public servers.
@@ -134,7 +134,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_LISTING(Packet *p);
virtual bool Receive_CLIENT_LISTING(Packet &p);
/**
* Game Coordinator replies with a list of all public servers. Multiple
@@ -149,7 +149,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_LISTING(Packet *p);
virtual bool Receive_GC_LISTING(Packet &p);
/**
* Client wants to connect to a Server.
@@ -160,7 +160,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_CONNECT(Packet *p);
virtual bool Receive_CLIENT_CONNECT(Packet &p);
/**
* Game Coordinator informs the Client under what token it will start the
@@ -172,7 +172,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_CONNECTING(Packet *p);
virtual bool Receive_GC_CONNECTING(Packet &p);
/**
* Client or Server failed to connect to the remote side.
@@ -184,7 +184,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERCLI_CONNECT_FAILED(Packet *p);
virtual bool Receive_SERCLI_CONNECT_FAILED(Packet &p);
/**
* Game Coordinator informs the Client that it failed to find a way to
@@ -196,7 +196,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_CONNECT_FAILED(Packet *p);
virtual bool Receive_GC_CONNECT_FAILED(Packet &p);
/**
* Client informs the Game Coordinator the connection with the Server is
@@ -208,7 +208,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_CLIENT_CONNECTED(Packet *p);
virtual bool Receive_CLIENT_CONNECTED(Packet &p);
/**
* Game Coordinator requests that the Client makes a direct connection to
@@ -222,7 +222,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_DIRECT_CONNECT(Packet *p);
virtual bool Receive_GC_DIRECT_CONNECT(Packet &p);
/**
* Game Coordinator requests the client/server to do a STUN request to the
@@ -237,7 +237,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_STUN_REQUEST(Packet *p);
virtual bool Receive_GC_STUN_REQUEST(Packet &p);
/**
* Client/server informs the Game Coordinator the result of a STUN request.
@@ -250,7 +250,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERCLI_STUN_RESULT(Packet *p);
virtual bool Receive_SERCLI_STUN_RESULT(Packet &p);
/**
* Game Coordinator informs the client/server of its STUN peer (the host:ip
@@ -266,7 +266,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_STUN_CONNECT(Packet *p);
virtual bool Receive_GC_STUN_CONNECT(Packet &p);
/**
* Game Coordinator informs the client of updates for the NewGRFs lookup table
@@ -289,7 +289,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_NEWGRF_LOOKUP(Packet *p);
virtual bool Receive_GC_NEWGRF_LOOKUP(Packet &p);
/**
* Game Coordinator requests that we make a connection to the indicated
@@ -303,9 +303,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_GC_TURN_CONNECT(Packet *p);
virtual bool Receive_GC_TURN_CONNECT(Packet &p);
bool HandlePacket(Packet *p);
bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs.
+48 -49
View File
@@ -61,9 +61,9 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool)
* @param p the packet to handle
* @return #NetworkRecvStatus of handling.
*/
NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet &p)
{
PacketGameType type = (PacketGameType)p->Recv_uint8();
PacketGameType type = (PacketGameType)p.Recv_uint8();
if (this->HasClientQuit()) {
Debug(net, 0, "[tcp/game] Received invalid packet from client {}", this->client_id);
@@ -135,10 +135,9 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
*/
NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets()
{
Packet *p;
std::unique_ptr<Packet> p;
while ((p = this->ReceivePacket()) != nullptr) {
NetworkRecvStatus res = HandlePacket(p);
delete p;
NetworkRecvStatus res = HandlePacket(*p);
if (res != NETWORK_RECV_STATUS_OKAY) return res;
}
@@ -156,50 +155,50 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceiveInvalidPacket(PacketGameType
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FULL); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_BANNED); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_JOIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_GAME_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CLIENT_INFO); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_GAME_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEED_COMPANY_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GAME_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMPANY_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WELCOME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WELCOME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_GETMAP); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_WAIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_BEGIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_SIZE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DATA); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MAP_DONE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MAP_OK); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_JOIN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_FRAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SYNC); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ACK); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_COMMAND); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMMAND); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_EXTERNAL_CHAT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_PASSWORD); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_SET_NAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_ERROR); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_ERROR_QUIT); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_SHUTDOWN); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_NEWGAME); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_RCON); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_RCON); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CHECK_NEWGRFS); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_NEWGRFS_CHECKED); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_MOVE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &) { return this->ReceiveInvalidPacket(PACKET_CLIENT_MOVE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_COMPANY_UPDATE); }
NetworkRecvStatus NetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &) { return this->ReceiveInvalidPacket(PACKET_SERVER_CONFIG_UPDATE); }
void NetworkGameSocketHandler::DeferDeletion()
{
+54 -66
View File
@@ -22,7 +22,7 @@
* Enum with all types of TCP packets.
* For the exact meaning, look at #NetworkGameSocketHandler.
*/
enum PacketGameType {
enum PacketGameType : uint8_t {
/*
* These first four pair of packets (thus eight in
* total) must remain in this order for backward
@@ -131,24 +131,12 @@ enum PacketGameType {
/** Packet that wraps a command */
struct CommandPacket;
/** A queue of CommandPackets. */
class CommandQueue {
CommandPacket *first; ///< The first packet in the queue.
CommandPacket *last; ///< The last packet in the queue; only valid when first != nullptr.
uint count; ///< The number of items in the queue.
public:
/** Initialise the command queue. */
CommandQueue() : first(nullptr), last(nullptr), count(0) {}
/** Clear the command queue. */
~CommandQueue() { this->Free(); }
void Append(CommandPacket *p);
CommandPacket *Pop(bool ignore_paused = false);
CommandPacket *Peek(bool ignore_paused = false);
void Free();
/** Get the number of items in the queue. */
uint Count() const { return this->count; }
};
/**
* A "queue" of CommandPackets.
* Not a std::queue because, when paused, some commands remain on the queue.
* In other words, you do not always pop the first element from this queue.
*/
using CommandQueue = std::vector<CommandPacket>;
/** Base socket handler for all TCP sockets */
class NetworkGameSocketHandler : public NetworkTCPSocketHandler {
@@ -164,13 +152,13 @@ protected:
* Notification that the server is full.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_FULL(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_FULL(Packet &p);
/**
* Notification that the client trying to join is banned.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_BANNED(Packet &p);
/**
* Try to join the server:
@@ -180,27 +168,27 @@ protected:
* uint8_t ID of the clients Language.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p);
/**
* The client made an error:
* uint8_t Error code caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_ERROR(Packet &p);
/**
* Request game information.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p);
/**
* Sends information about the game.
* Serialized NetworkGameInfo. See game_info.h for details.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p);
/**
* Send information about a client:
@@ -209,13 +197,13 @@ protected:
* string Name of the client.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p);
/**
* Indication to the client that the server needs a game password.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p);
/**
* Indication to the client that the server needs a company password:
@@ -223,7 +211,7 @@ protected:
* string Network ID of the server.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p);
/**
* Send a password to the server to authorize:
@@ -231,7 +219,7 @@ protected:
* string The password.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p);
/**
* Send a password to the server to authorize
@@ -239,7 +227,7 @@ protected:
* string The password.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p);
/**
* The client is joined and ready to receive their map:
@@ -248,61 +236,61 @@ protected:
* string Network ID of the server.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p);
/**
* Request the map from the server.
* uint32_t NewGRF version (release versions of OpenTTD only).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p);
/**
* Notification that another client is currently receiving the map:
* uint8_t Number of clients waiting in front of you.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_WAIT(Packet &p);
/**
* Sends that the server will begin with sending the map to the client:
* uint32_t Current frame.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p);
/**
* Sends the size of the map to the client.
* uint32_t Size of the (compressed) map (in bytes).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p);
/**
* Sends the data of the map to the client:
* Contains a part of the map (until max size of packet).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p);
/**
* Sends that all data of the map are sent to the client:
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p);
/**
* Tell the server that we are done receiving/loading the map.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p);
/**
* A client joined (PACKET_CLIENT_MAP_OK), what usually directly follows is a PACKET_SERVER_CLIENT_INFO:
* uint32_t ID of the client that just joined the game.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_JOIN(Packet &p);
/**
* Sends the current frame counter to the client:
@@ -313,7 +301,7 @@ protected:
* uint8_t Random token to validate the client is actually listening (only occasionally present).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_FRAME(Packet &p);
/**
* Sends a sync-check to the client:
@@ -322,7 +310,7 @@ protected:
* uint32_t General seed 2 (dependent on compile settings, not default).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_SYNC(Packet &p);
/**
* Tell the server we are done with this frame:
@@ -330,7 +318,7 @@ protected:
* uint8_t The random token that the server sent in the PACKET_SERVER_FRAME packet.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_ACK(Packet &p);
/**
* Send a DoCommand to the Server:
@@ -341,7 +329,7 @@ protected:
* uint8_t ID of the callback.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p);
/**
* Sends a DoCommand to the client:
@@ -353,7 +341,7 @@ protected:
* uint32_t Frame of execution.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p);
/**
* Sends a chat-packet to the server:
@@ -364,7 +352,7 @@ protected:
* uint64_t data (used e.g. for 'give money' actions).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p);
/**
* Sends a chat-packet to the client:
@@ -374,7 +362,7 @@ protected:
* uint64_t data (used e.g. for 'give money' actions).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CHAT(Packet &p);
/**
* Sends a chat-packet for external source to the client:
@@ -384,41 +372,41 @@ protected:
* string Message (max NETWORK_CHAT_LENGTH).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p);
/**
* Set the password for the clients current company:
* string The password.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p);
/**
* Gives the client a new name:
* string New name of the client.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p);
/**
* The client is quitting the game.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p);
/**
* The client made an error and is quitting the game.
* uint8_t Error of the code caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p);
/**
* Notification that a client left the game:
* uint32_t ID of the client.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_QUIT(Packet &p);
/**
* Inform all clients that one client made an error and thus has quit/been disconnected:
@@ -426,19 +414,19 @@ protected:
* uint8_t Code of the error caused (see NetworkErrorCode).
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p);
/**
* Let the clients know that the server is closing.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p);
/**
* Let the clients know that the server is loading a new map.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p);
/**
* Send the result of an issues RCon command back to the client:
@@ -446,7 +434,7 @@ protected:
* string Output of the RCon command
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_RCON(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_RCON(Packet &p);
/**
* Send an RCon command to the server:
@@ -454,7 +442,7 @@ protected:
* string Command to be executed.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_RCON(Packet &p);
/**
* Sends information about all used GRFs to the client:
@@ -463,13 +451,13 @@ protected:
* 16 * uint8_t MD5 checksum of the GRF
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p);
/**
* Tell the server that we have the required GRFs
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p);
/**
* Move a client from one company into another:
@@ -477,7 +465,7 @@ protected:
* uint8_t ID of the new company.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_MOVE(Packet &p);
/**
* Request the server to move this client into another company:
@@ -485,14 +473,14 @@ protected:
* string Password, if the company is password protected.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p);
virtual NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p);
/**
* Update the clients knowledge of which company is password protected:
* uint16_t Bitwise representation of each company
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p);
/**
* Update the clients knowledge of the max settings:
@@ -500,9 +488,9 @@ protected:
* uint8_t Maximum number of spectators allowed.
* @param p The packet that was just received.
*/
virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p);
virtual NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p);
NetworkRecvStatus HandlePacket(Packet *p);
NetworkRecvStatus HandlePacket(Packet &p);
NetworkGameSocketHandler(SOCKET s);
public:
@@ -542,8 +530,8 @@ public:
NetworkRecvStatus ReceivePackets();
const char *ReceiveCommand(Packet *p, CommandPacket *cp);
void SendCommand(Packet *p, const CommandPacket *cp);
const char *ReceiveCommand(Packet &p, CommandPacket &cp);
void SendCommand(Packet &p, const CommandPacket &cp);
bool IsPendingDeletion() const { return this->is_pending_deletion; }
+1 -1
View File
@@ -26,4 +26,4 @@ bool NetworkStunSocketHandler::ReceiveInvalidPacket(PacketStunType type)
return false;
}
bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet *) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); }
bool NetworkStunSocketHandler::Receive_SERCLI_STUN(Packet &) { return this->ReceiveInvalidPacket(PACKET_STUN_SERCLI_STUN); }
+2 -2
View File
@@ -17,7 +17,7 @@
#include "packet.h"
/** Enum with all types of TCP STUN packets. The order MUST not be changed. **/
enum PacketStunType {
enum PacketStunType : uint8_t {
PACKET_STUN_SERCLI_STUN, ///< Send a STUN request to the STUN server.
PACKET_STUN_END, ///< Must ALWAYS be on the end of this list!! (period)
};
@@ -39,7 +39,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERCLI_STUN(Packet *p);
virtual bool Receive_SERCLI_STUN(Packet &p);
public:
/**
+7 -8
View File
@@ -22,9 +22,9 @@
* @param p the packet to handle
* @return true if we should immediately handle further packets, false otherwise
*/
bool NetworkTurnSocketHandler::HandlePacket(Packet *p)
bool NetworkTurnSocketHandler::HandlePacket(Packet &p)
{
PacketTurnType type = (PacketTurnType)p->Recv_uint8();
PacketTurnType type = (PacketTurnType)p.Recv_uint8();
switch (type) {
case PACKET_TURN_TURN_ERROR: return this->Receive_TURN_ERROR(p);
@@ -43,12 +43,11 @@ bool NetworkTurnSocketHandler::HandlePacket(Packet *p)
*/
bool NetworkTurnSocketHandler::ReceivePackets()
{
Packet *p;
std::unique_ptr<Packet> p;
static const int MAX_PACKETS_TO_RECEIVE = 4;
int i = MAX_PACKETS_TO_RECEIVE;
while (--i != 0 && (p = this->ReceivePacket()) != nullptr) {
bool cont = this->HandlePacket(p);
delete p;
bool cont = this->HandlePacket(*p);
if (!cont) return true;
}
@@ -66,6 +65,6 @@ bool NetworkTurnSocketHandler::ReceiveInvalidPacket(PacketTurnType type)
return false;
}
bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); }
bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); }
bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet *) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); }
bool NetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_ERROR); }
bool NetworkTurnSocketHandler::Receive_SERCLI_CONNECT(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_SERCLI_CONNECT); }
bool NetworkTurnSocketHandler::Receive_TURN_CONNECTED(Packet &) { return this->ReceiveInvalidPacket(PACKET_TURN_TURN_CONNECTED); }
+5 -5
View File
@@ -18,7 +18,7 @@
#include "network_game_info.h"
/** Enum with all types of TCP TURN packets. The order MUST not be changed. **/
enum PacketTurnType {
enum PacketTurnType : uint8_t {
PACKET_TURN_TURN_ERROR, ///< TURN server is unable to relay.
PACKET_TURN_SERCLI_CONNECT, ///< Client or server is connecting to the TURN server.
PACKET_TURN_TURN_CONNECTED, ///< TURN server indicates the socket is now being relayed.
@@ -38,7 +38,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_TURN_ERROR(Packet *p);
virtual bool Receive_TURN_ERROR(Packet &p);
/**
* Client or servers wants to connect to the TURN server (on request by
@@ -50,7 +50,7 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_SERCLI_CONNECT(Packet *p);
virtual bool Receive_SERCLI_CONNECT(Packet &p);
/**
* TURN server has connected client and server together and will now relay
@@ -62,9 +62,9 @@ protected:
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/
virtual bool Receive_TURN_CONNECTED(Packet *p);
virtual bool Receive_TURN_CONNECTED(Packet &p);
bool HandlePacket(Packet *p);
bool HandlePacket(Packet &p);
public:
/**
* Create a new cs socket handler for a given cs.
+13 -13
View File
@@ -71,19 +71,19 @@ void NetworkUDPSocketHandler::CloseSocket()
* @param all send the packet using all sockets that can send it
* @param broadcast whether to send a broadcast message
*/
void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool all, bool broadcast)
void NetworkUDPSocketHandler::SendPacket(Packet &p, NetworkAddress &recv, bool all, bool broadcast)
{
if (this->sockets.empty()) this->Listen();
for (auto &s : this->sockets) {
/* Make a local copy because if we resolve it we cannot
* easily unresolve it so we can resolve it later again. */
NetworkAddress send(*recv);
NetworkAddress send(recv);
/* Not the same type */
if (!send.IsFamily(s.second.GetAddress()->ss_family)) continue;
p->PrepareToSend();
p.PrepareToSend();
if (broadcast) {
/* Enable broadcast */
@@ -94,7 +94,7 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a
}
/* Send the buffer */
ssize_t res = p->TransferOut<int>(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
ssize_t res = p.TransferOut<int>(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
Debug(net, 7, "sendto({})", send.GetAddressAsString());
/* Check for any errors, but ignore it otherwise */
@@ -140,7 +140,7 @@ void NetworkUDPSocketHandler::ReceivePackets()
p.PrepareToRead();
/* Handle the packet */
this->HandleUDPPacket(&p, &address);
this->HandleUDPPacket(p, address);
}
}
}
@@ -150,14 +150,14 @@ void NetworkUDPSocketHandler::ReceivePackets()
* @param p the received packet
* @param client_addr the sender of the packet
*/
void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_addr)
void NetworkUDPSocketHandler::HandleUDPPacket(Packet &p, NetworkAddress &client_addr)
{
PacketUDPType type;
/* New packet == new client, which has not quit yet */
this->Reopen();
type = (PacketUDPType)p->Recv_uint8();
type = (PacketUDPType)p.Recv_uint8();
switch (this->HasClientQuit() ? PACKET_UDP_END : type) {
case PACKET_UDP_CLIENT_FIND_SERVER: this->Receive_CLIENT_FIND_SERVER(p, client_addr); break;
@@ -165,9 +165,9 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_
default:
if (this->HasClientQuit()) {
Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr->GetAddressAsString());
Debug(net, 0, "[udp] Received invalid packet type {} from {}", type, client_addr.GetAddressAsString());
} else {
Debug(net, 0, "[udp] Received illegal packet from {}", client_addr->GetAddressAsString());
Debug(net, 0, "[udp] Received illegal packet from {}", client_addr.GetAddressAsString());
}
break;
}
@@ -178,10 +178,10 @@ void NetworkUDPSocketHandler::HandleUDPPacket(Packet *p, NetworkAddress *client_
* @param type The received packet type.
* @param client_addr The address we received the packet from.
*/
void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress *client_addr)
void NetworkUDPSocketHandler::ReceiveInvalidPacket(PacketUDPType type, NetworkAddress &client_addr)
{
Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr->GetAddressAsString());
Debug(net, 0, "[udp] Received packet type {} on wrong port from {}", type, client_addr.GetAddressAsString());
}
void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); }
void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); }
void NetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_CLIENT_FIND_SERVER, client_addr); }
void NetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr) { this->ReceiveInvalidPacket(PACKET_UDP_SERVER_RESPONSE, client_addr); }
+6 -6
View File
@@ -16,7 +16,7 @@
#include "packet.h"
/** Enum with all types of UDP packets. The order MUST not be changed **/
enum PacketUDPType {
enum PacketUDPType : uint8_t {
PACKET_UDP_CLIENT_FIND_SERVER, ///< Queries a game server for game information
PACKET_UDP_SERVER_RESPONSE, ///< Reply of the game server with game information
PACKET_UDP_END, ///< Must ALWAYS be on the end of this list!! (period)
@@ -30,23 +30,23 @@ protected:
/** The opened sockets. */
SocketList sockets;
void ReceiveInvalidPacket(PacketUDPType, NetworkAddress *client_addr);
void ReceiveInvalidPacket(PacketUDPType, NetworkAddress &client_addr);
/**
* Queries to the server for information about the game.
* @param p The received packet.
* @param client_addr The origin of the packet.
*/
virtual void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr);
virtual void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr);
/**
* Response to a query letting the client know we are here.
* @param p The received packet.
* @param client_addr The origin of the packet.
*/
virtual void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr);
virtual void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr);
void HandleUDPPacket(Packet *p, NetworkAddress *client_addr);
void HandleUDPPacket(Packet &p, NetworkAddress &client_addr);
public:
NetworkUDPSocketHandler(NetworkAddressList *bind = nullptr);
@@ -56,7 +56,7 @@ public:
bool Listen();
void CloseSocket();
void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false);
void SendPacket(Packet &p, NetworkAddress &recv, bool all = false, bool broadcast = false);
void ReceivePackets();
};
+85 -85
View File
@@ -134,10 +134,10 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode error)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_ERROR);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_ERROR);
p->Send_uint8(error);
this->SendPacket(p);
this->SendPacket(std::move(p));
std::string error_message = GetString(GetNetworkErrorMsg(error));
@@ -149,7 +149,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er
/** Send the protocol version to the admin. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_PROTOCOL);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_PROTOCOL);
/* announce the protocol version */
p->Send_uint8(NETWORK_GAME_ADMIN_VERSION);
@@ -161,7 +161,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
}
p->Send_bool(false);
this->SendPacket(p);
this->SendPacket(std::move(p));
return this->SendWelcome();
}
@@ -169,7 +169,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
/** Send a welcome message to the admin. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_WELCOME);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_WELCOME);
p->Send_string(_settings_client.network.server_name);
p->Send_string(GetNetworkRevisionString());
@@ -182,7 +182,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
p->Send_uint16(Map::SizeX());
p->Send_uint16(Map::SizeY());
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -190,26 +190,26 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
/** Tell the admin we started a new game. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendNewGame()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_NEWGAME);
this->SendPacket(p);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_NEWGAME);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the admin we're shutting down. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendShutdown()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_SHUTDOWN);
this->SendPacket(p);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_SHUTDOWN);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the admin the date. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_DATE);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_DATE);
p->Send_uint32(TimerGameCalendar::date.base());
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -220,10 +220,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientJoin(ClientID client_id)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_JOIN);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CLIENT_JOIN);
p->Send_uint32(client_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -238,7 +238,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
/* Only send data when we're a proper client, not just someone trying to query the server. */
if (ci == nullptr) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_INFO);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CLIENT_INFO);
p->Send_uint32(ci->client_id);
p->Send_string(cs == nullptr ? "" : const_cast<NetworkAddress &>(cs->client_address).GetHostname());
@@ -247,7 +247,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
p->Send_uint32(ci->join_date.base());
p->Send_uint8 (ci->client_playas);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -259,13 +259,13 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientInfo(const NetworkC
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const NetworkClientInfo *ci)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_UPDATE);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CLIENT_UPDATE);
p->Send_uint32(ci->client_id);
p->Send_string(ci->client_name);
p->Send_uint8 (ci->client_playas);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -276,10 +276,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientUpdate(const Networ
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID client_id)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_QUIT);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CLIENT_QUIT);
p->Send_uint32(client_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -291,11 +291,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientQuit(ClientID clien
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID client_id, NetworkErrorCode error)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CLIENT_ERROR);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CLIENT_ERROR);
p->Send_uint32(client_id);
p->Send_uint8 (error);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -306,10 +306,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID clie
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID company_id)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_NEW);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_NEW);
p->Send_uint8(company_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -320,7 +320,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID comp
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company *c)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_INFO);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_INFO);
p->Send_uint8 (c->index);
SetDParam(0, c->index);
@@ -333,7 +333,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company
p->Send_bool (c->is_ai);
p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -345,7 +345,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Company *c)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_UPDATE);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_UPDATE);
p->Send_uint8 (c->index);
SetDParam(0, c->index);
@@ -356,7 +356,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa
p->Send_bool (NetworkCompanyIsPassworded(c->index));
p->Send_uint8 (CeilDiv(c->months_of_bankruptcy, 3)); // send as quarters_of_bankruptcy
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -368,12 +368,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Compa
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason acrr)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_REMOVE);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_REMOVE);
p->Send_uint8(company_id);
p->Send_uint8(acrr);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -385,7 +385,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy()
/* Get the income. */
Money income = -std::reduce(std::begin(company->yearly_expenses[0]), std::end(company->yearly_expenses[0]));
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_ECONOMY);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_ECONOMY);
p->Send_uint8(company->index);
@@ -402,7 +402,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy()
p->Send_uint16(static_cast<uint16_t>(std::min<uint64_t>(UINT16_MAX, company->old_economy[i].delivered_cargo.GetSum<OverflowSafeInt64>())));
}
this->SendPacket(p);
this->SendPacket(std::move(p));
}
@@ -418,7 +418,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
/* Go through all the companies. */
for (const Company *company : Company::Iterate()) {
Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_STATS);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_COMPANY_STATS);
/* Send the information. */
p->Send_uint8(company->index);
@@ -431,7 +431,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
p->Send_uint16(company_stats[company->index].num_station[i]);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
}
return NETWORK_RECV_STATUS_OKAY;
@@ -447,7 +447,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats()
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64_t data)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CHAT);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CHAT);
p->Send_uint8 (action);
p->Send_uint8 (desttype);
@@ -455,7 +455,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action
p->Send_string(msg);
p->Send_uint64(data);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -465,10 +465,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string_view command)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON_END);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_RCON_END);
p->Send_string(command);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -480,20 +480,20 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const std::string
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRcon(uint16_t colour, const std::string_view result)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_RCON);
p->Send_uint16(colour);
p->Send_string(result);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
Debug(net, 3, "[admin] Rcon command from '{}' ({}): {}", this->admin_name, this->admin_version, command);
@@ -503,11 +503,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
return this->SendRconEnd(command);
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
std::string json = p->Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH);
std::string json = p.Recv_string(NETWORK_GAMESCRIPT_JSON_LENGTH);
Debug(net, 6, "[admin] GameScript JSON from '{}' ({}): {}", this->admin_name, this->admin_version, json);
@@ -515,11 +515,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
uint32_t d1 = p->Recv_uint32();
uint32_t d1 = p.Recv_uint32();
Debug(net, 6, "[admin] Ping from '{}' ({}): {}", this->admin_name, this->admin_version, d1);
@@ -539,11 +539,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string
* smaller than COMPAT_MTU. */
if (origin.size() + string.size() + 2 + 3 >= COMPAT_MTU) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(ADMIN_PACKET_SERVER_CONSOLE);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CONSOLE);
p->Send_string(origin);
p->Send_string(string);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -554,10 +554,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const std::string
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::string_view json)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_GAMESCRIPT);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_GAMESCRIPT);
p->Send_string(json);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -565,10 +565,10 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendGameScript(const std::str
/** Send ping-reply (pong) to admin **/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_PONG);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_PONG);
p->Send_uint32(d1);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -576,7 +576,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendPong(uint32_t d1)
/** Send the names of the commands. */
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CMD_NAMES);
for (uint16_t i = 0; i < CMD_END; i++) {
const char *cmdname = GetCommandName(static_cast<Commands>(i));
@@ -586,9 +586,9 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
* byte for string '\0' termination and 1 bool "no more data" */
if (!p->CanWriteToPacket(strlen(cmdname) + 5)) {
p->Send_bool(false);
this->SendPacket(p);
this->SendPacket(std::move(p));
p = new Packet(ADMIN_PACKET_SERVER_CMD_NAMES);
p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CMD_NAMES);
}
p->Send_bool(true);
@@ -598,7 +598,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
/* Marker to notify the end of the packet has been reached. */
p->Send_bool(false);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -608,17 +608,17 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdNames()
* @param client_id The client executing the command.
* @param cp The command that would be executed.
*/
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket *cp)
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID client_id, const CommandPacket &cp)
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_CMD_LOGGING);
auto p = std::make_unique<Packet>(ADMIN_PACKET_SERVER_CMD_LOGGING);
p->Send_uint32(client_id);
p->Send_uint8 (cp->company);
p->Send_uint16(cp->cmd);
p->Send_buffer(cp->data);
p->Send_uint32(cp->frame);
p->Send_uint8 (cp.company);
p->Send_uint16(cp.cmd);
p->Send_buffer(cp.data);
p->Send_uint32(cp.frame);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -627,11 +627,11 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCmdLogging(ClientID clien
* Receiving functions
************/
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet &p)
{
if (this->status != ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
if (_settings_client.network.admin_password.empty() ||
_settings_client.network.admin_password.compare(password) != 0) {
@@ -639,8 +639,8 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
}
this->admin_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
this->admin_version = p->Recv_string(NETWORK_REVISION_LENGTH);
this->admin_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
this->admin_version = p.Recv_string(NETWORK_REVISION_LENGTH);
if (this->admin_name.empty() || this->admin_version.empty()) {
/* no name or version supplied */
@@ -654,18 +654,18 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
return this->SendProtocol();
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet &)
{
/* The admin is leaving nothing else to do */
return this->CloseConnection();
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
AdminUpdateType type = (AdminUpdateType)p->Recv_uint16();
AdminUpdateFrequency freq = (AdminUpdateFrequency)p->Recv_uint16();
AdminUpdateType type = (AdminUpdateType)p.Recv_uint16();
AdminUpdateFrequency freq = (AdminUpdateFrequency)p.Recv_uint16();
if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) {
/* The server does not know of this UpdateType. */
@@ -680,12 +680,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
AdminUpdateType type = (AdminUpdateType)p->Recv_uint8();
uint32_t d1 = p->Recv_uint32();
AdminUpdateType type = (AdminUpdateType)p.Recv_uint8();
uint32_t d1 = p.Recv_uint32();
switch (type) {
case ADMIN_UPDATE_DATE:
@@ -746,15 +746,15 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
NetworkAction action = (NetworkAction)p->Recv_uint8();
DestType desttype = (DestType)p->Recv_uint8();
int dest = p->Recv_uint32();
NetworkAction action = (NetworkAction)p.Recv_uint8();
DestType desttype = (DestType)p.Recv_uint8();
int dest = p.Recv_uint32();
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
switch (action) {
case NETWORK_ACTION_CHAT:
@@ -772,14 +772,14 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *p)
NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet &p)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
std::string source = p->Recv_string(NETWORK_CHAT_LENGTH);
TextColour colour = (TextColour)p->Recv_uint16();
std::string user = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string source = p.Recv_string(NETWORK_CHAT_LENGTH);
TextColour colour = (TextColour)p.Recv_uint16();
std::string user = p.Recv_string(NETWORK_CHAT_LENGTH);
std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
if (!IsValidConsoleColour(colour)) {
Debug(net, 1, "[admin] Not supported chat colour {} ({}, {}, {}) from '{}' ({}).", (uint16_t)colour, source, user, msg, this->admin_name, this->admin_version);
@@ -959,7 +959,7 @@ void NetworkAdminGameScript(const std::string_view json)
* @param owner The owner of the CommandPacket (who sent us the CommandPacket).
* @param cp The CommandPacket to be distributed.
*/
void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp)
void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp)
{
ClientID client_id = owner == nullptr ? _network_own_client_id : owner->client_id;
+11 -11
View File
@@ -24,15 +24,15 @@ extern NetworkAdminSocketPool _networkadminsocket_pool;
/** Class for handling the server side of the game connection. */
class ServerNetworkAdminSocketHandler : public NetworkAdminSocketPool::PoolItem<&_networkadminsocket_pool>, public NetworkAdminSocketHandler, public TCPListenHandler<ServerNetworkAdminSocketHandler, ADMIN_PACKET_SERVER_FULL, ADMIN_PACKET_SERVER_BANNED> {
protected:
NetworkRecvStatus Receive_ADMIN_JOIN(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_QUIT(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_POLL(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_RCON(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_PING(Packet *p) override;
NetworkRecvStatus Receive_ADMIN_JOIN(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_QUIT(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_UPDATE_FREQUENCY(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_POLL(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_CHAT(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_RCON(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_GAMESCRIPT(Packet &p) override;
NetworkRecvStatus Receive_ADMIN_PING(Packet &p) override;
NetworkRecvStatus SendProtocol();
NetworkRecvStatus SendPong(uint32_t d1);
@@ -67,7 +67,7 @@ public:
NetworkRecvStatus SendConsole(const std::string_view origin, const std::string_view command);
NetworkRecvStatus SendGameScript(const std::string_view json);
NetworkRecvStatus SendCmdNames();
NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp);
NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket &cp);
NetworkRecvStatus SendRconEnd(const std::string_view command);
static void Send();
@@ -112,6 +112,6 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq);
void NetworkServerSendAdminRcon(AdminIndex admin_index, TextColour colour_code, const std::string_view string);
void NetworkAdminConsole(const std::string_view origin, const std::string_view string);
void NetworkAdminGameScript(const std::string_view json);
void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket *cp);
void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacket &cp);
#endif /* NETWORK_ADMIN_H */
+114 -116
View File
@@ -81,19 +81,19 @@ struct PacketReader : LoadFilter {
* Add a packet to this buffer.
* @param p The packet to add.
*/
void AddPacket(Packet *p)
void AddPacket(Packet &p)
{
assert(this->read_bytes == 0);
p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
/* Did everything fit in the current chunk, then we're done. */
if (p->RemainingBytesToTransfer() == 0) return;
if (p.RemainingBytesToTransfer() == 0) return;
/* Allocate a new chunk and add the remaining data. */
this->blocks.push_back(this->buf = CallocT<byte>(CHUNK));
this->bufe = this->buf + CHUNK;
p->TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
p.TransferOutWithLimit(TransferOutMemCopy, this->bufe - this->buf, this);
}
size_t Read(byte *rbuf, size_t size) override
@@ -331,7 +331,6 @@ static_assert(NETWORK_SERVER_ID_LENGTH == MD5_HASH_BYTES * 2 + 1);
/***********
* Sending functions
* DEF_CLIENT_SEND_COMMAND has no parameters
************/
/** Tell the server we would like to join. */
@@ -345,13 +344,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin()
_network_join_status = NETWORK_JOIN_STATUS_AUTHORIZING;
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
Packet *p = new Packet(PACKET_CLIENT_JOIN);
auto p = std::make_unique<Packet>(PACKET_CLIENT_JOIN);
p->Send_string(GetNetworkRevisionString());
p->Send_uint32(_openttd_newgrf_version);
p->Send_string(_settings_client.network.client_name); // Client name
p->Send_uint8 (_network_join.company); // PlayAs
p->Send_uint8 (0); // Used to be language
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -360,8 +359,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendNewGRFsOk()
{
Debug(net, 9, "Client::SendNewGRFsOk()");
Packet *p = new Packet(PACKET_CLIENT_NEWGRFS_CHECKED);
my_client->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_CLIENT_NEWGRFS_CHECKED);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -373,9 +372,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGamePassword(const std::st
{
Debug(net, 9, "Client::SendGamePassword()");
Packet *p = new Packet(PACKET_CLIENT_GAME_PASSWORD);
auto p = std::make_unique<Packet>(PACKET_CLIENT_GAME_PASSWORD);
p->Send_string(password);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -387,9 +386,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCompanyPassword(const std:
{
Debug(net, 9, "Client::SendCompanyPassword()");
Packet *p = new Packet(PACKET_CLIENT_COMPANY_PASSWORD);
auto p = std::make_unique<Packet>(PACKET_CLIENT_COMPANY_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -401,8 +400,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendGetMap()
Debug(net, 9, "Client::status = MAP_WAIT");
my_client->status = STATUS_MAP_WAIT;
Packet *p = new Packet(PACKET_CLIENT_GETMAP);
my_client->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_CLIENT_GETMAP);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -414,8 +413,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMapOk()
Debug(net, 9, "Client::status = ACTIVE");
my_client->status = STATUS_ACTIVE;
Packet *p = new Packet(PACKET_CLIENT_MAP_OK);
my_client->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_CLIENT_MAP_OK);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -424,11 +423,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
{
Debug(net, 9, "Client::SendAck()");
Packet *p = new Packet(PACKET_CLIENT_ACK);
auto p = std::make_unique<Packet>(PACKET_CLIENT_ACK);
p->Send_uint32(_frame_counter);
p->Send_uint8 (my_client->token);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -436,14 +435,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck()
* Send a command to the server.
* @param cp The command to send.
*/
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacket &cp)
{
Debug(net, 9, "Client::SendCommand(): cmd={}", cp->cmd);
Debug(net, 9, "Client::SendCommand(): cmd={}", cp.cmd);
Packet *p = new Packet(PACKET_CLIENT_COMMAND);
my_client->NetworkGameSocketHandler::SendCommand(p, cp);
auto p = std::make_unique<Packet>(PACKET_CLIENT_COMMAND);
my_client->NetworkGameSocketHandler::SendCommand(*p, cp);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -452,7 +451,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
{
Debug(net, 9, "Client::SendChat(): action={}, type={}, dest={}", action, type, dest);
Packet *p = new Packet(PACKET_CLIENT_CHAT);
auto p = std::make_unique<Packet>(PACKET_CLIENT_CHAT);
p->Send_uint8 (action);
p->Send_uint8 (type);
@@ -460,7 +459,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action,
p->Send_string(msg);
p->Send_uint64(data);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -469,10 +468,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendError(NetworkErrorCode err
{
Debug(net, 9, "Client::SendError(): errorno={}", errorno);
Packet *p = new Packet(PACKET_CLIENT_ERROR);
auto p = std::make_unique<Packet>(PACKET_CLIENT_ERROR);
p->Send_uint8(errorno);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -484,10 +483,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetPassword(const std::str
{
Debug(net, 9, "Client::SendSetPassword()");
Packet *p = new Packet(PACKET_CLIENT_SET_PASSWORD);
auto p = std::make_unique<Packet>(PACKET_CLIENT_SET_PASSWORD);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -499,10 +498,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendSetName(const std::string
{
Debug(net, 9, "Client::SendSetName()");
Packet *p = new Packet(PACKET_CLIENT_SET_NAME);
auto p = std::make_unique<Packet>(PACKET_CLIENT_SET_NAME);
p->Send_string(name);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -513,9 +512,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit()
{
Debug(net, 9, "Client::SendSetName()");
Packet *p = new Packet(PACKET_CLIENT_QUIT);
auto p = std::make_unique<Packet>(PACKET_CLIENT_QUIT);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -528,10 +527,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendRCon(const std::string &pa
{
Debug(net, 9, "Client::SendRCon()");
Packet *p = new Packet(PACKET_CLIENT_RCON);
auto p = std::make_unique<Packet>(PACKET_CLIENT_RCON);
p->Send_string(pass);
p->Send_string(command);
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -544,10 +543,10 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendMove(CompanyID company, co
{
Debug(net, 9, "Client::SendMove(): company={}", company);
Packet *p = new Packet(PACKET_CLIENT_MOVE);
auto p = std::make_unique<Packet>(PACKET_CLIENT_MOVE);
p->Send_uint8(company);
p->Send_string(GenerateCompanyPasswordHash(password, _password_server_id, _password_game_seed));
my_client->SendPacket(p);
my_client->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -563,12 +562,11 @@ bool ClientNetworkGameSocketHandler::IsConnected()
/***********
* Receiving functions
* DEF_CLIENT_RECEIVE_COMMAND has parameter: Packet *p
************/
extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr<struct LoadFilter> lf);
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_FULL()");
@@ -578,7 +576,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
return NETWORK_RECV_STATUS_SERVER_FULL;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_BANNED()");
@@ -591,15 +589,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *
/* This packet contains info about the client (playas and name)
* as client we save this in NetworkClientInfo, linked via 'client_id'
* which is always an unique number on a server. */
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Packet &p)
{
NetworkClientInfo *ci;
ClientID client_id = (ClientID)p->Recv_uint32();
CompanyID playas = (CompanyID)p->Recv_uint8();
ClientID client_id = (ClientID)p.Recv_uint32();
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->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -649,7 +647,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet &p)
{
static const StringID network_error_strings[] = {
STR_NETWORK_ERROR_LOSTCONNECTION, // NETWORK_ERROR_GENERAL
@@ -676,15 +674,15 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
};
static_assert(lengthof(network_error_strings) == NETWORK_ERROR_END);
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;
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 */
if (error == NETWORK_ERROR_KICKED && p->CanReadFromPacket(1)) {
SetDParamStr(0, p->Recv_string(NETWORK_CHAT_LENGTH));
if (error == NETWORK_ERROR_KICKED && p.CanReadFromPacket(1)) {
SetDParamStr(0, p.Recv_string(NETWORK_CHAT_LENGTH));
ShowErrorMessage(err, STR_NETWORK_ERROR_KICK_MESSAGE, WL_CRITICAL);
} else {
ShowErrorMessage(err, INVALID_STRING_ID, WL_CRITICAL);
@@ -696,11 +694,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(Packet &p)
{
if (this->status != STATUS_JOIN) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
uint grf_count = p->Recv_uint8();
uint grf_count = p.Recv_uint8();
NetworkRecvStatus ret = NETWORK_RECV_STATUS_OKAY;
Debug(net, 9, "Client::Receive_SERVER_CHECK_NEWGRFS(): grf_count={}", grf_count);
@@ -708,7 +706,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
/* Check all GRFs */
for (; grf_count > 0; grf_count--) {
GRFIdentifier c;
DeserializeGRFIdentifier(p, &c);
DeserializeGRFIdentifier(p, c);
/* Check whether we know this GRF */
const GRFConfig *f = FindGRFConfig(c.grfid, FGCM_EXACT, &c.md5sum);
@@ -729,7 +727,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(P
return ret;
}
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;
Debug(net, 9, "Client::status = AUTH_GAME");
@@ -746,7 +744,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_GAME_PASSW
return NETWORK_RECV_STATUS_OKAY;
}
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;
Debug(net, 9, "Client::status = AUTH_COMPANY");
@@ -754,8 +752,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA
Debug(net, 9, "Client::Receive_SERVER_NEED_COMPANY_PASSWORD()");
_password_game_seed = p->Recv_uint32();
_password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
_password_game_seed = p.Recv_uint32();
_password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (!_network_join.company_password.empty()) {
@@ -767,25 +765,25 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEED_COMPANY_PA
return NETWORK_RECV_STATUS_OKAY;
}
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;
Debug(net, 9, "Client::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. */
_password_game_seed = p->Recv_uint32();
_password_server_id = p->Recv_string(NETWORK_SERVER_ID_LENGTH);
_password_game_seed = p.Recv_uint32();
_password_server_id = p.Recv_string(NETWORK_SERVER_ID_LENGTH);
/* Start receiving the map */
return SendGetMap();
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet &p)
{
/* We set the internal wait state when requesting the map. */
if (this->status != STATUS_MAP_WAIT) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -795,13 +793,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_WAIT(Packet *p)
/* 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_waiting = p->Recv_uint8();
_network_join_waiting = p.Recv_uint8();
SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN);
return NETWORK_RECV_STATUS_OKAY;
}
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;
Debug(net, 9, "Client::status = MAP");
@@ -811,7 +809,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe
this->savegame = std::make_shared<PacketReader>();
_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);
@@ -825,12 +823,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet &p)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_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);
Debug(net, 9, "Client::Receive_SERVER_MAP_SIZE(): bytes_total={}", _network_join_bytes_total);
@@ -838,7 +836,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_SIZE(Packet
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet &p)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -852,7 +850,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DATA(Packet
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet &)
{
if (this->status != STATUS_MAP) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->savegame == nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
@@ -908,29 +906,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
_frame_counter_server = p->Recv_uint32();
_frame_counter_max = p->Recv_uint32();
_frame_counter_server = p.Recv_uint32();
_frame_counter_max = p.Recv_uint32();
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
/* Test if the server supports this option
* and if we are at the frame the server is */
#ifdef NETWORK_SEND_DOUBLE_SEED
if (p->CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) {
if (p.CanReadFromPacket(sizeof(uint32_t) + sizeof(uint32_t))) {
#else
if (p->CanReadFromPacket(sizeof(uint32_t))) {
if (p.CanReadFromPacket(sizeof(uint32_t))) {
#endif
_sync_frame = _frame_counter_server;
_sync_seed_1 = p->Recv_uint32();
_sync_seed_1 = p.Recv_uint32();
#ifdef NETWORK_SEND_DOUBLE_SEED
_sync_seed_2 = p->Recv_uint32();
_sync_seed_2 = p.Recv_uint32();
#endif
}
#endif
/* 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();
/* Let the server know that we received this frame correctly
* We do this only once per day, to save some bandwidth ;) */
@@ -943,14 +941,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
_sync_frame = p->Recv_uint32();
_sync_seed_1 = p->Recv_uint32();
_sync_frame = p.Recv_uint32();
_sync_seed_1 = p.Recv_uint32();
#ifdef NETWORK_SEND_DOUBLE_SEED
_sync_seed_2 = p->Recv_uint32();
_sync_seed_2 = p.Recv_uint32();
#endif
Debug(net, 9, "Client::Receive_SERVER_SYNC(): sync_frame={}, sync_seed_1={}", _sync_frame, _sync_seed_1);
@@ -958,14 +956,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SYNC(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
CommandPacket cp;
const char *err = this->ReceiveCommand(p, &cp);
cp.frame = p->Recv_uint32();
cp.my_cmd = p->Recv_bool();
const char *err = this->ReceiveCommand(p, cp);
cp.frame = p.Recv_uint32();
cp.my_cmd = p.Recv_bool();
Debug(net, 9, "Client::Receive_SERVER_COMMAND(): cmd={}, frame={}", cp.cmd, cp.frame);
@@ -974,23 +972,23 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
this->incoming_queue.Append(&cp);
this->incoming_queue.push_back(cp);
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
std::string name;
const NetworkClientInfo *ci = nullptr, *ci_to;
NetworkAction action = (NetworkAction)p->Recv_uint8();
ClientID client_id = (ClientID)p->Recv_uint32();
bool self_send = p->Recv_bool();
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
int64_t data = p->Recv_uint64();
NetworkAction action = (NetworkAction)p.Recv_uint8();
ClientID client_id = (ClientID)p.Recv_uint32();
bool self_send = p.Recv_bool();
std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
int64_t data = p.Recv_uint64();
Debug(net, 9, "Client::Receive_SERVER_CHAT(): action={}, client_id={}, self_send={}", action, client_id, self_send);
@@ -1030,14 +1028,14 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(Packet &p)
{
if (this->status != STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
std::string source = p->Recv_string(NETWORK_CHAT_LENGTH);
TextColour colour = (TextColour)p->Recv_uint16();
std::string user = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string msg = p->Recv_string(NETWORK_CHAT_LENGTH);
std::string source = p.Recv_string(NETWORK_CHAT_LENGTH);
TextColour colour = (TextColour)p.Recv_uint16();
std::string user = 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);
@@ -1048,17 +1046,17 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_EXTERNAL_CHAT(P
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
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);
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()));
delete ci;
}
@@ -1067,11 +1065,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_ERROR_QUIT(Pack
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
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);
@@ -1089,11 +1087,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
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);
@@ -1107,7 +1105,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_JOIN(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_SHUTDOWN()");
@@ -1122,7 +1120,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_SHUTDOWN(Packet
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet *)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet &)
{
Debug(net, 9, "Client::Receive_SERVER_NEWGAME()");
@@ -1141,29 +1139,29 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_NEWGAME(Packet
return NETWORK_RECV_STATUS_SERVER_ERROR;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_RCON(Packet &p)
{
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;
std::string rcon_out = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
std::string rcon_out = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
IConsolePrint(colour_code, rcon_out);
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
/* Nothing more in this packet... */
ClientID client_id = (ClientID)p->Recv_uint32();
CompanyID company_id = (CompanyID)p->Recv_uint8();
ClientID client_id = (ClientID)p.Recv_uint32();
CompanyID company_id = (CompanyID)p.Recv_uint8();
Debug(net, 9, "Client::Receive_SERVER_MOVE(): client_id={}, comapny_id={}", client_id, company_id);
@@ -1187,12 +1185,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(Packet &p)
{
if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
_network_server_max_companies = p->Recv_uint8();
_network_server_name = p->Recv_string(NETWORK_NAME_LENGTH);
_network_server_max_companies = p.Recv_uint8();
_network_server_name = p.Recv_string(NETWORK_NAME_LENGTH);
SetWindowClassesDirty(WC_CLIENT_LIST);
Debug(net, 9, "Client::Receive_SERVER_CONFIG_UPDATE(): max_companies={}", _network_server_max_companies);
@@ -1200,12 +1198,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet *p)
NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMPANY_UPDATE(Packet &p)
{
if (this->status < STATUS_ACTIVE) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
_network_company_passworded = p->Recv_uint16();
_network_company_passworded = p.Recv_uint16();
SetWindowClassesDirty(WC_COMPANY);
Debug(net, 9, "Client::Receive_SERVER_COMPANY_UPDATE()");
+28 -28
View File
@@ -40,33 +40,33 @@ protected:
friend void NetworkClose(bool close_admins);
static ClientNetworkGameSocketHandler *my_client; ///< This is us!
NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet *p) override;
NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet *p) override;
NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet *p) override;
NetworkRecvStatus Receive_SERVER_WELCOME(Packet *p) override;
NetworkRecvStatus Receive_SERVER_WAIT(Packet *p) override;
NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet *p) override;
NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet *p) override;
NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet *p) override;
NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet *p) override;
NetworkRecvStatus Receive_SERVER_JOIN(Packet *p) override;
NetworkRecvStatus Receive_SERVER_FRAME(Packet *p) override;
NetworkRecvStatus Receive_SERVER_SYNC(Packet *p) override;
NetworkRecvStatus Receive_SERVER_COMMAND(Packet *p) override;
NetworkRecvStatus Receive_SERVER_CHAT(Packet *p) override;
NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet *p) override;
NetworkRecvStatus Receive_SERVER_QUIT(Packet *p) override;
NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet *p) override;
NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet *p) override;
NetworkRecvStatus Receive_SERVER_NEWGAME(Packet *p) override;
NetworkRecvStatus Receive_SERVER_RCON(Packet *p) override;
NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet *p) override;
NetworkRecvStatus Receive_SERVER_MOVE(Packet *p) override;
NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet *p) override;
NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet *p) override;
NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override;
NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override;
NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override;
NetworkRecvStatus Receive_SERVER_CLIENT_INFO(Packet &p) override;
NetworkRecvStatus Receive_SERVER_NEED_GAME_PASSWORD(Packet &p) override;
NetworkRecvStatus Receive_SERVER_NEED_COMPANY_PASSWORD(Packet &p) override;
NetworkRecvStatus Receive_SERVER_WELCOME(Packet &p) override;
NetworkRecvStatus Receive_SERVER_WAIT(Packet &p) override;
NetworkRecvStatus Receive_SERVER_MAP_BEGIN(Packet &p) override;
NetworkRecvStatus Receive_SERVER_MAP_SIZE(Packet &p) override;
NetworkRecvStatus Receive_SERVER_MAP_DATA(Packet &p) override;
NetworkRecvStatus Receive_SERVER_MAP_DONE(Packet &p) override;
NetworkRecvStatus Receive_SERVER_JOIN(Packet &p) override;
NetworkRecvStatus Receive_SERVER_FRAME(Packet &p) override;
NetworkRecvStatus Receive_SERVER_SYNC(Packet &p) override;
NetworkRecvStatus Receive_SERVER_COMMAND(Packet &p) override;
NetworkRecvStatus Receive_SERVER_CHAT(Packet &p) override;
NetworkRecvStatus Receive_SERVER_EXTERNAL_CHAT(Packet &p) override;
NetworkRecvStatus Receive_SERVER_QUIT(Packet &p) override;
NetworkRecvStatus Receive_SERVER_ERROR_QUIT(Packet &p) override;
NetworkRecvStatus Receive_SERVER_SHUTDOWN(Packet &p) override;
NetworkRecvStatus Receive_SERVER_NEWGAME(Packet &p) override;
NetworkRecvStatus Receive_SERVER_RCON(Packet &p) override;
NetworkRecvStatus Receive_SERVER_CHECK_NEWGRFS(Packet &p) override;
NetworkRecvStatus Receive_SERVER_MOVE(Packet &p) override;
NetworkRecvStatus Receive_SERVER_COMPANY_UPDATE(Packet &p) override;
NetworkRecvStatus Receive_SERVER_CONFIG_UPDATE(Packet &p) override;
static NetworkRecvStatus SendNewGRFsOk();
static NetworkRecvStatus SendGetMap();
@@ -80,7 +80,7 @@ public:
void ClientError(NetworkRecvStatus res);
static NetworkRecvStatus SendJoin();
static NetworkRecvStatus SendCommand(const CommandPacket *cp);
static NetworkRecvStatus SendCommand(const CommandPacket &cp);
static NetworkRecvStatus SendError(NetworkErrorCode errorno);
static NetworkRecvStatus SendQuit();
static NetworkRecvStatus SendAck();
+52 -116
View File
@@ -122,9 +122,9 @@ struct CallbackArgsHelper<void(*const)(Commands, const CommandCost &, Targs...)>
/* Helpers to generate the command dispatch table from the command traits. */
template <Commands Tcmd> static CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data);
template <Commands Tcmd, size_t cb> static void UnpackNetworkCommand(const CommandPacket *cp);
template <Commands Tcmd, size_t cb> static void UnpackNetworkCommand(const CommandPacket &cp);
template <Commands Tcmd> static void NetworkReplaceCommandClientId(CommandPacket &cp, ClientID client_id);
using UnpackNetworkCommandProc = void (*)(const CommandPacket *);
using UnpackNetworkCommandProc = void (*)(const CommandPacket &);
using UnpackDispatchT = std::array<UnpackNetworkCommandProc, _callback_tuple_size>;
struct CommandDispatch {
CommandDataBuffer(*Sanitize)(const CommandDataBuffer &);
@@ -165,76 +165,6 @@ static constexpr auto _cmd_dispatch = MakeDispatchTable(std::make_integer_sequen
# pragma GCC diagnostic pop
#endif
/**
* Append a CommandPacket at the end of the queue.
* @param p The packet to append to the queue.
* @note A new instance of the CommandPacket will be made.
*/
void CommandQueue::Append(CommandPacket *p)
{
CommandPacket *add = new CommandPacket();
*add = *p;
add->next = nullptr;
if (this->first == nullptr) {
this->first = add;
} else {
this->last->next = add;
}
this->last = add;
this->count++;
}
/**
* Return the first item in the queue and remove it from the queue.
* @param ignore_paused Whether to ignore commands that may not be executed while paused.
* @return the first item in the queue.
*/
CommandPacket *CommandQueue::Pop(bool ignore_paused)
{
CommandPacket **prev = &this->first;
CommandPacket *ret = this->first;
CommandPacket *prev_item = nullptr;
if (ignore_paused && _pause_mode != PM_UNPAUSED) {
while (ret != nullptr && !IsCommandAllowedWhilePaused(ret->cmd)) {
prev_item = ret;
prev = &ret->next;
ret = ret->next;
}
}
if (ret != nullptr) {
if (ret == this->last) this->last = prev_item;
*prev = ret->next;
this->count--;
}
return ret;
}
/**
* Return the first item in the queue, but don't remove it.
* @param ignore_paused Whether to ignore commands that may not be executed while paused.
* @return the first item in the queue.
*/
CommandPacket *CommandQueue::Peek(bool ignore_paused)
{
if (!ignore_paused || _pause_mode == PM_UNPAUSED) return this->first;
for (CommandPacket *p = this->first; p != nullptr; p = p->next) {
if (IsCommandAllowedWhilePaused(p->cmd)) return p;
}
return nullptr;
}
/** Free everything that is in the queue. */
void CommandQueue::Free()
{
CommandPacket *cp;
while ((cp = this->Pop()) != nullptr) {
delete cp;
}
assert(this->count == 0);
}
/** Local queue of packets waiting for handling. */
static CommandQueue _local_wait_queue;
/** Local queue of packets waiting for execution. */
@@ -282,14 +212,14 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal
c.frame = _frame_counter_max + 1;
c.my_cmd = true;
_local_wait_queue.Append(&c);
_local_wait_queue.push_back(c);
return;
}
c.frame = 0; // The client can't tell which frame, so just make it 0
/* Clients send their command to the server and forget all about the packet */
MyClient::SendCommand(&c);
MyClient::SendCommand(c);
}
/**
@@ -303,10 +233,9 @@ void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *cal
*/
void NetworkSyncCommandQueue(NetworkClientSocket *cs)
{
for (CommandPacket *p = _local_execution_queue.Peek(); p != nullptr; p = p->next) {
CommandPacket c = *p;
for (auto &p : _local_execution_queue) {
CommandPacket &c = cs->outgoing_queue.emplace_back(p);
c.callback = nullptr;
cs->outgoing_queue.Append(&c);
}
}
@@ -319,8 +248,8 @@ void NetworkExecuteLocalCommandQueue()
CommandQueue &queue = (_network_server ? _local_execution_queue : ClientNetworkGameSocketHandler::my_client->incoming_queue);
CommandPacket *cp;
while ((cp = queue.Peek()) != nullptr) {
auto cp = queue.begin();
for (; cp != queue.end(); cp++) {
/* The queue is always in order, which means
* that the first element will be executed first. */
if (_frame_counter < cp->frame) break;
@@ -336,11 +265,9 @@ void NetworkExecuteLocalCommandQueue()
size_t cb_index = FindCallbackIndex(cp->callback);
assert(cb_index < _callback_tuple_size);
assert(_cmd_dispatch[cp->cmd].Unpack[cb_index] != nullptr);
_cmd_dispatch[cp->cmd].Unpack[cb_index](cp);
queue.Pop();
delete cp;
_cmd_dispatch[cp->cmd].Unpack[cb_index](*cp);
}
queue.erase(queue.begin(), cp);
/* Local company may have changed, so we should not restore the old value */
_current_company = _local_company;
@@ -351,8 +278,8 @@ void NetworkExecuteLocalCommandQueue()
*/
void NetworkFreeLocalCommandQueue()
{
_local_wait_queue.Free();
_local_execution_queue.Free();
_local_wait_queue.clear();
_local_execution_queue.clear();
}
/**
@@ -371,13 +298,13 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket
* first place. This filters that out. */
cp.callback = (cs != owner) ? nullptr : callback;
cp.my_cmd = (cs == owner);
cs->outgoing_queue.Append(&cp);
cs->outgoing_queue.push_back(cp);
}
}
cp.callback = (nullptr != owner) ? nullptr : callback;
cp.my_cmd = (nullptr == owner);
_local_execution_queue.Append(&cp);
_local_execution_queue.push_back(cp);
}
/**
@@ -385,7 +312,7 @@ static void DistributeCommandPacket(CommandPacket &cp, const NetworkClientSocket
* @param queue The queue of commands that has to be distributed.
* @param owner The client that owns the commands,
*/
static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owner)
static void DistributeQueue(CommandQueue &queue, const NetworkClientSocket *owner)
{
#ifdef DEBUG_DUMP_COMMANDS
/* When replaying we do not want this limitation. */
@@ -398,11 +325,20 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne
}
#endif
CommandPacket *cp;
while (--to_go >= 0 && (cp = queue->Pop(true)) != nullptr) {
/* Not technically the most performant way, but consider clients rarely click more than once per tick. */
for (auto cp = queue.begin(); cp != queue.end(); /* removing some items */) {
/* Limit the number of commands per client per tick. */
if (--to_go < 0) break;
/* Do not distribute commands when paused and the command is not allowed while paused. */
if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cp->cmd)) {
++cp;
continue;
}
DistributeCommandPacket(*cp, owner);
NetworkAdminCmdLogging(owner, cp);
delete cp;
NetworkAdminCmdLogging(owner, *cp);
cp = queue.erase(cp);
}
}
@@ -410,11 +346,11 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne
void NetworkDistributeCommands()
{
/* First send the server's commands. */
DistributeQueue(&_local_wait_queue, nullptr);
DistributeQueue(_local_wait_queue, nullptr);
/* Then send the queues of the others. */
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
DistributeQueue(&cs->incoming_queue, cs);
DistributeQueue(cs->incoming_queue, cs);
}
}
@@ -424,19 +360,19 @@ void NetworkDistributeCommands()
* @param cp the struct to write the data to.
* @return an error message. When nullptr there has been no error.
*/
const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *cp)
const char *NetworkGameSocketHandler::ReceiveCommand(Packet &p, CommandPacket &cp)
{
cp->company = (CompanyID)p->Recv_uint8();
cp->cmd = static_cast<Commands>(p->Recv_uint16());
if (!IsValidCommand(cp->cmd)) return "invalid command";
if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) return "single-player only command";
cp->err_msg = p->Recv_uint16();
cp->data = _cmd_dispatch[cp->cmd].Sanitize(p->Recv_buffer());
cp.company = (CompanyID)p.Recv_uint8();
cp.cmd = static_cast<Commands>(p.Recv_uint16());
if (!IsValidCommand(cp.cmd)) return "invalid command";
if (GetCommandFlags(cp.cmd) & CMD_OFFLINE) return "single-player only command";
cp.err_msg = p.Recv_uint16();
cp.data = _cmd_dispatch[cp.cmd].Sanitize(p.Recv_buffer());
byte callback = p->Recv_uint8();
if (callback >= _callback_table.size() || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) return "invalid callback";
byte callback = p.Recv_uint8();
if (callback >= _callback_table.size() || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) return "invalid callback";
cp->callback = _callback_table[callback];
cp.callback = _callback_table[callback];
return nullptr;
}
@@ -445,19 +381,19 @@ const char *NetworkGameSocketHandler::ReceiveCommand(Packet *p, CommandPacket *c
* @param p the packet to send it in.
* @param cp the packet to actually send.
*/
void NetworkGameSocketHandler::SendCommand(Packet *p, const CommandPacket *cp)
void NetworkGameSocketHandler::SendCommand(Packet &p, const CommandPacket &cp)
{
p->Send_uint8(cp->company);
p->Send_uint16(cp->cmd);
p->Send_uint16(cp->err_msg);
p->Send_buffer(cp->data);
p.Send_uint8(cp.company);
p.Send_uint16(cp.cmd);
p.Send_uint16(cp.err_msg);
p.Send_buffer(cp.data);
size_t callback = FindCallbackIndex(cp->callback);
if (callback > UINT8_MAX || _cmd_dispatch[cp->cmd].Unpack[callback] == nullptr) {
Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp->cmd);
size_t callback = FindCallbackIndex(cp.callback);
if (callback > UINT8_MAX || _cmd_dispatch[cp.cmd].Unpack[callback] == nullptr) {
Debug(net, 0, "Unknown callback for command; no callback sent (command: {})", cp.cmd);
callback = 0; // _callback_table[0] == nullptr
}
p->Send_uint8 ((uint8_t)callback);
p.Send_uint8 ((uint8_t)callback);
}
/** Helper to process a single ClientID argument. */
@@ -537,8 +473,8 @@ CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data)
* @param cp Command packet to unpack.
*/
template <Commands Tcmd, size_t Tcb>
void UnpackNetworkCommand(const CommandPacket *cp)
void UnpackNetworkCommand(const CommandPacket &cp)
{
auto args = EndianBufferReader::ToValue<typename CommandTraits<Tcmd>::Args>(cp->data);
Command<Tcmd>::PostFromNet(cp->err_msg, std::get<Tcb>(_callback_tuple), cp->my_cmd, args);
auto args = EndianBufferReader::ToValue<typename CommandTraits<Tcmd>::Args>(cp.data);
Command<Tcmd>::PostFromNet(cp.err_msg, std::get<Tcb>(_callback_tuple), cp.my_cmd, args);
}
+29 -29
View File
@@ -49,34 +49,34 @@ static bool HasGRFConfig(const ContentInfo *ci, bool md5sum)
*/
typedef bool (*HasProc)(const ContentInfo *ci, bool md5sum);
bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p)
bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet &p)
{
ContentInfo *ci = new ContentInfo();
ci->type = (ContentType)p->Recv_uint8();
ci->id = (ContentID)p->Recv_uint32();
ci->filesize = p->Recv_uint32();
ci->type = (ContentType)p.Recv_uint8();
ci->id = (ContentID)p.Recv_uint32();
ci->filesize = p.Recv_uint32();
ci->name = p->Recv_string(NETWORK_CONTENT_NAME_LENGTH);
ci->version = p->Recv_string(NETWORK_CONTENT_VERSION_LENGTH);
ci->url = p->Recv_string(NETWORK_CONTENT_URL_LENGTH);
ci->description = p->Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE);
ci->name = p.Recv_string(NETWORK_CONTENT_NAME_LENGTH);
ci->version = p.Recv_string(NETWORK_CONTENT_VERSION_LENGTH);
ci->url = p.Recv_string(NETWORK_CONTENT_URL_LENGTH);
ci->description = p.Recv_string(NETWORK_CONTENT_DESC_LENGTH, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE);
ci->unique_id = p->Recv_uint32();
ci->unique_id = p.Recv_uint32();
for (size_t j = 0; j < ci->md5sum.size(); j++) {
ci->md5sum[j] = p->Recv_uint8();
ci->md5sum[j] = p.Recv_uint8();
}
uint dependency_count = p->Recv_uint8();
uint dependency_count = p.Recv_uint8();
ci->dependencies.reserve(dependency_count);
for (uint i = 0; i < dependency_count; i++) {
ContentID dependency_cid = (ContentID)p->Recv_uint32();
ContentID dependency_cid = (ContentID)p.Recv_uint32();
ci->dependencies.push_back(dependency_cid);
this->reverse_dependency_map.insert({ dependency_cid, ci->id });
}
uint tag_count = p->Recv_uint8();
uint tag_count = p.Recv_uint8();
ci->tags.reserve(tag_count);
for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH));
for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p.Recv_string(NETWORK_CONTENT_TAG_LENGTH));
if (!ci->IsValid()) {
delete ci;
@@ -204,7 +204,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type)
this->Connect();
Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_LIST);
auto p = std::make_unique<Packet>(PACKET_CONTENT_CLIENT_INFO_LIST);
p->Send_uint8 ((byte)type);
p->Send_uint32(0xffffffff);
p->Send_uint8 (1);
@@ -221,7 +221,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentType type)
*/
this->SendPacket(p);
this->SendPacket(std::move(p));
}
/**
@@ -240,14 +240,14 @@ void ClientNetworkContentSocketHandler::RequestContentList(uint count, const Con
* The rest of the packet can be used for the IDs. */
uint p_count = std::min<uint>(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t));
Packet *p = new Packet(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU);
auto p = std::make_unique<Packet>(PACKET_CONTENT_CLIENT_INFO_ID, TCP_MTU);
p->Send_uint16(p_count);
for (uint i = 0; i < p_count; i++) {
p->Send_uint32(content_ids[i]);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
count -= p_count;
content_ids += p_count;
}
@@ -268,7 +268,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo
assert(cv->size() < (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint8_t)) /
(sizeof(uint8_t) + sizeof(uint32_t) + (send_md5sum ? MD5_HASH_BYTES : 0)));
Packet *p = new Packet(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU);
auto p = std::make_unique<Packet>(send_md5sum ? PACKET_CONTENT_CLIENT_INFO_EXTID_MD5 : PACKET_CONTENT_CLIENT_INFO_EXTID, TCP_MTU);
p->Send_uint8((uint8_t)cv->size());
for (const ContentInfo *ci : *cv) {
@@ -281,7 +281,7 @@ void ClientNetworkContentSocketHandler::RequestContentList(ContentVector *cv, bo
}
}
this->SendPacket(p);
this->SendPacket(std::move(p));
for (ContentInfo *ci : *cv) {
bool found = false;
@@ -365,14 +365,14 @@ void ClientNetworkContentSocketHandler::DownloadSelectedContentFallback(const Co
* The rest of the packet can be used for the IDs. */
uint p_count = std::min<uint>(count, (TCP_MTU - sizeof(PacketSize) - sizeof(byte) - sizeof(uint16_t)) / sizeof(uint32_t));
Packet *p = new Packet(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU);
auto p = std::make_unique<Packet>(PACKET_CONTENT_CLIENT_CONTENT, TCP_MTU);
p->Send_uint16(p_count);
for (uint i = 0; i < p_count; i++) {
p->Send_uint32(content_ids[i]);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
count -= p_count;
content_ids += p_count;
}
@@ -477,16 +477,16 @@ static inline ssize_t TransferOutFWrite(FILE *file, const char *buffer, size_t a
return fwrite(buffer, 1, amount, file);
}
bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p)
bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet &p)
{
if (this->curFile == nullptr) {
delete this->curInfo;
/* When we haven't opened a file this must be our first packet with metadata. */
this->curInfo = new ContentInfo;
this->curInfo->type = (ContentType)p->Recv_uint8();
this->curInfo->id = (ContentID)p->Recv_uint32();
this->curInfo->filesize = p->Recv_uint32();
this->curInfo->filename = p->Recv_string(NETWORK_CONTENT_FILENAME_LENGTH);
this->curInfo->type = (ContentType)p.Recv_uint8();
this->curInfo->id = (ContentID)p.Recv_uint32();
this->curInfo->filesize = p.Recv_uint32();
this->curInfo->filename = p.Recv_string(NETWORK_CONTENT_FILENAME_LENGTH);
if (!this->BeforeDownload()) {
this->CloseConnection();
@@ -494,8 +494,8 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_CONTENT(Packet *p)
}
} else {
/* We have a file opened, thus are downloading internal content */
size_t toRead = p->RemainingBytesToTransfer();
if (toRead != 0 && (size_t)p->TransferOut(TransferOutFWrite, this->curFile) != toRead) {
size_t toRead = p.RemainingBytesToTransfer();
if (toRead != 0 && (size_t)p.TransferOut(TransferOutFWrite, this->curFile) != toRead) {
CloseWindowById(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD);
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, WL_ERROR);
this->CloseConnection();
+2 -2
View File
@@ -82,8 +82,8 @@ protected:
friend class NetworkContentConnecter;
bool Receive_SERVER_INFO(Packet *p) override;
bool Receive_SERVER_CONTENT(Packet *p) override;
bool Receive_SERVER_INFO(Packet &p) override;
bool Receive_SERVER_CONTENT(Packet &p) override;
ContentInfo *GetContent(ContentID cid) const;
void DownloadContentInfo(ContentID cid);
+54 -54
View File
@@ -124,10 +124,10 @@ public:
}
};
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet &p)
{
NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p->Recv_uint8();
std::string detail = p->Recv_string(NETWORK_ERROR_DETAIL_LENGTH);
NetworkCoordinatorErrorType error = (NetworkCoordinatorErrorType)p.Recv_uint8();
std::string detail = p.Recv_string(NETWORK_ERROR_DETAIL_LENGTH);
switch (error) {
case NETWORK_COORDINATOR_ERROR_UNKNOWN:
@@ -174,14 +174,14 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_ERROR(Packet *p)
}
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet &p)
{
/* Schedule sending an update. */
this->next_update = std::chrono::steady_clock::now();
_settings_client.network.server_invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH);
_settings_client.network.server_invite_code_secret = p->Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH);
_network_server_connection_type = (ConnectionType)p->Recv_uint8();
_settings_client.network.server_invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH);
_settings_client.network.server_invite_code_secret = p.Recv_string(NETWORK_INVITE_CODE_SECRET_LENGTH);
_network_server_connection_type = (ConnectionType)p.Recv_uint8();
if (_network_server_connection_type == CONNECTION_TYPE_ISOLATED) {
ShowErrorMessage(STR_NETWORK_ERROR_COORDINATOR_ISOLATED, STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL, WL_ERROR);
@@ -230,9 +230,9 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_REGISTER_ACK(Packet *p)
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet &p)
{
uint8_t servers = p->Recv_uint16();
uint8_t servers = p.Recv_uint16();
/* End of list; we can now remove all expired items from the list. */
if (servers == 0) {
@@ -241,11 +241,11 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
}
for (; servers > 0; servers--) {
std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
/* Read the NetworkGameInfo from the packet. */
NetworkGameInfo ngi = {};
DeserializeNetworkGameInfo(p, &ngi, &this->newgrf_lookup_table);
DeserializeNetworkGameInfo(p, ngi, &this->newgrf_lookup_table);
/* Now we know the connection string, we can add it to our list. */
NetworkGameList *item = NetworkGameListAddItem(connection_string);
@@ -266,10 +266,10 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_LISTING(Packet *p)
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
std::string invite_code = p->Recv_string(NETWORK_INVITE_CODE_LENGTH);
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
std::string invite_code = p.Recv_string(NETWORK_INVITE_CODE_LENGTH);
/* Find the connecter based on the invite code. */
auto connecter_pre_it = this->connecter_pre.find(invite_code);
@@ -285,20 +285,20 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECTING(Packet *p)
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_CONNECT_FAILED(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
this->CloseToken(token);
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p->Recv_uint8();
std::string hostname = p->Recv_string(NETWORK_HOSTNAME_LENGTH);
uint16_t port = p->Recv_uint16();
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p.Recv_uint8();
std::string hostname = p.Recv_string(NETWORK_HOSTNAME_LENGTH);
uint16_t port = p.Recv_uint16();
/* Ensure all other pending connection attempts are killed. */
if (this->game_connecter != nullptr) {
@@ -310,22 +310,22 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_DIRECT_CONNECT(Packet *p)
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_REQUEST(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
this->stun_handlers[token][AF_INET6] = ClientNetworkStunSocketHandler::Stun(token, AF_INET6);
this->stun_handlers[token][AF_INET] = ClientNetworkStunSocketHandler::Stun(token, AF_INET);
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p->Recv_uint8();
uint8_t family = p->Recv_uint8();
std::string host = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
uint16_t port = p->Recv_uint16();
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p.Recv_uint8();
uint8_t family = p.Recv_uint8();
std::string host = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
uint16_t port = p.Recv_uint16();
/* Check if we know this token. */
auto stun_it = this->stun_handlers.find(token);
@@ -353,24 +353,24 @@ bool ClientNetworkCoordinatorSocketHandler::Receive_GC_STUN_CONNECT(Packet *p)
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_NEWGRF_LOOKUP(Packet &p)
{
this->newgrf_lookup_table_cursor = p->Recv_uint32();
this->newgrf_lookup_table_cursor = p.Recv_uint32();
uint16_t newgrfs = p->Recv_uint16();
uint16_t newgrfs = p.Recv_uint16();
for (; newgrfs> 0; newgrfs--) {
uint32_t index = p->Recv_uint32();
DeserializeGRFIdentifierWithName(p, &this->newgrf_lookup_table[index]);
uint32_t index = p.Recv_uint32();
DeserializeGRFIdentifierWithName(p, this->newgrf_lookup_table[index]);
}
return true;
}
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet *p)
bool ClientNetworkCoordinatorSocketHandler::Receive_GC_TURN_CONNECT(Packet &p)
{
std::string token = p->Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p->Recv_uint8();
std::string ticket = p->Recv_string(NETWORK_TOKEN_LENGTH);
std::string connection_string = p->Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
std::string token = p.Recv_string(NETWORK_TOKEN_LENGTH);
uint8_t tracking_number = p.Recv_uint8();
std::string ticket = p.Recv_string(NETWORK_TOKEN_LENGTH);
std::string connection_string = p.Recv_string(NETWORK_HOSTNAME_PORT_LENGTH);
/* Ensure all other pending connection attempts are killed. */
if (this->game_connecter != nullptr) {
@@ -458,7 +458,7 @@ void ClientNetworkCoordinatorSocketHandler::Register()
this->Connect();
Packet *p = new Packet(PACKET_COORDINATOR_SERVER_REGISTER);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_SERVER_REGISTER);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_uint8(_settings_client.network.server_game_type);
p->Send_uint16(_settings_client.network.server_port);
@@ -470,7 +470,7 @@ void ClientNetworkCoordinatorSocketHandler::Register()
p->Send_string(_settings_client.network.server_invite_code_secret);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
}
/**
@@ -480,11 +480,11 @@ void ClientNetworkCoordinatorSocketHandler::SendServerUpdate()
{
Debug(net, 6, "Sending server update to Game Coordinator");
Packet *p = new Packet(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_SERVER_UPDATE, TCP_MTU);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero());
SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo(), this->next_update.time_since_epoch() != std::chrono::nanoseconds::zero());
this->SendPacket(p);
this->SendPacket(std::move(p));
this->next_update = std::chrono::steady_clock::now() + NETWORK_COORDINATOR_DELAY_BETWEEN_UPDATES;
}
@@ -498,13 +498,13 @@ void ClientNetworkCoordinatorSocketHandler::GetListing()
_network_game_list_version++;
Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_LISTING);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_CLIENT_LISTING);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_uint8(NETWORK_GAME_INFO_VERSION);
p->Send_string(_openttd_revision);
p->Send_uint32(this->newgrf_lookup_table_cursor);
this->SendPacket(p);
this->SendPacket(std::move(p));
}
/**
@@ -530,11 +530,11 @@ void ClientNetworkCoordinatorSocketHandler::ConnectToServer(const std::string &i
this->Connect();
Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECT);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_CLIENT_CONNECT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(invite_code);
this->SendPacket(p);
this->SendPacket(std::move(p));
}
/**
@@ -547,12 +547,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectFailure(const std::string &to
/* Connecter will destroy itself. */
this->game_connecter = nullptr;
Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_SERCLI_CONNECT_FAILED);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(tracking_number);
this->SendPacket(p);
this->SendPacket(std::move(p));
/* We do not close the associated connecter here yet, as the
* Game Coordinator might have other methods of connecting available. */
@@ -578,10 +578,10 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to
} else {
/* The client informs the Game Coordinator about the success. The server
* doesn't have to, as it is implied by the client telling. */
Packet *p = new Packet(PACKET_COORDINATOR_CLIENT_CONNECTED);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_CLIENT_CONNECTED);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
this->SendPacket(p);
this->SendPacket(std::move(p));
/* Find the connecter; it can happen it no longer exist, in cases where
* we aborted the connect but the Game Coordinator was already in the
@@ -606,12 +606,12 @@ void ClientNetworkCoordinatorSocketHandler::ConnectSuccess(const std::string &to
*/
void ClientNetworkCoordinatorSocketHandler::StunResult(const std::string &token, uint8_t family, bool result)
{
Packet *p = new Packet(PACKET_COORDINATOR_SERCLI_STUN_RESULT);
auto p = std::make_unique<Packet>(PACKET_COORDINATOR_SERCLI_STUN_RESULT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(family);
p->Send_bool(result);
this->SendPacket(p);
this->SendPacket(std::move(p));
}
/**
+10 -10
View File
@@ -63,16 +63,16 @@ private:
GameInfoNewGRFLookupTable newgrf_lookup_table; ///< Table to look up NewGRFs in the GC_LISTING packets.
protected:
bool Receive_GC_ERROR(Packet *p) override;
bool Receive_GC_REGISTER_ACK(Packet *p) override;
bool Receive_GC_LISTING(Packet *p) override;
bool Receive_GC_CONNECTING(Packet *p) override;
bool Receive_GC_CONNECT_FAILED(Packet *p) override;
bool Receive_GC_DIRECT_CONNECT(Packet *p) override;
bool Receive_GC_STUN_REQUEST(Packet *p) override;
bool Receive_GC_STUN_CONNECT(Packet *p) override;
bool Receive_GC_NEWGRF_LOOKUP(Packet *p) override;
bool Receive_GC_TURN_CONNECT(Packet *p) override;
bool Receive_GC_ERROR(Packet &p) override;
bool Receive_GC_REGISTER_ACK(Packet &p) override;
bool Receive_GC_LISTING(Packet &p) override;
bool Receive_GC_CONNECTING(Packet &p) override;
bool Receive_GC_CONNECT_FAILED(Packet &p) override;
bool Receive_GC_DIRECT_CONNECT(Packet &p) override;
bool Receive_GC_STUN_REQUEST(Packet &p) override;
bool Receive_GC_STUN_CONNECT(Packet &p) override;
bool Receive_GC_NEWGRF_LOOKUP(Packet &p) override;
bool Receive_GC_TURN_CONNECT(Packet &p) override;
public:
/** The idle timeout; when to close the connection because it's idle. */
+1 -3
View File
@@ -107,9 +107,7 @@ void UpdateNetworkGameWindow();
* Everything we need to know about a command to be able to execute it.
*/
struct CommandPacket {
/** Make sure the pointer is nullptr. */
CommandPacket() : next(nullptr), company(INVALID_COMPANY), frame(0), my_cmd(false) {}
CommandPacket *next; ///< the next command packet (if in queue)
CommandPacket() : company(INVALID_COMPANY), frame(0), my_cmd(false) {}
CompanyID company; ///< company that is executing the command
uint32_t frame; ///< the frame in which this packet is executed
bool my_cmd; ///< did the command originate from "me"
+7 -7
View File
@@ -83,11 +83,11 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::SendGameInfo()
{
Debug(net, 9, "Query::SendGameInfo()");
this->SendPacket(new Packet(PACKET_CLIENT_GAME_INFO));
this->SendPacket(std::make_unique<Packet>(PACKET_CLIENT_GAME_INFO));
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &)
{
Debug(net, 9, "Query::Receive_SERVER_FULL()");
@@ -100,7 +100,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *)
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet &)
{
Debug(net, 9, "Query::Receive_SERVER_BANNED()");
@@ -113,7 +113,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_BANNED(Packet *)
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet *p)
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet &p)
{
Debug(net, 9, "Query::Receive_SERVER_GAME_INFO()");
@@ -122,7 +122,7 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet
/* Clear any existing GRFConfig chain. */
ClearGRFConfigList(&item->info.grfconfig);
/* Retrieve the NetworkGameInfo from the packet. */
DeserializeNetworkGameInfo(p, &item->info);
DeserializeNetworkGameInfo(p, item->info);
/* Check for compatability with the client. */
CheckGameCompatibility(item->info);
/* Ensure we consider the server online. */
@@ -134,9 +134,9 @@ NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_GAME_INFO(Packet
return NETWORK_RECV_STATUS_CLOSE_QUERY;
}
NetworkRecvStatus QueryNetworkGameSocketHandler::Receive_SERVER_ERROR(Packet *p)
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);
+4 -4
View File
@@ -19,10 +19,10 @@ private:
std::string connection_string; ///< Address we are connected to.
protected:
NetworkRecvStatus Receive_SERVER_FULL(Packet *p) override;
NetworkRecvStatus Receive_SERVER_BANNED(Packet *p) override;
NetworkRecvStatus Receive_SERVER_ERROR(Packet *p) override;
NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet *p) override;
NetworkRecvStatus Receive_SERVER_FULL(Packet &p) override;
NetworkRecvStatus Receive_SERVER_BANNED(Packet &p) override;
NetworkRecvStatus Receive_SERVER_ERROR(Packet &p) override;
NetworkRecvStatus Receive_SERVER_GAME_INFO(Packet &p) override;
NetworkRecvStatus SendGameInfo();
+129 -167
View File
@@ -61,9 +61,9 @@ template SocketList TCPListenHandler<ServerNetworkGameSocketHandler, PACKET_SERV
/** Writing a savegame directly to a number of packets. */
struct PacketWriter : SaveFilter {
ServerNetworkGameSocketHandler *cs; ///< Socket we are associated with.
Packet *current; ///< The packet we're currently writing to.
std::unique_ptr<Packet> current; ///< The packet we're currently writing to.
size_t total_size; ///< Total size of the compressed savegame.
Packet *packets; ///< Packet queue of the savegame; send these "slowly" to the client.
std::deque<std::unique_ptr<Packet>> packets; ///< Packet queue of the savegame; send these "slowly" to the client. Cannot be a std::queue as we want to push the map size packet in front of the data packets.
std::mutex mutex; ///< Mutex for making threaded saving safe.
std::condition_variable exit_sig; ///< Signal for threaded destruction of this packet writer.
@@ -71,7 +71,7 @@ struct PacketWriter : SaveFilter {
* Create the packet writer.
* @param cs The socket handler we're making the packets for.
*/
PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), current(nullptr), total_size(0), packets(nullptr)
PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), total_size(0)
{
}
@@ -84,11 +84,9 @@ struct PacketWriter : SaveFilter {
/* This must all wait until the Destroy function is called. */
while (this->packets != nullptr) {
delete Packet::PopFromQueue(&this->packets);
}
delete this->current;
Debug(net, 0, "Destruct!");
this->packets.clear();
this->current = nullptr;
}
/**
@@ -125,14 +123,14 @@ struct PacketWriter : SaveFilter {
bool TransferToNetworkQueue(ServerNetworkGameSocketHandler *socket)
{
/* Unsafe check for the queue being empty or not. */
if (this->packets == nullptr) return false;
if (this->packets.empty()) return false;
std::lock_guard<std::mutex> lock(this->mutex);
while (this->packets != nullptr) {
Packet *p = Packet::PopFromQueue(&this->packets);
bool last_packet = p->GetPacketType() == PACKET_SERVER_MAP_DONE;
socket->SendPacket(p);
while (!this->packets.empty()) {
bool last_packet = this->packets.front()->GetPacketType() == PACKET_SERVER_MAP_DONE;
socket->SendPacket(std::move(this->packets.front()));
this->packets.pop_front();
if (last_packet) return true;
}
@@ -140,32 +138,12 @@ struct PacketWriter : SaveFilter {
return false;
}
/** Append the current packet to the queue. */
void AppendQueue()
{
if (this->current == nullptr) return;
Packet::AddToQueue(&this->packets, this->current);
this->current = nullptr;
}
/** Prepend the current packet to the queue. */
void PrependQueue()
{
if (this->current == nullptr) return;
/* Reversed from AppendQueue so the queue gets added to the current one. */
Packet::AddToQueue(&this->current, this->packets);
this->packets = this->current;
this->current = nullptr;
}
void Write(byte *buf, size_t size) override
{
/* We want to abort the saving when the socket is closed. */
if (this->cs == nullptr) SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
if (this->current == nullptr) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU);
if (this->current == nullptr) this->current = std::make_unique<Packet>(PACKET_SERVER_MAP_DATA, TCP_MTU);
std::lock_guard<std::mutex> lock(this->mutex);
@@ -175,8 +153,8 @@ struct PacketWriter : SaveFilter {
buf += written;
if (!this->current->CanWriteToPacket(1)) {
this->AppendQueue();
if (buf != bufe) this->current = new Packet(PACKET_SERVER_MAP_DATA, TCP_MTU);
this->packets.push_back(std::move(this->current));
if (buf != bufe) this->current = std::make_unique<Packet>(PACKET_SERVER_MAP_DATA, TCP_MTU);
}
}
@@ -191,16 +169,15 @@ struct PacketWriter : SaveFilter {
std::lock_guard<std::mutex> lock(this->mutex);
/* Make sure the last packet is flushed. */
this->AppendQueue();
if (this->current != nullptr) this->packets.push_back(std::move(this->current));
/* Add a packet stating that this is the end to the queue. */
this->current = new Packet(PACKET_SERVER_MAP_DONE);
this->AppendQueue();
this->packets.push_back(std::make_unique<Packet>(PACKET_SERVER_MAP_DONE));
/* Fast-track the size to the client. */
this->current = new Packet(PACKET_SERVER_MAP_SIZE);
this->current->Send_uint32((uint32_t)this->total_size);
this->PrependQueue();
auto p = std::make_unique<Packet>(PACKET_SERVER_MAP_SIZE);
p->Send_uint32((uint32_t)this->total_size);
this->packets.push_front(std::move(p));
}
};
@@ -239,7 +216,7 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler()
}
}
Packet *ServerNetworkGameSocketHandler::ReceivePacket()
std::unique_ptr<Packet> ServerNetworkGameSocketHandler::ReceivePacket()
{
/* Only allow receiving when we have some buffer free; this value
* can go negative, but eventually it will become positive again. */
@@ -247,7 +224,7 @@ Packet *ServerNetworkGameSocketHandler::ReceivePacket()
/* We can receive a packet, so try that and if needed account for
* the amount of received data. */
Packet *p = this->NetworkTCPSocketHandler::ReceivePacket();
std::unique_ptr<Packet> p = this->NetworkTCPSocketHandler::ReceivePacket();
if (p != nullptr) this->receive_limit -= p->Size();
return p;
}
@@ -338,7 +315,6 @@ static void NetworkHandleCommandQueue(NetworkClientSocket *cs);
/***********
* Sending functions
* DEF_SERVER_SEND_COMMAND has parameter: NetworkClientSocket *cs
************/
/**
@@ -350,12 +326,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendClientInfo(NetworkClientIn
Debug(net, 9, "client[{}] SendClientInfo(): client_id={}", this->client_id, ci->client_id);
if (ci->client_id != INVALID_CLIENT_ID) {
Packet *p = new Packet(PACKET_SERVER_CLIENT_INFO);
auto p = std::make_unique<Packet>(PACKET_SERVER_CLIENT_INFO);
p->Send_uint32(ci->client_id);
p->Send_uint8 (ci->client_playas);
p->Send_string(ci->client_name);
this->SendPacket(p);
this->SendPacket(std::move(p));
}
return NETWORK_RECV_STATUS_OKAY;
}
@@ -365,10 +341,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendGameInfo()
{
Debug(net, 9, "client[{}] SendGameInfo()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_GAME_INFO, TCP_MTU);
SerializeNetworkGameInfo(p, GetCurrentNetworkServerGameInfo());
auto p = std::make_unique<Packet>(PACKET_SERVER_GAME_INFO, TCP_MTU);
SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo());
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -382,11 +358,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
{
Debug(net, 9, "client[{}] SendError(): error={}", this->client_id, error);
Packet *p = new Packet(PACKET_SERVER_ERROR);
auto p = std::make_unique<Packet>(PACKET_SERVER_ERROR);
p->Send_uint8(error);
if (!reason.empty()) p->Send_string(reason);
this->SendPacket(p);
this->SendPacket(std::move(p));
StringID strid = GetNetworkErrorMsg(error);
@@ -427,7 +403,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
{
Debug(net, 9, "client[{}] SendNewGRFCheck()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
auto p = std::make_unique<Packet>(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
const GRFConfig *c;
uint grf_count = 0;
@@ -437,16 +413,21 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGRFCheck()
p->Send_uint8 (grf_count);
for (c = _grfconfig; c != nullptr; c = c->next) {
if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(p, &c->ident);
if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(*p, c->ident);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Request the game password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
{
if (_settings_client.network.server_password.empty()) {
/* Do not actually need a game password, continue with the company password. */
return this->SendNeedCompanyPassword();
}
Debug(net, 9, "client[{}] SendNeedGamePassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_GAME or higher */
@@ -457,14 +438,19 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedGamePassword()
/* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter;
Packet *p = new Packet(PACKET_SERVER_NEED_GAME_PASSWORD);
this->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_SERVER_NEED_GAME_PASSWORD);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Request the company password. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
{
NetworkClientInfo *ci = this->GetInfo();
if (!Company::IsValidID(ci->client_playas) || _network_company_states[ci->client_playas].password.empty()) {
return this->SendWelcome();
}
Debug(net, 9, "client[{}] SendNeedCompanyPassword()", this->client_id);
/* Invalid packet when status is STATUS_AUTH_COMPANY or higher */
@@ -475,10 +461,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNeedCompanyPassword()
/* Reset 'lag' counters */
this->last_frame = this->last_frame_server = _frame_counter;
Packet *p = new Packet(PACKET_SERVER_NEED_COMPANY_PASSWORD);
auto p = std::make_unique<Packet>(PACKET_SERVER_NEED_COMPANY_PASSWORD);
p->Send_uint32(_settings_game.game_creation.generation_seed);
p->Send_string(_settings_client.network.network_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -487,8 +473,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
{
Debug(net, 9, "client[{}] SendWelcome()", this->client_id);
Packet *p;
/* Invalid packet when status is AUTH or higher */
if (this->status >= STATUS_AUTHORIZED) return this->CloseConnection(NETWORK_RECV_STATUS_MALFORMED_PACKET);
@@ -499,11 +483,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome()
_network_game_info.clients_on++;
p = new Packet(PACKET_SERVER_WELCOME);
auto p = std::make_unique<Packet>(PACKET_SERVER_WELCOME);
p->Send_uint32(this->client_id);
p->Send_uint32(_settings_game.game_creation.generation_seed);
p->Send_string(_settings_client.network.network_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
/* Transmit info about all the active clients */
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
@@ -521,7 +505,6 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
Debug(net, 9, "client[{}] SendWait()", this->client_id);
int waiting = 1; // current player getting the map counts as 1
Packet *p;
/* Count how many clients are waiting in the queue, in front of you! */
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
@@ -529,9 +512,9 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWait()
if (new_cs->GetInfo()->join_date < this->GetInfo()->join_date || (new_cs->GetInfo()->join_date == this->GetInfo()->join_date && new_cs->client_id < this->client_id)) waiting++;
}
p = new Packet(PACKET_SERVER_WAIT);
auto p = std::make_unique<Packet>(PACKET_SERVER_WAIT);
p->Send_uint8(waiting);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -579,9 +562,9 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap()
this->savegame = std::make_shared<PacketWriter>(this);
/* Now send the _frame_counter and how many packets are coming */
Packet *p = new Packet(PACKET_SERVER_MAP_BEGIN);
auto p = std::make_unique<Packet>(PACKET_SERVER_MAP_BEGIN);
p->Send_uint32(_frame_counter);
this->SendPacket(p);
this->SendPacket(std::move(p));
NetworkSyncCommandQueue(this);
Debug(net, 9, "client[{}] status = MAP", this->client_id);
@@ -622,18 +605,18 @@ 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);
auto p = std::make_unique<Packet>(PACKET_SERVER_JOIN);
p->Send_uint32(client_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/** Tell the client that they may run to a particular frame. */
NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame()
{
Packet *p = new Packet(PACKET_SERVER_FRAME);
auto p = std::make_unique<Packet>(PACKET_SERVER_FRAME);
p->Send_uint32(_frame_counter);
p->Send_uint32(_frame_counter_max);
#ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
@@ -649,7 +632,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame()
p->Send_uint8(this->last_token);
}
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -658,14 +641,14 @@ 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);
auto p = std::make_unique<Packet>(PACKET_SERVER_SYNC);
p->Send_uint32(_frame_counter);
p->Send_uint32(_sync_seed_1);
#ifdef NETWORK_SEND_DOUBLE_SEED
p->Send_uint32(_sync_seed_2);
#endif
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -673,17 +656,17 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendSync()
* Send a command to the client to execute.
* @param cp The command to send.
*/
NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket *cp)
NetworkRecvStatus ServerNetworkGameSocketHandler::SendCommand(const CommandPacket &cp)
{
Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp->cmd);
Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp.cmd);
Packet *p = new Packet(PACKET_SERVER_COMMAND);
auto p = std::make_unique<Packet>(PACKET_SERVER_COMMAND);
this->NetworkGameSocketHandler::SendCommand(p, cp);
p->Send_uint32(cp->frame);
p->Send_bool (cp->my_cmd);
this->NetworkGameSocketHandler::SendCommand(*p, cp);
p->Send_uint32(cp.frame);
p->Send_bool (cp.my_cmd);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -701,7 +684,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action,
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(PACKET_SERVER_CHAT);
auto p = std::make_unique<Packet>(PACKET_SERVER_CHAT);
p->Send_uint8 (action);
p->Send_uint32(client_id);
@@ -709,7 +692,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action,
p->Send_string(msg);
p->Send_uint64(data);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -726,14 +709,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::st
if (this->status < STATUS_PRE_ACTIVE) return NETWORK_RECV_STATUS_OKAY;
Packet *p = new Packet(PACKET_SERVER_EXTERNAL_CHAT);
auto p = std::make_unique<Packet>(PACKET_SERVER_EXTERNAL_CHAT);
p->Send_string(source);
p->Send_uint16(colour);
p->Send_string(user);
p->Send_string(msg);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -746,12 +729,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendErrorQuit(ClientID client_
{
Debug(net, 9, "client[{}] SendErrorQuit(): client_id={}, errorno={}", this->client_id, client_id, errorno);
Packet *p = new Packet(PACKET_SERVER_ERROR_QUIT);
auto p = std::make_unique<Packet>(PACKET_SERVER_ERROR_QUIT);
p->Send_uint32(client_id);
p->Send_uint8 (errorno);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -763,11 +746,11 @@ 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);
auto p = std::make_unique<Packet>(PACKET_SERVER_QUIT);
p->Send_uint32(client_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -776,8 +759,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendShutdown()
{
Debug(net, 9, "client[{}] SendShutdown()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_SHUTDOWN);
this->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_SERVER_SHUTDOWN);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -786,8 +769,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendNewGame()
{
Debug(net, 9, "client[{}] SendNewGame()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_NEWGAME);
this->SendPacket(p);
auto p = std::make_unique<Packet>(PACKET_SERVER_NEWGAME);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -800,11 +783,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour
{
Debug(net, 9, "client[{}] SendRConResult()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_RCON);
auto p = std::make_unique<Packet>(PACKET_SERVER_RCON);
p->Send_uint16(colour);
p->Send_string(command);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -817,11 +800,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMove(ClientID client_id, C
{
Debug(net, 9, "client[{}] SendMove(): client_id={}", this->client_id, client_id);
Packet *p = new Packet(PACKET_SERVER_MOVE);
auto p = std::make_unique<Packet>(PACKET_SERVER_MOVE);
p->Send_uint32(client_id);
p->Send_uint8(company_id);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -830,11 +813,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyUpdate()
{
Debug(net, 9, "client[{}] SendCompanyUpdate()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_COMPANY_UPDATE);
auto p = std::make_unique<Packet>(PACKET_SERVER_COMPANY_UPDATE);
static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
p->Send_uint16(_network_company_passworded);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
@@ -843,27 +826,26 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendConfigUpdate()
{
Debug(net, 9, "client[{}] SendConfigUpdate()", this->client_id);
Packet *p = new Packet(PACKET_SERVER_CONFIG_UPDATE);
auto p = std::make_unique<Packet>(PACKET_SERVER_CONFIG_UPDATE);
p->Send_uint8(_settings_client.network.max_companies);
p->Send_string(_settings_client.network.server_name);
this->SendPacket(p);
this->SendPacket(std::move(p));
return NETWORK_RECV_STATUS_OKAY;
}
/***********
* Receiving functions
* DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkClientSocket *cs, Packet *p
************/
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();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet *)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED(Packet &)
{
if (this->status != STATUS_NEWGRFS_CHECK) {
/* Illegal call, return error and ignore the packet */
@@ -872,21 +854,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED
Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id);
NetworkClientInfo *ci = this->GetInfo();
/* We now want a password from the client else we do not allow them in! */
if (!_settings_client.network.server_password.empty()) {
return this->SendNeedGamePassword();
}
if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) {
return this->SendNeedCompanyPassword();
}
return this->SendWelcome();
return this->SendNeedGamePassword();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet &p)
{
if (this->status != STATUS_INACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -898,8 +869,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_FULL);
}
std::string client_revision = p->Recv_string(NETWORK_REVISION_LENGTH);
uint32_t newgrf_version = p->Recv_uint32();
std::string client_revision = p.Recv_string(NETWORK_REVISION_LENGTH);
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);
@@ -909,8 +880,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
return this->SendError(NETWORK_ERROR_WRONG_REVISION);
}
std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
CompanyID playas = (Owner)p->Recv_uint8();
std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
CompanyID playas = (Owner)p.Recv_uint8();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -957,14 +928,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
this->status = STATUS_NEWGRFS_CHECK;
if (_grfconfig == nullptr) {
/* Behave as if we received PACKET_CLIENT_NEWGRFS_CHECKED */
return this->Receive_CLIENT_NEWGRFS_CHECKED(nullptr);
/* Continue asking for the game password. */
return this->SendNeedGamePassword();
}
return this->SendNewGRFCheck();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(Packet &p)
{
if (this->status != STATUS_AUTH_GAME) {
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -972,7 +943,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P
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 */
if (!_settings_client.network.server_password.empty() &&
@@ -981,16 +952,10 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD(P
return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
}
const NetworkClientInfo *ci = this->GetInfo();
if (Company::IsValidID(ci->client_playas) && !_network_company_states[ci->client_playas].password.empty()) {
return this->SendNeedCompanyPassword();
}
/* Valid password, allow user */
return this->SendWelcome();
return this->SendNeedCompanyPassword();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD(Packet &p)
{
if (this->status != STATUS_AUTH_COMPANY) {
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -998,7 +963,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR
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.
* Also, check the company is still valid - client could be moved to spectators
@@ -1013,7 +978,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWOR
return this->SendWelcome();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet &)
{
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close the connection */
@@ -1037,7 +1002,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *
return this->SendMap();
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet &)
{
/* Client has the map, now start syncing */
if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) {
@@ -1087,7 +1052,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK(Packet *
* The client has done a command and wants us to handle it
* @param p the packet in which the command was sent
*/
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet &p)
{
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close the connection */
@@ -1095,14 +1060,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
}
if (this->incoming_queue.Count() >= _settings_client.network.max_commands_in_queue) {
if (this->incoming_queue.size() >= _settings_client.network.max_commands_in_queue) {
return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS);
}
Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id);
CommandPacket cp;
const char *err = this->ReceiveCommand(p, &cp);
const char *err = this->ReceiveCommand(p, cp);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -1150,15 +1115,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
if (GetCommandFlags(cp.cmd) & CMD_CLIENT_ID) NetworkReplaceCommandClientId(cp, this->client_id);
this->incoming_queue.Append(&cp);
this->incoming_queue.push_back(cp);
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet &p)
{
/* This packets means a client noticed an error and is reporting this
* 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);
@@ -1185,7 +1150,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet &)
{
/* The client was never joined.. thank the client for the packet, but ignore it */
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
@@ -1209,14 +1174,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *)
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet &p)
{
if (this->status < STATUS_AUTHORIZED) {
/* Illegal call, return error and ignore the packet */
return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
}
uint32_t frame = p->Recv_uint32();
uint32_t frame = p.Recv_uint32();
Debug(net, 9, "client[{}] Receive_CLIENT_ACK(): frame={}", this->client_id, frame);
@@ -1235,7 +1200,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
}
/* Get, and validate the token. */
uint8_t token = p->Recv_uint8();
uint8_t token = p.Recv_uint8();
if (token == this->last_token) {
/* We differentiate between last_token_frame and last_frame so the lag
* test uses the actual lag of the client instead of the lag for getting
@@ -1394,21 +1359,21 @@ void NetworkServerSendExternalChat(const std::string &source, TextColour colour,
NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source);
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet &p)
{
if (this->status < STATUS_PRE_ACTIVE) {
/* Illegal call, return error and ignore the packet */
return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
}
NetworkAction action = (NetworkAction)p->Recv_uint8();
DestType desttype = (DestType)p->Recv_uint8();
int dest = p->Recv_uint32();
NetworkAction action = (NetworkAction)p.Recv_uint8();
DestType desttype = (DestType)p.Recv_uint8();
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);
int64_t data = p->Recv_uint64();
std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
int64_t data = p.Recv_uint64();
NetworkClientInfo *ci = this->GetInfo();
switch (action) {
@@ -1424,7 +1389,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Packet &p)
{
if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -1433,14 +1398,14 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD(Pa
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();
NetworkServerSetCompanyPassword(ci->client_playas, password);
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet &p)
{
if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
@@ -1451,7 +1416,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
NetworkClientInfo *ci;
std::string client_name = p->Recv_string(NETWORK_CLIENT_NAME_LENGTH);
std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
ci = this->GetInfo();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
@@ -1474,7 +1439,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet &p)
{
if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
@@ -1482,8 +1447,8 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id);
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
std::string command = p->Recv_string(NETWORK_RCONCOMMAND_LENGTH);
std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
if (_settings_client.network.rcon_password.compare(password) != 0) {
Debug(net, 1, "[rcon] Wrong password from client-id {}", this->client_id);
@@ -1498,11 +1463,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet &p)
{
if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
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);
@@ -1512,7 +1477,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
/* Check if we require a password for this company */
if (company_id != COMPANY_SPECTATOR && !_network_company_states[company_id].password.empty()) {
/* we need a password from the client - should be in this packet */
std::string password = p->Recv_string(NETWORK_PASSWORD_LENGTH);
std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
/* Incorrect password sent, return! */
if (_network_company_states[company_id].password.compare(password) != 0) {
@@ -1736,11 +1701,8 @@ void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &pa
*/
static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
{
CommandPacket *cp;
while ((cp = cs->outgoing_queue.Pop()) != nullptr) {
cs->SendCommand(cp);
delete cp;
}
for (auto &cp : cs->outgoing_queue) cs->SendCommand(cp);
cs->outgoing_queue.clear();
}
/**
+19 -19
View File
@@ -23,22 +23,22 @@ extern NetworkClientSocketPool _networkclientsocket_pool;
/** Class for handling the server side of the game connection. */
class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<&_networkclientsocket_pool>, public NetworkGameSocketHandler, public TCPListenHandler<ServerNetworkGameSocketHandler, PACKET_SERVER_FULL, PACKET_SERVER_BANNED> {
protected:
NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_ACK(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_RCON(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p) override;
NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_ACK(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_RCON(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p) override;
NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p) override;
NetworkRecvStatus SendGameInfo();
NetworkRecvStatus SendNewGRFCheck();
@@ -66,7 +66,7 @@ public:
byte last_token; ///< The last random token we did send to verify the client is listening
uint32_t last_token_frame; ///< The last frame we received the right token
ClientStatus status; ///< Status of this client
CommandQueue outgoing_queue; ///< The command-queue awaiting delivery
CommandQueue outgoing_queue; ///< The command-queue awaiting delivery; conceptually more a bucket to gather commands in, after which the whole bucket is sent to the client.
size_t receive_limit; ///< Amount of bytes that we can receive at this moment
std::shared_ptr<struct PacketWriter> savegame; ///< Writer used to write the savegame.
@@ -75,7 +75,7 @@ public:
ServerNetworkGameSocketHandler(SOCKET s);
~ServerNetworkGameSocketHandler();
Packet *ReceivePacket() override;
std::unique_ptr<Packet> ReceivePacket() override;
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override;
std::string GetClientName() const;
@@ -97,7 +97,7 @@ public:
NetworkRecvStatus SendJoin(ClientID client_id);
NetworkRecvStatus SendFrame();
NetworkRecvStatus SendSync();
NetworkRecvStatus SendCommand(const CommandPacket *cp);
NetworkRecvStatus SendCommand(const CommandPacket &cp);
NetworkRecvStatus SendCompanyUpdate();
NetworkRecvStatus SendConfigUpdate();
+2 -2
View File
@@ -92,12 +92,12 @@ std::unique_ptr<ClientNetworkStunSocketHandler> ClientNetworkStunSocketHandler::
stun_handler->Connect(token, family);
Packet *p = new Packet(PACKET_STUN_SERCLI_STUN);
auto p = std::make_unique<Packet>(PACKET_STUN_SERCLI_STUN);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(token);
p->Send_uint8(family);
stun_handler->SendPacket(p);
stun_handler->SendPacket(std::move(p));
return stun_handler;
}
+5 -5
View File
@@ -49,7 +49,7 @@ public:
}
};
bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet &)
{
Debug(net, 9, "Receive_TURN_ERROR()");
@@ -58,11 +58,11 @@ bool ClientNetworkTurnSocketHandler::Receive_TURN_ERROR(Packet *)
return false;
}
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
* game handler. */
@@ -100,11 +100,11 @@ void ClientNetworkTurnSocketHandler::Connect()
{
auto turn_handler = std::make_unique<ClientNetworkTurnSocketHandler>(token, tracking_number, connection_string);
Packet *p = new Packet(PACKET_TURN_SERCLI_CONNECT);
auto p = std::make_unique<Packet>(PACKET_TURN_SERCLI_CONNECT);
p->Send_uint8(NETWORK_COORDINATOR_VERSION);
p->Send_string(ticket);
turn_handler->SendPacket(p);
turn_handler->SendPacket(std::move(p));
return turn_handler;
}
+2 -2
View File
@@ -20,8 +20,8 @@ private:
std::string connection_string; ///< The connection string of the TURN server we are connecting to.
protected:
bool Receive_TURN_ERROR(Packet *p) override;
bool Receive_TURN_CONNECTED(Packet *p) override;
bool Receive_TURN_ERROR(Packet &p) override;
bool Receive_TURN_CONNECTED(Packet &p) override;
public:
std::shared_ptr<TCPConnecter> connecter{}; ///< Connecter instance.
+9 -9
View File
@@ -63,7 +63,7 @@ static UDPSocket _udp_server("Server"); ///< udp server socket
/** Helper class for handling all server side communication. */
class ServerNetworkUDPSocketHandler : public NetworkUDPSocketHandler {
protected:
void Receive_CLIENT_FIND_SERVER(Packet *p, NetworkAddress *client_addr) override;
void Receive_CLIENT_FIND_SERVER(Packet &p, NetworkAddress &client_addr) override;
public:
/**
* Create the socket.
@@ -73,12 +73,12 @@ public:
virtual ~ServerNetworkUDPSocketHandler() = default;
};
void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, NetworkAddress *client_addr)
void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet &, NetworkAddress &client_addr)
{
Packet packet(PACKET_UDP_SERVER_RESPONSE);
this->SendPacket(&packet, client_addr);
this->SendPacket(packet, client_addr);
Debug(net, 7, "Queried from {}", client_addr->GetHostname());
Debug(net, 7, "Queried from {}", client_addr.GetHostname());
}
///*** Communication with servers (we are client) ***/
@@ -86,16 +86,16 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *, Network
/** Helper class for handling all client side communication. */
class ClientNetworkUDPSocketHandler : public NetworkUDPSocketHandler {
protected:
void Receive_SERVER_RESPONSE(Packet *p, NetworkAddress *client_addr) override;
void Receive_SERVER_RESPONSE(Packet &p, NetworkAddress &client_addr) override;
public:
virtual ~ClientNetworkUDPSocketHandler() = default;
};
void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *, NetworkAddress *client_addr)
void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet &, NetworkAddress &client_addr)
{
Debug(net, 3, "Server response from {}", client_addr->GetAddressAsString());
Debug(net, 3, "Server response from {}", client_addr.GetAddressAsString());
NetworkAddServer(client_addr->GetAddressAsString(false), false, true);
NetworkAddServer(client_addr.GetAddressAsString(false), false, true);
}
/** Broadcast to all ips */
@@ -105,7 +105,7 @@ static void NetworkUDPBroadCast(NetworkUDPSocketHandler *socket)
Debug(net, 5, "Broadcasting to {}", addr.GetHostname());
Packet p(PACKET_UDP_CLIENT_FIND_SERVER);
socket->SendPacket(&p, &addr, true, true);
socket->SendPacket(p, addr, true, true);
}
}
+42 -8
View File
@@ -2431,7 +2431,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
* in the temperate climate. */
CargoID cid = housespec->accepts_cargo[2];
if (!IsValidCargoID(cid)) cid = GetCargoIDByLabel(housespec->accepts_cargo_label[2]);
if (!IsValidCargoID(cid) || !CargoSpec::Get(cid)->IsValid()) {
if (!IsValidCargoID(cid)) {
housespec->cargo_acceptance[2] = 0;
}
}
@@ -2471,7 +2471,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt
((_settings_game.game_creation.landscape == LT_TOYLAND) ? GetCargoIDByLabel(CT_FIZZY_DRINKS) : GetCargoIDByLabel(CT_FOOD));
/* Make sure the cargo type is valid in this climate. */
if (!CargoSpec::Get(cid)->IsValid()) goods = 0;
if (!IsValidCargoID(cid)) goods = 0;
housespec->accepts_cargo[2] = cid;
housespec->accepts_cargo_label[2] = CT_INVALID;
@@ -8962,6 +8962,38 @@ GRFFile::~GRFFile()
delete[] this->language_map;
}
/**
* Find first cargo label that exists and is active from a list of cargo labels.
* @param labels List of cargo labels.
* @returns First cargo label in list that exists, or CT_INVALID if none exist.
*/
static CargoLabel GetActiveCargoLabel(const std::initializer_list<CargoLabel> &labels)
{
for (const CargoLabel &label : labels) {
CargoID cid = GetCargoIDByLabel(label);
if (cid != INVALID_CARGO) return label;
}
return CT_INVALID;
}
/**
* Get active cargo label from either a cargo label or climate-dependent mixed cargo type.
* @param label Cargo label or climate-dependent mixed cargo type.
* @returns Active cargo label, or CT_INVALID if cargo label is not active.
*/
static CargoLabel GetActiveCargoLabel(const std::variant<CargoLabel, MixedCargoType> &label)
{
if (std::holds_alternative<CargoLabel>(label)) return std::get<CargoLabel>(label);
if (std::holds_alternative<MixedCargoType>(label)) {
switch (std::get<MixedCargoType>(label)) {
case MCT_LIVESTOCK_FRUIT: return GetActiveCargoLabel({CT_LIVESTOCK, CT_FRUIT});
case MCT_GRAIN_WHEAT_MAIZE: return GetActiveCargoLabel({CT_GRAIN, CT_WHEAT, CT_MAIZE});
case MCT_VALUABLES_GOLD_DIAMONDS: return GetActiveCargoLabel({CT_VALUABLES, CT_GOLD, CT_DIAMONDS});
default: NOT_REACHED();
}
}
NOT_REACHED();
}
/**
* Precalculate refit masks from cargo classes for all vehicles.
@@ -8980,7 +9012,7 @@ static void CalculateRefitMasks()
/* Apply default cargo translation map if cargo type hasn't been set, either explicitly or by aircraft cargo handling. */
if (!IsValidCargoID(e->info.cargo_type)) {
e->info.cargo_type = GetCargoIDByLabel(e->info.cargo_label);
e->info.cargo_type = GetCargoIDByLabel(GetActiveCargoLabel(e->info.cargo_label));
}
/* If the NewGRF did not set any cargo properties, we apply default values. */
@@ -9017,7 +9049,8 @@ static void CalculateRefitMasks()
_gted[engine].cargo_allowed = CC_PASSENGERS | CC_MAIL | CC_ARMOURED | CC_EXPRESS;
_gted[engine].cargo_disallowed = CC_LIQUID;
} else if (e->type == VEH_SHIP) {
switch (ei->cargo_label.base()) {
CargoLabel label = GetActiveCargoLabel(ei->cargo_label);
switch (label.base()) {
case CT_PASSENGERS.base():
/* Ferries */
_gted[engine].cargo_allowed = CC_PASSENGERS;
@@ -9048,9 +9081,10 @@ static void CalculateRefitMasks()
_gted[engine].cargo_disallowed = 0;
} else {
/* Train wagons and road vehicles are classified by their default cargo type */
CargoLabel label = GetActiveCargoLabel(ei->cargo_label);
for (const auto &drm : _default_refit_masks) {
if (!HasBit(drm.climate, _settings_game.game_creation.landscape)) continue;
if (drm.cargo_label != ei->cargo_label) continue;
if (drm.cargo_label != label) continue;
_gted[engine].cargo_allowed = drm.cargo_allowed;
_gted[engine].cargo_disallowed = drm.cargo_disallowed;
@@ -9446,17 +9480,17 @@ static void FinaliseIndustriesArray()
/* Apply default cargo translation map for unset cargo slots */
for (uint i = 0; i < lengthof(indsp.produced_cargo); ++i) {
if (!IsValidCargoID(indsp.produced_cargo[i])) indsp.produced_cargo[i] = GetCargoIDByLabel(indsp.produced_cargo_label[i]);
if (!IsValidCargoID(indsp.produced_cargo[i])) indsp.produced_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.produced_cargo_label[i]));
}
for (uint i = 0; i < lengthof(indsp.accepts_cargo); ++i) {
if (!IsValidCargoID(indsp.accepts_cargo[i])) indsp.accepts_cargo[i] = GetCargoIDByLabel(indsp.accepts_cargo_label[i]);
if (!IsValidCargoID(indsp.accepts_cargo[i])) indsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indsp.accepts_cargo_label[i]));
}
}
for (auto &indtsp : _industry_tile_specs) {
/* Apply default cargo translation map for unset cargo slots */
for (uint i = 0; i < lengthof(indtsp.accepts_cargo); ++i) {
if (!IsValidCargoID(indtsp.accepts_cargo[i])) indtsp.accepts_cargo[i] = GetCargoIDByLabel(indtsp.accepts_cargo_label[i]);
if (!IsValidCargoID(indtsp.accepts_cargo[i])) indtsp.accepts_cargo[i] = GetCargoIDByLabel(GetActiveCargoLabel(indtsp.accepts_cargo_label[i]));
}
}
}
+3 -1
View File
@@ -785,7 +785,9 @@ public:
this->CreateNestedTree();
this->vscroll = this->GetScrollbar(WID_O_SCROLLBAR);
this->GetWidget<NWidgetCore>(WID_O_DEPOT_ACTION)->tool_tip = STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP + v->type;
if (NWidgetCore *nwid = this->GetWidget<NWidgetCore>(WID_O_DEPOT_ACTION); nwid != nullptr) {
nwid->tool_tip = STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP + v->type;
}
this->FinishInitNested(v->index);
this->selected_order = -1;
+3 -8
View File
@@ -1693,12 +1693,9 @@ private:
/**
* Draw dynamic a signal-sprite in a button in the signal GUI
* Draw the sprite +1px to the right and down if the button is lowered
*
* @param widget_index index of this widget in the window
* @param image the sprite to draw
*/
void DrawSignalSprite(const Rect &r, WidgetID widget_index, SpriteID image) const
void DrawSignalSprite(const Rect &r, SpriteID image) const
{
Point offset;
Dimension sprite_size = GetSpriteSize(image, &offset);
@@ -1707,9 +1704,7 @@ private:
int y = ir.top - sig_sprite_bottom_offset +
(ir.Height() + sig_sprite_size.height) / 2; // aligned to bottom
DrawSprite(image, PAL_NONE,
x + this->IsWidgetLowered(widget_index),
y + this->IsWidgetLowered(widget_index));
DrawSprite(image, PAL_NONE, x, y);
}
/** Show or hide buttons for non-path signals in the signal GUI */
@@ -1786,7 +1781,7 @@ public:
int var = SIG_SEMAPHORE - (widget - WID_BS_SEMAPHORE_NORM) / SIGTYPE_END; // SignalVariant order is reversed compared to the widgets.
SpriteID sprite = GetRailTypeInfo(_cur_railtype)->gui_sprites.signals[type][var][this->IsWidgetLowered(widget)];
this->DrawSignalSprite(r, widget, sprite);
this->DrawSignalSprite(r, sprite);
}
}
+9 -3
View File
@@ -1582,7 +1582,11 @@ public:
this->InvalidateData();
}};
static inline HotkeyList hotkeys{"buildroadstop", {
static inline HotkeyList road_hotkeys{"buildroadstop", {
Hotkey('F', "focus_filter_box", BROSHK_FOCUS_FILTER_BOX),
}};
static inline HotkeyList tram_hotkeys{"buildtramstop", {
Hotkey('F', "focus_filter_box", BROSHK_FOCUS_FILTER_BOX),
}};
};
@@ -1684,7 +1688,8 @@ static WindowDesc _road_station_picker_desc(__FILE__, __LINE__,
WDP_AUTO, "build_station_road", 0, 0,
WC_BUS_STATION, WC_BUILD_TOOLBAR,
WDF_CONSTRUCTION,
std::begin(_nested_road_station_picker_widgets), std::end(_nested_road_station_picker_widgets)
std::begin(_nested_road_station_picker_widgets), std::end(_nested_road_station_picker_widgets),
&BuildRoadStationWindow::road_hotkeys
);
/** Widget definition of the build tram station window */
@@ -1761,7 +1766,8 @@ static WindowDesc _tram_station_picker_desc(__FILE__, __LINE__,
WDP_AUTO, "build_station_tram", 0, 0,
WC_BUS_STATION, WC_BUILD_TOOLBAR,
WDF_CONSTRUCTION,
std::begin(_nested_tram_station_picker_widgets), std::end(_nested_tram_station_picker_widgets)
std::begin(_nested_tram_station_picker_widgets), std::end(_nested_tram_station_picker_widgets),
&BuildRoadStationWindow::tram_hotkeys
);
static void ShowRVStationPicker(Window *parent, RoadStopType rs)
+2
View File
@@ -1436,6 +1436,8 @@ bool AfterLoadGame()
if (IsSavegameVersionBefore(SLV_31)) {
TimerGameCalendar::date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
TimerGameCalendar::year += CalendarTime::ORIGINAL_BASE_YEAR;
TimerGameEconomy::date += EconomyTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
TimerGameEconomy::year += EconomyTime::ORIGINAL_BASE_YEAR;
for (Station *st : Station::Iterate()) st->build_date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
for (Waypoint *wp : Waypoint::Iterate()) wp->build_date += CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR;
+1
View File
@@ -21,6 +21,7 @@
* \li AITimeMode
* \li AITown::ROAD_LAYOUT_RANDOM
* \li AIVehicle::IsPrimaryVehicle
* \li AITileList_StationCoverage
*
* API removals:
* \li AIError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore.
+2 -1
View File
@@ -87,10 +87,11 @@
* \li GSStoryPage::IsValidStoryPageButtonColour
* \li GSStoryPage::IsValidStoryPageButtonFlags
* \li GSStoryPage::IsValidStoryPageButtonCursor
* \li GSTileList_StationCoverage
*
* API removals:
* \li GSError::ERR_PRECONDITION_TOO_MANY_PARAMETERS, that error is never returned anymore.
* \li AIInfo::CONFIG_RANDOM, no longer used.
* \li GSInfo::CONFIG_RANDOM, no longer used.
*
* Other changes:
* \li GSGroupList accepts an optional filter function
+2
View File
@@ -178,6 +178,8 @@
{
company = ResolveCompanyID(company);
if (company == COMPANY_INVALID) return -1;
/* If we return INT64_MAX as usual, overflows may occur in the script. So return a smaller value. */
if (_settings_game.difficulty.infinite_money) return INT32_MAX;
return GetAvailableMoney((::CompanyID)company);
}
+2 -1
View File
@@ -258,9 +258,10 @@ public:
/**
* Gets the bank balance. In other words, the amount of money the given company can spent.
* If infinite money is enabled, it returns INT32_MAX.
* @param company The company to get the bank balance of.
* @pre ResolveCompanyID(company) != COMPANY_INVALID.
* @return The actual bank balance.
* @return The actual bank balance or INT32_MAX.
*/
static Money GetBankBalance(CompanyID company);
+24 -10
View File
@@ -181,6 +181,15 @@ void ScriptText::_FillParamList(ParamList &params)
}
}
void ScriptText::ParamCheck::Encode(std::back_insert_iterator<std::string> &output)
{
if (this->used) return;
if (std::holds_alternative<std::string>(*this->param)) fmt::format_to(output, ":\"{}\"", std::get<std::string>(*this->param));
if (std::holds_alternative<SQInteger>(*this->param)) fmt::format_to(output, ":{:X}", std::get<SQInteger>(*this->param));
if (std::holds_alternative<ScriptTextRef>(*this->param)) fmt::format_to(output, ":{:X}", this->owner);
this->used = true;
}
void ScriptText::_GetEncodedText(std::back_insert_iterator<std::string> &output, int &param_count, StringIDList &seen_ids, ParamSpan args)
{
const std::string &name = GetGameStringName(this->string);
@@ -198,7 +207,7 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator<std::string> &output,
if (idx >= args.size()) throw Script_FatalError(fmt::format("{}({}): Not enough parameters", name, param_count + 1));
ParamCheck &pc = args[idx++];
if (pc.owner != this->string) ScriptLog::Warning(fmt::format("{}({}): Consumes {}({})", name, param_count + 1, GetGameStringName(pc.owner), pc.idx + 1));
return pc.param;
return &pc;
};
auto skip_args = [&](size_t nb) { idx += nb; };
@@ -209,19 +218,24 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator<std::string> &output,
break;
case StringParam::RAW_STRING: {
Param *p = get_next_arg();
if (!std::holds_alternative<std::string>(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects a raw string", name, param_count + 1, cur_param.cmd));
fmt::format_to(output, ":\"{}\"", std::get<std::string>(*p));
ParamCheck &p = *get_next_arg();
if (!std::holds_alternative<std::string>(*p.param)) ScriptLog::Error(fmt::format("{}({}): {{{}}} expects a raw string", name, param_count + 1, cur_param.cmd));
p.Encode(output);
break;
}
case StringParam::STRING: {
Param *p = get_next_arg();
if (!std::holds_alternative<ScriptTextRef>(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects a GSText", name, param_count + 1, cur_param.cmd));
ParamCheck &p = *get_next_arg();
if (!std::holds_alternative<ScriptTextRef>(*p.param)){
ScriptLog::Error(fmt::format("{}({}): {{{}}} expects a GSText", name, param_count + 1, cur_param.cmd));
p.Encode(output);
break;
}
int count = 0;
fmt::format_to(output, ":");
ScriptTextRef &ref = std::get<ScriptTextRef>(*p);
ScriptTextRef &ref = std::get<ScriptTextRef>(*p.param);
ref->_GetEncodedText(output, count, seen_ids, args.subspan(idx));
p.used = true;
if (++count != cur_param.consumes) {
ScriptLog::Error(fmt::format("{}({}): {{{}}} expects {} to be consumed, but {} consumes {}", name, param_count + 1, cur_param.cmd, cur_param.consumes - 1, GetGameStringName(ref->string), count - 1));
/* Fill missing params if needed. */
@@ -233,9 +247,9 @@ void ScriptText::_GetEncodedText(std::back_insert_iterator<std::string> &output,
default:
for (int i = 0; i < cur_param.consumes; i++) {
Param *p = get_next_arg();
if (!std::holds_alternative<SQInteger>(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd));
fmt::format_to(output, ":{:X}", std::get<SQInteger>(*p));
ParamCheck &p = *get_next_arg();
if (!std::holds_alternative<SQInteger>(*p.param)) ScriptLog::Error(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd));
p.Encode(output);
}
}
+4 -1
View File
@@ -136,8 +136,11 @@ private:
StringID owner;
int idx;
Param *param;
bool used;
ParamCheck(StringID owner, int idx, Param *param) : owner(owner), idx(idx), param(param) {}
ParamCheck(StringID owner, int idx, Param *param) : owner(owner), idx(idx), param(param), used(false) {}
void Encode(std::back_insert_iterator<std::string> &output);
};
using ParamList = std::vector<ParamCheck>;
+10
View File
@@ -147,3 +147,13 @@ ScriptTileList_StationType::ScriptTileList_StationType(StationID station_id, Scr
this->AddTile(cur_tile);
}
}
ScriptTileList_StationCoverage::ScriptTileList_StationCoverage(StationID station_id)
{
if (!ScriptStation::IsValidStation(station_id)) return;
BitmapTileIterator it(::Station::Get(station_id)->catchment_tiles);
for (TileIndex tile = it; tile != INVALID_TILE; tile = ++it) {
this->AddTile(tile);
}
}
+13
View File
@@ -104,4 +104,17 @@ public:
ScriptTileList_StationType(StationID station_id, ScriptStation::StationType station_type);
};
/**
* Creates a list of tiles in the catchment area of the StationID.
* @api ai game
* @ingroup ScriptList
*/
class ScriptTileList_StationCoverage : public ScriptTileList {
public:
/**
* @param station_id The station to create the ScriptTileList for.
*/
ScriptTileList_StationCoverage(StationID station_id);
};
#endif /* SCRIPT_TILELIST_HPP */
+22 -22
View File
@@ -1211,7 +1211,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
208, 0xFFFFFFFF, 2, 0, 0, 0, 5, 0, 0, 0, 174,
IT_FARM, IT_STEEL_MILL, IT_INVALID, CHECK_NOTHING,
CT_GOODS, 0, CT_INVALID, 0, 5,
CT_LIVESTOCK, 256, CT_GRAIN, 256, CT_STEEL, 256,
MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_STEEL, 256,
INDUSTRYLIFE_PROCESSING, 1 << LT_TEMPERATE,
INDUSTRYBEH_CHOPPER_ATTACKS,
STR_INDUSTRY_NAME_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION,
@@ -1240,7 +1240,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_farm, 3, _farm_sounds,
250, 0xD9999999, 2, 4, 0, 0, 9, 9, 0, 0, 48,
IT_FACTORY, IT_FOOD_PROCESS, IT_INVALID, CHECK_FARM,
CT_GRAIN, 10, CT_LIVESTOCK, 10, 5,
MCT_GRAIN_WHEAT_MAIZE, 10, MCT_LIVESTOCK_FRUIT, 10, 5,
CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_ORGANIC, 1 << LT_TEMPERATE | 1 << LT_ARCTIC,
INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
@@ -1270,8 +1270,8 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_bank, 0, nullptr,
255, 0xA6666666, 7, 0, 0, 0, 0, 0, 0, 0, 15,
IT_BANK_TEMP, IT_INVALID, IT_INVALID, CHECK_NOTHING,
CT_VALUABLES, 6, CT_INVALID, 0, 5,
CT_VALUABLES, 0, CT_INVALID, 0, CT_INVALID, 0,
MCT_VALUABLES_GOLD_DIAMONDS, 6, CT_INVALID, 0, 5,
MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, 0, CT_INVALID, 0,
INDUSTRYLIFE_BLACK_HOLE, 1 << LT_TEMPERATE,
INDUSTRYBEH_TOWN1200_MORE,
STR_INDUSTRY_NAME_BANK, STR_NEWS_INDUSTRY_CONSTRUCTION,
@@ -1281,7 +1281,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
206, 0xFFFFFFFF, 0, 2, 2, 0, 0, 3, 4, 0, 55,
IT_FRUIT_PLANTATION, IT_FARM, IT_FARM_2, CHECK_NOTHING,
CT_FOOD, 0, CT_INVALID, 0, 5,
CT_FRUIT, 256, CT_MAIZE, 256, CT_INVALID, 256,
MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_INVALID, 256,
INDUSTRYLIFE_PROCESSING, 1 << LT_ARCTIC | 1 << LT_TROPIC,
INDUSTRYBEH_NONE,
STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT, STR_NEWS_INDUSTRY_CONSTRUCTION,
@@ -1300,7 +1300,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_gold_mine, 0, nullptr,
208, 0x99999999, 0, 3, 0, 0, 0, 4, 0, 0, 194,
IT_BANK_TROPIC_ARCTIC, IT_INVALID, IT_INVALID, CHECK_NOTHING,
CT_GOLD, 7, CT_INVALID, 0, 5,
MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5,
CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_EXTRACTIVE, 1 << LT_ARCTIC,
INDUSTRYBEH_NONE,
@@ -1311,7 +1311,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
151, 0xA6666666, 0, 3, 3, 0, 0, 6, 5, 0, 15,
IT_GOLD_MINE, IT_DIAMOND_MINE, IT_INVALID, CHECK_NOTHING,
CT_INVALID, 0, CT_INVALID, 0, 5,
CT_GOLD, 256, CT_INVALID, 256, CT_INVALID, 256,
MCT_VALUABLES_GOLD_DIAMONDS, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_BLACK_HOLE, 1 << LT_ARCTIC | 1 << LT_TROPIC,
INDUSTRYBEH_ONLY_INTOWN,
STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC, STR_NEWS_INDUSTRY_CONSTRUCTION,
@@ -1320,7 +1320,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_diamond_mine, 0, nullptr,
213, 0x99999999, 0, 0, 3, 0, 0, 0, 4, 0, 184,
IT_BANK_TROPIC_ARCTIC, IT_INVALID, IT_INVALID, CHECK_NOTHING,
CT_DIAMONDS, 7, CT_INVALID, 0, 5,
MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5,
CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_EXTRACTIVE, 1 << LT_TROPIC,
INDUSTRYBEH_NONE,
@@ -1340,7 +1340,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_fruit_plantation, 0, nullptr,
225, 0xBFFFFFFF, 0, 0, 2, 0, 0, 0, 4, 0, 86,
IT_FOOD_PROCESS, IT_INVALID, IT_INVALID, CHECK_PLANTATION,
CT_FRUIT, 10, CT_INVALID, 0, 15,
MCT_LIVESTOCK_FRUIT, 10, CT_INVALID, 0, 15,
CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_ORGANIC, 1 << LT_TROPIC,
INDUSTRYBEH_NONE,
@@ -1390,7 +1390,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
MI(_tile_table_farm2, 0, nullptr,
250, 0xD9999999, 0, 0, 1, 0, 0, 0, 2, 0, 48,
IT_FOOD_PROCESS, IT_INVALID, IT_INVALID, CHECK_PLANTATION,
CT_MAIZE, 11, CT_INVALID, 0, 5,
MCT_GRAIN_WHEAT_MAIZE, 11, CT_INVALID, 0, 5,
CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256,
INDUSTRYLIFE_ORGANIC, 1 << LT_TROPIC,
INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
@@ -1594,10 +1594,10 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET
MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Factory temperate */
MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_GRAIN, 8, CT_LIVESTOCK, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 8, CT_STEEL, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Printing works */
MT(0, CT_INVALID, 8, CT_PAPER, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
@@ -1621,14 +1621,14 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET
MT(1, CT_PASSENGERS, 8, CT_IRON_ORE, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Bank temperate*/
MT(1, CT_PASSENGERS, 8, CT_VALUABLES, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(1, CT_PASSENGERS, 8, CT_VALUABLES, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(1, CT_PASSENGERS, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(1, CT_PASSENGERS, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Food processing plant, tropic and arctic. CT_MAIZE or CT_WHEAT, CT_LIVESTOCK or CT_FRUIT*/
MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, CT_MAIZE, 8, CT_LIVESTOCK, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(8, MCT_GRAIN_WHEAT_MAIZE, 8, MCT_LIVESTOCK_FRUIT, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Paper mill */
MT(0, CT_INVALID, 8, CT_WOOD, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
@@ -1660,8 +1660,8 @@ static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET
MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, true),
/* Bank Sub Arctic */
MT(0, CT_INVALID, 8, CT_GOLD, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(0, CT_INVALID, 8, CT_GOLD, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(0, CT_INVALID, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_E, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
MT(0, CT_INVALID, 8, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, SLOPE_S, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
/* Diamond mine */
MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false),
+12 -12
View File
@@ -135,11 +135,11 @@ static const EngineInfo _orig_engine_info[] = {
MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 30 Oil Tanker
MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 31 Livestock Van
MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 32 Goods Van
MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 33 Grain Hopper
MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 33 Grain Hopper
MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 34 Wood Truck
MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 35 Iron Ore Hopper
MW( 1827, 20, 20, 50, CT_STEEL , T ), // 36 Steel Truck
MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 37 Armoured Van
MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 37 Armoured Van
MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 38 Food Van
MW( 1827, 20, 20, 50, CT_PAPER , A ), // 39 Paper Truck
MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 40 Copper Ore Hopper
@@ -165,11 +165,11 @@ static const EngineInfo _orig_engine_info[] = {
MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 60 Oil Tanker
MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 61 Livestock Van
MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 62 Goods Van
MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 63 Grain Hopper
MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 63 Grain Hopper
MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 64 Wood Truck
MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 65 Iron Ore Hopper
MW( 1827, 20, 20, 50, CT_STEEL , T ), // 66 Steel Truck
MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 67 Armoured Van
MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 67 Armoured Van
MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 68 Food Van
MW( 1827, 20, 20, 50, CT_PAPER , A ), // 69 Paper Truck
MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 70 Copper Ore Hopper
@@ -197,11 +197,11 @@ static const EngineInfo _orig_engine_info[] = {
MW( 1827, 20, 20, 50, CT_OIL , T|A|S ), // 92 Oil Tanker
MW( 1827, 20, 20, 50, CT_LIVESTOCK , T|A ), // 93 Livestock Van
MW( 1827, 20, 20, 50, CT_GOODS , T|A|S ), // 94 Goods Van
MW( 1827, 20, 20, 50, CT_GRAIN , T|A|S ), // 95 Grain Hopper
MW( 1827, 20, 20, 50, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 95 Grain Hopper
MW( 1827, 20, 20, 50, CT_WOOD , T|A|S ), // 96 Wood Truck
MW( 1827, 20, 20, 50, CT_IRON_ORE , T ), // 97 Iron Ore Hopper
MW( 1827, 20, 20, 50, CT_STEEL , T ), // 98 Steel Truck
MW( 1827, 20, 20, 50, CT_VALUABLES , T|A|S ), // 99 Armoured Van
MW( 1827, 20, 20, 50, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 99 Armoured Van
MW( 1827, 20, 20, 50, CT_FOOD , A|S ), // 100 Food Van
MW( 1827, 20, 20, 50, CT_PAPER , A ), // 101 Paper Truck
MW( 1827, 20, 20, 50, CT_COPPER_ORE , S ), // 102 Copper Ore Hopper
@@ -243,9 +243,9 @@ static const EngineInfo _orig_engine_info[] = {
MR( 5479, 20, 15, 55, CT_GOODS , T|A|S ), // 138 Balogh Goods Truck
MR( 19724, 20, 15, 55, CT_GOODS , T|A|S ), // 139 Craighead Goods Truck
MR( 31047, 20, 15, 85, CT_GOODS , T|A|S ), // 140 Goss Goods Truck
MR( 5479, 20, 15, 55, CT_GRAIN , T|A|S ), // 141 Hereford Grain Truck
MR( 21185, 20, 15, 55, CT_GRAIN , T|A|S ), // 142 Thomas Grain Truck
MR( 32873, 20, 15, 85, CT_GRAIN , T|A|S ), // 143 Goss Grain Truck
MR( 5479, 20, 15, 55, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 141 Hereford Grain Truck
MR( 21185, 20, 15, 55, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 142 Thomas Grain Truck
MR( 32873, 20, 15, 85, MCT_GRAIN_WHEAT_MAIZE, T|A|S ), // 143 Goss Grain Truck
MR( 5479, 20, 15, 55, CT_WOOD , T|A|S ), // 144 Witcombe Wood Truck
MR( 19724, 20, 15, 55, CT_WOOD , T|A|S ), // 145 Foster Wood Truck
MR( 35430, 20, 15, 85, CT_WOOD , T|A|S ), // 146 Moreland Wood Truck
@@ -255,9 +255,9 @@ static const EngineInfo _orig_engine_info[] = {
MR( 5479, 20, 15, 55, CT_STEEL , T ), // 150 Balogh Steel Truck
MR( 21185, 20, 15, 55, CT_STEEL , T ), // 151 Uhl Steel Truck
MR( 31777, 20, 15, 85, CT_STEEL , T ), // 152 Kelling Steel Truck
MR( 5479, 20, 15, 55, CT_VALUABLES , T|A|S ), // 153 Balogh Armoured Truck
MR( 22281, 20, 15, 55, CT_VALUABLES , T|A|S ), // 154 Uhl Armoured Truck
MR( 33603, 20, 15, 85, CT_VALUABLES , T|A|S ), // 155 Foster Armoured Truck
MR( 5479, 20, 15, 55, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 153 Balogh Armoured Truck
MR( 22281, 20, 15, 55, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 154 Uhl Armoured Truck
MR( 33603, 20, 15, 85, MCT_VALUABLES_GOLD_DIAMONDS, T|A|S ), // 155 Foster Armoured Truck
MR( 5479, 20, 15, 55, CT_FOOD , A|S ), // 156 Foster Food Van
MR( 18628, 20, 15, 55, CT_FOOD , A|S ), // 157 Perry Food Van
MR( 30681, 20, 15, 85, CT_FOOD , A|S ), // 158 Chippy Food Van