mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2026-09-14 12:29:39 +00:00
Compare commits
25
Commits
14.0-beta2
...
14.0-beta3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b085f610e2 | ||
|
|
b0f3417025 | ||
|
|
0858377e9e | ||
|
|
34b05465d5 | ||
|
|
02cdd5ba8b | ||
|
|
e9ea837311 | ||
|
|
e2d36f626b | ||
|
|
ae30ad7802 | ||
|
|
5c630e10b7 | ||
|
|
b2b4cceb49 | ||
|
|
05e23f8fc9 | ||
|
|
3534214dfc | ||
|
|
cb588d8d3f | ||
|
|
b3aa8a9c35 | ||
|
|
09a12f230f | ||
|
|
63708609fb | ||
|
|
6f77c2eaa2 | ||
|
|
72a44b0df6 | ||
|
|
794f12dc24 | ||
|
|
8add0bf8ec | ||
|
|
84623d2123 | ||
|
|
031a9d4e26 | ||
|
|
36e1b32ccf | ||
|
|
c77a45ed86 | ||
|
|
4ba62594e5 |
+16
-2
@@ -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.
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
+418
-414
File diff suppressed because it is too large
Load Diff
+20
-1
@@ -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.
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}경로를 건너뛰기 위한 비교 조건을 선택합니다
|
||||
|
||||
@@ -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
@@ -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}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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...
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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; }
|
||||
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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:
|
||||
/**
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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
@@ -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); }
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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()");
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -181,6 +181,15 @@ void ScriptText::_FillParamList(ParamList ¶ms)
|
||||
}
|
||||
}
|
||||
|
||||
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 ¶m_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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user