diff --git a/.changelog b/.changelog index 4cab85803c..1b121c6267 100644 --- a/.changelog +++ b/.changelog @@ -1,4 +1,30 @@ -14.0-beta1 (2023-02-03) +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) +Fix #11975: Inconsistent behaviour when changing first AI company settings (#11976) +Fix #11972: Year cut off in graph windows (#11974) +Fix #11968: Crash when opening orders window of new vehicles (#11973) +Fix #11966: Monospace text in windows may not have been fully scrollable (#11981) +Fix #11802: Made determining water region edge traversability more robust (#11986) +Fix: Second colour vehicle-type default liveries were not being updated (#11971) + + +14.0-beta1 (2024-02-03) ------------------------------------------------------------------------ Feature: Order option to unbunch vehicles at depot (#11945) Feature: Infinite money mode (#11902) diff --git a/.ottdrev b/.ottdrev index 67319e8dd3..781a8b8e29 100644 --- a/.ottdrev +++ b/.ottdrev @@ -1 +1 @@ -14.0-beta1 20240203 0 22eed9616efebf65a19bdb25e2c4bd968f719665 1 0 2024 +14.0-beta3 20240206 0 b085f610e2a92eb78aee547f1345007e5c4d8baf 1 0 2024 diff --git a/.release_date b/.release_date index c348b99090..8ee91f2106 100644 --- a/.release_date +++ b/.release_date @@ -1 +1 @@ -2024-02-03 19:50 UTC +2024-02-06 20:50 UTC diff --git a/.version b/.version index cac474ff78..f14954a797 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -14.0-beta1 +14.0-beta3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4527e5ab0e..10965b135d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -289,6 +289,10 @@ target_link_libraries(openttd ) target_link_libraries(openttd_test PRIVATE openttd_lib) +if(ANDROID) + target_link_libraries(openttd_test PRIVATE log) +endif() + include(Catch) catch_discover_tests(openttd_test) diff --git a/changelog.txt b/changelog.txt index 93f314b3df..9310b5b981 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,30 @@ -14.0-beta1 (2023-02-03) +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) +Fix #11975: Inconsistent behaviour when changing first AI company settings (#11976) +Fix #11972: Year cut off in graph windows (#11974) +Fix #11968: Crash when opening orders window of new vehicles (#11973) +Fix #11966: Monospace text in windows may not have been fully scrollable (#11981) +Fix #11802: Made determining water region edge traversability more robust (#11986) +Fix: Second colour vehicle-type default liveries were not being updated (#11971) + + +14.0-beta1 (2024-02-03) ------------------------------------------------------------------------ Feature: Order option to unbunch vehicles at depot (#11945) Feature: Infinite money mode (#11902) diff --git a/media/baseset/OpenTTD-Mono.ttf b/media/baseset/OpenTTD-Mono.ttf index ba17482213..6022735dbe 100644 Binary files a/media/baseset/OpenTTD-Mono.ttf and b/media/baseset/OpenTTD-Mono.ttf differ diff --git a/media/baseset/OpenTTD-Sans.ttf b/media/baseset/OpenTTD-Sans.ttf index fb322a3b1d..a9ed5d8c83 100644 Binary files a/media/baseset/OpenTTD-Sans.ttf and b/media/baseset/OpenTTD-Sans.ttf differ diff --git a/media/baseset/OpenTTD-Serif.ttf b/media/baseset/OpenTTD-Serif.ttf index fd5ca433ba..d188e2c80c 100644 Binary files a/media/baseset/OpenTTD-Serif.ttf and b/media/baseset/OpenTTD-Serif.ttf differ diff --git a/media/baseset/OpenTTD-Small.ttf b/media/baseset/OpenTTD-Small.ttf index df0711e1ae..a1c08fd49e 100644 Binary files a/media/baseset/OpenTTD-Small.ttf and b/media/baseset/OpenTTD-Small.ttf differ diff --git a/media/baseset/OpenTTD-font.md b/media/baseset/OpenTTD-font.md index 44fcb262f9..25115cca90 100644 --- a/media/baseset/OpenTTD-font.md +++ b/media/baseset/OpenTTD-font.md @@ -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. diff --git a/regression/regression/main.nut b/regression/regression/main.nut index b2daa5b687..7e98dd6ab4 100644 --- a/regression/regression/main.nut +++ b/regression/regression/main.nut @@ -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(); diff --git a/regression/regression/result.txt b/regression/regression/result.txt index 57c8a400a9..2119ada528 100644 --- a/regression/regression/result.txt +++ b/regression/regression/result.txt @@ -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 diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index e3512d315d..0cd83ea8b3 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -164,6 +164,17 @@ struct AIConfigWindow : public Window { switch (widget) { case WID_AIC_LIST: { Rect tr = r.Shrink(WidgetDimensions::scaled.matrix); + int max_slot = GetGameSettings().difficulty.max_no_competitors; + if (_game_mode == GM_NORMAL) { + for (const Company *c : Company::Iterate()) { + if (c->is_ai) max_slot--; + } + for (CompanyID cid = COMPANY_FIRST; cid < (CompanyID)max_slot && cid < MAX_COMPANIES; cid++) { + if (Company::IsValidID(cid)) max_slot++; + } + } else { + max_slot++; // Slot 0 is human + } for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < MAX_COMPANIES; i++) { StringID text; @@ -180,13 +191,6 @@ struct AIConfigWindow : public Window { if (this->selected_slot == i) { tc = TC_WHITE; } else if (IsEditable((CompanyID)i)) { - int max_slot = GetGameSettings().difficulty.max_no_competitors; - for (const Company *c : Company::Iterate()) { - if (c->is_ai) max_slot--; - } - for (CompanyID cid = COMPANY_FIRST; cid < (CompanyID)max_slot && cid < MAX_COMPANIES; cid++) { - if (Company::IsValidHumanID(cid)) max_slot++; - } if (i < max_slot) tc = TC_ORANGE; } else if (Company::IsValidAiID(i)) { tc = TC_GREEN; diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 94a80796d0..0537f60a86 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -306,11 +306,16 @@ CommandCost CmdBuildAircraft(DoCommandFlag flags, TileIndex tile, const Engine * v->cargo_cap = avi->passenger_capacity; v->refit_cap = 0; - u->cargo_cap = avi->mail_capacity; u->refit_cap = 0; v->cargo_type = e->GetDefaultCargoType(); - u->cargo_type = CT_MAIL; + assert(IsValidCargoID(v->cargo_type)); + + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail)) { + u->cargo_type = mail; + u->cargo_cap = avi->mail_capacity; + } v->name.clear(); v->last_station_visited = INVALID_STATION; diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp index 1f3a8a54b2..110acb3371 100644 --- a/src/articulated_vehicles.cpp +++ b/src/articulated_vehicles.cpp @@ -398,6 +398,7 @@ void AddArticulatedParts(Vehicle *first) rv->spritenum = e_artic->u.road.image_index; if (e_artic->CanCarryCargo()) { rv->cargo_type = e_artic->GetDefaultCargoType(); + assert(IsValidCargoID(rv->cargo_type)); rv->cargo_cap = e_artic->u.road.capacity; // Callback 36 is called when the consist is finished } else { rv->cargo_type = front->cargo_type; // Needed for livery selection diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 10477803bd..eb9d6a1f7b 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -822,7 +822,7 @@ static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_ if (te.mail_capacity > 0) { SetDParam(0, te.cargo); SetDParam(1, te.capacity); - SetDParam(2, CT_MAIL); + SetDParam(2, GetCargoIDByLabel(CT_MAIL)); SetDParam(3, te.mail_capacity); DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY); } else { @@ -904,7 +904,11 @@ void TestedEngineDetails::FillDefaultCapacities(const Engine *e) } else { this->capacity = e->GetDisplayDefaultCapacity(&this->mail_capacity); this->all_capacities[this->cargo] = this->capacity; - this->all_capacities[CT_MAIL] = this->mail_capacity; + if (IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) { + this->all_capacities[GetCargoIDByLabel(CT_MAIL)] = this->mail_capacity; + } else { + this->mail_capacity = 0; + } } if (this->all_capacities.GetCount() == 0) this->cargo = INVALID_CARGO; } diff --git a/src/cargo_type.h b/src/cargo_type.h index 871f958790..e3eca4772f 100644 --- a/src/cargo_type.h +++ b/src/cargo_type.h @@ -11,58 +11,64 @@ #define CARGO_TYPE_H #include "core/enum_type.hpp" +#include "core/strong_typedef_type.hpp" + +/** Globally unique label of a cargo type. */ +using CargoLabel = StrongType::Typedef; /** * Cargo slots to indicate a cargo type within a game. - * Numbers are re-used between different climates. - * @see CargoTypes */ -typedef byte CargoID; +using CargoID = byte; -/** Available types of cargo */ -enum CargoType { - /* Temperate */ - CT_PASSENGERS = 0, - CT_COAL = 1, - CT_MAIL = 2, - CT_OIL = 3, - CT_LIVESTOCK = 4, - CT_GOODS = 5, - CT_GRAIN = 6, - CT_WOOD = 7, - CT_IRON_ORE = 8, - CT_STEEL = 9, - CT_VALUABLES = 10, +/** + * Available types of cargo + * Labels may be re-used between different climates. + */ - /* Arctic */ - CT_WHEAT = 6, - CT_HILLY_UNUSED = 8, - CT_PAPER = 9, - CT_GOLD = 10, - CT_FOOD = 11, +/* Temperate */ +static constexpr CargoLabel CT_PASSENGERS = CargoLabel{'PASS'}; +static constexpr CargoLabel CT_COAL = CargoLabel{'COAL'}; +static constexpr CargoLabel CT_MAIL = CargoLabel{'MAIL'}; +static constexpr CargoLabel CT_OIL = CargoLabel{'OIL_'}; +static constexpr CargoLabel CT_LIVESTOCK = CargoLabel{'LVST'}; +static constexpr CargoLabel CT_GOODS = CargoLabel{'GOOD'}; +static constexpr CargoLabel CT_GRAIN = CargoLabel{'GRAI'}; +static constexpr CargoLabel CT_WOOD = CargoLabel{'WOOD'}; +static constexpr CargoLabel CT_IRON_ORE = CargoLabel{'IORE'}; +static constexpr CargoLabel CT_STEEL = CargoLabel{'STEL'}; +static constexpr CargoLabel CT_VALUABLES = CargoLabel{'VALU'}; - /* Tropic */ - CT_RUBBER = 1, - CT_FRUIT = 4, - CT_MAIZE = 6, - CT_COPPER_ORE = 8, - CT_WATER = 9, - CT_DIAMONDS = 10, +/* Arctic */ +static constexpr CargoLabel CT_WHEAT = CargoLabel{'WHEA'}; +static constexpr CargoLabel CT_PAPER = CargoLabel{'PAPR'}; +static constexpr CargoLabel CT_GOLD = CargoLabel{'GOLD'}; +static constexpr CargoLabel CT_FOOD = CargoLabel{'FOOD'}; - /* Toyland */ - CT_SUGAR = 1, - CT_TOYS = 3, - CT_BATTERIES = 4, - CT_CANDY = 5, - CT_TOFFEE = 6, - CT_COLA = 7, - CT_COTTON_CANDY = 8, - CT_BUBBLES = 9, - CT_PLASTIC = 10, - CT_FIZZY_DRINKS = 11, +/* Tropic */ +static constexpr CargoLabel CT_RUBBER = CargoLabel{'RUBR'}; +static constexpr CargoLabel CT_FRUIT = CargoLabel{'FRUI'}; +static constexpr CargoLabel CT_MAIZE = CargoLabel{'MAIZ'}; +static constexpr CargoLabel CT_COPPER_ORE = CargoLabel{'CORE'}; +static constexpr CargoLabel CT_WATER = CargoLabel{'WATR'}; +static constexpr CargoLabel CT_DIAMONDS = CargoLabel{'DIAM'}; - CT_INVALID = 0xFF, ///< Invalid cargo type. -}; +/* Toyland */ +static constexpr CargoLabel CT_SUGAR = CargoLabel{'SUGR'}; +static constexpr CargoLabel CT_TOYS = CargoLabel{'TOYS'}; +static constexpr CargoLabel CT_BATTERIES = CargoLabel{'BATT'}; +static constexpr CargoLabel CT_CANDY = CargoLabel{'SWET'}; +static constexpr CargoLabel CT_TOFFEE = CargoLabel{'TOFF'}; +static constexpr CargoLabel CT_COLA = CargoLabel{'COLA'}; +static constexpr CargoLabel CT_COTTON_CANDY = CargoLabel{'CTCD'}; +static constexpr CargoLabel CT_BUBBLES = CargoLabel{'BUBL'}; +static constexpr CargoLabel CT_PLASTIC = CargoLabel{'PLST'}; +static constexpr CargoLabel CT_FIZZY_DRINKS = CargoLabel{'FZDR'}; + +/** Dummy label for engines that carry no cargo; they actually carry 0 passengers. */ +static constexpr CargoLabel CT_NONE = CT_PASSENGERS; + +static constexpr CargoLabel CT_INVALID = CargoLabel{UINT32_MAX}; ///< Invalid cargo type. static const CargoID NUM_ORIGINAL_CARGO = 12; ///< Original number of cargo types. static const CargoID NUM_CARGO = 64; ///< Maximum number of cargo types in a game. @@ -73,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. @@ -85,7 +98,7 @@ namespace CargoFilterCriteria { }; /** Test whether cargo type is not CT_INVALID */ -inline bool IsValidCargoType(CargoType t) { return t != CT_INVALID; } +inline bool IsValidCargoType(CargoLabel t) { return t != CT_INVALID; } /** Test whether cargo type is not INVALID_CARGO */ inline bool IsValidCargoID(CargoID t) { return t != INVALID_CARGO; } diff --git a/src/cargotype.cpp b/src/cargotype.cpp index 7181782ec4..bca7e368b5 100644 --- a/src/cargotype.cpp +++ b/src/cargotype.cpp @@ -35,6 +35,12 @@ CargoTypes _cargo_mask; */ CargoTypes _standard_cargo_mask; +/** + * List of default cargo labels, used when setting up cargo types for default vehicles. + * This is done by label so that a cargo label can be redefined in a different slot. + */ +static std::vector _default_cargo_labels; + /** * Set up the default cargo types for the given landscape type. * @param l Landscape @@ -44,18 +50,20 @@ void SetupCargoForClimate(LandscapeID l) assert(l < lengthof(_default_climate_cargo)); _cargo_mask = 0; + _default_cargo_labels.clear(); /* Copy from default cargo by label or index. */ auto insert = std::begin(CargoSpec::array); - for (const CargoLabel &cl : _default_climate_cargo[l]) { + for (const auto &cl : _default_climate_cargo[l]) { /* Check if value is an index into the cargo table */ - if (cl < lengthof(_default_cargo)) { + if (std::holds_alternative(cl)) { /* Copy the default cargo by index. */ - *insert = _default_cargo[cl]; + *insert = _default_cargo[std::get(cl)]; } else { /* Search for label in default cargo types and copy if found. */ - auto found = std::find_if(std::begin(_default_cargo), std::end(_default_cargo), [&cl](const CargoSpec &cs) { return cs.label == cl; }); + CargoLabel label = std::get(cl); + auto found = std::find_if(std::begin(_default_cargo), std::end(_default_cargo), [&label](const CargoSpec &cs) { return cs.label == label; }); if (found != std::end(_default_cargo)) { *insert = *found; } else { @@ -64,12 +72,49 @@ void SetupCargoForClimate(LandscapeID l) } } - if (insert->IsValid()) SetBit(_cargo_mask, insert->Index()); + if (insert->IsValid()) { + SetBit(_cargo_mask, insert->Index()); + _default_cargo_labels.push_back(insert->label); + } ++insert; } /* Reset and disable remaining cargo types. */ std::fill(insert, std::end(CargoSpec::array), CargoSpec{}); + + BuildCargoLabelMap(); +} + +/** + * Build cargo label map. + * This is called multiple times during NewGRF initialization as cargos are defined, so that TranslateRefitMask() and + * GetCargoTranslation(), also used during initialization, get the correct information. + */ +void BuildCargoLabelMap() +{ + CargoSpec::label_map.clear(); + for (const CargoSpec &cs : CargoSpec::array) { + /* During initialization, CargoSpec can be marked valid before the label has been set. */ + if (!cs.IsValid() || cs.label == CargoLabel{0}) continue; + /* Label already exists, don't addd again. */ + if (CargoSpec::label_map.count(cs.label) != 0) continue; + + CargoSpec::label_map.insert(std::make_pair(cs.label, cs.Index())); + } +} + +/** + * Test if a cargo is a default cargo type. + * @param cid Cargo ID. + * @returns true iff the cargo type is a default cargo type. + */ +bool IsDefaultCargo(CargoID cid) +{ + auto cs = CargoSpec::Get(cid); + if (!cs->IsValid()) return false; + + CargoLabel label = cs->label; + return std::any_of(std::begin(_default_cargo_labels), std::end(_default_cargo_labels), [&label](const CargoLabel &cl) { return cl == label; }); } /** @@ -85,44 +130,6 @@ Dimension GetLargestCargoIconSize() return size; } -/** - * Get the cargo ID of a default cargo, if present. - * @param l Landscape - * @param ct Default cargo type. - * @return ID number if the cargo exists, else #INVALID_CARGO - */ -CargoID GetDefaultCargoID(LandscapeID l, CargoType ct) -{ - assert(l < lengthof(_default_climate_cargo)); - - if (!IsValidCargoType(ct)) return INVALID_CARGO; - - assert(ct < lengthof(_default_climate_cargo[0])); - CargoLabel cl = _default_climate_cargo[l][ct]; - /* Bzzt: check if cl is just an index into the cargo table */ - if (cl < lengthof(_default_cargo)) { - cl = _default_cargo[cl].label; - } - - return GetCargoIDByLabel(cl); -} - -/** - * Get the cargo ID by cargo label. - * @param cl Cargo type to get. - * @return ID number if the cargo exists, else #INVALID_CARGO - */ -CargoID GetCargoIDByLabel(CargoLabel cl) -{ - for (const CargoSpec *cs : CargoSpec::Iterate()) { - if (cs->label == cl) return cs->Index(); - } - - /* No matching label was found, so it is invalid */ - return INVALID_CARGO; -} - - /** * Find the CargoID of a 'bitnum' value. * @param bitnum 'bitnum' to find. diff --git a/src/cargotype.h b/src/cargotype.h index 4c83c3ceba..81758c8b42 100644 --- a/src/cargotype.h +++ b/src/cargotype.h @@ -17,9 +17,6 @@ #include "landscape_type.h" #include "core/bitmath_func.hpp" -/** Globally unique label of a cargo type. */ -typedef uint32_t CargoLabel; - /** Town growth effect when delivering cargo. */ enum TownAcceptanceEffect : byte { TAE_BEGIN = 0, @@ -194,8 +191,11 @@ struct CargoSpec { private: static CargoSpec array[NUM_CARGO]; ///< Array holding all CargoSpecs + static inline std::map label_map{}; ///< Translation map from CargoLabel to Cargo ID. friend void SetupCargoForClimate(LandscapeID l); + friend void BuildCargoLabelMap(); + friend inline CargoID GetCargoIDByLabel(CargoLabel ct); friend void FinaliseCargoArray(); }; @@ -203,9 +203,17 @@ extern CargoTypes _cargo_mask; extern CargoTypes _standard_cargo_mask; void SetupCargoForClimate(LandscapeID l); -CargoID GetCargoIDByLabel(CargoLabel cl); +bool IsDefaultCargo(CargoID cid); +void BuildCargoLabelMap(); CargoID GetCargoIDByBitnum(uint8_t bitnum); -CargoID GetDefaultCargoID(LandscapeID l, CargoType ct); + +inline CargoID GetCargoIDByLabel(CargoLabel label) +{ + auto found = CargoSpec::label_map.find(label); + if (found != std::end(CargoSpec::label_map)) return found->second; + return INVALID_CARGO; +} + Dimension GetLargestCargoIconSize(); void InitializeSortedCargoSpecs(); diff --git a/src/citymania/cm_export.cpp b/src/citymania/cm_export.cpp index 9b74a5ff00..74c5f1a464 100644 --- a/src/citymania/cm_export.cpp +++ b/src/citymania/cm_export.cpp @@ -4,19 +4,19 @@ #include "../cargotype.h" #include "../debug.h" -#include "../house.h" +#include "../house.h" // NUM_HOUSES and HZ_* for _town_land.h #include "../gfx_func.h" #include "../gfx_type.h" #include "../engine_base.h" -#include "../palette_func.h" // CM _colour_gradient +#include "../palette_func.h" // _colour_gradient #include "../screenshot.h" #include "../spritecache.h" #include "../strings_func.h" #include "../strings_type.h" #include "../table/palettes.h" #include "../table/sprites.h" -#include "../table/strings.h" -#include "../table/town_land.h" +#include "../table/strings.h" // for town_land.h +#include "../table/town_land.h" // _town_draw_tile_data #include "../table/train_sprites.h" #include "../timer/timer_game_tick.h" #include "../viewport_sprite_sorter.h" @@ -246,11 +246,12 @@ void WriteCargoSpecInfo(JsonWriter &j) { j.ks("quantifier", cs->quantifier); j.ks("abbrev", cs->abbrev); + auto label = cs->label.base(); for (uint i = 0; i < sizeof(cs->label); i++) { - cargo_label[i] = GB(cs->label, (uint8_t)(sizeof(cs->label) - i - 1) * 8, 8); + cargo_label[i] = GB(label, (uint8_t)(sizeof(label) - i - 1) * 8, 8); } - cargo_label[sizeof(cs->label)] = '\0'; - JKV(j, cs->label); + cargo_label[sizeof(label)] = '\0'; + JKV(j, label); j.kv("label_str", cargo_label); j.end_dict(); } diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index df9dd41878..b833efc3c7 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -1056,7 +1056,7 @@ CommandCost CmdSetCompanyColour(DoCommandFlag flags, LiveryScheme scheme, bool p c->livery[scheme].colour2 = colour; if (scheme == LS_DEFAULT) { - UpdateCompanyGroupLiveries(c); + UpdateCompanyLiveries(c); } } diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 50a59d224e..65266fbd6e 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -2543,7 +2543,7 @@ static void ConDumpCargoTypes() IConsolePrint(CC_DEFAULT, " {:02d} Bit: {:2d}, Label: {:c}{:c}{:c}{:c}, Callback mask: 0x{:02X}, Cargo class: {}{}{}{}{}{}{}{}{}{}{}, GRF: {:08X}, {}", spec->Index(), spec->bitnum, - spec->label >> 24, spec->label >> 16, spec->label >> 8, spec->label, + spec->label.base() >> 24, spec->label.base() >> 16, spec->label.base() >> 8, spec->label.base(), spec->callback_mask, (spec->classes & CC_PASSENGERS) != 0 ? 'p' : '-', (spec->classes & CC_MAIL) != 0 ? 'm' : '-', diff --git a/src/date.cpp b/src/date.cpp deleted file mode 100644 index d2af28596d..0000000000 --- a/src/date.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* - * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. - * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - */ - -/** @file date.cpp Handling of dates in our native format and transforming them to something human readable. */ - -#include "stdafx.h" -#include "network/network.h" -#include "network/network_func.h" -#include "currency.h" -#include "window_func.h" -#include "settings_type.h" -#include "date_func.h" -#include "vehicle_base.h" -#include "rail_gui.h" -#include "linkgraph/linkgraph.h" -#include "saveload/saveload.h" -#include "newgrf_profiling.h" -#include "widgets/statusbar_widget.h" - -#include "citymania/cm_main.hpp" - -#include "safeguards.h" - -Year _cur_year; ///< Current year, starting at 0 -Month _cur_month; ///< Current month (0..11) -Date _date; ///< Current date in days (day counter) -DateFract _date_fract; ///< Fractional part of the day. -uint64 _tick_counter; ///< Ever incrementing tick counter for setting off various events - -/** - * Set the date. - * @param date New date - * @param fract The number of ticks that have passed on this date. - */ -void SetDate(Date date, DateFract fract) -{ - assert(fract < DAY_TICKS); - - YearMonthDay ymd; - - _date = date; - _date_fract = fract; - ConvertDateToYMD(date, &ymd); - _cur_year = ymd.year; - _cur_month = ymd.month; -} - -#define M(a, b) ((a << 5) | b) -static const uint16 _month_date_from_year_day[] = { - M( 0, 1), M( 0, 2), M( 0, 3), M( 0, 4), M( 0, 5), M( 0, 6), M( 0, 7), M( 0, 8), M( 0, 9), M( 0, 10), M( 0, 11), M( 0, 12), M( 0, 13), M( 0, 14), M( 0, 15), M( 0, 16), M( 0, 17), M( 0, 18), M( 0, 19), M( 0, 20), M( 0, 21), M( 0, 22), M( 0, 23), M( 0, 24), M( 0, 25), M( 0, 26), M( 0, 27), M( 0, 28), M( 0, 29), M( 0, 30), M( 0, 31), - M( 1, 1), M( 1, 2), M( 1, 3), M( 1, 4), M( 1, 5), M( 1, 6), M( 1, 7), M( 1, 8), M( 1, 9), M( 1, 10), M( 1, 11), M( 1, 12), M( 1, 13), M( 1, 14), M( 1, 15), M( 1, 16), M( 1, 17), M( 1, 18), M( 1, 19), M( 1, 20), M( 1, 21), M( 1, 22), M( 1, 23), M( 1, 24), M( 1, 25), M( 1, 26), M( 1, 27), M( 1, 28), M( 1, 29), - M( 2, 1), M( 2, 2), M( 2, 3), M( 2, 4), M( 2, 5), M( 2, 6), M( 2, 7), M( 2, 8), M( 2, 9), M( 2, 10), M( 2, 11), M( 2, 12), M( 2, 13), M( 2, 14), M( 2, 15), M( 2, 16), M( 2, 17), M( 2, 18), M( 2, 19), M( 2, 20), M( 2, 21), M( 2, 22), M( 2, 23), M( 2, 24), M( 2, 25), M( 2, 26), M( 2, 27), M( 2, 28), M( 2, 29), M( 2, 30), M( 2, 31), - M( 3, 1), M( 3, 2), M( 3, 3), M( 3, 4), M( 3, 5), M( 3, 6), M( 3, 7), M( 3, 8), M( 3, 9), M( 3, 10), M( 3, 11), M( 3, 12), M( 3, 13), M( 3, 14), M( 3, 15), M( 3, 16), M( 3, 17), M( 3, 18), M( 3, 19), M( 3, 20), M( 3, 21), M( 3, 22), M( 3, 23), M( 3, 24), M( 3, 25), M( 3, 26), M( 3, 27), M( 3, 28), M( 3, 29), M( 3, 30), - M( 4, 1), M( 4, 2), M( 4, 3), M( 4, 4), M( 4, 5), M( 4, 6), M( 4, 7), M( 4, 8), M( 4, 9), M( 4, 10), M( 4, 11), M( 4, 12), M( 4, 13), M( 4, 14), M( 4, 15), M( 4, 16), M( 4, 17), M( 4, 18), M( 4, 19), M( 4, 20), M( 4, 21), M( 4, 22), M( 4, 23), M( 4, 24), M( 4, 25), M( 4, 26), M( 4, 27), M( 4, 28), M( 4, 29), M( 4, 30), M( 4, 31), - M( 5, 1), M( 5, 2), M( 5, 3), M( 5, 4), M( 5, 5), M( 5, 6), M( 5, 7), M( 5, 8), M( 5, 9), M( 5, 10), M( 5, 11), M( 5, 12), M( 5, 13), M( 5, 14), M( 5, 15), M( 5, 16), M( 5, 17), M( 5, 18), M( 5, 19), M( 5, 20), M( 5, 21), M( 5, 22), M( 5, 23), M( 5, 24), M( 5, 25), M( 5, 26), M( 5, 27), M( 5, 28), M( 5, 29), M( 5, 30), - M( 6, 1), M( 6, 2), M( 6, 3), M( 6, 4), M( 6, 5), M( 6, 6), M( 6, 7), M( 6, 8), M( 6, 9), M( 6, 10), M( 6, 11), M( 6, 12), M( 6, 13), M( 6, 14), M( 6, 15), M( 6, 16), M( 6, 17), M( 6, 18), M( 6, 19), M( 6, 20), M( 6, 21), M( 6, 22), M( 6, 23), M( 6, 24), M( 6, 25), M( 6, 26), M( 6, 27), M( 6, 28), M( 6, 29), M( 6, 30), M( 6, 31), - M( 7, 1), M( 7, 2), M( 7, 3), M( 7, 4), M( 7, 5), M( 7, 6), M( 7, 7), M( 7, 8), M( 7, 9), M( 7, 10), M( 7, 11), M( 7, 12), M( 7, 13), M( 7, 14), M( 7, 15), M( 7, 16), M( 7, 17), M( 7, 18), M( 7, 19), M( 7, 20), M( 7, 21), M( 7, 22), M( 7, 23), M( 7, 24), M( 7, 25), M( 7, 26), M( 7, 27), M( 7, 28), M( 7, 29), M( 7, 30), M( 7, 31), - M( 8, 1), M( 8, 2), M( 8, 3), M( 8, 4), M( 8, 5), M( 8, 6), M( 8, 7), M( 8, 8), M( 8, 9), M( 8, 10), M( 8, 11), M( 8, 12), M( 8, 13), M( 8, 14), M( 8, 15), M( 8, 16), M( 8, 17), M( 8, 18), M( 8, 19), M( 8, 20), M( 8, 21), M( 8, 22), M( 8, 23), M( 8, 24), M( 8, 25), M( 8, 26), M( 8, 27), M( 8, 28), M( 8, 29), M( 8, 30), - M( 9, 1), M( 9, 2), M( 9, 3), M( 9, 4), M( 9, 5), M( 9, 6), M( 9, 7), M( 9, 8), M( 9, 9), M( 9, 10), M( 9, 11), M( 9, 12), M( 9, 13), M( 9, 14), M( 9, 15), M( 9, 16), M( 9, 17), M( 9, 18), M( 9, 19), M( 9, 20), M( 9, 21), M( 9, 22), M( 9, 23), M( 9, 24), M( 9, 25), M( 9, 26), M( 9, 27), M( 9, 28), M( 9, 29), M( 9, 30), M( 9, 31), - M(10, 1), M(10, 2), M(10, 3), M(10, 4), M(10, 5), M(10, 6), M(10, 7), M(10, 8), M(10, 9), M(10, 10), M(10, 11), M(10, 12), M(10, 13), M(10, 14), M(10, 15), M(10, 16), M(10, 17), M(10, 18), M(10, 19), M(10, 20), M(10, 21), M(10, 22), M(10, 23), M(10, 24), M(10, 25), M(10, 26), M(10, 27), M(10, 28), M(10, 29), M(10, 30), - M(11, 1), M(11, 2), M(11, 3), M(11, 4), M(11, 5), M(11, 6), M(11, 7), M(11, 8), M(11, 9), M(11, 10), M(11, 11), M(11, 12), M(11, 13), M(11, 14), M(11, 15), M(11, 16), M(11, 17), M(11, 18), M(11, 19), M(11, 20), M(11, 21), M(11, 22), M(11, 23), M(11, 24), M(11, 25), M(11, 26), M(11, 27), M(11, 28), M(11, 29), M(11, 30), M(11, 31), -}; -#undef M - -enum DaysTillMonth { - ACCUM_JAN = 0, - ACCUM_FEB = ACCUM_JAN + 31, - ACCUM_MAR = ACCUM_FEB + 29, - ACCUM_APR = ACCUM_MAR + 31, - ACCUM_MAY = ACCUM_APR + 30, - ACCUM_JUN = ACCUM_MAY + 31, - ACCUM_JUL = ACCUM_JUN + 30, - ACCUM_AUG = ACCUM_JUL + 31, - ACCUM_SEP = ACCUM_AUG + 31, - ACCUM_OCT = ACCUM_SEP + 30, - ACCUM_NOV = ACCUM_OCT + 31, - ACCUM_DEC = ACCUM_NOV + 30, -}; - -/** Number of days to pass from the first day in the year before reaching the first of a month. */ -static const uint16 _accum_days_for_month[] = { - ACCUM_JAN, ACCUM_FEB, ACCUM_MAR, ACCUM_APR, - ACCUM_MAY, ACCUM_JUN, ACCUM_JUL, ACCUM_AUG, - ACCUM_SEP, ACCUM_OCT, ACCUM_NOV, ACCUM_DEC, -}; - -/** - * Converts a Date to a Year, Month & Day. - * @param date the date to convert from - * @param ymd the year, month and day to write to - */ -void ConvertDateToYMD(Date date, YearMonthDay *ymd) -{ - /* Year determination in multiple steps to account for leap - * years. First do the large steps, then the smaller ones. - */ - - /* There are 97 leap years in 400 years */ - Year yr = 400 * (date / (DAYS_IN_YEAR * 400 + 97)); - int rem = date % (DAYS_IN_YEAR * 400 + 97); - uint16 x; - - if (rem >= DAYS_IN_YEAR * 100 + 25) { - /* There are 25 leap years in the first 100 years after - * every 400th year, as every 400th year is a leap year */ - yr += 100; - rem -= DAYS_IN_YEAR * 100 + 25; - - /* There are 24 leap years in the next couple of 100 years */ - yr += 100 * (rem / (DAYS_IN_YEAR * 100 + 24)); - rem = (rem % (DAYS_IN_YEAR * 100 + 24)); - } - - if (!IsLeapYear(yr) && rem >= DAYS_IN_YEAR * 4) { - /* The first 4 year of the century are not always a leap year */ - yr += 4; - rem -= DAYS_IN_YEAR * 4; - } - - /* There is 1 leap year every 4 years */ - yr += 4 * (rem / (DAYS_IN_YEAR * 4 + 1)); - rem = rem % (DAYS_IN_YEAR * 4 + 1); - - /* The last (max 3) years to account for; the first one - * can be, but is not necessarily a leap year */ - while (rem >= (IsLeapYear(yr) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR)) { - rem -= IsLeapYear(yr) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR; - yr++; - } - - /* Skip the 29th of February in non-leap years */ - if (!IsLeapYear(yr) && rem >= ACCUM_MAR - 1) rem++; - - ymd->year = yr; - - x = _month_date_from_year_day[rem]; - ymd->month = x >> 5; - ymd->day = x & 0x1F; -} - -/** - * Converts a tuple of Year, Month and Day to a Date. - * @param year is a number between 0..MAX_YEAR - * @param month is a number between 0..11 - * @param day is a number between 1..31 - */ -Date ConvertYMDToDate(Year year, Month month, Day day) -{ - /* Day-offset in a leap year */ - int days = _accum_days_for_month[month] + day - 1; - - /* Account for the missing of the 29th of February in non-leap years */ - if (!IsLeapYear(year) && days >= ACCUM_MAR) days--; - - return DAYS_TILL(year) + days; -} - -/** Functions used by the IncreaseDate function */ - -extern void EnginesDailyLoop(); -extern void DisasterDailyLoop(); -extern void IndustryDailyLoop(); - -extern void CompaniesMonthlyLoop(); -extern void EnginesMonthlyLoop(); -extern void TownsMonthlyLoop(); -extern void IndustryMonthlyLoop(); -extern void StationMonthlyLoop(); -extern void SubsidyMonthlyLoop(); - -extern void CompaniesYearlyLoop(); -extern void VehiclesYearlyLoop(); -extern void TownsYearlyLoop(); - -extern void ShowEndGameChart(); - - -/** Available settings for autosave intervals. */ -static const Month _autosave_months[] = { - 0, ///< never - 1, ///< every month - 3, ///< every 3 months - 6, ///< every 6 months - 12, ///< every 12 months -}; - -/** - * Runs various procedures that have to be done yearly - */ -static void OnNewYear() -{ - CompaniesYearlyLoop(); - VehiclesYearlyLoop(); - TownsYearlyLoop(); - InvalidateWindowClassesData(WC_BUILD_STATION); - if (_network_server) NetworkServerYearlyLoop(); - - if (_cur_year == _settings_client.gui.semaphore_build_before) ResetSignalVariant(); - - /* check if we reached end of the game (end of ending year); 0 = never */ - if (_cur_year == _settings_game.game_creation.ending_year + 1 && _settings_game.game_creation.ending_year != 0) { - ShowEndGameChart(); - } - - /* check if we reached the maximum year, decrement dates by a year */ - if (_cur_year == MAX_YEAR + 1) { - int days_this_year; - - _cur_year--; - days_this_year = IsLeapYear(_cur_year) ? DAYS_IN_LEAP_YEAR : DAYS_IN_YEAR; - _date -= days_this_year; - for (Vehicle *v : Vehicle::Iterate()) v->ShiftDates(-days_this_year); - for (LinkGraph *lg : LinkGraph::Iterate()) lg->ShiftDates(-days_this_year); - - /* Because the _date wraps here, and text-messages expire by game-days, we have to clean out - * all of them if the date is set back, else those messages will hang for ever */ - NetworkInitChatMessage(); - } - - if (_settings_client.gui.auto_euro) CheckSwitchToEuro(); -} - -/** - * Runs various procedures that have to be done monthly - */ -static void OnNewMonth() -{ - if (_settings_client.gui.autosave != 0 && (_cur_month % _autosave_months[_settings_client.gui.autosave]) == 0) { - _do_autosave = true; - SetWindowDirty(WC_STATUS_BAR, 0); - } - - SetWindowClassesDirty(WC_CHEATS); - CompaniesMonthlyLoop(); - EnginesMonthlyLoop(); - TownsMonthlyLoop(); - IndustryMonthlyLoop(); - SubsidyMonthlyLoop(); - StationMonthlyLoop(); - citymania::Emit(citymania::event::NewMonth()); - if (_network_server) NetworkServerMonthlyLoop(); -} - -/** - * Runs various procedures that have to be done daily - */ -static void OnNewDay() -{ - if (!_newgrf_profilers.empty() && _newgrf_profile_end_date <= _date) { - NewGRFProfiler::FinishAll(); - } - - if (_network_server) NetworkServerDailyLoop(); - - DisasterDailyLoop(); - IndustryDailyLoop(); - - SetWindowWidgetDirty(WC_STATUS_BAR, 0, WID_S_LEFT); - EnginesDailyLoop(); - - /* Refresh after possible snowline change */ - SetWindowClassesDirty(WC_TOWN_VIEW); -} - -/** - * Increases the tick counter, increases date and possibly calls - * procedures that have to be called daily, monthly or yearly. - */ -void IncreaseDate() -{ - /* increase day, and check if a new day is there? */ - _tick_counter++; - - if (_game_mode == GM_MENU) return; - - _date_fract++; - if (_date_fract < DAY_TICKS) return; - _date_fract = 0; - - /* increase day counter */ - _date++; - - YearMonthDay ymd; - ConvertDateToYMD(_date, &ymd); - - /* check if we entered a new month? */ - bool new_month = ymd.month != _cur_month; - - /* check if we entered a new year? */ - bool new_year = ymd.year != _cur_year; - - /* update internal variables before calling the daily/monthly/yearly loops */ - _cur_month = ymd.month; - _cur_year = ymd.year; - - /* yes, call various daily loops */ - OnNewDay(); - - /* yes, call various monthly loops */ - if (new_month) OnNewMonth(); - - /* yes, call various yearly loops */ - if (new_year) OnNewYear(); -} diff --git a/src/engine.cpp b/src/engine.cpp index c46f7bb843..979c6a7e31 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -244,8 +244,10 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const if (!IsCargoInClass(cargo_type, CC_PASSENGERS)) { extra_mail_cap = GetEngineProperty(this->index, PROP_AIRCRAFT_MAIL_CAPACITY, this->u.air.mail_capacity, v); } - if (!new_multipliers && cargo_type == CT_MAIL) return capacity + extra_mail_cap; - default_cargo = CT_PASSENGERS; // Always use 'passengers' wrt. cargo multipliers + if (IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) { + if (!new_multipliers && cargo_type == GetCargoIDByLabel(CT_MAIL)) return capacity + extra_mail_cap; + } + default_cargo = GetCargoIDByLabel(CT_PASSENGERS); // Always use 'passengers' wrt. cargo multipliers break; default: NOT_REACHED(); @@ -262,8 +264,8 @@ uint Engine::DetermineCapacity(const Vehicle *v, uint16_t *mail_capacity) const uint16_t default_multiplier = new_multipliers ? 0x100 : CargoSpec::Get(default_cargo)->multiplier; uint16_t cargo_multiplier = CargoSpec::Get(cargo_type)->multiplier; capacity *= cargo_multiplier; - if (extra_mail_cap > 0) { - uint mail_multiplier = CargoSpec::Get(CT_MAIL)->multiplier; + if (extra_mail_cap > 0 && IsValidCargoID(GetCargoIDByLabel(CT_MAIL))) { + uint mail_multiplier = CargoSpec::Get(GetCargoIDByLabel(CT_MAIL))->multiplier; capacity += (default_multiplier * extra_mail_cap * cargo_multiplier + mail_multiplier / 2) / mail_multiplier; } capacity = (capacity + default_multiplier / 2) / default_multiplier; diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp index 622918d3a0..3be63c7bb5 100644 --- a/src/engine_gui.cpp +++ b/src/engine_gui.cpp @@ -213,7 +213,7 @@ static StringID GetAircraftEngineInfoString(const Engine *e) SetDParam(9, mail_capacity > 0 ? STR_ENGINE_PREVIEW_CAPACITY_2 : STR_ENGINE_PREVIEW_CAPACITY); SetDParam(10, cargo); SetDParam(11, capacity); - SetDParam(12, CT_MAIL); + SetDParam(12, GetCargoIDByLabel(CT_MAIL)); SetDParam(13, mail_capacity); return STR_ENGINE_PREVIEW_TEXT4; diff --git a/src/engine_type.h b/src/engine_type.h index 7716fd92e7..be4416ef7b 100644 --- a/src/engine_type.h +++ b/src/engine_type.h @@ -149,6 +149,7 @@ struct EngineInfo { byte load_amount; byte climates; ///< Climates supported by the engine. CargoID cargo_type; + std::variant cargo_label; CargoTypes refit_mask; byte refit_cost; byte misc_flags; ///< Miscellaneous flags. @see EngineMiscFlags diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 1423ea9ab9..06b2d5040b 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -628,7 +628,7 @@ public: SetDParam(1, INT64_MAX); uint y_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL).width; - size->width = std::max(size->width, ScaleGUITrad(7) + y_label_width + this->num_on_x_axis * (x_label_width + ScaleGUITrad(5)) + ScaleGUITrad(9)); + size->width = std::max(size->width, ScaleGUITrad(7) + y_label_width + this->num_vert_lines * (x_label_width + ScaleGUITrad(5)) + ScaleGUITrad(9)); size->height = std::max(size->height, ScaleGUITrad(8) + (1 + MIN_GRAPH_NUM_LINES_Y * 2 + (this->draw_dates ? 3 : 1)) * GetCharacterHeight(FS_SMALL) + ScaleGUITrad(4)); size->height = std::max(size->height, size->width / 3); } diff --git a/src/house.h b/src/house.h index 4831e289ac..c3308ea59b 100644 --- a/src/house.h +++ b/src/house.h @@ -106,6 +106,7 @@ struct HouseSpec { byte mail_generation; ///< mail generation multiplier (tile based, as the acceptances below) byte cargo_acceptance[HOUSE_NUM_ACCEPTS]; ///< acceptance level for the cargo slots CargoID accepts_cargo[HOUSE_NUM_ACCEPTS]; ///< input cargo slots + CargoLabel accepts_cargo_label[HOUSE_NUM_ACCEPTS]; ///< input landscape cargo slots BuildingFlags building_flags; ///< some flags that describe the house (size, stadium etc...) HouseZones building_availability; ///< where can it be built (climates, zones) bool enabled; ///< the house is available to build (true by default, but can be disabled by newgrf) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index f8a02f090e..2e9d30a072 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -988,7 +988,7 @@ bool IsTileForestIndustry(TileIndex tile) if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false; /* Check for wood production */ - return std::any_of(std::begin(ind->produced), std::end(ind->produced), [](const auto &p) { return IsValidCargoID(p.cargo) && CargoSpec::Get(p.cargo)->label == 'WOOD'; }); + return std::any_of(std::begin(ind->produced), std::end(ind->produced), [](const auto &p) { return IsValidCargoID(p.cargo) && CargoSpec::Get(p.cargo)->label == CT_WOOD; }); } static const byte _plantfarmfield_type[] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6}; @@ -1875,7 +1875,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? static_cast(i->accepted.size()) : 3; for (uint j = 0; j < maxcargoes; j++) { uint16_t res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); - if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break; + if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) { ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_INPUT_CARGO_TYPES, res); break; @@ -1907,7 +1907,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? static_cast(i->produced.size()) : 2; for (uint j = 0; j < maxcargoes; j++) { uint16_t res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); - if (res == CALLBACK_FAILED || GB(res, 0, 8) == CT_INVALID) break; + if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; if (indspec->grf_prop.grffile->grf_version >= 8 && res >= 0x100) { ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_OUTPUT_CARGO_TYPES, res); break; @@ -2924,7 +2924,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) /* Prevent production to overflow or Oil Rig passengers to be over-"produced" */ new_prod = Clamp(new_prod, 1, 255); - if (p.cargo == CT_PASSENGERS && !(indspec->behaviour & INDUSTRYBEH_NO_PAX_PROD_CLAMP)) { + if (IsValidCargoID(p.cargo) && p.cargo == GetCargoIDByLabel(CT_PASSENGERS) && !(indspec->behaviour & INDUSTRYBEH_NO_PAX_PROD_CLAMP)) { new_prod = Clamp(new_prod, 0, 16); } diff --git a/src/industrytype.h b/src/industrytype.h index 07a3d36bb7..e1fbd881e8 100644 --- a/src/industrytype.h +++ b/src/industrytype.h @@ -110,6 +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]; + std::variant produced_cargo_label[INDUSTRY_NUM_OUTPUTS]; byte production_rate[INDUSTRY_NUM_OUTPUTS]; /** * minimum amount of cargo transported to the stations. @@ -117,6 +118,7 @@ struct IndustrySpec { */ byte minimal_cargo; CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]; ///< 16 accepted cargoes. + std::variant 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 @@ -153,6 +155,7 @@ struct IndustrySpec { */ struct IndustryTileSpec { std::array accepts_cargo; ///< Cargo accepted by this tile + std::array, INDUSTRY_NUM_INPUTS> accepts_cargo_label; std::array 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 diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 0716ef3be9..1c20902723 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -3965,6 +3965,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :gaan altyd STR_ORDER_DROP_SERVICE_DEPOT :Diens indien nodig STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Voertuig data om sprong op te baseer # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index 730d9b6ab5..fd8c3287de 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -3716,6 +3716,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :الذهاب د STR_ORDER_DROP_SERVICE_DEPOT :الصيانة عند الحاجة STR_ORDER_DROP_HALT_DEPOT :توقف +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}بيانات العربة لتعريف التجاوز الى # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 3ac1428f79..e7b7590b6a 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -3734,6 +3734,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Joan beti STR_ORDER_DROP_SERVICE_DEPOT :Beharrezkoa bada mantenimendua egin STR_ORDER_DROP_HALT_DEPOT :Gelditu +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Ibilgailuaren xehetasunak jauzia oinarritzeko # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 1a35371bd7..e6ab224cd3 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -4325,6 +4325,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ісьці за STR_ORDER_DROP_SERVICE_DEPOT :Абслужыць, калі неабходна STR_ORDER_DROP_HALT_DEPOT :Стоп +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Парамэтр транспарту для параўнаньня # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 4af3923ef7..bc4e90b0ec 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -26,77 +26,77 @@ STR_JUST_NOTHING :Nada # Cargo related strings # Plural cargo name STR_CARGO_PLURAL_NOTHING : -STR_CARGO_PLURAL_PASSENGERS :{G=m}Passageiros -STR_CARGO_PLURAL_COAL :{G=m}Carvão -STR_CARGO_PLURAL_MAIL :{G=f}Correspondências -STR_CARGO_PLURAL_OIL :{G=m}Petróleo -STR_CARGO_PLURAL_LIVESTOCK :{G=m}Gado -STR_CARGO_PLURAL_GOODS :{G=m}Bens -STR_CARGO_PLURAL_GRAIN :{G=m}Cereais -STR_CARGO_PLURAL_WOOD :{G=f}Madeira -STR_CARGO_PLURAL_IRON_ORE :{G=m}Minério de Ferro -STR_CARGO_PLURAL_STEEL :{G=m}Aço -STR_CARGO_PLURAL_VALUABLES :{G=f}Objetos de Valor -STR_CARGO_PLURAL_COPPER_ORE :{G=m}Minério de Cobre -STR_CARGO_PLURAL_MAIZE :{G=m}Milho -STR_CARGO_PLURAL_FRUIT :{G=f}Fruta -STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes -STR_CARGO_PLURAL_FOOD :{G=m}Alimento -STR_CARGO_PLURAL_PAPER :{G=m}Papel -STR_CARGO_PLURAL_GOLD :{G=m}Ouro -STR_CARGO_PLURAL_WATER :{G=f}Água -STR_CARGO_PLURAL_WHEAT :{G=m}Trigo -STR_CARGO_PLURAL_RUBBER :{G=f}Borracha -STR_CARGO_PLURAL_SUGAR :{G=m}Açúcar -STR_CARGO_PLURAL_TOYS :{G=m}Brinquedos -STR_CARGO_PLURAL_SWEETS :{G=m}Doces -STR_CARGO_PLURAL_COLA :{G=f}Cola -STR_CARGO_PLURAL_CANDYFLOSS :{G=m}Algodão Doce -STR_CARGO_PLURAL_BUBBLES :{G=f}Bolhas -STR_CARGO_PLURAL_TOFFEE :{G=m}Caramelo -STR_CARGO_PLURAL_BATTERIES :{G=f}Pilhas -STR_CARGO_PLURAL_PLASTIC :{G=m}Plástico -STR_CARGO_PLURAL_FIZZY_DRINKS :{G=m}Refrigerantes +STR_CARGO_PLURAL_PASSENGERS :Passageiros +STR_CARGO_PLURAL_COAL :Carvão +STR_CARGO_PLURAL_MAIL :Correspondência +STR_CARGO_PLURAL_OIL :Petróleo +STR_CARGO_PLURAL_LIVESTOCK :Gado +STR_CARGO_PLURAL_GOODS :Bens +STR_CARGO_PLURAL_GRAIN :Grãos +STR_CARGO_PLURAL_WOOD :Madeira +STR_CARGO_PLURAL_IRON_ORE :Minério de Ferro +STR_CARGO_PLURAL_STEEL :Aço +STR_CARGO_PLURAL_VALUABLES :Objetos de Valor +STR_CARGO_PLURAL_COPPER_ORE :Minério de Cobre +STR_CARGO_PLURAL_MAIZE :Milho +STR_CARGO_PLURAL_FRUIT :Fruta +STR_CARGO_PLURAL_DIAMONDS :Diamantes +STR_CARGO_PLURAL_FOOD :Alimentos +STR_CARGO_PLURAL_PAPER :Papel +STR_CARGO_PLURAL_GOLD :Ouro +STR_CARGO_PLURAL_WATER :Água +STR_CARGO_PLURAL_WHEAT :Trigo +STR_CARGO_PLURAL_RUBBER :Borracha +STR_CARGO_PLURAL_SUGAR :Açúcar +STR_CARGO_PLURAL_TOYS :Brinquedos +STR_CARGO_PLURAL_SWEETS :Doces +STR_CARGO_PLURAL_COLA :Bebida de cola +STR_CARGO_PLURAL_CANDYFLOSS :Algodão Doce +STR_CARGO_PLURAL_BUBBLES :Bolhas +STR_CARGO_PLURAL_TOFFEE :Caramelo +STR_CARGO_PLURAL_BATTERIES :Pilhas +STR_CARGO_PLURAL_PLASTIC :Plástico +STR_CARGO_PLURAL_FIZZY_DRINKS :Refrigerantes # Singular cargo name STR_CARGO_SINGULAR_NOTHING : -STR_CARGO_SINGULAR_PASSENGER :{G=m}Passageiro -STR_CARGO_SINGULAR_COAL :{G=m}Carvão -STR_CARGO_SINGULAR_MAIL :{G=f}Correspondência -STR_CARGO_SINGULAR_OIL :{G=m}Petróleo -STR_CARGO_SINGULAR_LIVESTOCK :{G=m}Gado -STR_CARGO_SINGULAR_GOODS :{G=m}Bens -STR_CARGO_SINGULAR_GRAIN :{G=m}Cereais -STR_CARGO_SINGULAR_WOOD :{G=f}Madeira -STR_CARGO_SINGULAR_IRON_ORE :{G=m}Minério de Ferro -STR_CARGO_SINGULAR_STEEL :{G=m}Aço -STR_CARGO_SINGULAR_VALUABLES :{G=m}Objetos de Valor -STR_CARGO_SINGULAR_COPPER_ORE :{G=m}Minério de Cobre -STR_CARGO_SINGULAR_MAIZE :{G=m}Milho -STR_CARGO_SINGULAR_FRUIT :{G=f}Fruta -STR_CARGO_SINGULAR_DIAMOND :{G=m}Diamante -STR_CARGO_SINGULAR_FOOD :{G=f}Alimento -STR_CARGO_SINGULAR_PAPER :{G=m}Papel -STR_CARGO_SINGULAR_GOLD :{G=m}Ouro -STR_CARGO_SINGULAR_WATER :{G=f}Água -STR_CARGO_SINGULAR_WHEAT :{G=m}Trigo -STR_CARGO_SINGULAR_RUBBER :{G=f}Borracha -STR_CARGO_SINGULAR_SUGAR :{G=m}Açúcar -STR_CARGO_SINGULAR_TOY :{G=m}Brinquedo -STR_CARGO_SINGULAR_SWEETS :{G=m}Doce -STR_CARGO_SINGULAR_COLA :{G=m}Cola -STR_CARGO_SINGULAR_CANDYFLOSS :{G=m}Algodão doce -STR_CARGO_SINGULAR_BUBBLE :{G=f}Bolha -STR_CARGO_SINGULAR_TOFFEE :{G=m}Caramelo -STR_CARGO_SINGULAR_BATTERY :{G=f}Pilha -STR_CARGO_SINGULAR_PLASTIC :{G=m}Plástico -STR_CARGO_SINGULAR_FIZZY_DRINK :{G=m}Refrigerante +STR_CARGO_SINGULAR_PASSENGER :Passageiro +STR_CARGO_SINGULAR_COAL :Carvão +STR_CARGO_SINGULAR_MAIL :Correspondência +STR_CARGO_SINGULAR_OIL :Petróleo +STR_CARGO_SINGULAR_LIVESTOCK :Gado +STR_CARGO_SINGULAR_GOODS :Bens +STR_CARGO_SINGULAR_GRAIN :Grãos +STR_CARGO_SINGULAR_WOOD :Madeira +STR_CARGO_SINGULAR_IRON_ORE :Minério de Ferro +STR_CARGO_SINGULAR_STEEL :Aço +STR_CARGO_SINGULAR_VALUABLES :Objeto de Valor +STR_CARGO_SINGULAR_COPPER_ORE :Minério de Cobre +STR_CARGO_SINGULAR_MAIZE :Milho +STR_CARGO_SINGULAR_FRUIT :Fruta +STR_CARGO_SINGULAR_DIAMOND :Diamante +STR_CARGO_SINGULAR_FOOD :Alimento +STR_CARGO_SINGULAR_PAPER :Papel +STR_CARGO_SINGULAR_GOLD :Ouro +STR_CARGO_SINGULAR_WATER :Água +STR_CARGO_SINGULAR_WHEAT :Trigo +STR_CARGO_SINGULAR_RUBBER :Borracha +STR_CARGO_SINGULAR_SUGAR :Açúcar +STR_CARGO_SINGULAR_TOY :Brinquedo +STR_CARGO_SINGULAR_SWEETS :Doce +STR_CARGO_SINGULAR_COLA :Bebida de cola +STR_CARGO_SINGULAR_CANDYFLOSS :Algodão Doce +STR_CARGO_SINGULAR_BUBBLE :Bolha +STR_CARGO_SINGULAR_TOFFEE :Caramelo +STR_CARGO_SINGULAR_BATTERY :Bateria +STR_CARGO_SINGULAR_PLASTIC :Plástico +STR_CARGO_SINGULAR_FIZZY_DRINK :Refrigerante # Quantity of cargo STR_QUANTITY_NOTHING : STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s} STR_QUANTITY_COAL :{WEIGHT_LONG} de carvão -STR_QUANTITY_MAIL :{COMMA}{NBSP}bolsa{P "" s} de correspondência +STR_QUANTITY_MAIL :{COMMA}{NBSP}malote{P "" s} de correspondência STR_QUANTITY_OIL :{VOLUME_LONG} de petróleo STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}cabeça{P "" s} de gado STR_QUANTITY_GOODS :{COMMA}{NBSP}caixa{P "" s} de bens @@ -104,21 +104,21 @@ STR_QUANTITY_GRAIN :{WEIGHT_LONG} d STR_QUANTITY_WOOD :{WEIGHT_LONG} de madeira STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} de minério de ferro STR_QUANTITY_STEEL :{WEIGHT_LONG} de aço -STR_QUANTITY_VALUABLES :{COMMA}{NBSP}bolsa{P "" s} de objetos de valor +STR_QUANTITY_VALUABLES :{COMMA}{NBSP}pacote{P "" s} de objetos de valor STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} de minério de cobre STR_QUANTITY_MAIZE :{WEIGHT_LONG} de milho STR_QUANTITY_FRUIT :{WEIGHT_LONG} de fruta -STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}bolsa{P "" s} de diamantes +STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}saco{P "" s} de diamantes STR_QUANTITY_FOOD :{WEIGHT_LONG} de alimentos STR_QUANTITY_PAPER :{WEIGHT_LONG} de papel -STR_QUANTITY_GOLD :{COMMA}{NBSP}bolsa{P "" s} de ouro +STR_QUANTITY_GOLD :{COMMA}{NBSP}saco{P "" s} de ouro STR_QUANTITY_WATER :{VOLUME_LONG} de água STR_QUANTITY_WHEAT :{WEIGHT_LONG} de trigo STR_QUANTITY_RUBBER :{VOLUME_LONG} de borracha STR_QUANTITY_SUGAR :{WEIGHT_LONG} de açúcar STR_QUANTITY_TOYS :{COMMA}{NBSP}brinquedo{P "" s} -STR_QUANTITY_SWEETS :{COMMA}{NBSP}pacote{P "" s} de doces -STR_QUANTITY_COLA :{VOLUME_LONG} de cola +STR_QUANTITY_SWEETS :{COMMA}{NBSP}saco{P "" s} de doces +STR_QUANTITY_COLA :{VOLUME_LONG} de bebida de cola STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} de algodão doce STR_QUANTITY_BUBBLES :{COMMA} bolha{P "" s} STR_QUANTITY_TOFFEE :{WEIGHT_LONG} de caramelo @@ -165,7 +165,7 @@ STR_ABBREV_ALL :TUDO # 'Mode' of transport for cargoes STR_PASSENGERS :{COMMA}{NBSP}passageiro{P "" s} -STR_BAGS :{COMMA}{NBSP}bolsa{P "" s} +STR_BAGS :{COMMA}{NBSP}saco{P "" s} STR_TONS :{COMMA}{NBSP}tonelada{P "" s} STR_LITERS :{COMMA}{NBSP}litro{P "" s} STR_ITEMS :{COMMA}{NBSP}ite{P m ns} @@ -279,7 +279,7 @@ STR_TOOLTIP_SORT_CRITERIA :{BLACK}Selecion STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Selecione critério para filtração STR_BUTTON_SORT_BY :{BLACK}Classificar por STR_BUTTON_CATCHMENT :{BLACK}Cobertura -STR_TOOLTIP_CATCHMENT :{BLACK}Alternar a visão da área de cobertura +STR_TOOLTIP_CATCHMENT :{BLACK}Ativar a exibição da área de cobertura STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Fechar janela STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Título da janela - arraste isto para mover a janela @@ -288,7 +288,7 @@ STR_TOOLTIP_DEBUG :{BLACK}Mostrar STR_TOOLTIP_DEFSIZE :{BLACK}Redimensiona a janela ao tamanho padrão. Ctrl+Clique para salvar o tamanho atual como padrão STR_TOOLTIP_STICKY :{BLACK}Marcar esta janela como infechável pela tecla 'Fechar Todas as Janelas'. Ctrl+Clique torna essa opção padrão STR_TOOLTIP_RESIZE :{BLACK}Clique e arraste para redimensionar esta janela -STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Alternar entre janela de tamanho grande/pequena +STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Ativar janela de tamanho grande/pequena STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista acima/abaixo STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista para esquerda/direita STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir edifícios etc. em um quadrado do terreno. Ctrl+Clique+Arrastar seleciona a área diagonalmente. Pressionar Shift mostra o custo estimado @@ -385,21 +385,21 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pausar j STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Acelerar o jogo STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opções e definições STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Salvar, carregar ou abandonar o jogo, sair do jogo -STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Exibir mapa, visualizador extra, fluxo de cargas ou lista de sinais +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Abrir mapa, nova visualização, fluxo de cargas ou lista de sinais STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Mostrar lista de localidades -STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Exibir lista de subsídios -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Exibir lista de estações da companhia -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Mostrar informações financeiras da empresa -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Exibir informações gerais da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Abrir lista de subsídios +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Abrir lista de estações da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Abrir informações financeiras da empresa +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Abrir informações gerais da empresa STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostrar livro de histórias STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Mostrar lista de objetivos -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Exibir gráficos da empresa e taxas de pagamento de carga -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Exibir tabela de classificação das empresas +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Abrir gráficos da empresa e taxas de pagamento de carga +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Abrir tabela da liga da empresa STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Abrir o catálogo de indústria, a cadeia industrial ou financiar a construção de uma nova indústria -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Mostrar a lista de trens da companhia. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Exibir lista de veículos rodoviários da empresa. Ctrl+Clique alterna abrir a lista de grupos/veículos -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar lista de navios da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Abrir a lista de trens da empresa. Ctrl+Clique para mostrar ou ocultar os grupos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Abrir lista de veículos rodoviários da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Abrir lista de embarcações da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Abrir lista de aeronaves da empresa. Ctrl+Clique para mostrar ou ocultar os grupos de veículos, oposto da configuração escolhida STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ampliar a visão STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Reduzir a visão STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir linha ferroviária @@ -483,11 +483,11 @@ STR_GRAPH_MENU_OPERATING_PROFIT_GRAPH :Gráfico de luc STR_GRAPH_MENU_INCOME_GRAPH :Gráfico de renda STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Gráfico de carga entregue STR_GRAPH_MENU_PERFORMANCE_HISTORY_GRAPH :Gráfico de histórico de desempenho -STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de avaliação da empresa +STR_GRAPH_MENU_COMPANY_VALUE_GRAPH :Gráfico de valor da empresa STR_GRAPH_MENU_CARGO_PAYMENT_RATES :Taxa de pagamento de carga # Company league menu -STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela da liga de empresa +STR_GRAPH_MENU_COMPANY_LEAGUE_TABLE :Tabela de categoria das empresas STR_GRAPH_MENU_DETAILED_PERFORMANCE_RATING :Avaliação detalhada de performance STR_GRAPH_MENU_HIGHSCORE :Tabela de Pontuações @@ -528,15 +528,15 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Apagar todas as # About menu STR_ABOUT_MENU_LAND_BLOCK_INFO :Informações do terreno STR_ABOUT_MENU_HELP :Ajuda & manuais -STR_ABOUT_MENU_TOGGLE_CONSOLE :Alternar console +STR_ABOUT_MENU_TOGGLE_CONSOLE :Mostrar console STR_ABOUT_MENU_AI_DEBUG :Depurar IA/Script do jogo STR_ABOUT_MENU_SCREENSHOT :Captura de tela -STR_ABOUT_MENU_SHOW_FRAMERATE :Exibir taxa de quadros +STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar taxa de quadros STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de "sprites" -STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar caixas delimitadoras -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Alterna a colorização dos blocos sujos -STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Alterna o contorno do elemento +STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Mostrar caixas delimitadoras +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Ativar a colorização dos blocos sujos +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :Mostrar os contornos do elemento ###length 31 STR_DAY_NUMBER_1ST :1º @@ -601,7 +601,7 @@ STR_MONTH_DEC :Dezembro # Graph window STR_GRAPH_KEY_BUTTON :{BLACK}Chave -STR_GRAPH_KEY_TOOLTIP :{BLACK}Exibir chave aos gráficos +STR_GRAPH_KEY_TOOLTIP :{BLACK}Mostrar chave dos gráficos STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING} STR_GRAPH_X_LABEL_MONTH_YEAR :{TINY_FONT}{STRING}{}{NUM} STR_GRAPH_Y_LABEL :{TINY_FONT}{STRING} @@ -610,30 +610,30 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}Gráfico de Lucro Operacional STR_GRAPH_INCOME_CAPTION :{WHITE}Gráfico de Renda STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Unidades de carga entregues -STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Avaliações de desempenho da empresa (avaliação máxima=1000) +STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Classificações do desempenho da empresa (máximo=1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Gráfico de Valor da Empresa STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Últimos 72 minutos STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Taxa de Pagamento de Carga -STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em deslocamento -STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em deslocamento +STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dias em trânsito +STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Segundos em trânsito STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Pagamento por entregar 10 unidades (ou 10 000 litros) de carga numa distância de 20 quadrados STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Habilitar tudo STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Desabilitar tudo STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Exibir todas as cargas no gráfico de taxas de pagamento de cargas STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Não exibir cargas no gráfico de taxas de pagamento de cargas -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Alternar gráfico para o tipo de carga em ligado/desligado +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Mostrar/ocultar gráfico para o tipo de carga STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} -STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Exibir avaliações de performance detalhadas +STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Mostrar avaliações detalhadas de desempneho # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Chave para gráficos da empresa -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para alternar a entrada da empresa no gráfico +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para mostrar/ocultar empresa no gráfico # Company league window -STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas +STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela de Categoria das Empresas STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}' STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM} STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Engenheiro @@ -710,8 +710,8 @@ STR_MUSIC_TOOLTIP_SELECT_NEW_STYLE_MUSIC :{BLACK}Selecion STR_MUSIC_TOOLTIP_SELECT_EZY_STREET_STYLE :{BLACK}Selecionar programa 'Ezy Street' STR_MUSIC_TOOLTIP_SELECT_CUSTOM_1_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 1' (definido pelo usuário) STR_MUSIC_TOOLTIP_SELECT_CUSTOM_2_USER_DEFINED :{BLACK}Selecionar programa 'Personalizado 2' (definido pelo usuário) -STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Alternar programa misturado em ligado/desligado -STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Exibir janela de seleção de faixas de música +STR_MUSIC_TOOLTIP_TOGGLE_PROGRAM_SHUFFLE :{BLACK}Ligar/Desligar reprodução aleatória +STR_MUSIC_TOOLTIP_SHOW_MUSIC_TRACK_SELECTION :{BLACK}Mostrar janela de seleção de faixas de música # Playlist window STR_PLAYLIST_MUSIC_SELECTION_SETNAME :{WHITE}Programação Musical - '{STRING}' @@ -752,16 +752,16 @@ STR_SMALLMAP_TYPE_ROUTES :Rotas STR_SMALLMAP_TYPE_VEGETATION :Vegetação STR_SMALLMAP_TYPE_OWNERS :Proprietários -STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Exibir contornos do terreno no mapa -STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Exibir veículos no mapa -STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Exibir indústrias no mapa -STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Exibir fluxo de carga no mapa -STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Exibir rotas de transporte no mapa -STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Exibir vegetação no mapa -STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Exibir proprietários de terrenos no mapa -STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para alternar sua exibição. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias -STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma compania para alternar a exibição de suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as companias -STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique numa carga para alternar a exibição de sua propriedade. Ctrl+Clique desativa todas as cargas exceto a selecionada. Ctrl+Clique novamente para exibir todas +STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Mostrar contornos do terreno no mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Mostrar veículos no mapa +STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Mostrar indústrias no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Mostrar fluxo de carga no mapa +STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Mostrar rotas de transporte no mapa +STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Mostrar vegetação no mapa +STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Mostrar proprietários do terreno no mapa +STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Clique em um tipo de indústria para exibir/ocultar a indústria. Ctrl+Clique desabilita todos os tipos exceto a selecionada. Ctrl+Clique nela novamente para habilitar todos os tipos de indústrias +STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Clique em uma empresa para exibir/ocultar as suas propriedades. Ctrl+Clique desabilita todas as companias exceto a selecionada. Ctrl+Clique nela novamente para habilitar todas as empresas +STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Clique em uma carga para exibir/ocultar as suas propriedades. Ctrl+Clique desativa todas as cargas, exceto a selecionada. Ctrl+Clique novamente para ativar todas as cargas STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Rodovias STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Ferrovias @@ -804,14 +804,14 @@ STR_SMALLMAP_ENABLE_ALL :{BLACK}Habilita STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altitude STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não exibir indústrias no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Exibir todas as indústrias no mapa -STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a exibição de mapa topográfico -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedade da empresa no mapa +STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Ativar a exibição de mapa topográfico +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedades da empresa no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Exibir todas as propriedades da empresa no mapa -STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Exibe nenhuma carga no mapa -STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibe todas as cargas no mapa +STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Não mostrar cargas no mapa +STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Exibir todas as cargas no mapa # Status bar messages -STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Exibir a última mensagem ou notícia +STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar a última mensagem ou notícia STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_PAUSED :{YELLOW}* * PAUSADO * * STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSADO (aguardando atualização do gráfico de links) * * @@ -908,7 +908,7 @@ STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}{VEHICLE STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE}'s rendeu no último período {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} não pode chegar ao próximo destino porque está fora de alcance -STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma readaptação ordenada falhou +STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} parou porque uma ordem de adaptação falhou STR_NEWS_VEHICLE_AUTORENEW_FAILED :{WHITE}Autorenovação falhou para {VEHICLE}{}{STRING} STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE :{BIG_FONT}{BLACK}Nov{G o a} {STRING} já está disponível! @@ -1015,7 +1015,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaio STR_GAME_OPTIONS_CURRENCY_LVL :Lats da Letônia STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente -STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos +STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticamente # Autosave dropdown ###length 5 @@ -1127,11 +1127,11 @@ STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Definir STR_CURRENCY_SUFFIX :{LTBLUE}Sufixo: {ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Definir a sequência de sufixo por a sua moeda -STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Alternar para Euro: {ORANGE}{NUM} -STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Alternar para Euro: {ORANGE}nunca -STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para alternar para Euro -STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para Euro anteriormente -STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Alternar para euro posteriormente +STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Mudar para Euro: {ORANGE}{NUM} +STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Mudar para Euro: {ORANGE}nunca +STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Definir o ano para mudar para Euro +STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais cedo +STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Mudar para Euro mais tarde STR_CURRENCY_PREVIEW :{LTBLUE}Previsão: {ORANGE}{CURRENCY_LONG} STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Libras (£) na sua moeda @@ -1222,14 +1222,14 @@ STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo de STR_CONFIG_SETTING_TYPE_CLIENT :Config. do cliente (não é guardado em savegames; afeta todos os jogos) STR_CONFIG_SETTING_TYPE_GAME_MENU :Config. do jogo (guardado no savegame; afeta apenas jogos novos) STR_CONFIG_SETTING_TYPE_GAME_INGAME :Config. do jogo (guardado no savegame; afeta apenas jogo atual) -STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos) -STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Config. da companhia (guardado no savegame; afeta apenas a comp. atual) +STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos) +STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual) STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Cuidado! STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Essa ação irá restaurar todas as configurações para os valores padrão.{}Tem certeza que deseja continuar? STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoria: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo: -STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a mostrar apenas filtros pré-definidos +STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo usando filtros pré-definidos STR_CONFIG_SETTING_RESTRICT_BASIC :Básico (apenas configs. importantes) STR_CONFIG_SETTING_RESTRICT_ADVANCED :Avançado (maior parte das configs.) STR_CONFIG_SETTING_RESTRICT_ALL :Expert (mostra todas as configs. inclusive as estranhas) @@ -1241,10 +1241,10 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos os tipos STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Configs. do cliente (não é guardado no savegame; afeta todos os jogos) STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Configs. do jogo (guardado no savegame; afeta apenas novos jogos) STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configs. do jogo (guardado no savegame; afeta apenas o jogo atual) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configs. da companhia (guardado no savegame; afeta apenas novos jogos) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configs. de companhia (guardado no savegame; afeta apenas a companhia atual) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configurações da empresa (guardado no savegame; afeta apenas novos jogos) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configurações da empresa (guardado no savegame; afeta apenas a empresa atual) -STR_CONFIG_SETTINGS_NONE :{G=m}{WHITE}- Nenhum - +STR_CONFIG_SETTINGS_NONE :{WHITE}- Nenhum - ###length 3 STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Categoria {BLACK}até {WHITE}{STRING} STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Tipo {BLACK}até {WHITE}Todas configurações de tipos @@ -1288,7 +1288,7 @@ STR_CONFIG_SETTING_RUNNING_COSTS :Custos de Opera STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Define o nível e custos de manutenção de veículos e infraestrutura STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Velocidade de construção: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limita ações de construção para IA's +STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Limitar a quantidade de ações de construção para IAs STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Quebra de veículos: {STRING} STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controla o quanto veículos mal conservados podem quebrar @@ -1306,7 +1306,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sem subsídios STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de construção: {STRING} -STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Define o nível de construção e custos de compra +STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Definir o nível de construção e os custos de aquisição STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING} STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativado, recessões podem ocorrer periodicamente. Durante uma recessão toda a produção é significativamente menor (ela retorna ao nível anterior quando a recessão termina) @@ -1315,7 +1315,7 @@ STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar rev STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Se ativado, trens não irão mudar de direção em estações não terminais, mesmo se houver um caminho mais curto ao próximo destino ao trocar de direção STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING} -STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Alterna desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestrutura +STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Ativar desastres que podem, ocasionalmente, bloquear ou destruir veículos ou infraestrutura STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da autoridade local: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolhe como a poluição sonoroa e ambiental afeta a classificação na cidade e as ações futuras nessa cidade @@ -1328,7 +1328,7 @@ STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(automático) STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Impossível definir o limite de altura do mapa para este valor. Há ao menos uma montanha mais alta que isso STR_CONFIG_SETTING_AUTOSLOPE :Permitir paisagismo sob edifícios, trilhos, etc.: {STRING} -STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite paisagismo sob edifícios e vias sem precisar removê-las +STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permitir paisagismo sob edifícios e vias sem precisar removê-las STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista das áreas de abrangência: {STRING} STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Exibe áreas de abrangência de para diferentes tipos de estações e aeroportos @@ -1398,8 +1398,8 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :Do lado que se STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Direita ###length 2 -STR_CONFIG_SETTING_SHOWFINANCES :Exibir janela das finanças no fim do ano: {STRING} -STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Exibir janela das finanças no fim do período: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES :Mostrar janela das finanças no fim do ano: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Mostrar janela das finanças no fim do período: {STRING} ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Se ativado, a janela de finanças é aberta ao final de cada ano para permitir uma inspeção fácil das economias da companhia @@ -1509,9 +1509,9 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (tempo do calendário congelado) STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Escalar a produção de carga da localidade: {STRING} -STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nesta percentagem. +STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das localidades nessa porcentagem. STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Escalar a produção de carga da indústria: {STRING} -STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nesta percentagem. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escalar a produção de carga das indústrias nessa porcentagem. STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING} @@ -1529,13 +1529,13 @@ STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :Quantia mínima STR_CONFIG_SETTING_ERRMSG_DURATION :Duração da mensagem de erro: {STRING} STR_CONFIG_SETTING_ERRMSG_DURATION_HELPTEXT :Define quanto tempo as janelas de erro (vermelhas) ficam abertas antes de fecharem automaticamente. Erros críticos devem ser fechados manualmente. -STR_CONFIG_SETTING_HOVER_DELAY :Exibir dicas: {STRING} +STR_CONFIG_SETTING_HOVER_DELAY :Mostrar dicas: {STRING} STR_CONFIG_SETTING_HOVER_DELAY_HELPTEXT :Intervalo antes das dicas de ferramentas aparecerem ao deixar o mouse sobre algum botão na interface. Em contrapartida, as dicas são mostradas ao se clicar com o botão direito se esse valor for definido para 0. STR_CONFIG_SETTING_HOVER_DELAY_VALUE :Aguardar {COMMA} milisegundo{P "" s} ###setting-zero-is-special STR_CONFIG_SETTING_HOVER_DELAY_DISABLED :Botão direito -STR_CONFIG_SETTING_POPULATION_IN_LABEL :Exibir população da cidade na janela da cidade: {STRING} +STR_CONFIG_SETTING_POPULATION_IN_LABEL :Mostrar população da localidade na identificação da localidade: {STRING} STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :Exibe a população das cidades nos nomes, no mapa STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :Espessura das linhas nos gráficos: {STRING} @@ -1550,7 +1550,7 @@ STR_CONFIG_SETTING_LANDSCAPE :Terreno: {STRIN STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :O terreno define a jogabilidade básica com diferentes cargas e requerimentos para o crescimento das cidades. NewGRF's e Scripts de Jogo permitem um controle mais fino STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de Terreno: {STRING} -STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do set gráficos base, e cria terrenos de formatos fixos. TerraGenesis é um gerador baseado em ruído Perlin com configurações mais delicadas +STR_CONFIG_SETTING_LAND_GENERATOR_HELPTEXT :O gerador original depende do conjunto gráfico base e produz formas de terreno pré-definidas. TerraGenesis é um gerador baseado no algoritmo de ruído de Perlin com definições mais refinadas ###length 2 STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis @@ -1589,7 +1589,7 @@ STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Apenas TerraGe STR_CONFIG_SETTING_RIVER_AMOUNT :Quantidade de rios: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Escolha quantos rios a serem gerados -STR_CONFIG_SETTING_TREE_PLACER :Algorítimo de colocação de árvores: {STRING} +STR_CONFIG_SETTING_TREE_PLACER :Algoritmo para colocação de árvores: {STRING} STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Escolha a distribuição das árvores no mapa: 'Original' planta árvores uniformemente pelo mapa, 'Melhorado' planta-as em grupos ###length 3 STR_CONFIG_SETTING_TREE_PLACER_NONE :Nenhum @@ -1652,7 +1652,7 @@ STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a STR_CONFIG_SETTING_MEASURE_TOOLTIP :Exibe distâncias quando usar ferramentas de construção: {STRING} STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Exibe distâncias e diferenças de altitude quando clicando e arrastando enquanto constrói -STR_CONFIG_SETTING_LIVERIES :Exibir cores avançadas: {STRING} +STR_CONFIG_SETTING_LIVERIES :Mostrar pinturas específicas do tipo de veículo: {STRING} STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Contra o uso de cores de veículos dependentes do tipo (ao invés de cores específicas à companhia) ###length 3 STR_CONFIG_SETTING_LIVERIES_NONE :Nenhum @@ -1660,7 +1660,7 @@ STR_CONFIG_SETTING_LIVERIES_OWN :Minha empresa STR_CONFIG_SETTING_LIVERIES_ALL :Todas as empresas STR_CONFIG_SETTING_PREFER_TEAMCHAT :Falar em time com : {STRING} -STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Alterna a ativação da conversa entre público e só-companhia entre e +STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Trocar o mapeamento entre o chat interno da empresa e o chat público para e respectivamente STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Velocidade do scrollwheel do mapa: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Controla a sensitividade do rolamento com a roda do mouser @@ -1725,27 +1725,27 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando -STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para as ordens: {STRING} -STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nas ordens dos veículos +STR_CONFIG_SETTING_TIMETABLE_MODE :Unidades de tempo para horários: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selecionar as unidades de tempo usadas nos horários dos veículos ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dias STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Segundos STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tiques -STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e saída nos planos de horário: {STRING} -STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibe tempos de chegada e partida anticipados nos planos de horário +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Mostrar chegada e partida nos horários: {STRING} +STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Exibir tempos de chegada e partida anticipados nos horários STR_CONFIG_SETTING_QUICKGOTO :Criar rapidamente ordens para um veículo: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Pre-seleciona a opção 'ir para' ao abrir a janelas de ordens STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Tipo padrão de ferrovia (ao criar ou carregar um jogo): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar o jogo. 'primeiro disponível' seleciona o mais antigo. 'último disponível' seleciona o mais novo. 'mais usado' seleciona o que é atualmente mais usado +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho a ser selecionado ao carregar/iniciar um jogo. 'primeiro disponível' seleciona o tipo mais antigo. 'último disponível' seleciona o tipo mais novo de trilho e 'mais usado' seleciona o tipo que é mais usado atualmente ###length 3 STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado -STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Exibir vias reservadas para trilhos: {STRING} +STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Mostrar trajetos reservados para trilhos: {STRING} STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Escurece as vias reservadas para ajudar a lidar com problemas de trens não funcionando em blocos baseados em destinos STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter a barra de construção aberta: {STRING} @@ -1764,7 +1764,7 @@ STR_CONFIG_SETTING_SOUND_TICKER :Notícias: {STR STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Toca um som para mensagens resumidas STR_CONFIG_SETTING_SOUND_NEWS :Jornal: {STRING} -STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Toca efeito sonoro ao exibir jornais +STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Reproduzir efeito sonoro ao exibir jornais ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :Fim de ano: {STRING} @@ -1847,7 +1847,7 @@ STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limite d STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ativado, usa limites de velocidade para vagões para decidir a velocidade máxima de um trem STR_CONFIG_SETTING_DISABLE_ELRAILS :Desativar ferrovias elétricas: {STRING} -STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativado, remove a necessidade de trilhos elétricos para locomotivas elétricas, permitindo-nas usar trilhos normais +STR_CONFIG_SETTING_DISABLE_ELRAILS_HELPTEXT :Ativar essa configuração desativa o requisito de eletrificação dos trilhos para que locomotivas elétricas possam utilizá-los STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Chegada do primeiro veículo à estação do jogador: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN_HELPTEXT :Exibe um jornal quando o primeiro veículo chega numa estação do jogador @@ -1862,7 +1862,7 @@ STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Acidentes de ve STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Mostrar um jornal sobre os acidentes de veículos dos competidores STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informações da empresa: {STRING} -STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibe um jornal quando uma companhia é aberta, ou quando estão próximas da bancarrota +STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibir um jornal quando uma nova empresa é criada, ou quando empresas estão à beira da falência STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN :Abertura de indústrias: {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_OPEN_HELPTEXT :Exibe um jornal quando indústrias abrem @@ -1874,13 +1874,13 @@ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES :Mudanças econ STR_CONFIG_SETTING_NEWS_ECONOMY_CHANGES_HELPTEXT :Exibe um jornal referente a mudanças globais na economia STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY :Mudanças na produção das indústrias servidas pela empresa: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pela companhia +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_COMPANY_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que são atendidas pela empresa mudarem STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER :Mudanças na produção de indústrias servida pelo(s) concorrente(es): {STRING} STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_OTHER_HELPTEXT :Exibe um jornal quando a produção de indústrias muda, que são atendidas pelos competidores STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED :Outras mudanças de produção das indústrias: {STRING} -STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :{G=f}Exibe um jornal quando a produção de indústrias muda, que não não atendidas pela companhia ou competidores +STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Exibir um jornal quando o nível de produção das indústrias que não não atendidas pela empresa ou por competidores mudar STR_CONFIG_SETTING_NEWS_ADVICE :Conselhos / informações sobre os veículos da empresa: {STRING} STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Exibe mensagens sobre veículos precisando de atenção @@ -1933,12 +1933,13 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Seleciona o ano STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Tipo de sinal a ser exibido: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecione quais os tipos de sinais mostrar ao usar Ctrl+Clique num sinal existente com a ferramenta de sinais ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Apenas grupo atual STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos visíveis STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostrar tipos de sinais: {STRING} STR_CONFIG_SETTING_SIGNAL_GUI_MODE_HELPTEXT :Escolha quais tipos de sinais são mostrados na barra de ferramentas de sinais ###length 2 -STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Sinal de trajeto apenas +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :Apenas sinais de trajeto STR_CONFIG_SETTING_SIGNAL_GUI_MODE_ALL_CYCLE_PATH :Todos os sinais STR_CONFIG_SETTING_TOWN_LAYOUT :Disposição de ruas para novas cidades: {STRING} @@ -2037,7 +2038,7 @@ STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo gasto par STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribuição para passageiros: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que aproximadamente o mesmo número de passageiros irá de uma estação A para uma estação B como de B para A. "Assimétrico" significa que um número arbitrário de passageiros pode ir em qualquer direção. "Manual" significa que não haverá distribuição automática para os passageiros. -STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correios: {STRING} +STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Modo de distribuição para correspondências: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"Simétrico" significa que aproximadamente a mesma quantidade de correspondência será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias de correspondência podem ser enviadas em qualquer direção. "Manual" significa que nenhuma distribuição automática ocorrerá por correio. STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe de carga BLINDADA contém objetos de valor em clima temperado, diamantes em clima subtropical ou ouro em clima subártico. NewGRFs podem mudar isso. "Simétrica" significa que aproximadamente a mesma quantidade dessa carga será enviada de uma estação A para uma estação B como de B para A. "Assimétrica" significa que quantidades arbitrárias dessa carga podem ser enviadas em qualquer direção. "Manual" significa que não haverá distribuição automática para aquela carga. Recomenda-se definir isso como assimétrico ou manual ao jogar subártico ou subtropical, pois os bancos só recebem carga nesses climas. Para temperado, você também pode escolher simétrico, pois os bancos enviarão objetos de valor de volta ao banco de origem. @@ -2052,12 +2053,12 @@ STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão da di STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto você define esse valor, mais tempo de CPU será dado ao cálculo do gráfico. Se levar muito tempo, você poderá notar um pouco de lag. Se você definir um valor muito baixo, a distribuição será imprecisa, e você notará cargas deixando de serem enviadas aonde deveriam ir. STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito da distância na demanda: {STRING} -STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga levada de A até B. Quanto mais distante B for da A, menos carga será enviada. Quanto mais alto você definir esse valor, menos carga será levada para estações distantes, e mais carga será levada para estações próximas. +STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Se você definir esse valor para maior que 0, a distância entre a estação de origem A para alguma carga e um possível destino B terá um efeito na quantidade de carga transportada de A até B. Quanto mais distante B estiver de A, menos carga será enviada. Quanto maior valor definido, menos carga será transportada para estações distantes e mais carga será levada para estações próximas. STR_CONFIG_SETTING_DEMAND_SIZE :Quantidade de carga retornada no modo simétrico: {STRING} STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Definir isso para menos de 100% faz com que a distribuição simétrica comporte-se mais como a assimétrica. Menos carga será devolvida forçosamente se uma certa quantidade for mandada a uma estação. Se você definir a 0%, a distribuição se comportará exatamente como a assimétrica. STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturação de caminhos curtos antes de usar caminhos de alta capacidade: {STRING} -STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos caminhos entre duas estações. Cargodist irá saturar o caminho mais curto primeiro, depois usar o segundo caminho mais curto até saturá-lo, e assim por diante. Saturação é determinada pela estimação da capacidade de do uso planejado. Ao saturar todos os caminhos, se ainda houver demanda, irá sobrecarregar todos os caminhos, com preferência aos de maior capacidade. No entanto, na maior parte do tempo o algorítimo não irá estimar a capacidade corretamente. Essa configuração permite você definir até que porcentagem um caminho mais curto deverá ser saturado na primeira passada antes do algorítimo proceder ao próxido. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. +STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frequentemente há múltiplos trajetos entre duas estações. Cargodist irá saturar o trajeto mais curto primeiro, depois usar o segundo trajeto mais curto até saturá-lo, e assim por diante. A saturação é determinada por uma estimativa da capacidade e do uso planejado. Ao saturar todos os trajetos, se ainda houver demanda não atendida, irá sobrecarregar todos os trajetos, com preferência pelos de maior capacidade. Entretanto, na maioria das vezes o algoritmo não irá estimar corretamente a capacidade. Essa configuração permite definir até que porcentagem um trajeto mais curto deverá ser saturado na primeira passada antes do algoritmo selecionar o próximo trajeto mais longo. Defina-o para menos de 100% para evitar estações sobrecarregadas no caso de capacidade superestimada. STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terrestre): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidades de velocidade (náutica): {STRING} @@ -2112,7 +2113,7 @@ STR_CONFIG_SETTING_INTERFACE_GENERAL :Geral STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :Janelas de visualização STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :Construção STR_CONFIG_SETTING_ADVISORS :Notícias / Conselheiros -STR_CONFIG_SETTING_COMPANY :Companhia +STR_CONFIG_SETTING_COMPANY :Empresa STR_CONFIG_SETTING_ACCOUNTING :Contabilidade STR_CONFIG_SETTING_VEHICLES :Veículos STR_CONFIG_SETTING_VEHICLES_PHYSICS :Física @@ -2132,12 +2133,12 @@ STR_CONFIG_SETTING_AI :Oponentes STR_CONFIG_SETTING_AI_NPC :Computadores STR_CONFIG_SETTING_NETWORK :Rede -STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Pathfinder para trens: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Algorítimo de formulação de vias para trens, que define quais vias tomar -STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Pathfinder para automóveis: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Algorítimo de formulação de vias para automóveis, que define quais vias tomar -STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Pathfinder para embarcações: {STRING} -STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Algorítimo de formulação de vias para embarcações, que define quais vias tomar +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :Gerador de rotas para trens: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :Gerador de rotas para usar nos trens +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES :Gerador de rotas para veículos rodoviários: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_ROAD_VEHICLES_HELPTEXT :Gerador de rotas para usar nos veículos rodoviários +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS :Gerador de rotas para embarcações: {STRING} +STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :Gerador de rotas para usar nas embarcações STR_CONFIG_SETTING_REVERSE_AT_SIGNALS :Reversão automática em sinais: {STRING} STR_CONFIG_SETTING_REVERSE_AT_SIGNALS_HELPTEXT :Permite trens reverterem sentido num sinal, se estiverem aguardando por muito tempo ###length 2 @@ -2203,7 +2204,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Selecion STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'subtropical' STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Selecionar cenário do estilo 'toyland' -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Exibir opções de jogo +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Abrir opções de jogo STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Mostrar tabela de classificações STR_INTRO_TOOLTIP_HELP :{BLACK}Obter acesso à documentação e recursos online STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Mostrar configurações @@ -2243,7 +2244,7 @@ STR_HELP_WINDOW_COMMUNITY :{BLACK}Comunida # Cheat window STR_CHEATS :{WHITE}Opções da sandbox STR_CHEAT_MONEY :{LTBLUE}Aumentar dinheiro em {CURRENCY_LONG} -STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando pela Co.: {ORANGE}{COMMA} +STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Jogando como empresa: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Escavadeira mágica (destrói indústrias, objetos estáticos): {ORANGE}{STRING} STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Os túneis poderão cruzar-se: {ORANGE}{STRING} STR_CHEAT_NO_JETCRASH :{LTBLUE}Aeronaves a jato não irão se acidentar (frequentemente) em aeroportos pequenos: {ORANGE} {STRING} @@ -2257,15 +2258,15 @@ STR_CHEAT_STATION_RATING :{LTBLUE}Fixar a # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de cores -STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Exibir esquemas de cor gerais +STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Mostrar esquemas de cores gerais STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Exibe esquemas de cor de trens -STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Exibir os esquemas de cor de automóveis -STR_LIVERY_SHIP_TOOLTIP :{BLACK}Exibir esquemas de cor de embarcação -STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Exibir esquemas de cor de aviões -STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de trens -STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de veículos -STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Exibir cores de grupos de embarcações -STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Exibir cores dos grupos de aeronaves +STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Mostrar esquemas de cores de veículos rodoviários +STR_LIVERY_SHIP_TOOLTIP :{BLACK}Mostrar esquemas de cores de embarcações +STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Mostrar esquemas de cores de aeronaves +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de trens +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de veículos rodoviários +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de embarcações +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Mostrar cores dos grupos de aeronaves STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Escolha a cor principal para o esquema selecionado. Ctrl+Clique define essa cor para todos os esquemas STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Escolha a cor secundária para o esquema selecionado. Ctrl+Clique aplica essa cor para todos os esquemas STR_LIVERY_PANEL_TOOLTIP :{BLACK}Selecionar um esquema de cores para mudar, ou múltiplos esquemas com CTRL+clique. Marque a opção para utilizar o esquema @@ -2375,7 +2376,7 @@ STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Clientes STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Clientes ligados / max. clientes{}Empresas ligados / max, empresas STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Tamanho do mapa -STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para exibir por área +STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Tamanho do mapa do jogo{}Clique para ordenar por área STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Data STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Data atual STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}min @@ -2542,7 +2543,7 @@ STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP :{BLACK}Usar est # Network company info join/password STR_COMPANY_VIEW_JOIN :{BLACK}Entrar -STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa companhia +STR_COMPANY_VIEW_JOIN_TOOLTIP :{BLACK}Entrar e jogar como essa empresa STR_COMPANY_VIEW_PASSWORD :{BLACK}Senha STR_COMPANY_VIEW_PASSWORD_TOOLTIP :{BLACK}Protege a sua empresa com uma senha para prevenir a entrada de usuários não autorizados STR_COMPANY_VIEW_SET_PASSWORD :{BLACK}Definir senha para empresa @@ -2601,7 +2602,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :um pacote invá STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :versão incorreta STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :nome já está em uso STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :senha incorreta -STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :wrong company-id in DoCommand (ERRO) +STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :empresa errada em DoCommand STR_NETWORK_ERROR_CLIENT_KICKED :expulso pelo servidor STR_NETWORK_ERROR_CLIENT_CHEATER :estava tentando trapacear STR_NETWORK_ERROR_CLIENT_SERVER_FULL :servidor cheio @@ -2626,7 +2627,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Jogo despausado STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de jogadores STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :clientes conectando-se STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual -STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :{G=m}script do jogo +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script do jogo STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :aguardando atualização do gráfico de links STR_NETWORK_MESSAGE_CLIENT_LEAVING :saindo @@ -2679,7 +2680,7 @@ STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Esta de STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Você já baixou isso STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Esse conteúdo é desconhecido e não pode ser baixado pelo OpenTTD -STR_CONTENT_DETAIL_UPDATE :{G=f}{SILVER}Isso substitui uma {STRING} existente +STR_CONTENT_DETAIL_UPDATE :{SILVER}Isto é uma substituição para um existente {STRING} STR_CONTENT_DETAIL_NAME :{SILVER}Nome: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Versão: {WHITE}{STRING} STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Descrição: {WHITE}{STRING} @@ -2728,15 +2729,15 @@ STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Sair do # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Opções de Transparência -STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Alternar transparência para sinais de estação. Ctrl+Clique para travar -STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Alternar transparência para árvores. Ctrl+Clique para travar -STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Alternar transparência para casas. Ctrl+Clique para travar -STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Alternar transparência para indústrias. Ctrl+Clique para travar -STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Alternar transparência para construções como estações, depósitos, pontos de controle. Ctrl+Clique para travar -STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Alternar transparência para pontes. Ctrl+Clique para travar -STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Alternar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar -STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Alternar transparência para catenária. Ctrl+Clique para travar -STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Alternar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar. +STR_TRANSPARENT_SIGNS_TOOLTIP :{BLACK}Ativar transparência dos sinais. Ctrl+Clique para travar +STR_TRANSPARENT_TREES_TOOLTIP :{BLACK}Ativar transparência das árvores. Ctrl+Clique para travar +STR_TRANSPARENT_HOUSES_TOOLTIP :{BLACK}Ativar transparência das casas. Ctrl+Clique para travar +STR_TRANSPARENT_INDUSTRIES_TOOLTIP :{BLACK}Ativar transparência das indústrias. Ctrl+Clique para travar +STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}Ativar transparência das construções como estações, depósitos e pontos de controle. Ctrl+Clique para travar +STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}Ativar transparência das pontes. Ctrl+Clique para travar +STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}Ativar transparência para estruturas como faróis e antenas. Ctrl+Clique para travar +STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}Ativar transparência para catenária. Ctrl+Clique para travar +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}Ativar transparência do texto de carregamento e custo/receita. Ctrl+Clique para travar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Definir objetivos como invisíveis ao invés de transparentes. # Linkgraph legend window @@ -2792,7 +2793,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construi STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinal na ferrovia. Ctrl+Clique para construir o sinal com estilo diferente{}Clique+Arraste para preencher a seção selecionada da ferrovia com os sinais no espaçamento escolhido. Ctrl+Clique+Arraste para colocar sinais até a próxima junção, estação ou sinal. Pressionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Presionar Shift mostra o custo estimado STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Pressionar Shift mostra o custo estimado -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar entre construir/remover linha férrea, sinais, pontos de controle e estações. Pressionar Ctrl+Clique remove os trilhos de pontos de controle e das estações +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Ativar construir/remover linha férrea, sinais, pontos de controle e estações. Ctrl+Clique remove os trilhos de pontos de controle e das estações STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Converter/Atualizar tipo de trilho. Pressione Shift para somente mostrar o custo estimado STR_RAIL_NAME_RAILROAD :Ferrovia @@ -2802,7 +2803,7 @@ STR_RAIL_NAME_MAGLEV :Maglev # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Ferroviário -STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação do depósito ferroviário +STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do depósito ferroviário # Rail waypoint construction window STR_WAYPOINT_CAPTION :{WHITE}Ponto de controle @@ -2811,7 +2812,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Selecion # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Seleção de Estação STR_STATION_BUILD_ORIENTATION :{BLACK}Orientação -STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação ferroviária +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação ferroviária STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Número de linhas STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Selecionar o número de linhas da estação ferroviária STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Tamanho da plataforma @@ -2830,20 +2831,20 @@ STR_STATION_CLASS_WAYP_WAYPOINT :Ponto de contro # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Seleção de Sinais -STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Alternar se mostra os tipos de sinais avançados -STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinais padrão (semáforos){}Sinais são necessários para impedir trens de colidirem nas malhas ferroviárias com mais de um trem -STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho -STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada -STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combo (semáforo){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações -STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo -STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de trajeto de mão única(Semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária -STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal Padrão (elétrico){}Sinais são necessários para impedir que trens batam em redes de ferrovias com mais de uma máquina -STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (elétrico){}Verde enquanto haja um ou mais sinais de saída verdes na atual seção dos trilhos. Do contrário, mostra vermelho -STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída(elétrico){}Funciona como um sinal normal, porém é necessário para o funcionamento correto do sistema de pré-sinais combo ou de entrada -STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal Combo (elétrico){}O sinal combo funciona tanto como um sinal de entrada quanto de saída. Permite construir várias ramificações de pré-sinais -STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (Elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados pelo lado de trás -STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal avançado de mão única(Elétrico){}Um sinal de trajeto permite mais de um trem em um bloco de ferrovia, Se o trem no bloco puder reservar um local seguro para parar, o sinal de trajeto já permite a passada do próximo, porém não permite a passagem na via contrária -STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique anterna a variante existente. Shift+Clique mostra o custo estimado da conversão +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Ativar a exibição dos tipos de sinais avançados +STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Sinal de bloco (semáforo){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha ao mesmo tempo +STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Sinal de Entrada (semáforo){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho +STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Sinal de saída (semáforo){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. +STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Sinal combinado (semáforo){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite a construção de ramificações complexas de pré-sinais. +STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Sinal de trajeto(semáforo){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário +STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único(semáforo){}Um sinal de trajeto permite mais de um trem em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário +STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Sinal de bloco (elétrico){}Este é o tipo mais básico de sinal, permitindo que apenas um trem fique em um bloco de linha em um dado momento +STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Sinal de entrada (elétrico){}Fica verde enquanto houver um ou mais sinais de saída verdes no trecho da linha. Caso contrário, ficará vermelho. +STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Sinal de saída (elétrico){}Funciona da mesma forma que o sinal de bloco, mas é necessário para ativar a cor correta nos pré-sinais de entrada e combinado. +STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Sinal combinado (elétrico){}O sinal combinado funciona simultaneamente como um sinal de entrada e de saída. Isto permite construir ramificações complexas de pré-sinais. +STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Sinal de trajeto (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Sinais de trajeto padrões podem ser passados no sentido contrário +STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Sinal de sentido único (elétrico){}Um sinal de trajeto permite mais de um trem entrar em um bloco de sinal ao mesmo tempo, se o trem puder reservar um trajeto para um ponto seguro de parada. Os sinais de sentido único não podem ser passados no sentido contrário +STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Converter sinal{}Clique em um sinal existente para convertê-lo para o tipo e variante de sinal selecionado. Ctrl+Clique muda a variante existente. Shift+Clique mostra o custo estimado da conversão STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Densidade dos sinais ao clicar e arrastar STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Diminuir a densidade dos sinais STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Aumentar a densidade dos sinais @@ -2884,8 +2885,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para bondes. Pressionar Shift mostra o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressionar Shift mostra o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para bondes. Pressionar Shift mostra o custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas -STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar entre construir/remover linhas de bonde +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Ativar construir/remover estradas +STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Ativar construir/remover linhas de bonde STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Converter/Atualizar o tipo de estrada. Pressione Shift para mostrar somente o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Converter/Atualizar o tipo de bonde. Pressionar Shift mostra o custo estimado @@ -2893,20 +2894,20 @@ STR_ROAD_NAME_ROAD :Estrada STR_ROAD_NAME_TRAM :Bonde # Road depot construction window -STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação da Garagem -STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação da garagem -STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito -STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar a orientação do depósito de bonde +STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito Rodoviário +STR_BUILD_DEPOT_ROAD_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito rodoviário +STR_BUILD_DEPOT_TRAM_ORIENTATION_CAPTION :{WHITE}Orientação do Depósito de Bondes +STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Selecionar orientação do depósito de bondes # Road vehicle station construction window -STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação do estação de ônibus +STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Orientação da Estação de Ônibus STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação do estação de ônibus -STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da área de carga -STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar a orientação da estação de caminhões -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde Passageiros -STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Carga -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bonde +STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Orientação da estação de carga +STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de caminhões +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bonde de Passageiros +STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de passageiros +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Orientação da Estação de Bondes de Carga +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Selecionar orientação da estação de bondes de carga # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Construção de Hidrovias @@ -2994,7 +2995,7 @@ STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Diminui STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Gera terreno aleatório STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Criar novo cenário STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Limpar terreno -STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remove todas as propriedades da empresa do mapa +STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Remover todas as propriedades das empresas do mapa STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Limpar Terreno STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Tem certeza que quer remover todas as propriedades da empresa? @@ -3053,14 +3054,14 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Você t STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Cadeia da Indústria - {STRING} STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Cadeia de Carga - {STRING} STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Indústrias produtoras -STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias aceptoras +STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Indústrias que aceitam STR_INDUSTRY_CARGOES_HOUSES :{WHITE}Casas STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP :{BLACK}Clique na indústria para ver seus fornecedores e clientes STR_INDUSTRY_CARGOES_CARGO_TOOLTIP :{BLACK}{STRING}{}Clique na carga para ver seus fornecedores e clientes STR_INDUSTRY_DISPLAY_CHAIN :{BLACK}Cadeia da Indústria STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP :{BLACK}Exibe indústrias que suprem e aceitam carga -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Exiba também no minimapa -STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Selecione as indústrias exibidas no minimapa também +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP :{BLACK}Ligar ao minimapa +STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP :{BLACK}Também selecionar as indústrias exibidas no minimapa STR_INDUSTRY_CARGOES_SELECT_CARGO :{BLACK}Selecionar carga STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP :{BLACK}Selecionar a carga que você deseja exibir STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}Selecionar a indústria @@ -3105,28 +3106,28 @@ STR_LAI_CLEAR_DESCRIPTION_FIELDS :Campos STR_LAI_CLEAR_DESCRIPTION_SNOW_COVERED_LAND :Neve STR_LAI_CLEAR_DESCRIPTION_DESERT :Deserto -STR_LAI_RAIL_DESCRIPTION_TRACK :Trilho de ferrovia -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Trilho de ferrovia com sinais normais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Trilho de ferrovia com pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Trilho de ferrovia com sinais de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Trilho de ferrovia com sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Trilho de ferrovia com sinais de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Trilhos de Ferrovia com sinais de trajeto de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Trilho de ferrovia com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Trilho de ferrovia com sinais normais e pré-sinais -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Trilho de ferrovia com sinais normais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Trilho de ferrovia com sinais normais e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Trilho de ferrovia com sinais normais e de trajeto de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Trilho de ferrovia com pré-sinais e de saída -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Trilho de ferrovia com pré-sinais e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Trilho de ferrovia com pré-sinais e sinais de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Trilho de ferrovia com pré-sinais de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Trilho de ferrovia com sinais de saída e sinais-combo -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Trilho de ferrovia com sinais de saída e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Trilho de ferrovia com sinais de saída de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Trilho de ferrovia com sinais-combo e de trajeto -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Trilho de ferrovia com sinais-combo de trajeto e de mão única -STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Trilho de ferrovia com sinais de trajeto normais e de mão única +STR_LAI_RAIL_DESCRIPTION_TRACK :Ferrovia +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Ferrovia com sinais de bloqueio +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Ferrovia com pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Ferrovia com sinais de saída +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Ferrovia com sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Ferrovia com sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Ferrovia com sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Ferrovia com sinais de bloqueio e pré-sinais +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Ferrovia com sinais de bloqueio e de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Ferrovia com sinais de bloqueio e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Ferrovia com sinais de bloqueio e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Ferrovia com sinais de bloqueio e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Ferrovia com pré-sinais e sinais de saida +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_COMBOSIGNALS :Ferrovia com pré-sinais e sinais combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_PBSSIGNALS :Ferrovia com pré-sinais e sinais de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_NOENTRYSIGNALS :Ferrovia com pré-sinais e sinais de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Ferrovia com sinais de saida e combinados +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Ferrovia com sinais de saída e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Ferrovia com sinais de saida e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Ferrovia com sinais combinados e de trajeto +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Ferrovia com sinais combinados e de sentido único +STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Ferrovia com sinais de trajeto e de sentido único STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Depósito de ferrovia STR_LAI_ROAD_DESCRIPTION_ROAD :Rodovia @@ -3267,8 +3268,8 @@ STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Remover STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salvar STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual, usando o nome escolhido STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar -STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carrega o jogo selecionado -STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carrega o mapa topográfico selecionado +STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carregar o jogo selecionado +STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carregar o mapa topográfico selecionado STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} @@ -3279,7 +3280,7 @@ STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Tem cer STR_SAVELOAD_DIRECTORY :{STRING} (Diretório) STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Diretório raiz) -STR_SAVELOAD_OSKTITLE :{BLACK}Coloque o nome para o jogo salvo +STR_SAVELOAD_OSKTITLE :{BLACK}Digitar um nome para o jogo gravado # World generation STR_MAPGEN_WORLD_GENERATION_CAPTION :{WHITE}Geração de mundo @@ -3289,7 +3290,7 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}No. de cidades: STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selecionar a densidade de cidades ou fornecer um número STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nome das cidades: -STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das cidades +STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Selecionar o estilo dos nomes das localidades STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selecionar a data inicial STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}No. de indústrias: @@ -3426,9 +3427,9 @@ STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Atualiza STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Uma lista dos NewGRF instalados. STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros -STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Exibir parâmetros -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Alterna paleta -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo +STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Mostrar parâmetros +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Mostrar paleta +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Ativar a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Procurar o conteúdo on-line @@ -3567,7 +3568,7 @@ STR_NEWGRF_BROKEN_CAPACITY :{WHITE}A capaci STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trem '{VEHICLE}' de '{COMPANY}' tem um tamanho inválido. Provavelmente causado por um NewGRF. O jogo pode travar ou sair de sincronia STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' retorna informação incorreta -STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Informação de carga/readaptação para '{1:ENGINE}' difere da lista de aquisição após a construção. Isso pode causar a autorenovação/-substituição à falhar a readaptação corretamente. +STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}A informação de carga/adaptação para '{1:ENGINE}' difere da lista de aquisição depois da construção. Isto poderá causar problemas ao adaptar quando for renovado/substituído automaticamente STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' causou um loop infinito no callback da produção STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Retorno {1:HEX} retornou um resultado desconhecido/inválido {2:HEX} STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' retornou tipo de carga inválido no retorno de chamada de produção em {2:HEX} @@ -3590,8 +3591,8 @@ STR_NEWGRF_SCAN_ARCHIVES :Procurando arqu # Sign list window STR_SIGN_LIST_CAPTION :{WHITE}Lista de Placas - {COMMA} Placa{P "" s} -STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar caixa alta -STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativa/Desativa a diferenciação de caixa alta na comparação dos nomes pelo filtro +STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas +STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação dos nomes com a sequência fornecida # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Editar texto da placa @@ -3613,9 +3614,9 @@ STR_TOWN_POPULATION :{BLACK}Populaç STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (Cidade) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} últ. mês: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} último mês: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}{CARGO_LIST} último minuto: {ORANGE}{COMMA}{BLACK} máx: {ORANGE}{COMMA} -STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para prover o crescimento: +STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}Carga necessária para o crescimento da localidade: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{ORANGE}{STRING}{RED} necessário(a) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} necessário no inverno STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} entregues @@ -3625,7 +3626,7 @@ STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Localida STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Localidade cresce a cada {ORANGE}{UNITS_DAYS_OR_SECONDS} (financiada) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}A cidade {RED}não{BLACK} está crescendo STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Limite de ruído na cidade: {ORANGE}{COMMA}{BLACK} max: {ORANGE}{COMMA} -STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localidade. Ctrl+Clique abre uma nova visualização na posição da localidade +STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da localidade. Ctrl+Clique abre uma nova visualização na posição da localidade STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Autoridade Local STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Mostrar informações sobre a autoridade local STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Renomear cidade @@ -3641,7 +3642,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Renomear Cidade STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} autoridade local STR_LOCAL_AUTHORITY_ZONE :{BLACK}Zona STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Mostrar a zona dentro dos limites da autoridade local -STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Avaliações das empresas +STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Classificações das empresas de transporte: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Ações disponíveis: STR_LOCAL_AUTHORITY_ACTIONS_TOOLTIP :{BLACK}Lista de ações disponíveis desta cidade - clique no item para mais detalhes @@ -3673,16 +3674,16 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{Y # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objetivos STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objetivos globais -STR_GOALS_SPECTATOR :Objetivos Globais +STR_GOALS_SPECTATOR :Metas Globais STR_GOALS_GLOBAL_BUTTON :{BLACK}Globais -STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostra objetivos globais +STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Mostrar as metas globais STR_GOALS_COMPANY_BUTTON :{BLACK}Empresa -STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostra objetivos da empresa +STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Mostrar as metas da empresa STR_GOALS_TEXT :{ORANGE}{STRING} -STR_GOALS_NONE :{G=m}{ORANGE}- Nenhum - +STR_GOALS_NONE :{ORANGE}- Nenhum - STR_GOALS_PROGRESS :{ORANGE}{STRING} STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} -STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova vista na localização da indústria/localidade/quadrado +STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clique no objetivo para centrar a vista principal na indústria/localidade/quadrado. Ctrl+Clique abre uma nova visualização na localização da indústria/localidade/quadrado # Goal question window STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Pergunta @@ -3743,7 +3744,7 @@ STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Manter C STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} Estações STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} -STR_STATION_LIST_NONE :{G=m}{YELLOW}- Nenhum - +STR_STATION_LIST_NONE :{YELLOW}- Nenhum - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Selecionar todas as instalações STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Selecionar todos os tipos de carga (inclusive as que não tem espera) STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Não há carga de nenhum tipo aguardando @@ -3754,16 +3755,16 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L STR_STATION_VIEW_RESERVED :{YELLOW}({CARGO_SHORT} reservado para carregamento) STR_STATION_VIEW_ACCEPTS_BUTTON :{BLACK}Aceita -STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Exibir lista de carga aceita +STR_STATION_VIEW_ACCEPTS_TOOLTIP :{BLACK}Mostrar lista de carga aceita STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceita: {WHITE}{CARGO_LIST} -STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos de transporte exclusivos nessa cidade. +STR_STATION_VIEW_EXCLUSIVE_RIGHTS_SELF :{BLACK}Essa estação tem direitos exclusivos de transporte nessa cidade. STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPANY}{BLACK} adquiriu direitos exclusivos de transporte nessa cidade. -STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Avaliações -STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Exibir avaliações da estação -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Suprimento por mês e classificação local: -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Suprimento por minuto e classificação local: +STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Classificações +STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostrar classificações da estação +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Fornecimento por mês e avaliação local: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Fornecimento por minuto e avaliação local: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}Agrupar por @@ -3799,13 +3800,13 @@ STR_CARGO_RATING_VERY_GOOD :Muito Bom STR_CARGO_RATING_EXCELLENT :Excelente STR_CARGO_RATING_OUTSTANDING :Proeminente -STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da estação. Ctrl+Clique abre uma nova visualização na localização da estação +STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da estação. Ctrl+Clique abre uma nova visualização na posição da estação STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Alterar o nome da estação -STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Exibir todos os trens que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Exibir todos os automóveis que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Exibir todas as aeronaves que possuem esta estação nas ordens de serviço -STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que possuem esta estação nas ordens de serviço +STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Mostrar todos os trens que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Mostrar todos os veículos rodoviários que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Mostrar todas as aeronaves que têm esta estação na sua programação +STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Exibir todas as embarcações que têm esta estação na sua programação STR_STATION_VIEW_RENAME_STATION_CAPTION :Renomear estação/área de carga @@ -3814,9 +3815,9 @@ STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Impedir # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} -STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização do ponto de controle. Ctrl+Clique abre uma nova visualização na localização do ponto de controle +STR_WAYPOINT_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição do ponto de controle. Ctrl+Clique abre uma nova visualização na posição do ponto de controle STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME :{BLACK}Renomear ponto de controle -STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na localização da bóia. Ctrl+Clique abre uma nova visualização na localização da bóia +STR_BUOY_VIEW_CENTER_TOOLTIP :{BLACK}Centrar visualização na posição da bóia. Ctrl+Clique abre uma nova visualização na posição da bóia STR_BUOY_VIEW_CHANGE_BUOY_NAME :{BLACK}Renomear bóia STR_EDIT_WAYPOINT_NAME :{WHITE}Editar nome do ponto de controle @@ -3873,10 +3874,10 @@ STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE :{WHITE}{PRESIDE STR_COMPANY_VIEW_INAUGURATED_TITLE :{GOLD}Inaugurado: {WHITE}{NUM} STR_COMPANY_VIEW_COLOUR_SCHEME_TITLE :{GOLD}Cores: STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Veículos: -STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} tre{P m ns} +STR_COMPANY_VIEW_TRAINS :{WHITE}{COMMA} trem{P "" s} STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}{COMMA} automóve{P l is} STR_COMPANY_VIEW_AIRCRAFT :{WHITE}{COMMA} aeronave{P "" s} -STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} embarcaç{P ão ões} +STR_COMPANY_VIEW_SHIPS :{WHITE}{COMMA} navio{P "" s} STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}Nenhum STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}Valor da empresa: {WHITE}{CURRENCY_LONG} STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}Infraestrutura: @@ -3890,20 +3891,20 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_NONE :{WHITE}Nenhum STR_COMPANY_VIEW_BUILD_HQ_BUTTON :{BLACK}Construir sede STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Construir sede da companhia STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Ver sede -STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da companhia +STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Ver sede da empresa STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Mover sede STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Reconstruir sede da empresa em outro local por 1% do valor da empresa. Shift+Clique mostra o preço estimado sem reconstruir a sede STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Detalhes -STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas de infraestrutura +STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ver informações detalhadas da infraestrutura STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Dar dinheiro -STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dá dinheiro a essa empresa +STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Dar dinheiro a essa empresa STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}Aquisição hostil STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}Fazer a aquisição hostil desta empresa STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Novo Rosto STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Selecionar novo rosto para o presidente STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Cores -STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos +STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Alterar cores dos veículos da empresa STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Empresa STR_COMPANY_VIEW_COMPANY_NAME_TOOLTIP :{BLACK}Alterar nome da empresa STR_COMPANY_VIEW_PRESIDENT_NAME_BUTTON :{BLACK}Presidente @@ -4049,18 +4050,18 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nova Locomotiva STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nova Locomotiva Monotrilho STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nova Locomotiva Maglev -STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Automóveis -STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novo Veículo Elétrico +STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Novos Veículos Rodoviários +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Novos Veículos tipo Bonde # Vehicle availability ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Trens -STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novo Veículo Terrestre +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Novos Veículos Rodoviários STR_BUY_VEHICLE_SHIP_CAPTION :Novas Embarcações STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nova Aeronave STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Peso: {GOLD}{WEIGHT_SHORT} -STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Peso: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Velocidade: {GOLD}{VELOCITY}{BLACK} Potência: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Velocidade: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Velocidade em oceanos: {GOLD}{VELOCITY} @@ -4072,10 +4073,10 @@ STR_PURCHASE_INFO_REFITTABLE :(adaptável) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Desenvolvida: {GOLD}{NUM}{BLACK} Vida: {GOLD}{COMMA} ano{P "" s} STR_PURCHASE_INFO_RELIABILITY :{BLACK}Confiabilidade Máx.: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Preço: {GOLD}{CURRENCY_LONG} -STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo para Reequipar: {GOLD}{CURRENCY_LONG}{BLACK}) +STR_PURCHASE_INFO_COST_REFIT :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Peso: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Preço: {GOLD}{CURRENCY_LONG}{BLACK} Velocidade: {GOLD}{VELOCITY} -STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Troca: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Custo: {GOLD}{CURRENCY_LONG}{BLACK} (Custo de Adaptação: {GOLD}{CURRENCY_LONG}{BLACK}) Velocidade: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacidade: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagões energizados: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Adaptável para: {GOLD}{STRING} @@ -4105,10 +4106,10 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Comprar STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Comprar Aeronave ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar veículo -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Reequipar Veículo -STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Repor Navio -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e reequipar aeronaves +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e adaptar veículo +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Veículo +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Embarcação +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Comprar e Adaptar Aeronaves ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar o veículo ferroviário selecionado. Pressionar Shift mostra o custo estimado @@ -4117,10 +4118,10 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Comprar aeronave selecionada. Pressionar Shift mostra o custo estimado ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Compra e modifica o trem selecionado. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a embarcação selecionada. Pressionar Shift mostra o custo estimado -STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e converter a aeronave selecionada. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo ferroviário selecionado. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar o veículo rodoviário selecionado. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a embarcação selecionada. Pressionar Shift mostra o custo estimado +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Comprar e adaptar a aeronave selecionada. Pressionar Shift mostra o custo estimado ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Renomear @@ -4130,7 +4131,7 @@ STR_BUY_VEHICLE_AIRCRAFT_RENAME_BUTTON :{BLACK}Renomear ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo ferroviário -STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo do automóvel +STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_TOOLTIP :{BLACK}Renomear tipo de veículo rodoviário STR_BUY_VEHICLE_SHIP_RENAME_TOOLTIP :{BLACK}Renomear tipo de embarcação STR_BUY_VEHICLE_AIRCRAFT_RENAME_TOOLTIP :{BLACK}Renomear tipo de aeronave @@ -4144,13 +4145,13 @@ STR_BUY_VEHICLE_AIRCRAFT_HIDE_TOGGLE_BUTTON :{BLACK}Ocultar STR_BUY_VEHICLE_TRAIN_SHOW_TOGGLE_BUTTON :{BLACK}Exibir STR_BUY_VEHICLE_ROAD_VEHICLE_SHOW_TOGGLE_BUTTON :{BLACK}Exibir STR_BUY_VEHICLE_SHIP_SHOW_TOGGLE_BUTTON :{BLACK}Exibir -STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Exibir +STR_BUY_VEHICLE_AIRCRAFT_SHOW_TOGGLE_BUTTON :{BLACK}Mostrar ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de trem -STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de automóvel -STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de navio -STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Alterna a exibição do tipo de aeronave +STR_BUY_VEHICLE_TRAIN_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo ferroviário +STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de veículo rodoviário +STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de embarcação +STR_BUY_VEHICLE_AIRCRAFT_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}Ativa ocultar/exibir o tipo de aeronave ###length VEHICLE_TYPES STR_QUERY_RENAME_TRAIN_TYPE_CAPTION :{WHITE}Renomear tipo de veículo ferroviário @@ -4281,10 +4282,10 @@ STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES :{YELLOW}Veícul STR_REPLACE_VEHICLE_AVAILABLE_VEHICLES_TOOLTIP :{BLACK}Coluna com os veículos disponíveis para substituição ###length VEHICLE_TYPES -STR_REPLACE_VEHICLE_TRAIN :{G=m}Trem -STR_REPLACE_VEHICLE_ROAD_VEHICLE :{G=m}Automóvel -STR_REPLACE_VEHICLE_SHIP :{G=m}Embarcação -STR_REPLACE_VEHICLE_AIRCRAFT :{G=f}Aeronave +STR_REPLACE_VEHICLE_TRAIN :Trem +STR_REPLACE_VEHICLE_ROAD_VEHICLE :Veículo rodoviário +STR_REPLACE_VEHICLE_SHIP :Embarcação +STR_REPLACE_VEHICLE_AIRCRAFT :Aeronave STR_REPLACE_HELP_LEFT_ARRAY :{BLACK}Selecionar o tipo de motor para substituir STR_REPLACE_HELP_RIGHT_ARRAY :{BLACK}Selecionar o novo tipo de motor para substituir o que selecionou à esquerda @@ -4299,7 +4300,7 @@ STR_REPLACE_REPLACING_WHEN_OLD :{ENGINE} quando STR_REPLACE_VEHICLES_STOP :{BLACK}Parar Substituição STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Pressione para parar a subsituição do tipo de motor que selecionou à esquerda -STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alterna entre janelas de substituir locomotivas e substituir vagões +STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Alternar entre a janela de substituição de locomotivas e a de substituição de vagões STR_REPLACE_ENGINES :Motores STR_REPLACE_WAGONS :Vagões STR_REPLACE_ALL_RAILTYPE :Todos os veículos ferroviários @@ -4351,15 +4352,15 @@ STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para um tipo de carga diferente -STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar tipo de carga diferente +STR_VEHICLE_VIEW_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar veículo rodoviário para transportar um tipo de carga diferente STR_VEHICLE_VIEW_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar a embarcação para transportar uma carga diferente STR_VEHICLE_VIEW_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar uma carga diferente ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Exibe ordens do trem. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Exibe ordens do veículo. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Exibe ordens da embarcação. Ctrl+Clique para exibir o plano de horário -STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Exibe ordens da aeronave. Ctrl+Clique para exibir o plano de horário +STR_VEHICLE_VIEW_TRAIN_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do trem. Ctrl+Clique para mostrar a tabela de horários do trem +STR_VEHICLE_VIEW_ROAD_VEHICLE_ORDERS_TOOLTIP :{BLACK}Mostrar ordens do veículo. Ctrl+Clique para mostrar a tabela de horários do veículo +STR_VEHICLE_VIEW_SHIP_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da embarcação. Ctrl+Clique para mostrar a tabela de horários da embarcação +STR_VEHICLE_VIEW_AIRCRAFT_ORDERS_TOOLTIP :{BLACK}Mostrar ordens da aeronave. Ctrl+Clique para mostrar o plano de horários da aeronave ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SHOW_DETAILS_TOOLTIP :{BLACK}Exibe detalhes do trem @@ -4376,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação a # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Carregando / descarregando STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Saindo +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Esperando para desagrupar STR_VEHICLE_STATUS_CRASHED :{RED}Acidentado! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Quebrado STR_VEHICLE_STATUS_STOPPED :{RED}Parado @@ -4389,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sem ord STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Indo para {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Indo para {DEPOT}. {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manutenção em {DEPOT}. {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Desagrupar e efetuar manutenção em {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Não é possível alcançar {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Não é possível alcançar {WAYPOINT}, {VELOCITY} @@ -4475,30 +4478,30 @@ STR_VEHICLE_DETAILS_CARGO_FROM :{LTBLUE}{CARGO_ STR_VEHICLE_DETAILS_CARGO_FROM_MULT :{LTBLUE}{CARGO_LONG} de {STATION} (x{NUM}) STR_VEHICLE_DETAIL_TAB_CARGO :{BLACK}Carga -STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Exibir detalhes da carga transportada +STR_VEHICLE_DETAILS_TRAIN_CARGO_TOOLTIP :{BLACK}Mostrar detalhes da carga transportada STR_VEHICLE_DETAIL_TAB_INFORMATION :{BLACK}Informação -STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Exibir detalhes dos veículos +STR_VEHICLE_DETAILS_TRAIN_INFORMATION_TOOLTIP :{BLACK}Mostrar detalhes dos veículos ferroviários STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Capacidades -STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Exibir capacidades de cada veículo +STR_VEHICLE_DETAILS_TRAIN_CAPACITIES_TOOLTIP :{BLACK}Mostar capacidade de cada veículo STR_VEHICLE_DETAIL_TAB_TOTAL_CARGO :{BLACK}Carga Total -STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Exibir capacidade total do trem, dividir por tipo de carga +STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK}Mostrar capacidade total do trem, separada por tipo de carga STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Capacidade: {LTBLUE} # Vehicle refit STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Adaptar) -STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga: +STR_REFIT_TITLE :{GOLD}Selecionar tipo de carga para transportar: STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}{}{BLACK}Lucro vindo da adaptação: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Custo da adaptação: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nova capacidade: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Lucro da adaptação: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para modificar. Clique+Arrastar para selecionar vários veículos. Clique em espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Selecione os veículos para adaptar. Clique+Arraste para selecionar vários veículos. Clique em um espaço vazio para selecionar todo o veículo. Ctrl+Clique para selecionar um veículo e a sequência restante ###length VEHICLE_TYPES -STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem -STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o automóvel -STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação -STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave +STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o trem transportar +STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para o veículo rodoviário transportar +STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a embarcação transportar +STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Selecionar tipo de carga para a aeronave transportar ###length VEHICLE_TYPES STR_REFIT_TRAIN_REFIT_BUTTON :{BLACK}Adaptar trem @@ -4507,18 +4510,19 @@ STR_REFIT_SHIP_REFIT_BUTTON :{BLACK}Adaptar STR_REFIT_AIRCRAFT_REFIT_BUTTON :{BLACK}Adaptar aeronave ###length VEHICLE_TYPES -STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adapta trem para transportar a carga selecionada +STR_REFIT_TRAIN_REFIT_TOOLTIP :{BLACK}Adaptar trem para transportar a carga selecionada STR_REFIT_ROAD_VEHICLE_REFIT_TOOLTIP :{BLACK}Adaptar automóvel para carregar o tipo de carga selecionado STR_REFIT_SHIP_REFIT_TOOLTIP :{BLACK}Adaptar embarcação para transportar a carga selecionada STR_REFIT_AIRCRAFT_REFIT_TOOLTIP :{BLACK}Adaptar aeronave para transportar a carga selecionada # Order view STR_ORDERS_CAPTION :{WHITE}{VEHICLE} (Ordens) -STR_ORDERS_TIMETABLE_VIEW :{BLACK}Plano de horário -STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Exibe o plano de horário +STR_ORDERS_TIMETABLE_VIEW :{BLACK}Horário +STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Mudar para a visão de horários STR_ORDERS_LIST_TOOLTIP :{BLACK}Lista de ordens - clique em uma ordem para selecionar. Ctrl+Clique mostra o destino da ordem STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Fim de Ordens - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Fim de Ordens Compartilhadas - - @@ -4531,10 +4535,10 @@ STR_ORDER_GO_VIA :Vá via STR_ORDER_GO_NON_STOP_VIA :Ir sem parar via STR_ORDER_TOOLTIP_NON_STOP :{BLACK}Altera a instrução de paradas da ordem selecionada -STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar qualquer carga +STR_ORDER_TOGGLE_FULL_LOAD :{BLACK}Carregar completamente com qualquer carga STR_ORDER_DROP_LOAD_IF_POSSIBLE :Carregar se disponível -STR_ORDER_DROP_FULL_LOAD_ALL :Carregar tudo -STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente qualquer carga +STR_ORDER_DROP_FULL_LOAD_ALL :Carregar completamente com todas as cargas +STR_ORDER_DROP_FULL_LOAD_ANY :Carregar completamente com qualquer carga STR_ORDER_DROP_NO_LOADING :Não carregar STR_ORDER_TOOLTIP_FULL_LOAD :{BLACK}Altera a instrução de carregamento da ordem selecionada @@ -4547,14 +4551,23 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Altera a STR_ORDER_REFIT :{BLACK}Adaptar STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar a adaptação na ordem atual. CTRL + Clique para remover a instrução -STR_ORDER_REFIT_AUTO :{BLACK}Reformar na estação -STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de carga para o qual reformar nessa ordem. Ctrl+clique para remover a ordem de reforma. Reforma apenas será feita se o veículo permitir +STR_ORDER_REFIT_AUTO :{BLACK}Adaptar na estação +STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de mercadoria para o qual adaptar nesta ordem. Ctrl+Clique para remover ordem de adaptação. Adaptação em estações será realizada somente se o veículo aceitar STR_ORDER_DROP_REFIT_AUTO :Carga fixa -STR_ORDER_DROP_REFIT_AUTO_ANY :Cargas disponíveis +STR_ORDER_DROP_REFIT_AUTO_ANY :Carga disponível STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária STR_ORDER_DROP_HALT_DEPOT :Parar +STR_ORDER_DROP_UNBUNCH :Desagrupar + +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse depósito +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}Selecionar qual ação executar nesse hangar +###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados do veículo no qual se basear para pular ordem @@ -4599,7 +4612,7 @@ STR_ORDER_CONDITIONAL :Pulo de ordem c STR_ORDER_SHARE :Compartilhar ordens STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Insirir uma nova ordem antes da ordem selecionada ou adicionar ao final da lista. Ctrl+Clique em uma estação para "carregar totalmente qualquer carga", em um ponto de controle para "sem parar" ou em um depósito para "manutenção". Clique em outro veículo para copiar suas ordens ou Ctrl+Clique compartilha as ordens. Uma ordem de depósito desativa a manutenção automática do veículo -STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Exibir todos os veículos com a mesma rota +STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Mostrar todos os veículos que compartilham essa programação # String parts to build the order string STR_ORDER_GO_TO_WAYPOINT :Ir via {WAYPOINT} @@ -4623,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :(Adaptar para { STR_ORDER_REFIT_STOP_ORDER :(Adaptar a {STRING} e parar) STR_ORDER_STOP_ORDER :(Parar) +STR_ORDER_WAIT_TO_UNBUNCH :(esperar para desagrupar) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Não pode usar a estação){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4630,7 +4644,7 @@ STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{R STR_ORDER_IMPLICIT :(Implícito) STR_ORDER_FULL_LOAD :(Carregar completamente) -STR_ORDER_FULL_LOAD_ANY :(Carregar completamente qualquer carga) +STR_ORDER_FULL_LOAD_ANY :(Carregar completamente com qualquer carga) STR_ORDER_NO_LOAD :(Não carregar) STR_ORDER_UNLOAD :(Descarregar e tomar carga) STR_ORDER_UNLOAD_FULL_LOAD :(Descarregar e esperar carregamento completo) @@ -4638,27 +4652,27 @@ STR_ORDER_UNLOAD_FULL_LOAD_ANY :(Descarregar e STR_ORDER_UNLOAD_NO_LOAD :(Descarregar e sair vazio) STR_ORDER_TRANSFER :(Transferir e tomar carga) STR_ORDER_TRANSFER_FULL_LOAD :(Transferir e esperar por carregamento completo) -STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e esperar por qualquer carregamento completo) +STR_ORDER_TRANSFER_FULL_LOAD_ANY :(Transferir e aguardar por qualquer carregamento completo) STR_ORDER_TRANSFER_NO_LOAD :(Transferir e sair vazio) STR_ORDER_NO_UNLOAD :(Não descarregar e tomar carga) STR_ORDER_NO_UNLOAD_FULL_LOAD :(Não descarregar e esperar carregamento completo) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Não descarregar e esperar por qualquer carregamento completo) STR_ORDER_NO_UNLOAD_NO_LOAD :(Não descarregar e não carregar) -STR_ORDER_AUTO_REFIT :(Reformar para {STRING}) -STR_ORDER_FULL_LOAD_REFIT :(Carga completa com reforma para {STRING}) -STR_ORDER_FULL_LOAD_ANY_REFIT :(Qualquer carga completa com reforma para {STRING}) -STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com reforma para {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar carga completa com reforma para {STRING}) -STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar qualquer carga completa com reforma para {STRING}) -STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com reforma para {STRING}) -STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar carga completa com reforma para {STRING}) -STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carga completa com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar carga completa com reforma para {STRING}) -STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carga completa com reforma para {STRING}) +STR_ORDER_AUTO_REFIT :(Adaptar para {STRING}) +STR_ORDER_FULL_LOAD_REFIT :(Carregar completamente com adaptação para {STRING}) +STR_ORDER_FULL_LOAD_ANY_REFIT :(Carregar completamente com qualquer carga com adaptação para {STRING}) +STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com adaptação para {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar por carregamento completo com adaptação para {STRING}) +STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING}) +STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com adaptação para {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar por carregamento completo com adaptação para {STRING}) +STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carregamento completo com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar por caregamento completo com adaptação para {STRING}) +STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carregamento completo com adaptação para {STRING}) -STR_ORDER_AUTO_REFIT_ANY :cargas disponíveis +STR_ORDER_AUTO_REFIT_ANY :carga disponível ###length 3 STR_ORDER_STOP_LOCATION_NEAR_END :[quase no fim] @@ -4676,9 +4690,9 @@ STR_INVALID_ORDER :{RED} (Ordem In # Time table window STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Horário) STR_TIMETABLE_ORDER_VIEW :{BLACK}Ordens -STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Alternar para visão de ordens +STR_TIMETABLE_ORDER_VIEW_TOOLTIP :{BLACK}Mudar para visualização de ordens -STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique sobre uma ordem para destaca-la +STR_TIMETABLE_TOOLTIP :{BLACK}Horário - clique em uma ordem para selecioná-la STR_TIMETABLE_NO_TRAVEL :Não viajar STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; com horário marcado pela próxima ordem manual) @@ -4701,34 +4715,34 @@ STR_TIMETABLE_STATUS_LATE :{BLACK}Este ve STR_TIMETABLE_STATUS_EARLY :{BLACK}Este veículo está atualmente circulando {STRING} adiantado STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Este horário ainda não começou STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Essa ordem irá iniciar às {STRING} -STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Essa ordem irá iniciar em {COMMA} segundos +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Este horário irá iniciar em {COMMA} segundos -STR_TIMETABLE_START :{BLACK}Iniciar Ordem -STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecionar quando essa ordem inicia. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada +STR_TIMETABLE_START :{BLACK}Iniciar Horário +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selecione quando esse horário começa. Ctrl+Clique distribui igualmente a partida de todos os veículos que compartilham essa ordem com base em sua ordem relativa, se a ordem for totalmente programada -STR_TIMETABLE_START_SECONDS_QUERY :Segundos até a ordem iniciar +STR_TIMETABLE_START_SECONDS_QUERY :Segundos até o horário iniciar -STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar horário +STR_TIMETABLE_CHANGE_TIME :{BLACK}Mudar Tempo STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mudar a duração do tempo que a ordem em destaque deve durar. Ctrl+Clique define o tempo para todas as ordens -STR_TIMETABLE_CLEAR_TIME :{BLACK}Limpar Horário -STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo para todas as ordens +STR_TIMETABLE_CLEAR_TIME :{BLACK}Apagar Tempo +STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Limpar a duração do tempo da ordem selecionada. Ctrl+Clique limpa o tempo de todas as ordens -STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar Limite de Vel. -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Altera a velocidade máxima de viagem para a ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens +STR_TIMETABLE_CHANGE_SPEED :{BLACK}Alterar limite de velocidade +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Alterar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique define a velocidade para todas as ordens -STR_TIMETABLE_CLEAR_SPEED :{BLACK}Limpa Limite de Vel. -STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem em destaque. Ctrl+Clique limpa as velocidades para todas as ordens +STR_TIMETABLE_CLEAR_SPEED :{BLACK}Remover limite de velocidade +STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Limpar a velocidade máxima de viagem da ordem selecionada. Ctrl+Clique limpa as velocidades para todas as ordens -STR_TIMETABLE_RESET_LATENESS :{BLACK}Restabelecer Contador de Atraso -STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Limpar o contador de atrasos, para que o veículo fique no horário. Ctrl+Clique para reiniciar todo o grupo para que o veículo mais recente esteja no horário e todos os outros estejam antecipados +STR_TIMETABLE_RESET_LATENESS :{BLACK}Reiniciar o Contador de Atraso +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reiniciar o contador de atrasos, assim o veículo ficará no horário. Ctrl+Clique para reiniciar todo o grupo, de modo que o último veículo ficará pontual e todos os outros estarão antecipados -STR_TIMETABLE_AUTOFILL :{BLACK}Autopreencher +STR_TIMETABLE_AUTOFILL :{BLACK}Auto preencher STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Preencher o horário automaticamente com os valores da próxima viagem. Ctrl+Clique para tentar manter os tempos de espera STR_TIMETABLE_EXPECTED :{BLACK}Esperado STR_TIMETABLE_SCHEDULED :{BLACK}Agendado -STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Trocar entre esperado e agendado +STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Alternar entre esperado e agendado STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} @@ -4755,14 +4769,14 @@ STR_AI_DEBUG_RELOAD :{BLACK}Recarreg STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Desativar a IA, recarregar o script e reiniciar a IA STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Ativar/desativar a pausa quando uma mensagem de registo da IA corresponder à sequência de pausa STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Falha em: -STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Falha em -STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem do registo da IA corresponder a esta sequência, o jogo é pausado -STR_AI_DEBUG_MATCH_CASE :{BLACK}Caso de igualdade -STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Alternar o caso de igualdade quando comparar as mensagens de resgisto da IA com a sequência de pausa +STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Parar em +STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Quando uma mensagem de registo da IA for igual a esta sequência, o jogo é pausado +STR_AI_DEBUG_MATCH_CASE :{BLACK}Diferenciar maiúsculas/minúsculas +STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Ativar correspondência de maiúsculas/minúsculas na comparação das mensagens de resgistro da IA com a sequência de parada STR_AI_DEBUG_CONTINUE :{BLACK}Continuar -STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Despausar e continuar o AI +STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Sair da pausa e continuar a IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ver saída de depuração desta IA -STR_AI_GAME_SCRIPT :{BLACK}Game Script +STR_AI_GAME_SCRIPT :{BLACK}Script de jogo STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Verifique o registo do Script de jogo STR_ERROR_AI_NO_AI_FOUND :Nenhuma IA adequada encontrada para carregar.{} Esta IA é falsa e não irá fazer nada.{} Você pode pode baixar várias IA através do sistema de 'Conteúdo Online' @@ -4776,19 +4790,19 @@ STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}O script STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs que serão carregadas no próximo jogo STR_AI_CONFIG_HUMAN_PLAYER :Jogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatória -STR_AI_CONFIG_NONE :{G=m}(nenhum) +STR_AI_CONFIG_NONE :(nenhum) STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Número máximo de concorrentes: {ORANGE}{COMMA} STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervalo entre o começo dos competidores: {ORANGE}{COMMA} minuto{P "" s} STR_AI_CONFIG_MOVE_UP :{BLACK}Subir -STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA selecionada para cima na lista +STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Move a IA seleccionada para cima STR_AI_CONFIG_MOVE_DOWN :{BLACK}Descer -STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Mover a IA selecionada para baixo na lista +STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Move a IA seleccionada para baixo STR_AI_CONFIG_GAMESCRIPT :{SILVER}Script do jogo STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Parâmetros -STR_AI_CONFIG_AI :{G=f}{SILVER}IAs +STR_AI_CONFIG_AI :{SILVER}IAs STR_AI_CONFIG_CHANGE_AI :{BLACK}Selecionar IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Selecionar Script do Jogo @@ -4798,8 +4812,8 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configur # Available AIs window STR_AI_LIST_CAPTION :{WHITE}Disponíveis {STRING} -STR_AI_LIST_CAPTION_AI :{G=f}IAs -STR_AI_LIST_CAPTION_GAMESCRIPT :Script do jogo +STR_AI_LIST_CAPTION_AI :IAs +STR_AI_LIST_CAPTION_GAMESCRIPT :Scripts de jogo STR_AI_LIST_TOOLTIP :{BLACK}Clique para selecionar um script STR_AI_LIST_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING} @@ -5094,13 +5108,18 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Incapaz STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósito errado # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... pode haver somente uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... não é possível usar ordens de carga completa quando o veículo tem uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... não é possível desagrupar um veículo com ordem de carga completa +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... não é possível usar ordens condicionais quando um veículo tem uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... não é possível desagrupar um veículo com uma ordem condicional # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} fica grande demais para ser substituído STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Regras de autosubstituição/renovação não estão ativadas STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(limite de dinheiro) STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Novo veículo não pode transportar {STRING} -STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Novo veículo não pode ser reequipado na ordem {NUM} +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}Veículo novo não pode ser adaptado na ordem {NUM} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}Impossível combinação de linhas @@ -5305,10 +5324,10 @@ STR_ERROR_NO_BUOY :{WHITE}Não há # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossível programar veículo... -STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos só podem aguardar em estações -STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Esse veículo não pára nesta estação +STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos podem esperar apenas em estações. +STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este veículo não para nesta estação STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horário incompleto -STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o plano de horário ainda não começou +STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... o horário ainda não começou # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... existem placas demais @@ -5355,7 +5374,7 @@ STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Casas velhas STR_TOWN_BUILDING_NAME_COTTAGES_1 :Casas de campo STR_TOWN_BUILDING_NAME_HOUSES_1 :Casas STR_TOWN_BUILDING_NAME_FLATS_1 :Apartamentos -STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Prédio de escritórios alto +STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :Edifício alto de escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Lojas e escritórios STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Lojas e escritórios STR_TOWN_BUILDING_NAME_THEATER_1 :Teatro @@ -5371,43 +5390,43 @@ STR_TOWN_BUILDING_NAME_PIGGY_BANK_1 :Mealheiro ##id 0x4800 # industry names -STR_INDUSTRY_NAME_COAL_MINE :{G=f}Mina de Carvão -STR_INDUSTRY_NAME_POWER_STATION :{G=f}Usina de Energia -STR_INDUSTRY_NAME_SAWMILL :{G=f}Serraria -STR_INDUSTRY_NAME_FOREST :{G=f}Floresta -STR_INDUSTRY_NAME_OIL_REFINERY :{G=f}Refinaria de Petróleo -STR_INDUSTRY_NAME_OIL_RIG :{G=f}Plataforma Petrolífera -STR_INDUSTRY_NAME_FACTORY :{G=f}Fábrica -STR_INDUSTRY_NAME_PRINTING_WORKS :{G=f}Gráfica -STR_INDUSTRY_NAME_STEEL_MILL :{G=f}Siderurgica -STR_INDUSTRY_NAME_FARM :{G=f}Fazenda -STR_INDUSTRY_NAME_COPPER_ORE_MINE :{G=f}Mina de Cobre -STR_INDUSTRY_NAME_OIL_WELLS :{G=m}Poços de Petróleo -STR_INDUSTRY_NAME_BANK :{G=f}Banco -STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :{G=f}Indústria Alimentícia -STR_INDUSTRY_NAME_PAPER_MILL :{G=f}Fábrica de Papel -STR_INDUSTRY_NAME_GOLD_MINE :{G=f}Mina de Ouro -STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :{G=m}Banco -STR_INDUSTRY_NAME_DIAMOND_MINE :{G=f}Mina de Diamante -STR_INDUSTRY_NAME_IRON_ORE_MINE :{G=f}Mina de Ferro -STR_INDUSTRY_NAME_FRUIT_PLANTATION :{G=m}Pomar -STR_INDUSTRY_NAME_RUBBER_PLANTATION :{G=f}Plantação de Seringueiras -STR_INDUSTRY_NAME_WATER_SUPPLY :{G=m}Poço Artesiano -STR_INDUSTRY_NAME_WATER_TOWER :{G=m}Reservatório de Água -STR_INDUSTRY_NAME_FACTORY_2 :{G=f}Fábrica -STR_INDUSTRY_NAME_FARM_2 :{G=f}Fazenda -STR_INDUSTRY_NAME_LUMBER_MILL :{G=f}Serraria -STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :{G=f}Floresta de Algodão Doce -STR_INDUSTRY_NAME_CANDY_FACTORY :{G=f}Fábrica de Doces -STR_INDUSTRY_NAME_BATTERY_FARM :{G=m}Campo de Pilhas -STR_INDUSTRY_NAME_COLA_WELLS :{G=m}Poços de Xarope -STR_INDUSTRY_NAME_TOY_SHOP :{G=f}Loja de Brinquedos -STR_INDUSTRY_NAME_TOY_FACTORY :{G=f}Fábrica de Brinquedos -STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :{G=f}Fontes de Plástico -STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :{G=f}Fábrica de Refrigerante -STR_INDUSTRY_NAME_BUBBLE_GENERATOR :{G=m}Gerador de Bolhas -STR_INDUSTRY_NAME_TOFFEE_QUARRY :{G=f}Extração de Caramelo -STR_INDUSTRY_NAME_SUGAR_MINE :{G=f}Mina de Açúcar +STR_INDUSTRY_NAME_COAL_MINE :Mina de Carvão +STR_INDUSTRY_NAME_POWER_STATION :Usina de Energia +STR_INDUSTRY_NAME_SAWMILL :Serraria +STR_INDUSTRY_NAME_FOREST :Floresta +STR_INDUSTRY_NAME_OIL_REFINERY :Refinaria de Petróleo +STR_INDUSTRY_NAME_OIL_RIG :Plataforma Petrolífera +STR_INDUSTRY_NAME_FACTORY :Fábrica +STR_INDUSTRY_NAME_PRINTING_WORKS :Gráfica +STR_INDUSTRY_NAME_STEEL_MILL :Siderúrgica +STR_INDUSTRY_NAME_FARM :Fazenda +STR_INDUSTRY_NAME_COPPER_ORE_MINE :Mina de Minério Cobre +STR_INDUSTRY_NAME_OIL_WELLS :Poços de Petróleo +STR_INDUSTRY_NAME_BANK :Banco +STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT :Indústria Alimentícia +STR_INDUSTRY_NAME_PAPER_MILL :Fábrica de Papel +STR_INDUSTRY_NAME_GOLD_MINE :Mina de Ouro +STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :Banco +STR_INDUSTRY_NAME_DIAMOND_MINE :Mina de Diamantes +STR_INDUSTRY_NAME_IRON_ORE_MINE :Mina de Minério de Ferro +STR_INDUSTRY_NAME_FRUIT_PLANTATION :Plantação de Frutas +STR_INDUSTRY_NAME_RUBBER_PLANTATION :Plantação de Seringueiras +STR_INDUSTRY_NAME_WATER_SUPPLY :Fornecimento de àgua +STR_INDUSTRY_NAME_WATER_TOWER :Reservatório de Água +STR_INDUSTRY_NAME_FACTORY_2 :Fábrica +STR_INDUSTRY_NAME_FARM_2 :Fazenda +STR_INDUSTRY_NAME_LUMBER_MILL :Serraria +STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :Floresta de Algodão Doce +STR_INDUSTRY_NAME_CANDY_FACTORY :Fábrica de Doces +STR_INDUSTRY_NAME_BATTERY_FARM :Produção de Pilhas +STR_INDUSTRY_NAME_COLA_WELLS :Poços de xarope de cola +STR_INDUSTRY_NAME_TOY_SHOP :Loja de Brinquedos +STR_INDUSTRY_NAME_TOY_FACTORY :Fábrica de Brinquedos +STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS :Fontes de Plástico +STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY :Fábrica de Refrigerantes +STR_INDUSTRY_NAME_BUBBLE_GENERATOR :Gerador de Bolhas +STR_INDUSTRY_NAME_TOFFEE_QUARRY :Extração de Caramelo +STR_INDUSTRY_NAME_SUGAR_MINE :Mina de Açúcar ############ WARNING, using range 0x6000 for strings that are stored in the savegame ############ These strings may never get a new id, or savegames will break! @@ -5483,7 +5502,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_SH_40_ELECTRIC :SH '40' (Elétr STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_T_I_M_ELECTRIC :'T.I.M.' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_ASIASTAR_ELECTRIC :'AsiaStar' (Elétrico) STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correspondências +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_LIVESTOCK_VAN :Vagão de Gado @@ -5513,7 +5532,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (Elétr STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_MILLENNIUM_Z1_ELECTRIC :'Millennium Z1' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_WIZZOWOW_Z99 :Wizzowow Z99 STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Cartas +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_LIVESTOCK_VAN :Vagão de Gado @@ -5545,7 +5564,7 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV3_PEGASUS_ELECTRIC :Lev3 'Pegasus' STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_LEV4_CHIMAERA_ELECTRIC :Lev4 'Chimaera' (Elétrico) STR_VEHICLE_NAME_TRAIN_ENGINE_MAGLEV_WIZZOWOW_ROCKETEER :Wizzowow Rocketeer STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_PASSENGER_CAR :Vagão de Passageiros -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Cartas +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_MAIL_VAN :Vagão de Correio STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COAL_CAR :Vagão de Carvão STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_OIL_TANKER :Tanque de Petróleo STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_LIVESTOCK_VAN :Vagão de Gado @@ -5583,12 +5602,12 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :Ônibus Ploddyp STR_VEHICLE_NAME_ROAD_VEHICLE_BALOGH_COAL_TRUCK :Caminhão de Carvão Balogh STR_VEHICLE_NAME_ROAD_VEHICLE_UHL_COAL_TRUCK :Caminhão de Carvão Uhl STR_VEHICLE_NAME_ROAD_VEHICLE_DW_COAL_TRUCK :Caminhão de Carvão DW -STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Cartas MPS -STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Cartas Reynard -STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Cartas Perry -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Cartas MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Cartas Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Cartas Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MPS_MAIL_TRUCK :Caminhão de Correio MPS +STR_VEHICLE_NAME_ROAD_VEHICLE_REYNARD_MAIL_TRUCK :Caminhão de Correio Reynard +STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_MAIL_TRUCK :Caminhão de Correio Perry +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_MAIL_TRUCK :Caminhão de Correio MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_MAIL_TRUCK :Caminhão de Correio Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_MAIL_TRUCK :Caminhão de Correio Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_WITCOMBE_OIL_TANKER :Tanque de Petróleo Witcombe STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_OIL_TANKER :Tanque de Petróleo Foster STR_VEHICLE_NAME_ROAD_VEHICLE_PERRY_OIL_TANKER :Tanque de Petróleo Perry @@ -5725,7 +5744,7 @@ STR_FORMAT_DATE_SHORT :{STRING} {NUM} STR_FORMAT_DATE_LONG :{STRING} {STRING} {NUM} STR_FORMAT_DATE_ISO :{2:NUM}-{1:ZEROFILL_NUM}-{0:ZEROFILL_NUM} -STR_FORMAT_COMPANY_NUM :(Companhia {COMMA}) +STR_FORMAT_COMPANY_NUM :(Empresa {COMMA}) STR_FORMAT_GROUP_NAME :Agrupar {COMMA} STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{1:STRING} de {0:TOWN} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index 793ae051d5..7bdde6832e 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -3806,6 +3806,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Винаги н STR_ORDER_DROP_SERVICE_DEPOT :Сервиз, когато е необходимо STR_ORDER_DROP_HALT_DEPOT :Стоп +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Данни за превозното средство, на които се базира # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 9f4cf7ae20..65ead37825 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -363,6 +363,7 @@ STR_SORT_BY_POPULATION :Població STR_SORT_BY_RATING :Qualificació STR_SORT_BY_NUM_VEHICLES :Nombre de vehicles STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Benefici total de l'any passat +STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Benefici total durant l'últim període STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Benefici total d'aquest any STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Benefici total d'aquest període STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Benefici mitjà de l'any passat @@ -634,6 +635,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clica aq # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Taula de la lliga de companyies STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} «{STRING}» +STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM} STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Enginyer STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Director de trànsit STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinador de transport @@ -666,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 @@ -923,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} @@ -1263,6 +1270,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Dreta STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}segon{P 0 "" s} STR_CONFIG_SETTING_INFINITE_MONEY :Diners infinits: {STRING} +STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Permet gastar diners sense límit i desactiva les bancarrotes de les companyies. STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Préstec inicial màxim: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Quantitat màxima del préstec que pot demanar una companyia (sense tenir en compte la inflació) @@ -1288,6 +1296,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Fixa quant es p STR_CONFIG_SETTING_SUBSIDY_DURATION :Durada dels subsidis: {STRING} ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Establiu el nombre d'anys que duren els subsidis. +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Estableix el nombre de períodes que duren les subvencions. STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special @@ -1412,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 @@ -1474,7 +1484,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :De tots els veh STR_CONFIG_SETTING_WARN_INCOME_LESS :Avisa si el benefici del vehicle és negatiu: {STRING} ###length 2 -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quan està activat, un missatge de notícia és enviat quan un vehicle no ha tingut beneficis durant l'any +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Quan està activat, s'envia un missatge de notícia quan un vehicle no ha tingut beneficis durant l'any +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Quan està activat, s'envia un missatge de notícia quan un vehicle no ha obtingut benefici durant un període. STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Els vehicles mai caduquen: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quan està activat, tots els models de vehicles continuen disponibles per sempre després de la seva introducció @@ -1491,6 +1502,7 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (temps de cal STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Escala la producció de càrrega de les poblacions: {STRING} STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Escala la producció de càrrega de les poblacions segons aquest percentatge. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Escala la producció de càrrega de les indústries: {STRING} STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Escala la producció de càrrega de les indústries segons aquest percentatge. STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}{NBSP}% @@ -1752,6 +1764,7 @@ STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Fi del període ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Reprodueix un efecte de so al final de l'any quan apareix el resum financer de l'any de la companyia en comparació amb l'anterior +STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Reprodueix un so al final d'un període que indica el rendiment de la companyia durant el període respecte al període anterior. STR_CONFIG_SETTING_SOUND_CONFIRM :Construcció: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Reprodueix un efecte de so quan es realitzin amb èxit construccions o altres accions @@ -1912,6 +1925,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Estableix l'any STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Canvia a través dels tipus de senyal: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Seleccioneu com es commutaran els tipus de senyals quan es faci Ctrl+clic sobre un senyal ja construït amb l'eina de construir senyals. ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Només el grup actual STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Tots visibles STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostra els tipus de senyals: {STRING} @@ -2220,7 +2234,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Informeu STR_HELP_WINDOW_COMMUNITY :Comunitat # Cheat window -STR_CHEATS :{WHITE}Trampes +STR_CHEATS :{WHITE}Opcions de mode lliure STR_CHEAT_MONEY :{LTBLUE}Augmenta els diners de la companyia actual en {CURRENCY_LONG}. STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Juga amb la companyia: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Eruga màgica (treu indústries i altres objectes inamovibles): {ORANGE}{STRING} @@ -2359,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 @@ -3638,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} @@ -3694,6 +3710,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clica al STR_SUBSIDIES_OFFERED_EXPIRY_DATE :fins el {DATE_SHORT} STR_SUBSIDIES_OFFERED_EXPIRY_TIME :abans de {UNITS_MONTHS_OR_MINUTES} STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :fins el {DATE_SHORT} +STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :Queden {UNITS_MONTHS_OR_MINUTES} # Story book window STR_STORY_BOOK_CAPTION :{WHITE}Llibre de Partida de {COMPANY} @@ -3734,6 +3751,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Ratis STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra els ratis de l'estació STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}Subministrament mensual i rati local: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}Subministrament per minut i rati local: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}Agrupa per @@ -3918,6 +3936,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Cap # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Producció del darrer mes: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Producció durant l'últim minut: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% transportat) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centra la vista principal al lloc de la indústria. Ctrl+Clic obre una nova vista al lloc de la indústria STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Nivell de producció: {YELLOW}{COMMA}% @@ -4345,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 @@ -4358,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} @@ -4396,6 +4417,7 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Pes: {LT STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Benefici d'aquest any: {LTBLUE}{CURRENCY_LONG} (darrer any: {CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Benefici aquest any: {LTBLUE}{CURRENCY_LONG} (l'any passat: {CURRENCY_LONG}) {BLACK}Rendiment mínim: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Benefici durant aquest període: {LTBLUE}{CURRENCY_LONG} (durant l'últim període: {CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Benefici durant aquest període: {LTBLUE}{CURRENCY_LONG} (durant l'últim període: {CURRENCY_LONG}) {BLACK}Rendiment mínim: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Fiabilitat: {LTBLUE}{COMMA}% {BLACK}Avaries des de la darrera revisió: {LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}Fabricat: {LTBLUE}{NUM}{BLACK} Valor: {LTBLUE}{CURRENCY_LONG} @@ -4411,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 @@ -4481,6 +4508,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Commuta STR_ORDERS_LIST_TOOLTIP :{BLACK}Llista d'ordres - clica en una ordre per marcar-la. Ctrl+Clic desplaça cap a la destinació de l'ordre STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Fi d'Ordres - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Fi d'Ordres Compartides - - @@ -4517,6 +4545,14 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Càrrega dispon STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vés-hi sempre STR_ORDER_DROP_SERVICE_DEPOT :Revisa si és necessari STR_ORDER_DROP_HALT_DEPOT :Para +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 @@ -4585,6 +4621,7 @@ STR_ORDER_REFIT_ORDER :(Remodela a {ST STR_ORDER_REFIT_STOP_ORDER :(Remodela a {STRING} i para) STR_ORDER_STOP_ORDER :(Para) +STR_ORDER_WAIT_TO_UNBUNCH :(espera per a separar) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(No pot usar l'estació){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4788,6 +4825,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Script de la pa STR_AI_SETTINGS_CLOSE :{BLACK}Tanca STR_AI_SETTINGS_RESET :{BLACK}Restableix 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 @@ -5054,6 +5093,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Impossib STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipus de cotxera incorrecta # 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. # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} és massa llarg després de la substitució diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 4f0b1f2667..62d30a61ce 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -1528,6 +1528,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 25147fe7b8..c688ecd013 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -4151,6 +4151,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Idi neprekidno STR_ORDER_DROP_SERVICE_DEPOT :Servisiraj prema potrebi STR_ORDER_DROP_HALT_DEPOT :Stani +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Podaci vozila prema kojima se zasniva skok # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 53f3594d21..60551f1577 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -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í @@ -4414,6 +4447,11 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Jeď vždy STR_ORDER_DROP_SERVICE_DEPOT :Údržba v případě potřeby 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 # Conditional order variables, must follow order of OrderConditionVariable enum @@ -4558,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 ""} @@ -5712,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} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 9093ef77da..e633aca2f6 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -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 @@ -799,6 +802,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}AUTOGEM STR_STATUSBAR_SAVING_GAME :{RED}* * GEMMER SPIL * * STR_STATUSBAR_SPECTATOR :{WHITE}(tilskuer) +STR_STATUSBAR_INFINITE_MONEY :{WHITE}(uendelige penge) # News message history STR_MESSAGE_HISTORY :{WHITE}Beskedhistorik @@ -2314,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 @@ -2685,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 @@ -4163,6 +4169,8 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :sporvogn 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} @@ -4332,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 @@ -4434,6 +4443,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Altid benyt STR_ORDER_DROP_SERVICE_DEPOT :Service hvis nødvendigt STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Data som ordrespring baseres på # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index e24f3ecf92..1bbf2c6a23 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -4554,6 +4554,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Altijd gaan STR_ORDER_DROP_SERVICE_DEPOT :Onderhouden wanneer nodig STR_ORDER_DROP_HALT_DEPOT :Stoppen +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Voertuiggegevens voor basisspringen wanneer # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/english.txt b/src/lang/english.txt index 72e04fa7fd..a191499061 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -4563,7 +4563,14 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go STR_ORDER_DROP_SERVICE_DEPOT :Service if needed STR_ORDER_DROP_HALT_DEPOT :Stop STR_ORDER_DROP_UNBUNCH :Unbunch -STR_ORDER_DEPOT_ACTION_TOOLTIP :{BLACK}Select the action to take at this depot + +# 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 @@ -5109,7 +5116,6 @@ STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cann STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order -STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED :{WHITE}... vehicle must always visit the depot to unbunch there # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index 071948ddde..ba10e79e25 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year wh STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Current group only STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Show signal types: {STRING} @@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Current # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Loading / Unloading STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Leaving +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Waiting to unbunch STR_VEHICLE_STATUS_CRASHED :{RED}Crashed! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Broken down STR_VEHICLE_STATUS_STOPPED :{RED}Stopped @@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}No orde STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Heading for {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Service at {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Unbunch and service at {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Cannot reach {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Cannot reach {WAYPOINT}, {VELOCITY} @@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch t STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click to scroll to the order's destination STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - End of Orders - - STR_ORDERS_END_OF_SHARED_ORDERS :- - End of Shared Orders - - @@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go STR_ORDER_DROP_SERVICE_DEPOT :Service if needed STR_ORDER_DROP_HALT_DEPOT :Stop +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 @@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(Refit to {STRI STR_ORDER_REFIT_STOP_ORDER :(Refit to {STRING} and stop) STR_ORDER_STOP_ORDER :(Stop) +STR_ORDER_WAIT_TO_UNBUNCH :(wait to unbunch) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Can't use station){POP_COLOUR} {STRING} {STATION} {STRING} @@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Unable t STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Wrong depot type # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... can only have one unbunching order +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cannot use full load orders when vehicle has an unbunching order +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 2f164130da..945ff1c232 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Set the year wh STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Cycle through signal types: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Select which signal types to cycle through when Ctrl+Clicking on a built signal with the signal tool ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Current group only STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :All visible STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Show signal types: {STRING} @@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Current # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Loading / Unloading STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Leaving +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Waiting to unbunch STR_VEHICLE_STATUS_CRASHED :{RED}Crashed! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Broken down STR_VEHICLE_STATUS_STOPPED :{RED}Stopped @@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}No orde STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Heading for {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Maintenance at {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Unbunch and service at {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Cannot reach {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Cannot reach {WAYPOINT}, {VELOCITY} @@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch t STR_ORDERS_LIST_TOOLTIP :{BLACK}Order list - click on an order to highlight it. Ctrl+Click to scroll to the order's destination STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - End of Orders - - STR_ORDERS_END_OF_SHARED_ORDERS :- - End of Shared Orders - - @@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Available cargo STR_ORDER_DROP_GO_ALWAYS_DEPOT :Always go STR_ORDER_DROP_SERVICE_DEPOT :Repair if needed STR_ORDER_DROP_HALT_DEPOT :Stop +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 @@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(Refit to {STRI STR_ORDER_REFIT_STOP_ORDER :(Refit to {STRING} and stop) STR_ORDER_STOP_ORDER :(Stop) +STR_ORDER_WAIT_TO_UNBUNCH :(wait to unbunch) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Can't use station){POP_COLOUR} {STRING} {STATION} {STRING} @@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Unable t STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Wrong depot type # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... can only have one unbunching order +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... cannot use full load orders when vehicle has an unbunching order +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... cannot unbunch a vehicle with a full load order +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... cannot use conditional orders when vehicle has an unbunching order +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... cannot unbunch a vehicle with a conditional order # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} is too long after replacement diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 28b4e51391..c36d00e84f 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -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 - - @@ -4289,6 +4309,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ĉiam iru. STR_ORDER_DROP_SERVICE_DEPOT :Prizorgu se necesas. STR_ORDER_DROP_HALT_DEPOT :Haltu. +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 @@ -4545,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 diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 553e3a9332..ebef38c2f7 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -4341,6 +4341,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alati STR_ORDER_DROP_SERVICE_DEPOT :Vajadusel STR_ORDER_DROP_HALT_DEPOT :Peatu +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Sõiduki andmed, millel korralduse vahelejätmine põhineb # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 86c4646d74..ddfdc70b50 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -3427,6 +3427,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Far altíð STR_ORDER_DROP_SERVICE_DEPOT :Eftirlit um neyðugt STR_ORDER_DROP_HALT_DEPOT :Steðga +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index ea13022bd2..c3df8a9dc0 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -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,6 +4558,15 @@ 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 @@ -4546,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 @@ -4559,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 @@ -4585,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) @@ -4680,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 @@ -4788,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 @@ -5054,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 @@ -5748,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} diff --git a/src/lang/french.txt b/src/lang/french.txt index 92bd790fda..684e53745f 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -635,6 +635,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Cliquer # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Classement des compagnies STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}' +STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM} STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingénieur STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Gestionnaire de trafic STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Coordinateur de trafic @@ -818,6 +819,7 @@ STR_STATUSBAR_AUTOSAVE :{RED}ENREGISTRE STR_STATUSBAR_SAVING_GAME :{RED}* * SAUVEGARDE EN COURS * * STR_STATUSBAR_SPECTATOR :{WHITE}(spectateur) +STR_STATUSBAR_INFINITE_MONEY :{WHITE}(argent infini) # News message history STR_MESSAGE_HISTORY :{WHITE}Historique des messages @@ -1270,6 +1272,8 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :À droite STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}seconde{P 0 "" s} +STR_CONFIG_SETTING_INFINITE_MONEY :Argent infini{NBSP}: {STRING} +STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Autoriser les dépenses illimitées et désactiver la banqueroute des compagnies STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Emprunt initial maximum{NBSP}: {STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :Montant maximum qu'une compagnie peut emprunter (sans tenir compte de l'inflation) @@ -1504,6 +1508,11 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (calendrier gelé) +STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Échelle de production de marchandise des villes{NBSP}: {STRING} +STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Modifier la production de marchandise des villes de ce pourcentage. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Échelle de production de marchandise des industries{NBSP}: {STRING} +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Modifier la production de marchandise des industries de ce pourcentage. +STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Renouveler automatiquement les véhicules vieillissants{NBSP}: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quand il est actif, un véhicule approchant de la fin de sa durée de vie est automatiquement remplacé quand les conditions du renouvellement sont remplies @@ -1916,7 +1925,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Espacement des STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Définit la distance à laquelle les signaux seront construits sur une voies jusqu'au prochain obstacle (signal, jonction), si les signaux sont glissés-déposés STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} case{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Espacement fixe entre les signaux en mode glisser-déposer{NBSP}: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Choisir le comportement du placement des signaux en mode glisser-déposer avec Ctrl. Si désactivé, les signaux sont placés autour des tunnels ou des ponts pour éviter de longues portions sans signaux. Si activé, les signaux sont placés toutes les N case, permettant d'aligner facilement les signaux sur des voies parallèles +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Choisir le comportement du placement des signaux en mode glisser-déposer. Si désactivé, les signaux sont placés autour des tunnels ou des ponts pour éviter de longues portions sans signaux. Si activé, les signaux sont placés toutes les N cases, permettant d'aligner facilement les signaux sur des voies parallèles STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Construire automatiquement des sémaphores avant{NBSP}: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Définit l'année à partir de laquelle des signaux électriques seront utilisés pour les voies. Avant cette année, des signaux non électriques seront utilisés (ils ont le même fonctionnement mais une apparence différente) @@ -1924,6 +1933,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Définit l'ann STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Sélectionner les signaux parmi{NBSP}: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Choisir quels types de signaux sont proposés lors de leur construction avec Ctrl ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Uniquement le groupe courant STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :tous les signaux visibles STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Afficher les signaux parmi{NBSP}: {STRING} @@ -2780,7 +2790,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construi STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construire un dépôt ferroviaire (pour acheter et entretenir des trains).{}Shift pour afficher seulement le coût estimé. STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Construire un point de contrôle sur les rails.{}Ctrl pour joindre des points de contrôle entre eux.{}Shift pour afficher seulement le coût estimé. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construire une gare.{}Ctrl pour joindre des stations entre elles.{}Shift pour afficher seulement le coût estimé. -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construire des signaux. Ctrl pour inverser le type des signaux (sémaphore/lumineux).{}Faire glisser pour construire le long d'une section de voie linéaire.{}Ctrl-glisser pour construire des signaux jusqu'à la prochaine jonction ou le prochain signal{}Ctrl-clic pour inverser le mode d'ouverture de la fenêtre de sélection des signaux.{}Shift pour afficher seulement le coût estimé. +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construire des signaux. Ctrl pour inverser le type des signaux (sémaphore/lumineux).{}Faire glisser pour construire des signaux jusqu'à la prochaine jonction ou le prochain signal{}Shift pour afficher seulement le coût estimé. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construire un pont ferroviaire.{}Shift pour afficher seulement le coût estimé. STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construire un tunnel ferroviaire.{}Shift pour afficher seulement le coût estimé. STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alterner entre construire et retirer des voies, des signaux, des points de contrôle et des gares.{}Ctrl pour retirer également la voie lors du retrait des points de contrôle et des gares. @@ -4367,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Action c # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Chargement/Déchargement STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Départ +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}En attente de répartition STR_VEHICLE_STATUS_CRASHED :{RED}Accidenté{NBSP}! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}En panne STR_VEHICLE_STATUS_STOPPED :{RED}Arrêté @@ -4380,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Aucun o STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}En route pour {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}En route pour le {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Entretien au {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Répartition et entretien au {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Ne peut pas atteindre {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Ne peut pas atteindre {WAYPOINT}, {VELOCITY} @@ -4510,6 +4522,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Basculer STR_ORDERS_LIST_TOOLTIP :{BLACK}Liste d'ordres - Cliquer sur un ordre pour le sélectionner. Ctrl-clic pour déplacer la vue sur la destination de l'ordre. STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :−− Fin des ordres −− STR_ORDERS_END_OF_SHARED_ORDERS :−− Fin des ordres partagés −− @@ -4546,6 +4559,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Cargaison dispo STR_ORDER_DROP_GO_ALWAYS_DEPOT :Toujours aller STR_ORDER_DROP_SERVICE_DEPOT :Entretien si nécessaire STR_ORDER_DROP_HALT_DEPOT :Arrêt +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 @@ -4614,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :(Réaménager p STR_ORDER_REFIT_STOP_ORDER :(Réaménager pour {STRING} et arrêt) STR_ORDER_STOP_ORDER :(Arrêt) +STR_ORDER_WAIT_TO_UNBUNCH :(attendre la répartition) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Station inutilisable){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4817,6 +4840,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :du script de je STR_AI_SETTINGS_CLOSE :{BLACK}Fermer STR_AI_SETTINGS_RESET :{BLACK}Réinitialiser STR_AI_SETTINGS_SETTING :{STRING}{NBSP}: {ORANGE}{STRING} +STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}{NBSP}: {ORANGE}[{STRING}, {STRING}] +STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}] # Textfile window @@ -5083,6 +5108,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Impossib STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Dépôt incompatible # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... ne peut avoir qu'un seul ordre de répartition +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... impossible d'utiliser un ordre de chargement complet quand un véhicule a un ordre de répartition +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... impossible de répartir un véhicule avec un ordre de chargement complet +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... impossible d'utiliser des ordres conditionnels quand le véhicule a un ordre de répartition +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... impossible de répartir un véhicule avec un ordre conditionnel # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} est trop long après remplacement @@ -5743,6 +5773,7 @@ STR_UNKNOWN_STATION :station inconnu STR_DEFAULT_SIGN_NAME :Panneau STR_COMPANY_SOMEONE :quelqu'un +STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :Spectateur, {1:STRING} @@ -5776,6 +5807,10 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} +STR_CURRENCY_SHORT_KILO :{NBSP}k +STR_CURRENCY_SHORT_MEGA :{NBSP}Mio +STR_CURRENCY_SHORT_GIGA :{NBSP}Mrd +STR_CURRENCY_SHORT_TERA :{NBSP}kMrd STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 51e1c92dd3..54579817c3 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -3618,6 +3618,10 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Beskikbere frac STR_ORDER_DROP_GO_ALWAYS_DEPOT :Gean altyd STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 5a09cdbea7..459854221d 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -4116,6 +4116,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Rach ann an-cò STR_ORDER_DROP_SERVICE_DEPOT :Obair-ghlèidhidh ma tha i a dhìth STR_ORDER_DROP_HALT_DEPOT :Stad +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dàta a' charbaid air a bheil an leum stèidhichte # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 8f743e57a3..795962bda1 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1243,6 +1243,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Fixa canto se p STR_CONFIG_SETTING_SUBSIDY_DURATION :Duración da subvención: {STRING} ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Establece o número de anos durante os cales se concede a subvención. +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Establece o número de períodos durante os que se concede a subvención ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sen subvencións @@ -2301,6 +2302,7 @@ STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Direcci STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Código de convite: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Data de comezo: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Data actual: {WHITE}{DATE_SHORT} +STR_NETWORK_SERVER_LIST_PLAY_TIME :{SILVER}Tempo de xogo: {WHITE}{NUM}h {NUM}m STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script do xogo: {WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Protexido con contrasinal! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVIDOR DESCONECTADO @@ -4125,6 +4127,7 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :Vehículo de tr STR_ENGINE_PREVIEW_AIRCRAFT :avión STR_ENGINE_PREVIEW_SHIP :barco +STR_ENGINE_PREVIEW_CAPACITY_2 :Capacidade: {CARGO_LONG}, {CARGO_LONG} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Substituír {STRING} - {STRING} @@ -4394,6 +4397,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre STR_ORDER_DROP_SERVICE_DEPOT :Facer servizo se é necesario STR_ORDER_DROP_HALT_DEPOT :Parar +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos do vehículo para saltarse # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/german.txt b/src/lang/german.txt index 00805ce49c..12e92a832d 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -215,6 +215,8 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Wie primär 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}Felder/Tag +STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}Felder/Sek STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}Knoten STR_UNITS_POWER_IMPERIAL :{DECIMAL}{NBSP}PS @@ -256,7 +258,9 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m # Time units used in string control characters +STR_UNITS_TICKS :{COMMA}{NBSP}Tick{P "" s} +STR_UNITS_MINUTES :{NUM}{NBSP}minute{P "" n} # Common window strings @@ -324,6 +328,7 @@ STR_SORT_BY_TRANSPORTED :Transportiert STR_SORT_BY_NUMBER :Nummer STR_SORT_BY_PROFIT_LAST_YEAR :Gewinn im letzten Jahr STR_SORT_BY_PROFIT_THIS_YEAR :Gewinn in diesem Jahr +STR_SORT_BY_PROFIT_THIS_PERIOD :Gewinn in diesem Zeitraum STR_SORT_BY_AGE :Alter STR_SORT_BY_RELIABILITY :Zuverlässigkeit STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Gesamtkapazität pro Fracht @@ -352,8 +357,10 @@ STR_SORT_BY_RATING :Bewertung STR_SORT_BY_NUM_VEHICLES :Anzahl der Fahrzeuge STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Gewinn im letzten Jahr STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Gewinn in diesem Jahr +STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Gesamter Gewinn in diesem Zeitraum STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Durchschnittlicher Gewinn im letzten Jahr STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Durchschnittlicher Gewinn in diesem Jahr +STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Durchschnittlicher Gewinn in diesem Zeitraum # Group by options for vehicle list STR_GROUP_BY_NONE :Keine @@ -599,8 +606,10 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Beförde STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Bewertung der Firmenleistung (Höchstwert: 1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Firmenwertdiagramm +STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Letzten 72 Minuten STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Frachtbeförderungspreise +STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekunden unterwegs STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Zahlung für 10 gelieferte Einheiten (oder 10.000 Liter) Fracht über eine Strecke von 20 Feldern STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Alle auswählen STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Alle abwählen @@ -618,6 +627,7 @@ STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph de # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Firmentabelle STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} „{STRING}“ +STR_COMPANY_LEAGUE_COMPANY_RANK :{YELLOW}#{NUM} STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER :Ingenieur STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER :Verkehrsmanager STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR :Fuhrparkleiter @@ -649,6 +659,7 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Kredit: STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Gesamt: ###next-name-looks-similar +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Anzahl der Fahrzeuge, die im letzten Zeitraum einen Gewinn erzielt haben. Diese beinhaltet Straßenfahrzeuge, Züge, Schiffe und Flugzeuge STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Anzahl vor kurzem genutzter Stationen (wenn Stationen verschiedener Typen verbunden sind, werden sie trotzdem einzeln gezählt) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Geringste Quartalseinnahmen in den letzten 3 Jahren STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Höchste Quartalseinnahmen in den letzten 3 Jahren @@ -916,6 +927,7 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafik STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Grafikeinstellungen wählen STR_GAME_OPTIONS_TAB_SOUND :Sound STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Sound- und Musikeinstellungen auswählen +STR_GAME_OPTIONS_TAB_SOCIAL :Soziales STR_GAME_OPTIONS_VOLUME :Lautstärke STR_GAME_OPTIONS_SFX_VOLUME :Sound-Effekte @@ -1016,6 +1028,8 @@ STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Dieses K STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Schrägen skalieren STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um Schrägen nach der Oberflächengröße zu skalieren +STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Nutze die traditionelle Sprite-Schriftart +STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Dieses Kästchen ankreuzen, um die traditionelle Sprite-Schriftart mit fester Größe zu verwenden. STR_GAME_OPTIONS_GUI_SCALE_1X :1× STR_GAME_OPTIONS_GUI_SCALE_2X :2× @@ -1051,7 +1065,11 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Ein Basi STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Zusätzliche Informationen über das Basismusikset +STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING}) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Bahnsteig: +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Am laufen +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Entladen STR_BASESET_STATUS :{STRING} {RED}({NUM} fehlende/beschädigte Datei{P "" en}) @@ -1243,7 +1261,8 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Einstellen, wie STR_CONFIG_SETTING_SUBSIDY_DURATION :Subventionsdauer: {STRING} ###length 2 -STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Die Anzahl der Jahre, für die eine Subvention vergeben wird +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Wähle die Anzahl der Jahre, für die eine Subvention vergeben wird +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Wähle die Anzahl der Zeiträume, für die eine Subvention vergeben wird ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Keine Subventionen @@ -1342,6 +1361,7 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :Auf der rechten ###length 2 STR_CONFIG_SETTING_SHOWFINANCES :Zeige Firmenfinanzen am Ende des Jahres: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Zeige Firmenfinanzen am Ende des Zeitraums: {STRING} ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Blende am Ende jedes Jahres automatisch die Einkommensübersicht des Unternehmes ein, um eine schnelle Übersicht über den finanziellen Status zu bekommen @@ -1370,7 +1390,8 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Firmen das Best STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Den Erwerb exklusiver Transportrechte erlauben: {STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wenn eine Firma exklusive Transportrechte in einer Stadt kauft, wird ein Jahr lang keine Fracht an Stationen von Mitbewerbern im Stadtgebiet geliefert +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Wenn eine Firma exklusive Transportrechte für eine Stadt kauft, erhalten Stationen von Mitbewerbern 12 Monate lang keine Passagiere und Fracht +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Wenn eine Firma exklusive Transportrechte für eine Stadt kauft, erhalten Stationen von Mitbewerbern 12 Minuten lang keine Passagiere und Fracht STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Finanzieren von Gebäuden erlauben: {STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Erlaubt Firmen, der Stadtverwaltung Geld für das Errichten neuer Häuser zur Verfügung zu stellen @@ -1433,11 +1454,14 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Zeige Nachricht STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Fahrzeuge veralten nie: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Erlauben, dass Fahrzeuge nach ihrem Einführungsdatum ewig verfügbar bleiben +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Wähle die Zeiteinheit des Spiels. Diese kann später nicht geändert werden.{}{}Kalender-basiert ist die klassische OpenTTD Erfahrung, in dem ein Jahr aus 12 Monaten besteht und jeder Monat 28-31 Tage hat.{}{}In Wanduhr-basierter Zeit sind Fahrzeuggeschwindigkeit, Güterproduktion und Finanzen basierend auf 1-minütigen Inkrementen, welche etwa so lang wie ein 30-tägiger Monat im Kalender-basierten Modus sind. Diese sind in 12-minütige Zeiträume gruppiert, equivalent zu einem Kalender-Jahr.{}{}In beiden Modi ist immer ein klassischer Kalender, welcher für das Einführungdatum von Fahrzeugen, Häusern und anderer Infrastruktur genutzt wird. ###length 2 +STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special +STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Skaliere Güterproduktion in Städten: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Fahrzeuge automatisch erneuern, wenn sie alt werden: {STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Erneuere Fahrzeuge automatisch gemäß der Regeln für Erneuerung, wenn sie ihr Maximalalter erreicht haben. @@ -1529,6 +1553,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Linksverkehr STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechtsverkehr STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Drehung der Reliefkarte: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Wählen, in welche Richtung das Höhenkarten-Bild rotiert wird um in die Spielwelt zu passen ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Nach links STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Nach rechts @@ -1649,7 +1674,9 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Nutze erweitert STR_CONFIG_SETTING_LOADING_INDICATORS :Ladestandanzeiger verwenden: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Auswählen, ob beim Be- oder Entladen der Ladestand in Prozent über dem Fahrzeug angezeigt werden soll +STR_CONFIG_SETTING_TIMETABLE_MODE :Zeiteinheiten für Fahrpläne: {STRING} ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Ticks STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Zeige Ankunft und Abfahrt im Fahrplan: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zeige geschätzte Ankunfts- und Abfahrtzeiten in Fahrplänen @@ -1687,6 +1714,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Soundeffekte be ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :Bericht am Jahresende: {STRING} +STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Ende des Zeitraums: {STRING} ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Soundeffekte beim Jahresrückblick auf die Bilanzen der vergangenen Jahre abspielen @@ -1757,6 +1785,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiviert STR_CONFIG_SETTING_NOSERVICE :Wartung deaktivieren, wenn Pannen abgeschaltet: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Schicke Fahrzeuge nicht zur Wartung, wenn Pannen ausgeschaltet sind +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Verringerung der Ladegeschwindigkeit für Züge die länger als die Station sind: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Berücksichtige Waggonhöchstgeschwindigkeit: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Begrenze die Höchstgeschwindigkeit eines Zuges durch die jeweiligen Höchstgeschwindigkeiten der mitgeführten Waggons @@ -1848,6 +1877,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Lege das Jahr f STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Durchlaufen der Signalarten: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Lege fest, durch welche Signaltypen mittels Strg-Klick auf vorhandene Signale rotiert wird ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Nur aktuelle Gruppe STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Alle Sichtbaren STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Signaltypen zeigen: {STRING} @@ -2034,10 +2064,12 @@ STR_CONFIG_SETTING_LIMITATIONS :Beschränkungen STR_CONFIG_SETTING_ACCIDENTS :Unfälle und Katastrophen STR_CONFIG_SETTING_GENWORLD :Spielfeld-Erzeugung STR_CONFIG_SETTING_ENVIRONMENT :Umgebung +STR_CONFIG_SETTING_ENVIRONMENT_TIME :Uhrzeit STR_CONFIG_SETTING_ENVIRONMENT_AUTHORITIES :Öffentliche Verwaltungen STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :Städte STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :Industrien STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :Warenverteilung +STR_CONFIG_SETTING_ENVIRONMENT_TREES :Bäume STR_CONFIG_SETTING_AI :Mitbewerber STR_CONFIG_SETTING_AI_NPC :Computerspieler STR_CONFIG_SETTING_NETWORK :Netzwerk @@ -2172,9 +2204,13 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Zugfarbs STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Fahrzeugfarbschema anzeigen STR_LIVERY_SHIP_TOOLTIP :{BLACK}Schiffsfarbschema anzeigen STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Flugzeugfarbschema anzeigen +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Zeige Farben von Zuggruppen an +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Zeige Farben von Schiffsgruppen an STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Die Hauptfarbe für das gewählte Schema auswählen. Strg+Klick wählt diese Farbe für jedes Schema STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Die Nebenfarbe für das ausgewählte Schema auswählen. Strg+Klick wählt diese Farbe für jedes Schema STR_LIVERY_PANEL_TOOLTIP :{BLACK}Farbschema oder mehrere Farbschemata mittels Strg+Klick auswählen, um diese zu ändern. In das Kästchen klicken, um ein Schema zu aktivieren +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Es sind keine Straßenfahrzeuge eingerichtet +STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Es wurden keine Flugzeuggruppen erstellt ###length 23 STR_LIVERY_DEFAULT :Standardlackierung @@ -2280,6 +2316,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Spielfel STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Spielfeldgröße{}Klick sortiert nach Fläche STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Datum STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Momentanes Spieljahr +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Spielzeit +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Zeit gespielt während{}Spiel nicht pausiert war STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Sprache, Server-Version, etc. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Ein Spiel der Liste durch Anklicken wählen @@ -2650,7 +2689,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}überlastet # Linkgraph tooltip -STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} ZUM Rücktransport vorgesehen ({COMMA}% der Kapazitäten) +STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG} zum Rücktransport vorgesehen pro Minute von {STATION} zu {STATION} ({COMMA}% der Kapazität){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} zum Rücktransport vorgesehen ({COMMA}% der Kapazität) # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Einzugsgebiet anzeigen @@ -2660,6 +2700,7 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Einzugsg STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Einzugsgebiet anzeigen STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Nimmt an: {GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Liefert: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}Unterhaltskosten: {GOLD}{CURRENCY_SHORT}/Jahr # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Verbinde mit Station @@ -3184,6 +3225,7 @@ STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Städten STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wähle die Sprache für die Städtenamen aus STR_MAPGEN_DATE :{BLACK}Datum: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Industriedichte: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Wähle die Dichte der Industrien, oder einen benutzerdefinierten Wert STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Höchster Gipfel: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Die maximale Höhe des höchsten Gipfels auf der Karte um eins erhöhen STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Die maximale Höhe des höchsten Gipfels auf der Karte um eins verringern @@ -3197,10 +3239,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Wüstenb STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Landschaftstyp: STR_MAPGEN_SEA_LEVEL :{BLACK}Gewässermenge: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Wähle die Meereshöhe STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Flüsse: STR_MAPGEN_SMOOTHNESS :{BLACK}Gleichmäßigkeit: STR_MAPGEN_VARIETY :{BLACK}Größe der Geländeformen: STR_MAPGEN_GENERATE :{WHITE}Erzeugen +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Erstelle die Welt und spiele OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-Einstellungen STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-Einstellungen anzeigen STR_MAPGEN_AI_SETTINGS :{BLACK}KI Einstellungen @@ -3233,6 +3277,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalanisch # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Spielfeldränder: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Wähle die Grenzen der Spielwelt STR_MAPGEN_NORTHWEST :{BLACK}Nordwesten STR_MAPGEN_NORTHEAST :{BLACK}Nordosten STR_MAPGEN_SOUTHEAST :{BLACK}Südosten @@ -3542,8 +3587,10 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Die Stadtverwal STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine kleine Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem kleinen Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine mittlere Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem mittleren Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Im Ort eine große Werbekampagne starten, um mehr Passagier- und Frachtaufträge für die eigene Firma zu gewinnen.{}Bewirkt eine temporäre Steigerung der Stationsbewertung in einem großen Radius um das Ortszentrum.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Straßenreparaturen des Ortes finanzieren.{}Verursacht erhebliche Störungen für Straßenverkehr für bis zu 6 Monate.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Eine Statue zu Ehren der eigenen Firma errichten.{}Bewirkt eine permanente Steigerung der Stationsbewertung in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Bau von neuen Gebäuden im Ort finanzieren.{}Bewirkt eine temporäre Steigerung des Ortswachstums in diesem Ort.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Kaufe exklusive Transportrechte in dieser Stadt für 12 Minuten.{}Die Stadtverwaltung wird es Passagieren und Fracht nicht erlauben Stationen von Mitbewerbern zu nutzen. Eine erfolgreiche Bestechung eines Mitbewerbers kündigt den Vertrag.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Die Stadtverwaltung bestechen, um die eigene Bewertung zu verbessern und die exklusiven Transportrechte eines Wettbewerbers zu widerrufen. Dabei riskiert man allerdings eine harte Strafe, falls man ertappt wird.{}{POP_COLOUR}Kosten: {CURRENCY_LONG} # Goal window @@ -3593,6 +3640,8 @@ STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Subventi STR_SUBSIDIES_NONE :{ORANGE}- Keine - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Bereits vergebene Subventionen: STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klick auf subventionierte Dienstleistung zentriert Hauptansicht auf die Industrie/Stadt. Strg+Klick öffnet neue Zusatzansicht zentriert auf die Industrie/Stadt +STR_SUBSIDIES_OFFERED_EXPIRY_TIME :innerhalb {UNITS_MONTHS_OR_MINUTES} +STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} übrig # Story book window STR_STORY_BOOK_CAPTION :{WHITE}Chronik für {COMPANY} @@ -3692,6 +3741,8 @@ STR_EDIT_WAYPOINT_NAME :{WHITE}Namen de # Finances window STR_FINANCES_CAPTION :{WHITE}{COMPANY} – Finanzen {BLACK}{COMPANY_NUM} STR_FINANCES_YEAR :{WHITE}{NUM} +STR_FINANCES_YEAR_CAPTION :{WHITE}Jahr +STR_FINANCES_PERIOD_CAPTION :{WHITE}Zeitraum ###length 3 STR_FINANCES_REVENUE_TITLE :{WHITE}Einnahmen @@ -3793,6 +3844,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Kanäle STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Stationen: STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Stationsfelder STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Flughäfen +STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/Zeitraum # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrien @@ -3853,6 +3905,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Fahrzeuge erset STR_VEHICLE_LIST_SEND_FOR_SERVICING :Zur Wartung schicken STR_VEHICLE_LIST_CREATE_GROUP :Gruppe erstellen STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Gewinn im laufenden Jahr: {CURRENCY_LONG} (vergangenes Jahr: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Profit in diesem Zeitraum: {CURRENCY_LONG} (letzter Zeitraum: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -3898,6 +3951,7 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Liste leeren STR_GROUP_RENAME_CAPTION :{BLACK}Gruppe umbenennen STR_GROUP_PROFIT_THIS_YEAR :Gewinn dieses Jahr: +STR_GROUP_PROFIT_THIS_PERIOD :Gewinn in diesem Zeitraum: STR_GROUP_PROFIT_LAST_YEAR :Gewinn letztes Jahr: STR_GROUP_OCCUPANCY :Aktuelle Nutzung: STR_GROUP_OCCUPANCY_VALUE :{NUM}% @@ -3925,6 +3979,7 @@ STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Geschw.: STR_PURCHASE_INFO_SPEED :{BLACK}Geschwindigkeit: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Geschwindigkeit auf dem Meer: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Geschwindigkeit auf Kanälen und Flüssen: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Betriebskosten: {GOLD}{CURRENCY_LONG}/Zeitraum STR_PURCHASE_INFO_CAPACITY :{BLACK}Kapazität: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(umrüstbar) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Entworfen: {GOLD}{NUM}{BLACK} Betriebsdauer: {GOLD}{COMMA} Jahr{P "" e} @@ -3933,7 +3988,7 @@ STR_PURCHASE_INFO_COST :{BLACK}Kosten: STR_PURCHASE_INFO_COST_REFIT :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Gewicht: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} Geschw.: {GOLD}{VELOCITY} -STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK}) Geschwindigkeit: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Kosten: {GOLD}{CURRENCY_LONG}{BLACK} (Kosten der Umrüstung: {GOLD}{CURRENCY_LONG}{BLACK}) Geschw.: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Kapazität: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Angetriebene Waggons: {GOLD}+{POWER}{BLACK} Gewicht: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Umrüstbar auf: {GOLD}{STRING} @@ -4117,6 +4172,13 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :Straßenbahn STR_ENGINE_PREVIEW_AIRCRAFT :{G=n}Flugzeug STR_ENGINE_PREVIEW_SHIP :{G=n}Schiff +STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} +STR_ENGINE_PREVIEW_COST_MAX_SPEED :Kosten: {CURRENCY_LONG} Max. Geschw.: {VELOCITY} +STR_ENGINE_PREVIEW_SPEED_POWER :Geschw.: {VELOCITY} Leistung: {POWER} +STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Geschw.: {VELOCITY} Leistung: {POWER} Max. Zugkraft: {FORCE} +STR_ENGINE_PREVIEW_TYPE :Flugzeugtyp: {STRING} +STR_ENGINE_PREVIEW_TYPE_RANGE :Flugzeugtyp: {STRING} Reichweite: {COMMA} Felder +STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Betriebskosten: {CURRENCY_LONG}/Zeitraum # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}{STRING} ersetzen – {STRING} @@ -4261,7 +4323,8 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Name des STR_VEHICLE_INFO_AGE :{COMMA} Jahr{P "" e} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} Jahr{P "" e} ({COMMA}) -STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Jahr +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Jahr +STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Alter: {LTBLUE}{STRING}{BLACK} Betriebskosten: {LTBLUE}{CURRENCY_LONG}/Zeitraum STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. Geschw.: {LTBLUE}{VELOCITY} {BLACK}Flugzeugtyp: {LTBLUE}{STRING} @@ -4282,6 +4345,8 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Kapazit STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Transfer-Einnahmen: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Zuletzt gewartet: vor {LTBLUE}{NUM} Minuten +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Verringere Serviceintervall um 5 Minuten. Strg+Klick um den Serviceintervall um 1 Minute zu verringern STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Art des Wartungsintervalls ändern STR_VEHICLE_DETAILS_DEFAULT :Standard @@ -4387,6 +4452,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Fahre immer STR_ORDER_DROP_SERVICE_DEPOT :Wartung, wenn nötig STR_ORDER_DROP_HALT_DEPOT :Stopp +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Fahrzeuginformation, welche für den Sprung ausgewertet wird # Conditional order variables, must follow order of OrderConditionVariable enum @@ -4531,8 +4600,10 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Das Fahr STR_TIMETABLE_STATUS_LATE :{BLACK}Dieses Fahrzeug hat {STRING} Verspätung STR_TIMETABLE_STATUS_EARLY :{BLACK}Dieses Fahrzeug ist {STRING} zu früh STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Dieser Fahrplan ist noch nicht gültig +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Dieser Fahrplan startet in {COMMA} Sekunden +STR_TIMETABLE_START_SECONDS_QUERY :Sekunden bis der Fahrplan beginnt STR_TIMETABLE_CHANGE_TIME :{BLACK}Zeit ändern STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zeitrahmen für den markierten Auftrag ändern. Strg+Klick legt die Zeit für alle Aufträge fest @@ -4556,6 +4627,7 @@ STR_TIMETABLE_EXPECTED :{BLACK}Voraussi STR_TIMETABLE_SCHEDULED :{BLACK}Fahrplanmäßig STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Umschalten zwischen Anzeige der erwarteten Ankunftszeit und des Fahrplans +STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} # Date window (for timetable) @@ -4648,6 +4720,8 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spielskript STR_AI_SETTINGS_CLOSE :{BLACK}Schließen STR_AI_SETTINGS_RESET :{BLACK}Zurücksetzen 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 @@ -5574,6 +5648,7 @@ STR_UNKNOWN_STATION :unbekannte Stat STR_DEFAULT_SIGN_NAME :Schild STR_COMPANY_SOMEONE :Jemand +STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}m STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :Zuschauer, {1:STRING} @@ -5607,6 +5682,8 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} +STR_CURRENCY_SHORT_KILO :{NBSP}t +STR_CURRENCY_SHORT_GIGA :{NBSP}Mrd STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 4b290ae79e..422c5d4a75 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -4374,6 +4374,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Πάντα πή STR_ORDER_DROP_SERVICE_DEPOT :Επισκευή εάν χρειάζεται STR_ORDER_DROP_HALT_DEPOT :Στάση +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Δεδομένα οχήματος για να βασιστεί το άλμα # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 27eca245fa..9a4c2346ff 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -4011,6 +4011,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :עבור תמי STR_ORDER_DROP_SERVICE_DEPOT :טפל במידת הצורך STR_ORDER_DROP_HALT_DEPOT :עצור +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}נתוני כלי הרכב עליהם יתבסס הדילוג # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 377ea9564c..938b8f164a 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -1282,6 +1282,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} STR_ORDER_REFIT_TOOLTIP :{BLACK}इस मार्ग पर ढोये जा रहे नौभार को बदलने के लिये नये प्रकार का नौभार चुनें। Ctrl+क्लिक करने पर परिवर्तन का आदेश निरस्त हो जायेगा। +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 69cb6f3c09..9f021c6538 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -4446,6 +4446,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mindig menj jav STR_ORDER_DROP_SERVICE_DEPOT :Ha javításra szorul STR_ORDER_DROP_HALT_DEPOT :Maradj ott +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}A jármű adata ami alapján ugrani szeretnénk a parancssorban # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index 1ddd95441c..1bd5db35d9 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -3623,6 +3623,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Fara alltaf STR_ORDER_DROP_SERVICE_DEPOT :Þjónusta ef þarf STR_ORDER_DROP_HALT_DEPOT :Stoppa +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Gögn farartækis sem skilyrði byggja á # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 44a73b3a3f..cf4b8b03d4 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -1406,6 +1406,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 494547390f..1bff0bf27e 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -4383,6 +4383,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Selalu masuk STR_ORDER_DROP_SERVICE_DEPOT :Perbaikan jika diperlukan STR_ORDER_DROP_HALT_DEPOT :Berhenti +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kondisi yang diperiksa # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 888d803780..d9e7ee3636 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -4200,6 +4200,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Téigh i gcóna STR_ORDER_DROP_SERVICE_DEPOT :Seirbhísigh más gá STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Sonraí feithicle a bhunófar an léim air # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/italian.txt b/src/lang/italian.txt index aa056b67ea..3c298fe89d 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -4444,6 +4444,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Sempre STR_ORDER_DROP_SERVICE_DEPOT :Solo se necessario STR_ORDER_DROP_HALT_DEPOT :Ferma in deposito +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dato del veicolo sul quale basare il salto # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index c0cb01d65e..31452a5c9a 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -4311,6 +4311,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :常に行く STR_ORDER_DROP_SERVICE_DEPOT :必要であれば点検 STR_ORDER_DROP_HALT_DEPOT :運用停止 +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}輸送機器データに基づく条件分岐 # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/korean.txt b/src/lang/korean.txt index c3464d3d02..58abe9c7cd 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1496,17 +1496,17 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :옛날 차량 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :이 설정을 켜면, 오래된 차량 모델을 포함하여 모든 차량 모델을 도입 이후에 계속 사용할 수 있게 됩니다. STR_CONFIG_SETTING_TIMEKEEPING_UNITS :시간 단위: {STRING} -STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :게임에서 사용할 시간 표시 단위를 선택합니다. 나중에 변경할 수 없습니다.{}{}달력 기반은 1년 12개월, 매월 28~31일로 구성된 고전적인 OpenTTD 환경입니다.{}{}벽시계 기반은 차량 이동, 화물 생산 및 재정이 1분 단위로 대신 계산됩니다. 1분은 달력 기반 모드에서 한 달, 즉 30일 정도 걸리는 시간으로, 12분 간격으로 묶어서 1년을 구성합니다.{}{}두 단위 모두, 시간 표시 단위와 상관없이 차량, 주택 및 기타 인프라 도입 날짜에 사용되는 기존 달력 시스템을 별도로 사용합니다. +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :게임에서 사용할 시간 표시 단위를 선택합니다. 나중에 변경할 수 없습니다.{}{}달력 기반은 1년 12개월, 매월 28~31일로 구성된 고전적인 OpenTTD 환경입니다.{}{}벽시계 기반은 차량 이동, 화물 생산 및 재정이 1분 단위로 대신 계산됩니다. 1분은 달력 기반 모드에서 한 달, 즉 30일 정도 걸리는 시간으로, 12분 간격으로 묶어서 1년을 구성합니다.{}{}두 단위 모두, 시간 표시 단위와 상관없이 차량, 건물 및 기타 기반 시설 도입 날짜 등에는 기존의 달력 시스템을 별도로 사용합니다. ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :달력 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :벽시계 -STR_CONFIG_SETTING_MINUTES_PER_YEAR :1년의 길이: {STRING}분 +STR_CONFIG_SETTING_MINUTES_PER_YEAR :1년의 길이: {STRING}{ORANGE}분 STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :달력의 1년을 몇 분으로 할 지 선택합니다. 기본값은 12분입니다. 달력 시간이 변하는 것을 막으려면 0으로 설정하세요. 이 설정은 게임의 경제 시뮬레이션에는 영향을 미치지 않고, 벽시계 시간 설정을 사용할 때만 이용 가능합니다. STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special -STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (달력 시간 정지됨) +STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :(달력 시간 정지됨) 0 STR_CONFIG_SETTING_TOWN_CARGO_SCALE :도시 화물 생성 조정: {STRING} STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :도시의 화물 생산량을 이 백분율 값만큼 조정합니다. @@ -1933,6 +1933,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :전자식 신 STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :신호기를 CTRL 클릭할 때 바뀌는 신호기의 종류: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :신호기 건설에서 CTRL+클릭할 때 바뀌는 신호기의 종류를 선택합니다 ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :경로 신호기만 보여주기 STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :모두 보여주기 STR_CONFIG_SETTING_SIGNAL_GUI_MODE :보여줄 신호기 종류: {STRING} @@ -4376,6 +4377,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}현재 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}싣는 중 / 내리는 중 STR_VEHICLE_STATUS_LEAVING :{LTBLUE}출발 중 +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}배차 간격 유지 대기 중 STR_VEHICLE_STATUS_CRASHED :{RED}충돌! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}고장 STR_VEHICLE_STATUS_STOPPED :{RED}정지함 @@ -4389,6 +4391,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}경로 STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}다음 목적지: {WAYPOINT} ({VELOCITY}) STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}다음 목적지: {DEPOT} ({VELOCITY}) STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}점검: {DEPOT} ({VELOCITY}) +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}점검 및 배차 간격 대기: {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{STATION}에 갈 수 없음, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{WAYPOINT}에 갈 수 없음, {VELOCITY} @@ -4519,6 +4522,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}시간 STR_ORDERS_LIST_TOOLTIP :{BLACK}이 열차의 경로 - 선택하려면 클릭하세요. CTRL+클릭하시면 그 역이 있는 장소로 이동합니다 STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - 경로의 끝 - - STR_ORDERS_END_OF_SHARED_ORDERS :- - 공유된 경로의 끝 - - @@ -4555,6 +4559,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :이용 가능 STR_ORDER_DROP_GO_ALWAYS_DEPOT :항상 감 STR_ORDER_DROP_SERVICE_DEPOT :필요하면 점검 STR_ORDER_DROP_HALT_DEPOT :멈춤 +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}경로를 건너뛰기 위한 비교 조건을 선택합니다 @@ -4623,6 +4636,7 @@ STR_ORDER_REFIT_ORDER :({STRING}{G 0 " STR_ORDER_REFIT_STOP_ORDER :({STRING}에서 수리 후 멈춤) STR_ORDER_STOP_ORDER :(멈춤) +STR_ORDER_WAIT_TO_UNBUNCH :(배차 간격 유지 대기) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(이 역을 이용할 수 없음){POP_COLOUR} {STRING} {STATION} {STRING} @@ -5094,6 +5108,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}근처 STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :잘못된 차량기지 종류입니다 # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... 배차 간격 유지 경로는 하나만 사용 가능합니다 +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... 차량에 배차 간격 유지 경로가 있으면 가득 싣기 경로를 사용할 수 없습니다 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... 가득 싣기 경로가 있는 차량에는 배차 간격 유지를 사용할 수 없습니다 +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... 차량에 배차 간격 유지 경로가 있으면 조건부 경로를 사용할 수 없습니다 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... 조건부 경로가 있는 차량에는 배차 간격 유지를 사용할 수 없습니다 # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} : 교체된지 너무 오래되었습니다 diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 7fadd4109e..b233940696 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -4106,6 +4106,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ire semper STR_ORDER_DROP_SERVICE_DEPOT :Ministrari si necesse est STR_ORDER_DROP_HALT_DEPOT :Consiste +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Indicia vehiculi ad quae spectat ordines conditionales # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 511a3e711b..6f106fbebf 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -216,6 +216,7 @@ STR_COLOUR_SECONDARY_SAME_AS_PRIMARY :Tāds, ka prim STR_UNITS_VELOCITY_IMPERIAL :{DECIMAL}{NBSP}jūdzes stundā STR_UNITS_VELOCITY_METRIC :{DECIMAL}{NBSP}km/h STR_UNITS_VELOCITY_SI :{DECIMAL}{NBSP}m/s +STR_UNITS_VELOCITY_GAMEUNITS_DAY :{DECIMAL}{NBSP}lauciņi/dienā STR_UNITS_VELOCITY_GAMEUNITS_SEC :{DECIMAL}{NBSP}lauciņi/s STR_UNITS_VELOCITY_KNOTS :{DECIMAL}{NBSP}mezgli @@ -291,7 +292,7 @@ STR_TOOLTIP_RESIZE :{BLACK}Klikšķ STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Pārslēgties starp lielu/mazu loga izmēru STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Ritjosla - ritina sarakstu augšup/lejup STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Ritjosla - ritina sarakstu pa kreisi/pa labi -STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Nojaukt celtnes u.c. objektus no zemes platības. Ctrl iezīmē diagonālu laukumu. Shift pārslēdz nojaukšanu/izmaksu tāmes attēlošanu +STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Nojaukt celtnes u.c. objektus no zemes platības. Velkot Ctrl+klikšķis iezīmē diagonālu laukumu. Shift parāda izmaksas, neveicot nojaukšanu # Show engines button ###length VEHICLE_TYPES @@ -333,6 +334,7 @@ STR_SORT_BY_TYPE :veida STR_SORT_BY_TRANSPORTED :pārvadājuma STR_SORT_BY_NUMBER :numura STR_SORT_BY_PROFIT_LAST_YEAR :peļņas pērn +STR_SORT_BY_PROFIT_LAST_PERIOD :Peļņa pēdējā periodā STR_SORT_BY_PROFIT_THIS_YEAR :peļņas šogad STR_SORT_BY_PROFIT_THIS_PERIOD :Peļņa šajā periodā STR_SORT_BY_AGE :vecuma @@ -366,6 +368,7 @@ STR_SORT_BY_TOTAL_PROFIT_LAST_PERIOD :Kopējā peļņ STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Kopējā peļņa šogad STR_SORT_BY_TOTAL_PROFIT_THIS_PERIOD :Kopējā peļņa šajā periodā STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Vidējā peļņa iepriekšējā gadā +STR_SORT_BY_AVERAGE_PROFIT_LAST_PERIOD :Vidējā peļņa pēdējā periodā STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Vidējā peļņa šajā gadā STR_SORT_BY_AVERAGE_PROFIT_THIS_PERIOD :Vidējā peļņa šajā periodā @@ -383,32 +386,32 @@ STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauzēt STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Paātrināta spēle STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcijas un iestatījumi STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Saglabājiet, ielādējiet vai pametiet spēli, iziet no programmas -STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Rādīt karti, papildu skata logu, kravas plūsmu vai zīmju sarakstu -STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Rādīt pilsētu sarakstu -STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Rādīt subsīdijas -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Rādīt uzņēmuma staciju sarakstu -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Rādīt uzņēmuma finanšu stāvokli -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Rādīt uzņēmuma vispārējo informāciju -STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Rādīt stāstu grāmatu -STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Rādīt mērķu sarakstu -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Rādīt uzņēmumu grafikus un kravas maksājumu likmes -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Rādīt uzņēmumu rangu sarakstu -STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Izpētiet nozares vai finansējiet jaunas nozares celtniecību -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Rādīt uzņēmuma vilcienu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Rādīt uzņēmuma autotransporta sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Rādīt uzņēmuma kuģu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu -STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Rādīt uzņēmuma lidaparātu sarakstu. Ctrl+klikšķis pārslēdz grupu/transportlīdzekļu saraksta atvēršanu -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Pietuvināt skatu -STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Attālināt skatu -STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliežu ceļu -STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Būvēt ceļus -STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Būvēt tramvajus -STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Būvēt kuģu piestātnes +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Atvērt karti, papildu skata logu, kravas plūsmu vai zīmju sarakstu +STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Atvērt pilsētu sarakstu vai dibināt pilsētu +STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Atvērt subsīdiju sarakstu +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Atvērt uzņēmuma staciju sarakstu +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Atvērt uzņēmuma finanšu stāvokli +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Atvērt uzņēmuma vispārējo informāciju +STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Atvērt stāstu grāmatu +STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Atvērt mērķu sarakstu +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Atvērt uzņēmumu grafikus un kravas maksājumu likmes +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Atvērt uzņēmumu rangu sarakstu +STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Atvērt ražotņu sarakstu, ražošanas ķēdi vai subsidēt jauno ražotņu izveidi +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Atvērt uzņēmuma vilcienu sarakstu. Ctrl+noklikšķiniet, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Rādīt uzņēmuma autotransporta sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētajiem iestatījumiem +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Atvērt uzņēmuma kuģu sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem +STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Atvērt uzņēmuma lidaparātu sarakstu. Ctrl+klikšķis, lai parādītu vai paslēptu transportlīdzekļu grupas pretēji izvēlētiem iestatījumiem +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Pietuvināt +STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Attālināt +STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Buvēt dzelzceļa infrastruktūru +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Buvēt ceļu infrastruktūru +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Buvēt tramvaju infrastruktūru +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Būvēt ūdensceļu infrastruktūru STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Būvēt lidostas -STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Atvērt ainavas rīkjoslu, lai paceltu/nolaistu zemes līmeni, stādītu kokus utt. -STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Rādīt skaņas/mūzikas logu -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Rādīt pēdējo ziņojumu/ziņu pārskatu, ziņojumu vēsturi vai dzēst visus ziņojumus -STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Informācija par zemi, ekrānuzņēmums par OpenTTD un izstrādātāju rīkiem +STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Atveriet ainavu izvēlni, koku izvēlni vai novietojiet zīmi +STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Atvērt skaņas/mūzikas logu +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Atvērt pēdējo ziņojumu/ziņu pārskatu, ziņojumu vēsturi vai dzēst visus ziņojumus +STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Atvērt zemes informāciju, ekrānuzņēmumu izvēlni, OpenTTD kredītus vai izstrādātāju rīkus STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Pārslēgt rīkjoslas # Extra tooltips for the scenario editor toolbar @@ -418,15 +421,15 @@ STR_SCENEDIT_TOOLBAR_SCENARIO_EDITOR :{YELLOW}scenār STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}Pārvietot sākuma datumu 1 gadu atpakaļ STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}Pārvietot sākuma datumu 1 gadu uz priekšu STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}Klikšķināt, lai ievadītu sākuma gadu -STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Rādīt karti, pilsētu sarakstu -STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Ainavas radīšana -STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Pilsētu radīšana -STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Ražotņu radīšana -STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Ceļu būvēšana -STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Tramvaju sliežu ceļu būvniecība -STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Iestādiet kokus. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz celt/parādīt izmaksas +STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}Atvērt karti, papildu skata logu, zīmju sarakstu vai pilsētas vai ražotņu sarakstu +STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}Atvērt ainavu izvēlni vai izveidot jaunu pasauli +STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}Buvēt vai ģenerēt pilsētas +STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}Veidot vai ģenerēt ražotnes +STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Būvēt ceļu infrastruktūru +STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Būvēt tramvaju infrastruktūru +STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Iestādiet kokus. Velkot Ctrl+klikšķis atlasīs apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Novietot zīmi -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Novietojiet objektu. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Novietojiet objektu. Velkot Ctrl+klikšķis tiek atlasīts apgabals pa diagonāli. Shift parāda novērtētās izmaksas, neveicot iegādi # Scenario editor file menu ###length 7 @@ -611,8 +614,10 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}Pārvad STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}Uzņēmuma darbības vērtējumi (maksimālais ir 1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}Uzņēmuma vērtības diagramma +STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}Pēdējās 72 minūtes STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}Kravas apmaksas cenas +STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}Dienas ceļā STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}Sekundes tranzītā STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}Izmaksas par 10 vienību (vai 10,000 litru) kravas pārvadāšanu par 20 lauciņiem STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}Iespējot visu @@ -667,6 +672,7 @@ STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}To trans STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}Transportlīdzekļu skaits, kas pagājušajā periodā guva peļņu. Tas ietver autotransporta līdzekļus, vilcienus, kuģus un lidmašīnas STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}Nesen apkalpoto staciju skaits. Dzelzceļa stacijas, autoostas, lidostas un tamlīdzīgas tiek skaitītas kā atsevišķas, pat ja tās ir savienotas kā viena stacija STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}Transportlīdzekļa peļņa ar viszemākajiem ienākumiem (tiek ņemti vērā tikai transportlīdzekļi, kas vecāki par diviem gadiem) +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}Transportlīdzekļa peļņa ar viszemākajiem ienākumiem (tiek ņemti vērā tikai transportlīdzekļi, kas vecāki par diviem periodiem) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}Nopelnītās naudas daudzums ceturksnī ar vismazāko peļņu pēdējos 12 ceturkšņos STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}Nopelnītās naudas daudzums ceturksnī ar vislielāko peļņu pēdējos 12 ceturkšņos STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}Kravu vienības , kas piegādātas pēdējos četros ceturkšņos @@ -899,6 +905,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} ir kļuvis ļoti vecs un tam steidzami nepieciešama nomaiņa STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} nevar atrast ceļu, lai turpinātu STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} ir apmaldījies +STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :Uzņēmuma {WHITE}{VEHICLE} peļņa pagājušajā gadā bija {CURRENCY_LONG} STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE} peļņa pagājušajā periodā bija {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} nevar doties uz nākamo galamērķi, jo tas ir ārpus apgabala @@ -918,10 +925,16 @@ STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLAC STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidēšana atcelta:{}{}{STRING} pārvadājumi no {STRING} uz {STRING} turpmāk vairs netiek subsidēti STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Pakalpojuma subsīdijas piedāvājums:{}{}Pirmais {STRING} no {STRING} līdz {STRING} saņems {UNITS_YEARS_OR_MINUTES} subsīdiju no vietējās pašvaldības! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{} Pārvadājot {STRING} no {STRING} līdz {STRING} saņems 50% piemaksu par nākamo {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot {STRING} no {STRING} līdz {STRING} saņems dubultās likmes nākamos {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot{STRING} no {STRING} līdz {STRING} saņems trīskāršu maksu nākamo {UNITS_YEARS_OR_MINUTES}! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Pakalpojuma subsīdija piešķirta uzņēmumam {STRING}!{}{}Pārvadājot {STRING} no {STRING} līdz {STRING} saņems četrkāršu tarifu par nākamo {UNITS_YEARS_OR_MINUTES}! STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Satiksmes haoss pilsētā {TOWN}!{}{} Dēļ {STRING} finansētā ceļu atjaunošanas programmas, tuprmākos 6 mēnešus +STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Satiksmes haoss pilsētā {TOWN}!{}{}{STRING} finansētā ceļu atjaunošanas programma autobraucējiem sagādā 6 minūtes posta! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Pārvadājumu monopols! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}{TOWN} vietējā pašvaldība paraksta līgumu ar {STRING} par ekskluzīvām transporta tiesībām uz 12 mēnešiem! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}{TOWN} vietējā pašvaldība paraksta līgumu ar {STRING} par ekskluzīvām transporta tiesībām uz 12 minūtēm! # Extra view window STR_EXTRA_VIEWPORT_TITLE :{WHITE}Skatvieta {COMMA} @@ -939,6 +952,8 @@ STR_GAME_OPTIONS_TAB_GRAPHICS :Grafika STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Izvēlieties grafikas iestatījumus STR_GAME_OPTIONS_TAB_SOUND :Skaņa STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Izvēlieties skaņas un mūzikas iestatījumus +STR_GAME_OPTIONS_TAB_SOCIAL :Sociālais tīkls +STR_GAME_OPTIONS_TAB_SOCIAL_TT :{BLACK}Izvēlieties sociālās integrācijas iestatījumus STR_GAME_OPTIONS_VOLUME :Skaļums STR_GAME_OPTIONS_SFX_VOLUME :Skaņas efekti @@ -1028,20 +1043,22 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK} Atzīm STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Šis iestatījums stāsies spēkā tikai pēc spēles restartēšanas STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync -STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai sinhronizētu ekrānu. Mainīts iestatījums tiks piemērots tikai pēc spēles restartēšanas. Darbojas tikai ar iespējotu aparatūras paātrinājumu +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai sinhronizētu ekrānu. Mainīts iestatījums tiks piemērots tikai pēc spēles restartēšanas. Darbojas tikai ar ieslēgtu aparatūras paātrinājumu STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}Esošais vadītājs: {STRING} STR_GAME_OPTIONS_GUI_SCALE_FRAME :{BLACK}Saskarnes izmērs -STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Velciet slīdni, lai iestatītu interfeisa izmēru. Turiet nospiestu taustiņu Ctrl, lai veiktu nepārtrauktu regulēšanu +STR_GAME_OPTIONS_GUI_SCALE_TOOLTIP :{BLACK}Velciet slīdni, lai iestatītu saskarnes izmēru. Velciet Ctrl nepārtrauktai pielāgošanai STR_GAME_OPTIONS_GUI_SCALE_AUTO :{BLACK}Automātiski noteikt izmēru STR_GAME_OPTIONS_GUI_SCALE_AUTO_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai automātiski noteiktu interfeisa izmēru STR_GAME_OPTIONS_GUI_SCALE_BEVELS :{BLACK}Mēroga slīpumi STR_GAME_OPTIONS_GUI_SCALE_BEVELS_TOOLTIP :{BLACK}Atzīmējiet šo izvēlni, lai mērogotu slīpumu pēc saskarnes lieluma -STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Izmantot radicionālo sprite fontu +STR_GAME_OPTIONS_GUI_FONT_SPRITE :{BLACK}Izmantot tradicionālo sprite fontu STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Atzīmējiet šo izvēli, ja vēlaties izmantot tradicionālo fiksētā izmēra sprite fontu. +STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}Anti-alias fonti +STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}Atzīmējiet šo izvēli, ja vēlaties mainīt fontus ar anti-alias izmēru. STR_GAME_OPTIONS_GUI_SCALE_1X :1x STR_GAME_OPTIONS_GUI_SCALE_2X :2x @@ -1076,12 +1093,19 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Pamata m STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Atlasīt lietošanai pamata mūzikas kopu STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Papildinformācija par pamata mūzikas kopu +STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(nav instalētu spraudņu, ko integrēt ar sociālajām platformām) STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING}) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}Platforma: STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}Spraudņa stāvoklis: +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}Darbojas STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}Neizdevās instalēt +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} nedarbojas +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}Izkrauts STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}Dublēts spraudnis +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}Neatbalstīta versija +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}Nederīgs paraksts STR_BASESET_STATUS :{STRING} {RED}({NUM} trūkst/bojāts fail{P s i ""}) @@ -1230,7 +1254,7 @@ STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Rādīt ###length 3 STR_CONFIG_SETTING_OFF :izslēgts STR_CONFIG_SETTING_ON :ieslēgts -STR_CONFIG_SETTING_DISABLED :atspējots +STR_CONFIG_SETTING_DISABLED :Atspējots ###length 3 STR_CONFIG_SETTING_COMPANIES_OFF :izslēgts @@ -1249,6 +1273,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :pa labi STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}sekund{P 0 i es ""} +STR_CONFIG_SETTING_INFINITE_MONEY :Bezgalīga nauda: {STRING} STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :Atļaut neierobežotus tēriņus un izslēgt uzņēmumu bankrotu STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :Maksimālais sākotnējais aizdevums: {STRING} @@ -1277,6 +1302,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :Subsīdiju ilgu STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Nosakiet gadu skaitu, par kuru tiek piešķirta subsīdija STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :Iestatiet periodu skaitu, par kuriem tiek piešķirta subsīdija +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Bez subsīdijām @@ -1284,7 +1310,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Būvēšanas iz STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Iestatīt būvēšanas un pirkumu izmaksas STR_CONFIG_SETTING_RECESSIONS :Lejupslīde: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ja ieslēgts, ik pa laikam var gadīties recesijas. To laikā visa ražošana būtiski samazinās (tā atgriežas sākotnējā līmenī pēc recesijas beigām). +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ja ieslēgts, periodiski var rasties recesijas. Recesijas laikā visa ražošana ir ievērojami zemāka (tā atgriežas iepriekšējā līmenī, kad recesija ir beigusies) STR_CONFIG_SETTING_TRAIN_REVERSING :Neatļaut vilcienu apgriešanos stacijās: {STRING} STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Ja ieslēgts, stacijās vilcieni negriezīsies pretējā virzienā, pat ja braucot tādā veidā tie atrastu īsāku ceļu un nākamo pieturu; izņēmums ir gala stacijas @@ -1338,7 +1364,7 @@ STR_CONFIG_SETTING_FORBID_90_DEG :Aizliegt vilcie STR_CONFIG_SETTING_FORBID_90_DEG_HELPTEXT :90 grādu pagriezieni rodas, ja horizontālam sliežu ceļa posmam tieši seko vertikāls sliežu ceļa posms uz blakus esošā lauciņa. Tādējādi vilciens, šķērsojot lauciņu malas, veic 90 grādu pagriezienu, nevis parasto 45 grādu kā citām sliežu ceļu kombinācijām. Tas attiecas arī uz kuģu pagrieziena leņķiem. Tas arī attiecas uz kuģu pagriešanās rādiusu. STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS :Atļaut savienot stacijas, kas neatrodas tieši blakus: {STRING} -STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Atļaut pievienot staciju daļas, tām nesaskaroties ar jau esošajām. Novietojot jaunās daļas, ir nepieciešams nospiest Ctrl+klikšķis +STR_CONFIG_SETTING_DISTANT_JOIN_STATIONS_HELPTEXT :Ļauj pievienot staciju daļas, tām nesaskaroties ar jau esošajām spiežot Ctrl+klikšķis, novietojot jaunas daļas STR_CONFIG_SETTING_INFLATION :Inflācija: {STRING} STR_CONFIG_SETTING_INFLATION_HELPTEXT :Atļaut inflāciju ekonomikā, kur izmaksu celšanās nedaudz apsteidz ienākumus @@ -1374,10 +1400,11 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :labajā pusē ###length 2 STR_CONFIG_SETTING_SHOWFINANCES :Gada beigās rādīt finanšu pārskatu: {STRING} +STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :Rādīt finanšu logu perioda beigās: {STRING} ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Ja ieslēgts, katra gada beigās uznirst finanšu logs, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli -STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Ja iespējots, finanšu logs tiek parādīts katra perioda beigās, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :Ja ieslēgts, finanšu logs tiek parādīts katra perioda beigās, lai varētu viegli pārbaudīt uzņēmuma finansiālo stāvokli STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Jaunie rīkojumi noklusējumā ir 'bez pieturām': {STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :Transportlīdzeklis parasti pietur pie katras caurbraucamās stacijas. Ieslēdzot šo iestatījumu, tas dosies cauri visām ceļa stacijām uz savu galamērķi bez pieturām. Ņemiet vērā, ka šis iestatījums nosaka noklusējuma vērtību tikai jaunajiem rīkojumiem. Tomēr ir iespējams katru rīkojumu iestatīt arī atsevišķi @@ -1390,7 +1417,7 @@ STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :vidū STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :beigās STR_CONFIG_SETTING_AUTOSCROLL :Bīdīt logu, kad peles kursors atrodas tā malā: {STRING} -STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Ja iespējots, skatvieta sāk ritināties kad peles kursors ir pie loga malas +STR_CONFIG_SETTING_AUTOSCROLL_HELPTEXT :Ja ieslēgts, skatvieta sāk ritināties kad peles kursors ir pie loga malas ###length 4 STR_CONFIG_SETTING_AUTOSCROLL_DISABLED :atspējots STR_CONFIG_SETTING_AUTOSCROLL_MAIN_VIEWPORT_FULLSCREEN :galveno skatvietu, tikai pilnekrāna spēlei @@ -1400,10 +1427,11 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :katru skatvietu STR_CONFIG_SETTING_BRIBE :Atļaut piekukuļot vietējās pašvaldības: {STRING} ###length 2 STR_CONFIG_SETTING_BRIBE_HELPTEXT :Lauj uzņēmumiem mēģināt piekukuļot pilsētu vietējo pašvaldību. Ja inspektors paziņo par kukuli, tad uzņēmums pilsētā nevarēs darboties sešus mēnešus +STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :Ļaujiet uzņēmumiem mēģināt uzpirkt vietējās pašvaldības. Ja kukuli pamanīs inspektors, uzņēmums nevarēs rīkoties pilsētā sešas minūtes STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Atļaut pirkt pārvadājumu izņēmuma tiesības: {STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ja uzņēmums pērk pārvadājumu izņēmuma tiesības pilsētā, pretinieku stacijas (pasažieru un kravas) veselu gadu nesaņems nekādu kravu +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ja uzņēmums pērk ekskluzīvas pilsētas transporta tiesības, pretinieku stacijas (pasažieru un kravas) nesaņems nevienu kravu 12 mēnešus. STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Ja uzņēmums pērk ekskluzīvas pilsētas transporta tiesības, pretinieku stacijas (pasažieru un kravas) nesaņems nevienu kravu 12 minūtes. STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Atļaut ēku finansēšanu: {STRING} @@ -1463,21 +1491,28 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :visiem transpor STR_CONFIG_SETTING_WARN_INCOME_LESS :Brīdināt, ja transportlīdzekļa ienākumi ir negatīvi: {STRING} ###length 2 STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Ja ieslēgts, tiks sūtīts ziņojums gadījumā kad transportlīdzeklis negūst nekādu peļņu kalendārā gada laikā -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Ja iespējots, tik nosūtīts ziņojums, ja transportlīdzeklis noteiktā periodā nav guvis peļņu +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Ja ieslēgts, tik nosūtīts ziņojums, ja transportlīdzeklis noteiktā periodā nav guvis peļņu STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Transportlīdzekļi nekad "nemirst": {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Kad ieslēgts, visi transportlīdzekļu modeļi pēc to ieviešanas vienmēr ir pieejami STR_CONFIG_SETTING_TIMEKEEPING_UNITS :Laika uzskaite: {STRING} +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :Izvēlieties spēles laika mērīšanas vienības. Vēlāk to nevar mainīt.{}{}Kalendāra pamatā ir klasiskā OpenTTD pieredze, kurā gads sastāv no 12 mēnešiem un katru mēnesi ir 28–31 diena.{}{}{}Uz sienas pulksteni balstītā laikā, transportlīdzekļu kustībā, kravu ražošana, un finanses ir balstītas uz vienas minūtes soli, kas ir aptuveni tikpat ilgs laiks, cik 30 dienu mēnesis aizņem kalendāra režīmā. Tie ir sagrupēti 12 minūšu periodos, kas ir līdzvērtīgi gadam kalendāra režīmā.{}{}{}Abos režīmos vienmēr ir klasisks kalendārs, kas tiek izmantots transportlīdzekļu, māju un citas infrastruktūras datu ievadīšanai. ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalendārs +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Sienas pulkstenis +STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minūtes gadā: {STRING} STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Izvēlieties minūšu skaitu kalendārajā gadā. Noklusējums ir 12 minūtes. Iestatiet uz 0, lai apturētu kalendāra laika izmaiņas. Šis iestatījums neietekmē spēles ekonomisko simulāciju un ir pieejams tikai tad, ja tiek izmantots sienas pulksteņa laika mērijums +STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special +STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0 (kalendāra laiks ir iesaldēts) STR_CONFIG_SETTING_TOWN_CARGO_SCALE :Mērogot pilsētas kravu ražošana: {STRING} STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :Mērogojiet pilsētu kravu ražošanu par šo procentu. +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :Merogot industrijas kravu ražošanu: {STRING} +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :Mērogojiet nozaru kravu ražošanu par šo procentu. STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Automātiski atjaunot transportlīdzekļus, kad tie ir kļuvuši veci: {STRING} @@ -1510,7 +1545,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Diagrammu līni STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :Rādīt jauno NewGRF paplašinājumu nosaukumus uzbūvēto transportlīdzekļu logā: {STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :Uzbūvēto transportlīdzekļu loga pievienot rindu, kurā būtu redzams, no kura NewGRF nāk izvēlētais transportlīdzeklis. STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :Rādīt kravas, ko transportlīdzekļi var pārvadāt saraksta logos {STRING} -STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Ja iespējots, transportlīdzekļa transportējamā krava parādīsies virs tās transportlīdzekļu sarakstos +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :Ja ieslēgts, transportlīdzekļa transportējamā krava parādīsies virs tās transportlīdzekļu sarakstos STR_CONFIG_SETTING_LANDSCAPE :Ainava: {STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :Ainavas nosaka pamata spēles scenārijus ar dažādām kravām un pilsētu izaugsmes nosacījumiem. NewGRF un spēles skripti dod smalkākas kontroles iespējas @@ -1641,7 +1676,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_OFF :izslēgts STR_CONFIG_SETTING_OSK_ACTIVATION :Ekrāntastatūra: {STRING} STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Izvēlieties metodi, kas atvērs ekrnāna tastatūru, lai teksta lauciņos varētu ievadīt tekstu, izmantojot rādītājierīces. Tas ir domāts ierīcēm, kurām nav tastatūras. ###length 4 -STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :atspējota +STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Atspējots STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :dubultklikšķis STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :viens klikšķis (kad fokusēta) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :viens klikšķis (nekavējoties) @@ -1721,7 +1756,7 @@ STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Automātiski no STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Automātiski noņemiet signālus dzelzceļa būvniecības laikā, ja signāli ir uz ceļa. Ņemiet vērā, ka tas var izraisīt vilcienu avārijas. STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Ātrās pārsniegšanas ātruma ierobežojums: {STRING} -STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Ierobežojiet spēles ātrumu, kad ir iespējota ātrā spēles gaita. 0 = nav ierobežojumu (tik ātri, cik ļauj jūsu dators). Vērtības, kas zemākas par 100%, palēnina spēli. Augšējā robeža ir atkarīga no jūsu datora specifikācijas un var atšķirties atkarībā no spēles. +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Ierobežojiet spēles ātrumu, kad ir ieslēgta ātrā spēles gaita. 0 = nav ierobežojumu (tik ātri, cik ļauj jūsu dators). Vērtības, kas zemākas par 100%, palēnina spēli. Augšējā robeža ir atkarīga no jūsu datora specifikācijas un var atšķirties atkarībā no spēles. STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% standarta spēles ātrums ###setting-zero-is-special STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :Bez ierobežojumiem (tik ātri, cik ļauj jūsu dators) @@ -1738,6 +1773,7 @@ STR_CONFIG_SETTING_SOUND_NEW_PERIOD :Perioda beigas: ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Atskaņot skaņu gada beigās, apkopojot uzņēmuma darbības sasniegumus gada laikā salīdzinājumā ar iepriekšējo gadu +STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :Atskaņojiet skaņu perioda beigās, apkopojot uzņēmuma darbību attiecīgajā periodā salīdzinājumā ar iepriekšējo periodu STR_CONFIG_SETTING_SOUND_CONFIRM :Būvniecība: {STRING} STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Atskaņot skaņu pēc sekmīgas būvēšanas vai citām darbībām @@ -1798,7 +1834,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT :Lidaparātu apk STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :Izvēlēties jauniem lidaparātiem apkopju noklusējuma starplaiku, ja transportlīdzeklim tas nav noteikts STR_CONFIG_SETTING_SERVINT_SHIPS :Kuģu apkopju noklusējuma starplaiks: {STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :Izvēlēties jauniem kuģiem apkopju noklusējuma starplaiku, ja transportlīdzeklim tas nav noteikts -STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}dien{P 0 a as u}/% +STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}Dien{P 0 a as u}/Minūt{P 0 e es es}/% ###setting-zero-is-special STR_CONFIG_SETTING_SERVINT_DISABLED :izslēgts @@ -1890,7 +1926,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Velkot izvietot STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Iestatīt attālumus, kādos līdz nākamajam šķērslim (signālierīcei, dzelzceļa mezglam) uz ceļa tiks būvētas signālierīces, ja tās tiek vilktas STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} lauciņ{P 0 a a a} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Velkot paturēt vienādu attālumu starp signālierīcēm: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Signālierīču izvietošanas uzvedības izvēle, kad to veic ar Ctrl+velkot. Ja izslēgts, signālierīces tiek novietotas pie tuneļiem un tiltiem, lai izvairītos no gariem posmiem bez signālierīcēm. Ja ieslēgts, signālierīces tiek izvietotas uz katra N lauciņa, atvieglojot to izkārtošanu uz paralēliem sliežu ceļiem +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Velkot signālus, izvēlaties izvietojuma opciju. Ja ieslēgts, signāli tiek novietoti ap tuneļiem vai tiltiem, lai izvairītos no gariem posmiem bez signāliem. Ja atslēgts, signāli tiek ievietoti ik pēc n elementiem, atvieglojot signālu izlīdzināšanu paralēlos sliežu ceļus STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Automātiski būvēt semaforus pirms: {STRING} gada STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Izvēlēties gadu, kad ceļiem sāks izmantot elektriskās signālierīces. Pirms šā gada tiks izmantotas neelektriskās signālierīces (kam ir tieši tāda pati funkcija, bet ar atšķirīgu izskatu) @@ -1898,6 +1934,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Izvēlēties ga STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Braukt garām signālu veidiem: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Atlasiet, kādus signālu veidus izmantot, izmantojot Ctrl+noklikšķinot uz izveidotā signāla, izmantojot signāla rīku ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Tikai pašreizējā grupa STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Redzami visi STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Rādīt signāla tipus: {STRING} @@ -2030,6 +2067,8 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Vai lietotāja STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :impērijas, britu (jūdzes stundā) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :metriskās (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI, starptautiskās (m/s) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :Spēles vienības (rūtiņas/dienā) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :Spēles vienības (rūtiņas/sek.) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Mezgli STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Transportlīdzekļu jaudas mērvienības: {STRING} @@ -2168,14 +2207,14 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Izvēlē STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Izvēlēties 'subtropu klimata' ainavas stilu STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Izvēlēties 'rotaļlietu zemes' ainavas stilu -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Rādīt spēles opcijas -STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Rādīt sasniegumu tabulu +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Atvērt spēles opcijas +STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Atvērt sasniegumu tabulu STR_INTRO_TOOLTIP_HELP :{BLACK}Piekļūstiet dokumentācijai un tiešsaistes resursiem -STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Displeja iestatījumi -STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Rādīt NewGRF iestatījumus +STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Atvērt iestatījumus +STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Atvērt NewGRF iestatījumus STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Pārbaudīt vai lejupielādei nav pieejams jauns un atjaunināts saturs -STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Parādīt AI iestatījumus -STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Displeja spēles skripta iestatījumi +STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Atvērt AI iestatījumus +STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS :{BLACK}Atvērt spēles skripta iestatījumi STR_INTRO_TOOLTIP_QUIT :{BLACK}Iziet no 'OpenTTD' STR_INTRO_BASESET :{BLACK}Pašlaik izvēlētajai bāzes grafikas kopai trūkst {NUM} sprait{P s i u}. Lūdzu, pārbaudiet, vai bāzes kopai ir atjauninājumi. @@ -2206,7 +2245,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Ziņot p STR_HELP_WINDOW_COMMUNITY :{BLACK}Kopiena # Cheat window -STR_CHEATS :{WHITE}Blēdības +STR_CHEATS :{WHITE}Smilškastes Opcijas STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING} @@ -2231,7 +2270,7 @@ STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Rādīt STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Rādīt autotransporta grupu krāsas STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Rādīt kuģu grupu krāsas STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Rādīt lidaparātu grupu krāsas -STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izvēlēties galveno identitātes krāsu atlasītajai shēmai. Ctrl+klikšķis iestatīs šo krāsu katrai shēmai +STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Izvēlieties primāro krāsu atlasītajai shēmai. Ctrl+klikšķis, lai iestatītu šo krāsu katrai shēmai STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Izvēlēties papildu identitātes krāsu atlasītajai shēmai. Ctrl+klikšķis iestatīs šo krāsu katrai shēmai STR_LIVERY_PANEL_TOOLTIP :{BLACK}Izvēlēties kuru identitātes krāsu shēmu mainīt, vai vairākas ar Ctrl+klikšķi. Klikšķināt uz rūtiņas, lai pārslēgtu shēmas izmantošanu STR_LIVERY_TRAIN_GROUP_EMPTY :Vilcienu grupas nav izveidotas @@ -2343,6 +2382,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartes i STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Spēles kartes izmērs{}Klikšķināt, lai šķirotu laukumos STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}Datums STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}Šībrīža datums +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}h {NUM}m +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}Spēles laiks +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}Spēles laiks, kamēr{} spēle netika apturēta STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Valoda, servera versija utt. STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}Klikšķināt sarakstā uz spēles, lai to izvēlētos @@ -2717,6 +2759,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}{CARGO_LONG}, kas jāpārvadā mēnesī no {STATION} uz {STATION} ({COMMA}% no jaudas){STRING} STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}{CARGO_LONG}, kas jāpārvadā minūtē no {STATION} uz {STATION} ({COMMA}% no jaudas){STRING} STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}{CARGO_LONG} jātransportē atpakaļ ({COMMA}% no pārvadājuma) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}Vidējais braucina laiks: {UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Pārklājuma iezīmēšana @@ -2745,16 +2788,16 @@ STR_RAIL_TOOLBAR_ELRAIL_CONSTRUCTION_CAPTION :Elektrificētā STR_RAIL_TOOLBAR_MONORAIL_CONSTRUCTION_CAPTION :Viensliedes būvniecība STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :Magleva būvēšana -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliedes. Ctrl pārslēdz sliežu būvniecību/nojaukšanu. Shift pārslēdz būve/rādīt izmaksu tāmi -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Būvēt dzelzceļu, izmantojot automātisko sliežu režīmu. Ctrl pārslēdz sliežu būvniecību/demolēšanu -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Būvēt vilcienu depo (vilcienu pirkšanai un apkopei). Shift pārslēdz būvi/rādīt izmaksu tāmi -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Izveidojiet ceļa punktu uz dzelzceļa. Ctrl ļauj pievienot vairākus pieturas punktus. Shift rāda izmaksu tāmi -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Būvēt dzelzceļa staciju. Ctrl iespējo staciju apvienošanu. Shift pārslēdz būve/rādīt izmaksu tāmi -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Būvēt signālu uz dzelzceļa. Ctrl pārslēdz semaforu/gaismas signālus{}Velkot, signāli tiek veidoti taisnā sliedes posmā. Ctrl veido signālus līdz nākamajam krustojumam vai signālam{}Ctrl+Click pārslēdz signāla atlases loga atvēršanu. Shift rāda izmaksu tāmi +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Būvēt sliedes. Ctrl pārslēdz sliežu būvniecību/nojaukšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Būvēt dzelzceļu, izmantojot automātisko sliežu režīmu. Ctrl+klikšķis pārslēdz sliežu būvniecību/demolēšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Būvēt vilcienu depo (vilcienu pirkšanai un apkopei). Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Izveidojiet ceļa punktu uz dzelzceļa. Ctrl ļauj pievienot vairākus pieturas punktus. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Būvēt dzelzceļa staciju. Ctrl+klikšķis iespējo staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Būvēt dzelzceļa signālu. Ctrl+klikšķis, lai izveidotu alternatīvu signāla stilu{} Velciet lai aizpildītu signālus līdz nākamajam krustojumam, stacijai vai signālam. Shiftparāda izmaksas, neveicot iegādi STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Būvēt dzelzceļa tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Būvēt dzelzceļa tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Pārslēgties starp sliežu, signālierīču, pieturas punktu būvēšanu/noņemšanu. Aizturēt Ctrl, lai noņemtu arī sliedes no pieturas punktiem un stacijām -STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pārveidot/uzlabot sliežu veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Būvēt dzelzceļa tuneli. Shift parāda izmaksas, neveicot būvēšanu +STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Pārslēgties starp sliežu, signālierīču, pieturas punktu būvēšanu/noņemšanu. Aizturēt Ctrl+klikšķis, lai noņemtu arī sliedes no pieturas punktiem un stacijām +STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pārveidot/uzlabot sliežu veidu. Shift parāda novērtētās izmaksas, neveicot iegādi STR_RAIL_NAME_RAILROAD :Dzelzceļš STR_RAIL_NAME_ELRAIL :Elektrificēts dzelzceļš @@ -2830,25 +2873,25 @@ STR_BRIDGE_TUBULAR_SILICON :Cauruļveida, s # Road construction toolbar STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}Ceļu būvniecība STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}Tramvaju sliežu ceļu būvniecība -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Ceļu būves izvēle. Ctrl pārslēdz ceļa būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Tramvaju sliežu būves izvēle. Ctrl pārslēdz tramvaju sliežu būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Būvēt ceļu izmantojot automātiskā ceļa paņēmienu. Ctrl pārslēdz ceļu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Būvēt tramvaju sliedes izmantojot automātisko paņēmienu. Ctrl pārslēdz tramvaju sliežu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Ceļu būves izvēle. Ctrl+klikšķis pārslēdz ceļa būvešanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Būvēt tramvaja posmu. Ctrl+klikšķis, lai noņemtu tramvaja posmu. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Būvēt ceļu izmantojot automātiskā ceļa paņēmienu. Ctrl+klikšķis pārslēdz ceļu būvēšanu/nojaukšanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Būvēt tramvaju sliedes izmantojot automātisko paņēmienu. Ctrl+klikšķis pārslēdz tramvaju sliežu būvēšanu/nojaukšanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Būvēt autotransporta depo (autotransporta līdzekļu pirkšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Būvēt tramvaju depo (tramvaju pirkšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Būvēt autobusu pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Būvēt pasažieru tramvaju pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Uzbūvēt kravas automašīnu staciju. Ctrl ļauj buvēt stacijas. Shift rāda izmaksu tāmi -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Būvēt kravas tramvaju pieturvietu. Ctrl ieslēdz pieturvietu apvienošanu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Būvēt tramvaju depo (tramvaju pirkšanai un apkopei). Shift parāda izmaksas, neveicot būvēšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Būvēt autobusu pieturvietu. Ctrl+klikšķis ieslēdz pieturvietu apvienošanu. Shift+klikšķis parāda izmaksas, neveicot būvēšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Būvēt pasažieru tramvaju staciju. Ctrl+klikšķis, lai atlasītu citu staciju, kurai pievienoties. Nospiediet taustiņu Shift, lai rādītu izmaksu tāmi +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Būvēt kravas automašīnu staciju. Ctrl+klikšķis iespējo staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Būvēt kravas tramvaju pieturvietu. Ctrl+klikšķis ieslēdz pieturvietu apvienošanu. Shift parāda novērtētās izmaksas, neveicot būvēšanu STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ieslēgt/izslēgt vienvirziena ceļus -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Būvēt ceļa tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Būvēt tramvaju tiltu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Būvēt ceļa tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Būvēt tramvaju tuneli. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Būvēt ceļa tiltu. Nospiediet taustiņu Shift, lai rādītu tikai izmaksu tāmi +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Būvē tramvaja tiltu. Nospiediet taustiņu Shift, lai rādītu tikai izmaksu tāmi +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Būvēt ceļa tuneli. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Būvēt tramvaju tuneli. Shift parāda novērtētās izmaksas, neveicot būvēšanu STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Pārslēgties starp ceļa būvēšanas/nojaukšanas režīmiem STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Pārslēgt būvēt/novākt tramvaju būvei -STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Pārveidot/uzlabot ceļa veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu -STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Pārveidot/uzlabot tramvaju veidu. Shift pārslēdz būvēšanu/izmaksu novērtējumu rādīšanu +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Pārveidot/uzlabot ceļa veidu. Shift parāda izmaksas, neveicot uzlabojumu +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Pārveidot/uzlabot tramvaju veidu. Shift parāda izmaksas, neveicot uzlabošanu STR_ROAD_NAME_ROAD :Ceļš STR_ROAD_NAME_TRAM :Tramvaja ceļš @@ -2872,14 +2915,14 @@ STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Izvēlē # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Ūdensceļu būvniecība STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Ūdensceļi -STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Būvēt kanālus. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Būvēt slūžas. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Būvēt kuģu depo (kuģu būvēšanai un apkopei). Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu -STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Būvēt kuģu piestātni. Ctrl ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu -STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Izvietot boju, kura var kalpot kā pieturas punkts. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Būvēt akveduktu. Shift pārslēdz būvēšanu/izmaksu tāmes rādīšanu -STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Norādīt ūdens laukumu.{}Būvēt kanālu. Ja tur nospiestu Ctrl jūras līmenī, tad appludinās apkārtni -STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Pievienot updes. Ctrl pievieno apgabalu diagonāli +STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Būvēt kanālus. Shift parāda izmaksas, neveicot būvēšanu +STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Būvēt slūžas. Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Būvēt kuģu depo (kuģu būvēšanai un apkopei). Shift parāda novērtētās izmaksas, neveicot būvēšanu +STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Būvēt kuģu piestātni. Ctrl+klikšķis ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu +STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Izvietot boju, kura var kalpot kā pieturas punkts. Shift parāda novērtētās izmaksas, neveicot izvietojumu +STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Būvēt akveduktu. Shift parāda novērtētās izmaksas, neveicot buvēšanu +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Būvēt kanālu. Ctrl+klikšķis jūras līmenī, lai tā vietā appludinātu ar jūras ūdeni +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Izveidot upes. Ctrl+klikšķis, lai veidotu pa diagonāli # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Kuģu depo virziens @@ -2890,7 +2933,7 @@ STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Piestāt # Airport toolbar STR_TOOLBAR_AIRCRAFT_CAPTION :{WHITE}Lidostas -STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Būvēt lidostu. Ctrl ieslēdz staciju apvienošanu. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu +STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP :{BLACK}Būvēt lidostu. Ctrl+klikšķis ieslēdz staciju apvienošanu. Shift parāda izmaksas, neveicot būvēšanu # Airport construction window STR_STATION_BUILD_AIRPORT_CAPTION :{WHITE}Lidostas izvēle @@ -2917,14 +2960,14 @@ STR_STATION_BUILD_NOISE :{BLACK}Radītai # Landscaping toolbar STR_LANDSCAPING_TOOLBAR :{WHITE}Ainavas veidošana -STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Pazemināt zemes stūri. Vilkšana pazemina pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu -STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Pacelt zemes stūri. Vilkšana paceļ pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu -STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Izlīdzināt zemes laukumu pirmā izvēlētā stūra augstumā. Ctrl iezīmē laukumu diagonāli. Shift pārslēdz būvēšanu/izmaksu novērtējuma rādīšanu -STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Iegādājieties zemi turpmākai lietošanai. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi +STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Pazemināt zemes stūri. Vilkšana pazemina pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Velkot Ctrl+klikšķis iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi +STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Pacelt zemes stūri. Vilkšana paceļ pirmo izvēlēto stūri un nolīdzina izvēlēto laukumu uz stūra jauno augstumu. Ctrl iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi +STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Izlīdzināt zemes laukumu pirmā izvēlētā stūra augstumā. Ctrl iezīmē laukumu diagonāli. Shift parāda izmaksas, neveicot iegādi +STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Iegādājieties zemi turpmākai lietošanai. Velkot Ctrl+klikšķis atlasa apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi # Object construction window STR_OBJECT_BUILD_CAPTION :{WHITE}Objektu izvēle -STR_OBJECT_BUILD_TOOLTIP :{BLACK}Izvēlēlaties buvējamo objektu. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz ēku/rāda izmaksu tāmi +STR_OBJECT_BUILD_TOOLTIP :{BLACK}Izvēlēlaties buvējamo objektu. Ctrl atlasa apgabalu pa diagonāli. Shift parāda novērtētās izmaksas, neveicot būvēšanu STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Izvēlēties būvējamā objekta klasi STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Objekta priekšskatījums STR_OBJECT_BUILD_SIZE :{BLACK}Izmērs: {GOLD}{NUM} x {NUM} lauciņi @@ -2936,7 +2979,7 @@ STR_OBJECT_CLASS_TRNS :Raidītāji STR_PLANT_TREE_CAPTION :{WHITE}Koki STR_PLANT_TREE_TOOLTIP :{BLACK}Izvēlēties koka veidu stādīšanai. Ja lauciņš jau ir koks, tas pievienos vairāk jauktu veidu kokus neatkarīgi no izvēlētā veida STR_TREES_RANDOM_TYPE :{BLACK}Nejauši izvēlēta veida koki -STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Novietojiet jaukta veida kokus. Ctrl atlasa apgabalu pa diagonāli. Shift pārslēdz celtniecību/rāda izmaksas +STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Novietojiet jaukta veida kokus. Velkot Ctrl+klikšķis atlasa apgabalu pa diagonāli. Shift parāda izmaksas, neveicot iegādi STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Nejauši koki STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Stādīt nejaušus kokus visā ainavā STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normāls @@ -2949,7 +2992,7 @@ STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Stādiet # Land generation window (SE) STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Zemes radīšana STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Ainavā novietot akmeņainus apvidus -STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Norādīt tuksneša laukumu.{}Turēt nospiestu Ctrl, lai to noņemtu +STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Norādīt tuksneša laukumu.{}Turēt nospiestu Ctrl+klikšķis, lai to noņemtu STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Palielināt zemes apgabalu pazemināšanai/paaugstināšanai STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Samazināt zemes apgabalu pazemināšanai/paaugstināšanai STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Radīt nejaušu zemi @@ -2963,7 +3006,7 @@ STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Vai tie # Town generation window (SE) STR_FOUND_TOWN_CAPTION :{WHITE}Pilsētu radīšana STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}Jauna pilsēta -STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Dibināt jaunu pilsētu. Shift+klikšķis rāda tikai izmaksu tāmi +STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Dibināt jaunu pilsētu. Shift parāda izmaksas, neveicot dibināšanu STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Nejauša pilsēta STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Dibināt pilsētu nejaušā vietā STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Daudz nejauši izveidotu pilsētu @@ -3029,7 +3072,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Izvēlē # Land area window STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Zemes platības informācija -STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK} Centrējiet galveno skatu uz lauciņa atrašanās vietu. Ctrl + klikšķis atver jaunu skatu logu lauciņa atrašanās vietā +STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK} Centrējiet galveno skatu uz lauciņa atrašanās vietu. Ctrl+klikšķis atvērs skatu uz lauciņu jaunā skatlaukā STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Notīrīšanas izmaksa: {LTBLUE}nav zināma STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Notīrīšanas izmaksa: {RED}{CURRENCY_LONG} STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Ieņēmumi pēc notīrīšanas: {LTBLUE}{CURRENCY_LONG} @@ -3042,7 +3085,7 @@ STR_LAND_AREA_INFORMATION_RAIL_OWNER.kas :{BLACK}Dzelzce STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY :{BLACK}Pašvaldība: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_LOCAL_AUTHORITY_NONE :Neviena STR_LAND_AREA_INFORMATION_LANDINFO_COORDS :{BLACK}Koordinātes: {LTBLUE}{NUM} x {NUM} x {NUM} ({STRING}) -STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Uzbūvēts: {LTBLUE}{DATE_LONG} +STR_LAND_AREA_INFORMATION_BUILD_DATE :{BLACK}Buvēts/atjaunots: {LTBLUE}{DATE_LONG} STR_LAND_AREA_INFORMATION_STATION_CLASS :{BLACK}Stacijas klase: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_STATION_TYPE :{BLACK}Stacijas tips: {LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_AIRPORT_CLASS :{BLACK}Lidostas klase: {LTBLUE}{STRING} @@ -3277,11 +3320,11 @@ STR_MAPGEN_VARIETY :{BLACK}Dažād STR_MAPGEN_GENERATE :{WHITE}Radīt STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Izveidojiet pasauli un spēlējiet OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF Iestatījumi -STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Rādīt NewGRF iestatījumus +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Atvērt NewGRF iestatījumus STR_MAPGEN_AI_SETTINGS :{BLACK}AI iestatījumi -STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Parādīt AI iestatījumus +STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Atvērt AI iestatījumus STR_MAPGEN_GS_SETTINGS :{BLACK}Spēles skripta iestatījumi -STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Rādīt spēles skripta iestatījumus +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Atvērt spēles skripta iestatījumus ###length 21 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Angļu (sākotnējie) @@ -3559,7 +3602,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Pārslē # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Labot zīmi -STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrējiet norādes atrašanās vietas galveno skatu. Ctrl + klikšķis atver jaunu skata zīmi uz zīmes atrašanās vietas +STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Centrējiet norādes atrašanās vietas galveno skatu. Ctrl+klikšķis atver jaunu skata zīmi uz zīmes atrašanās vietas STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Doties uz nākamo zīmi STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Doties uz iepriekšējo zīmi @@ -3571,7 +3614,7 @@ STR_TOWN_DIRECTORY_NONE :{G=m}{ORANGE}- STR_TOWN_DIRECTORY_NONE.kas :{ORANGE}- Neviena - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Pilsēta){BLACK} ({COMMA}) -STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to. Ctrl+klikšķis atvērs jaunu skatu lauku uz pilsētu +STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}Pilsētu nosaukumi - klikšķināt uz nosaukuma, lai centrētu skatu uz to.Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā STR_TOWN_POPULATION :{BLACK}Pasaules iedzīvotāju skaits: {COMMA} # Town view window @@ -3586,6 +3629,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} piegādāts STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (joprojām pieprasīts) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (piegādāts) +STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Pilsēta attīstās ik pēc {ORANGE}{UNITS_DAYS_OR_SECONDS} +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Pilsēta attīstās ik pēc {ORANGE}{UNITS_DAYS_OR_SECONDS} (finansēts) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Pilsēta {RED}neattīstās{BLACK} STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Trokšņu ierobežojums pilsētā: {ORANGE}{COMMA}{BLACK} maks.: {ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz pilsētu. Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā @@ -3625,8 +3670,11 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :Dot kukuli paš STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}Sāciet nelielu vietējo reklāmas kampaņu, lai piesaistītu vairāk pasažieru un kravas saviem transporta pakalpojumiem.{}Nodrošina īslaicīgu staciju vērtējuma palielinājumu nelielā rādiusā ap pilsētas centru.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}Veiciet vidējo reklāmas kampaņu lai palielinātu pasažieru un kravu parvadājumu savās stacijās.{}Tas īslaicīgi palielinās to staciju vērtējumu, kuras atrodas netālu no pilsētas centra.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}Sāciet lielu vietējo reklāmas kampaņu lai piesaistītu vairāk pasažieru un kravas saviem transporta pakalpojumiem.{}Nodrošina īslaicīgu staciju vērtējuma palielinājumu lielā rādiusā ap pilsētas centru.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}Finansējiet pilsētas ceļu tīkla rekonstrukciju.{}Izraisa ievērojamus ceļu satiksmes traucējumus līdz pat 6 mēnešiem.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}Finansējiet pilsētas ceļu tīkla rekonstrukciju.{}Izraisa ievērojamus ceļu satiksmes traucējumus līdz pat 6 minūtēm.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}Uzceliet statuju par godu savam uzņēmumam.{}Nodrošina pastāvīgu staciju vērtējuma palielinājumu šajā pilsētā.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}Finansējiet jaunu ēku celtniecību pilsētā.{}Nodrošina īslaicīgu stimulu pilsētas izaugsmei šajā pilsētā.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}Iegādājieties ekskluzīvas transporta tiesības pilsētā uz 12 mēnešiem.{}Pašvaldība neļaus pasažieriem un kravai izmantot jūsu konkurentu stacijas. Veiksmīgs kukulis no konkurenta atcels šo līgumu.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}Iegādājieties ekskluzīvas transporta tiesības pilsētā uz 12 minūtēm.{}Pilsētas pārvalde neļaus pasažieriem un kravai izmantot jūsu konkurentu stacijas. Veiksmīgs kukulis no konkurenta atcels šo līgumu.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}Piekukuļot vietējo pašvaldību, lai paaugstinātu savu vērtējumu un atceltu konkurenta ekskluzīvās transporta tiesības, riskējot ar bargu sodu, ja tiksiet pieķerts.{}{POP_COLOUR}Izmaksas: {CURRENCY_LONG} @@ -3676,11 +3724,14 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :Aizvērt # Subsidies window STR_SUBSIDIES_CAPTION :{WHITE}Subsīdijas STR_SUBSIDIES_OFFERED_TITLE :{BLACK}Piedāvājumā esošās subsīdijas par pakalpojumu nodrošināšanu: +STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}{STRING} no {STRING} līdz {STRING}{YELLOW} ({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- Neviens - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}Pašlaik subsidētie pakalpojumi: -STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikšķināt uz servisa, lai iecentrētu skatu uz rūpnīcu/pilsētu. Ctrl+klikšķis atvērs jaunu skatu lauku uz pilsētu/rūpnīcu +STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING} no {STRING} līdz {STRING}{YELLOW} ({COMPANY}{YELLOW}, {STRING}) +STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikšķināt uz servisa, lai iecentrētu skatu uz rūpnīcu/pilsētu. Ctrl+klikšķis atvērs skatu uz pilsētu jaunā skatlaukā STR_SUBSIDIES_OFFERED_EXPIRY_DATE :līdz {DATE_SHORT} STR_SUBSIDIES_OFFERED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} laikā +STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :līdz {DATE_SHORT} STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :{UNITS_MONTHS_OR_MINUTES} atlikušais kalpošanas laiks # Story book window @@ -3697,8 +3748,8 @@ STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Doties u STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Mērķa norāde ir nederīga # Station list window -STR_STATION_LIST_TOOLTIP :{BLACK}Staciju nosaukumi - klikšķināt uz nosaukuma, lai centrētu galveno skatu uz staciju. Ctrl+klikšķis atvērs jaunu skatvietu pie stacijas -STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Aizturēt Ctrl, lai izvēlētos vairākus +STR_STATION_LIST_TOOLTIP :{BLACK}Staciju nosaukumi - klišķināt uz nosaukuma, lai centrētu galveno skatu uz staciju. Ctrl+klikšķis atvērs skatu uz stacijas atrašanos jaunā skatlaukā +STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}Ctrl+klikšķis, atlasa vairākus vienumus STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - {COMMA} stacij{P a as u} STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} @@ -3851,7 +3902,7 @@ STR_COMPANY_VIEW_BUILD_HQ_TOOLTIP :{BLACK}Būvēt STR_COMPANY_VIEW_VIEW_HQ_BUTTON :{BLACK}Skatīt biroju STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Rādīt uzņēmuma vadības ēku STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Pārvietot biroju -STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Pārcelt uzņēmuma centrālo biroju uz citu vietu samaksājot 1% no uzņēmuma vērtības. Shift+klikšķis parāda izmaksu novērtējumu, nemainot biroja atrašanās vietu +STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Pārcelt uzņēmuma centrālo biroju uz citu vietu samaksājot 1% no uzņēmuma vērtības. Shift parāda izmaksas, neveicot pārcelšanu STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Sīkāk STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Skatīt detalizētāku infrastruktūras uzskaiti STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Iedot naudu @@ -3908,6 +3959,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :Nav # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Iepriekšējā mēnesī saražots: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}Ražošanas pēdējā minūtē: STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (pārvadāti {COMMA}%) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz ražotni. Ctrl+klikšķis atvērs skatu uz ražotni jaunā skatlaukā STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ražošanas līmenis: {YELLOW}{COMMA}% @@ -3949,6 +4001,7 @@ STR_VEHICLE_LIST_REPLACE_VEHICLES :Nomainīt trans STR_VEHICLE_LIST_SEND_FOR_SERVICING :Sūtīt uz apkopi STR_VEHICLE_LIST_CREATE_GROUP :Izveidot grupu STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Peļņa šogad: {CURRENCY_LONG} (pērn: {CURRENCY_LONG}) +STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}Peļņa šajā periodā: {CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG}) STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} @@ -4024,6 +4077,7 @@ STR_PURCHASE_INFO_SPEED :{BLACK}Ātrums: STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Ātrums okeānā: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}Ātrums kanālā/upē: {GOLD}{VELOCITY} STR_PURCHASE_INFO_RUNNINGCOST_YEAR :{BLACK}Darbības izmaksas: {GOLD}{CURRENCY_LONG}/gadā +STR_PURCHASE_INFO_RUNNINGCOST_PERIOD :{BLACK}Darbības izmaksas: {GOLD}{CURRENCY_LONG}/periodā STR_PURCHASE_INFO_CAPACITY :{BLACK}Ietilpība: {GOLD}{CARGO_LONG} {STRING} STR_PURCHASE_INFO_REFITTABLE :(pielāgojams) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Projektēts: {GOLD}{NUM}{BLACK} Kalpošanas laiks: {GOLD}{COMMA} gad{P s i u} @@ -4050,10 +4104,10 @@ STR_CARGO_TYPE_FILTER_FREIGHT :Krava STR_CARGO_TYPE_FILTER_NONE :Nav ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vilciena vagonu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju -STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Autotransporta atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Kuģu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju -STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparātu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju +STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Vilciena vagonu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo vagona veidu +STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Autotransporta atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. trl+klikškis, lai parādītu/paslēptu šo autotransporta veidu +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Kuģu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo kuģa veidu +STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparātu atlasīšanas saraksts - klikšķināt uz transportlīdzekļa, lai iegūtu informāciju. Ctrl+klikškis, lai parādītu/paslēptu šo lidaparātu veidu ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_BUTTON :{BLACK}Pirkt transportlīdzekli @@ -4068,14 +4122,14 @@ STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Pirkt un STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Pirkt un pielāgot lidaparātu ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto vilciena vagonu. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto transportlīdzekli. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto kuģi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt izvēlēto lidaparātu. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu +STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto vilciena vagonu. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto transportlīdzekli. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt atzīmēto kuģi. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Pirkt izcelto lidmašīnu. Nospiediet taustiņu Shift, lai rādītu izmaksu tāmi ###length VEHICLE_TYPES -STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto vilcienu. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi -STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto ceļa transportlīdzekli. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto vilcienu. Shift parāda novērtētās izmaksas, neveicot iegādi +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto ceļa transportlīdzekli. Shift parāda novērtētās izmaksas, neveicot iegādi STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto kuģi. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Pirkt un pielāgot izcelto lidaparātu. Shift+klikšķis parāda novērtētās izmaksas, neveicot iegādi @@ -4127,7 +4181,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} tr STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Vilcieni - villkt sastāva daļu, lai pievienotu/atvienotu no vilciena. Klikšķināt uz vilciena, lai iegūtu informāciju. Turēt piespiestu Ctrl, lai attiecinātu abas funkcijas sekojošajai ķēdei +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Vilcieni - velciet transportlīdzekli ar kreiso klikšķi, lai pievienotu/noņemtu no vilciena, ar labo klikšķi lai iegūtu informāciju. Ctrl+klikšķis, lai lietotu kādu no funkcijām sekojošai ķēdei STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Transportlīdzekļi - labais klikšķis uz transportlīdzekļa, lai uzzinātu vairāk STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Kuģi - labais klikšķis uz kuģa, lai uzzinātu vairāk STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lidaparāti - labais klikšķis uz lidaparāta, lai uzzinātu vairāk @@ -4169,15 +4223,15 @@ STR_DEPOT_CLONE_SHIP :{BLACK}Klonēt STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Klonēt lidaparātu ###length VEHICLE_TYPES -STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Nopirkt vilciena kopiju ar visiem vagoniem. Spiediet šo pogu, un pēc tam uz vilciena, kas atrodas depo vai ārpus tā. Ctrl+Klikšķis, lai koplietotu rīkojumus. Shift+Klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Tas nopirks autotransporta kopiju. Spiediet uz pogas un pēc tam uz autotransporta, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Tas nopirks kuģa kopiju. Spiediet šo pogu un pēc tam uz kuģa, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Tas pirks lidaparāta kopiju. Spiediet uz pogas un pēc tam uz lidaparāta, kas atrodas angārā vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu +STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Nopirkt vilciena kopiju ar visiem vagoniem. Spiediet šo pogu, un pēc tam uz vilciena, kas atrodas depo vai ārpus tā. Ctrl+Klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Nopirkt autotransporta kopiju. Spiediet uz pogas un pēc tam uz autotransporta, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Nopirkt kuģa kopiju. Spiediet šo pogu un pēc tam uz kuģa, kas atrodas depo vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu +STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Pirkt lidaparāta kopiju. Spiediet uz pogas un pēc tam uz lidaparāta, kas atrodas angārā vai ārpus tā. Ctrl+klikšķis, lai koplietotu rīkojumus. Shift rāda izmaksu novērtējumu, neveicot pirkumu ###length VEHICLE_TYPES STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz vilcienu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz autotransporta depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā -STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā +STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģu depo. Ctrl+klikšķis atvērs skatu uz depo jaunā skatlaukā STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz angāru. Ctrl+klikšķis atvērs skatu uz angāru jaunā skatlaukā ###length VEHICLE_TYPES @@ -4216,10 +4270,18 @@ STR_ENGINE_PREVIEW_TRAM_VEHICLE :tramvajs STR_ENGINE_PREVIEW_AIRCRAFT :lidaparāts STR_ENGINE_PREVIEW_SHIP :kuģis +STR_ENGINE_PREVIEW_TEXT3 :{BLACK}{STRING}{}{5:STRING}{}{STRING} +STR_ENGINE_PREVIEW_TEXT4 :{BLACK}{STRING}{}{STRING}{}{STRING}{}{STRING} +STR_ENGINE_PREVIEW_COST_WEIGHT :Izmaksas: {CURRENCY_LONG} Svars: {WEIGHT_SHORT} +STR_ENGINE_PREVIEW_COST_MAX_SPEED :Maksa: {CURRENCY_LONG} maks. ātrums: {VELOCITY} STR_ENGINE_PREVIEW_SPEED_POWER :Ātrums: {VELOCITY} Jauda: {POWER} STR_ENGINE_PREVIEW_SPEED_POWER_MAX_TE :Ātrums: {VELOCITY} Jauda: {POWER} Maks. V.S.: {FORCE} STR_ENGINE_PREVIEW_TYPE :Lidaparāta veids: {STRING} +STR_ENGINE_PREVIEW_TYPE_RANGE :Lidaparāta tips: {STRING} Attālums: {COMMA} rūtiņas +STR_ENGINE_PREVIEW_RUNCOST_YEAR :Darbības izmaksas: {CURRENCY_LONG}/gadā +STR_ENGINE_PREVIEW_RUNCOST_PERIOD :Darbības izmaksas: {CURRENCY_LONG}/periodā STR_ENGINE_PREVIEW_CAPACITY :Ietilpība: {CARGO_LONG} +STR_ENGINE_PREVIEW_CAPACITY_2 :Ietilpība: {CARGO_LONG}, {CARGO_LONG} # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}Nomainīt {STRING} - {STRING} @@ -4276,10 +4338,10 @@ STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. Klik STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK} Centra galvenais skats uz vilciena atrašanās vietu. Veicot dubultklikšķi, vilcienam sekos galvenais skats. Ctrl + Click atver jaunu skata punktu vilciena atrašanās vietā -STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK} Centrēt transportlīdzekļa atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenais skats sekos transportlīdzeklim. Ctrl + klikšķis atver jaunu skatu uz transportlīdzekļa atrašanās vietu -STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģa atrašanās vietas. Dubultais klikšķis sekos kuģim galvenajā skatlaukā. Ctrl+klikšķis atvers jaunu boju kuģa lokācijā -STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centrēt lidmašīnas atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenajais skats sekos lidmašīnai. Ctrl + klikšķis atver jaunu skatu uz lidmašīnas atrašanās vietu +STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK} Centra galvenais skats uz vilciena atrašanās vietu. Veicot dubultklikšķi, vilcienam sekos galvenais skats. Ctrl+klikšķis atvērs skatu uz vilcienu jaunā skatlaukā +STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK} Centrēt transportlīdzekļa atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenais skats sekos transportlīdzeklim. Ctrl+klikšķis atvērs skatu uz transportlīdzekl jaunā skatlaukā +STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrēt galveno skatu uz kuģa atrašanās vietas. Dubultais klikšķis sekos kuģim galvenajā skatlaukā. Ctrl+klikšķis atvērs jaunu boju kuģa lokācijā +STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Centrēt lidmašīnas atrašanās vietas galveno skatu. Veicot dubultklikšķi, galvenajais skats sekos lidmašīnai. Ctrl+klikšķis atvērs skatu uz lidmašīnu jaunā skatlaukā ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt vilcienu uz depo. Ctrl+klikšķis - izvēlēties tikai apkopi @@ -4288,15 +4350,15 @@ STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Sūtīt lidaparātu uz angāru. Ctrl+klikšķis - izvēlēties tikai apkopi ###length VEHICLE_TYPES -STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Tas nopirks vilciena kopiju ar visiem vagoniem. Izmantojot Ctrl+klikšķis, vilcieni rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu vērtību, neveicot pirkumu -STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Tas nopirks autotransporta līdzekļa kopiju. Izmantojot Ctrl+klikšķis, autotransporta līdzekļi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Tas nopirks kuģa kopiju. Izmantojot Ctrl+klikšķis, kuģi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu -STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Tas nopirks lidaparāta kopiju. Izmantojot Ctrl+klikšķis, lidaparāti rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu +STR_VEHICLE_VIEW_CLONE_TRAIN_INFO :{BLACK}Pirkt vilciena kopiju ar visiem vagoniem. Izmantojot Ctrl+klikšķis, vilcieni rīkojumus lietos kopīgi. Shift rāda izmaksu vērtību, neveicot pirkumu +STR_VEHICLE_VIEW_CLONE_ROAD_VEHICLE_INFO :{BLACK}Nopirkt autotransporta līdzekļa kopiju. Izmantojot Ctrl+klikšķis, autotransporta līdzekļi rīkojumus lietos kopīgi. Shift+klikšķis rāda izmaksu novērtējumu, neveicot pirkumu +STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}Nopirkt kuģa kopiju. Izmantojot Ctrl+klikšķis, kuģi rīkojumus lietos kopīgi. Shift parāda novērtētās izmaksas, neveicot iegādi +STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Pirkt lidmašīnas kopiju. Ctrl+klikšķis, lai kopīgotu pasūtījumus. Nospiežot Shift, rāda izmaksu novērtējumu, neveicot pirkumu STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Piespiest vilcienu doties tālāk, neievērojot signālu STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Apgriezt vilcienu pretējā virzienā STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Piespiest transportlīdzekli apgriezties -STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK} Centrēt pasūtījuma galamērķa galveno skatu. Ctrl + klikšķis atver jaunu skata punktu pasūtījuma galamērķa atrašanās vietā +STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrēt galveno skatu uz pasūtijuma galamērķi. Ctrl+klikšķis atvērs skatu uz pasūtijuma galamērķi jaunā skatlaukā ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Pielāgot vilcienu citam kravas veidam @@ -4325,6 +4387,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Pašreiz # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Iekraušana / Izkraušana STR_VEHICLE_STATUS_LEAVING :{LTBLUE}Aizbrauc +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Gaida atdalīšanu STR_VEHICLE_STATUS_CRASHED :{RED}Cietis avārijā! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Salūzis STR_VEHICLE_STATUS_STOPPED :{RED}Apstādināts @@ -4338,6 +4401,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Nav rī STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dodas uz {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Dodas uz {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Veikt apkopi {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Atvienot un apkalpot {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Nevar sasniegt {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Nevar sasniegt {WAYPOINT}, {VELOCITY} @@ -4364,7 +4428,8 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}Nosaukt STR_VEHICLE_INFO_AGE :{COMMA} gad{P s i u} ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} gad{P s i u} ({COMMA}) -STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Izmaksas: {LTBLUE}{CURRENCY_LONG} gadā +STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Darbības izmaksas: {LTBLUE}{CURRENCY_LONG}/gadā +STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}Vecums: {LTBLUE}{STRING}{BLACK} Darbības izmaksas: {LTBLUE}{CURRENCY_LONG}/periods STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Maks. ātrums: {LTBLUE}{VELOCITY} {BLACK}Lidaparāta veids: {LTBLUE}{STRING} @@ -4374,6 +4439,7 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Svars: { STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}Peļņa šogad: {LTBLUE}{CURRENCY_LONG} (pagājušajā gadā: {CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}Peļņa šogad: {LTBLUE}{CURRENCY_LONG} (pagājušajā gadā: {CURRENCY_LONG}) {BLACK}Min. veiktspēja: {LTBLUE}{POWER_TO_WEIGHT} +STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}Peļņa šajā periodā: {LTBLUE}{CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}Peļņa šajā periodā: {LTBLUE}{CURRENCY_LONG} (pēdējais periods: {CURRENCY_LONG}) {BLACK}Min. veiktspēja: {LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}Drošums: {LTBLUE}{COMMA}% {BLACK}Ķibeles kopš pēdējās apkopes: {LTBLUE}{COMMA} @@ -4385,11 +4451,21 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ietilpī STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Pārvadājumu ieņēmumi: {LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}{NBSP}dienas{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}{NBSP}minūtes{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Apkopes intervāls: {LTBLUE}{COMMA}%{BLACK} {STRING} +STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :Pēdējā apkalpošana: {LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :Pēdējā apkope: pirms {LTBLUE}{NUM} minūtēm +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Palieliniet apkopes intervālu par 10 dienām. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 5 dienām STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Palieliniet apkopes intervālu par 5 minūtēm. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 1 minūti +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Palieliniet apkopes intervālu par 10 procentiem. Ctrl+klikšķis, lai palielinātu apkopes intervālu par 5 procentiem STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}Samaziniet apkopes intervālu par 10 dienām. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 5 dienām +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}Samaziniet apkopes intervālu par 5 minūtēm. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 1 minūti +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}Samaziniet apkopes intervālu par 10 procentiem. Ctrl+klikšķis, lai samazinātu apkopes intervālu par 5 procentiem STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}Mainīt apkopes starplaiku veidu STR_VEHICLE_DETAILS_DEFAULT :Noklusējuma +STR_VEHICLE_DETAILS_DAYS :Dienas STR_VEHICLE_DETAILS_MINUTES :Minūtes STR_VEHICLE_DETAILS_PERCENT :Procenti @@ -4429,7 +4505,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Jaunā i STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}{}{BLACK}Ienākumi no pielāgošanas: {GREEN}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Pielāgošanas izmaksas: {RED}{CURRENCY_LONG} STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Jaunā ietilpība: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Ienākumi no pielāgošanas: {GREEN}{CURRENCY_LONG} -STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Izvēlēties transportlīdzekļus pielāgošanai. Vilkšana ar peli ļauj izvēlēties vairākus transportlīdzekļus. Klikšķināšana tukšumā atzīmēs visus transportlīdzekļus. Ctrl+klikšķis atzīmēs izvēlēto un visus tam sekojošus transportlīdzekļus +STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Atlasiet transportlīdzekļus, ko pārbūvēt. Velciet ar peli lai atlasītu vairākus transportlīdzekļus. Noklikšķiniet uz tukšas vietas, lai atlasītu visu transportlīdzekli. Ctrl+klikšķis, lai atlasītu visus sekojošos transportlīdzekļus ###length VEHICLE_TYPES STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Izvēlēties, kuru kravas veidu vilciens pārvadās @@ -4454,8 +4530,9 @@ STR_ORDERS_CAPTION :{WHITE}{VEHICLE STR_ORDERS_TIMETABLE_VIEW :{BLACK}Saraksts STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Pārslēgt uz saraksta skatu -STR_ORDERS_LIST_TOOLTIP :{BLACK}Rīkojumu saraksts - klikšķināt uz rīkojuma, lai to atzīmētu. Ctrl+klikšķis ritina uz rīkojuma galamērķi +STR_ORDERS_LIST_TOOLTIP :{BLACK}Pasūtījumu saraksts - noklikšķiniet uz pasūtījuma, lai to iezīmētu. Ctrl+klikšķis, ritina līdz pasūtījuma galamērķim STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Rīkojumu beigas - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Koplietojamo rīkojumu beigas - - @@ -4492,6 +4569,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Pieejamā krava STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vienmēr doties STR_ORDER_DROP_SERVICE_DEPOT :Apkope, ja nepieciešama STR_ORDER_DROP_HALT_DEPOT :Apstādināt +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 @@ -4534,7 +4620,7 @@ STR_ORDER_GO_TO_NEAREST_DEPOT :Doties uz tuvā STR_ORDER_GO_TO_NEAREST_HANGAR :Doties uz tuvāko angāru STR_ORDER_CONDITIONAL :Nosacītais rīkojuma lēciens STR_ORDER_SHARE :Koplietot rīkojumus -STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Ievietot jaunu rīkojumu pirms iezīmētā rīkojuma vai saraksta beigās. Ctrl izveido stacijas rīkojumu 'piekraut pilnu ar jebkuru kravu', liek braukt cauri pieturas punktam 'neapstājoties' un depo veikt 'apkopi'. 'Koplietot rīkojumus' vai Ctrl ļauj šim transportlīdzeklim lietot rīkojumus kopīgi ar atlasīto transportlīdzekli. Klikšķināšana uz transportlīdzekļa kopēs tā rīkojumus. Depo rīkojums izslēdz automātisko apkopi. +STR_ORDERS_GO_TO_TOOLTIP :{BLACK}Ievietot jaunu rīkojumu pirms iezīmētā rīkojuma vai saraksta beigās. Ctrl+klikšķis izveido stacijas rīkojumu 'piekraut pilnu ar jebkuru kravu', liek braukt cauri pieturas punktam 'neapstājoties' un depo veikt 'apkopi'. 'Koplietot rīkojumus' vai Ctrl+klikšķis ļauj šim transportlīdzeklim lietot rīkojumus kopīgi ar atlasīto transportlīdzekli. Klikšķināšana uz transportlīdzekļa kopēs tā rīkojumus. Depo rīkojums izslēdz automātisko apkopi. STR_ORDERS_VEH_WITH_SHARED_ORDERS_LIST_TOOLTIP :{BLACK}Rādīt visus ar šo plānu saistītos transportlīdzekļus @@ -4560,6 +4646,7 @@ STR_ORDER_REFIT_ORDER :(Pielāgot uz { STR_ORDER_REFIT_STOP_ORDER :(Pielāgot uz {STRING} un apstāties) STR_ORDER_STOP_ORDER :(Apstādināt) +STR_ORDER_WAIT_TO_UNBUNCH :(gaida atdalīšanu) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Nevar izmantot staciju){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4641,24 +4728,24 @@ STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Šis gra STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Šis grafiks sāksies pēc {COMMA} sekundēm STR_TIMETABLE_START :{BLACK}Sākt Grafiku -STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet, kad sākas šis saraksts. Ctrl+klikšķis vienmērīgi sadala visu transportlīdzekļu sākumu, kas koplieto šo pasūtījumu, pamatojoties uz to relatīvo pasūtījumu, ja pasūtījumam ir pilnībā noteikts saraksts +STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet, kad sākas šis grafiks. Ctrl+klikšķis, lai vienmērīgi sadalītu visu transportlīdzekļu sākumu, kas koplieto šo rīkojumu. Rīkojumā visiem transportiem jāizmanto grafiks STR_TIMETABLE_START_SECONDS_QUERY :Sekundes līdz grafika sākumam STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+Click iestata laiku visiem pasūtījumiem +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem STR_TIMETABLE_CLEAR_TIME :{BLACK}Notīrīt laiku STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma laiku. Ctrl+klikšķis notīra laiku visiem pasūtījumiem STR_TIMETABLE_CHANGE_SPEED :{BLACK}Mainīt ātruma ierobežojumu -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+Click iestata ātrumu visiem pasūtījumiem +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem STR_TIMETABLE_CLEAR_SPEED :{BLACK}Nodzēst ātruma ierobežojumu STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis notīra ātrumu visiem pasūtījumiem STR_TIMETABLE_RESET_LATENESS :{BLACK}Atiestatīt kavējuma skaitītāju -STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Atiestatiet kavējuma skaitītāju, lai transportlīdzeklis būtu laikā. Nospiežot taustiņu kombināciju Ctrl+klikšķis, tiks atiestatīta visa grupa, lai jaunākais transportlīdzeklis būtu laicīgi un visi pārējie ātrāk +STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Atiestatiet kavējuma skaitītāju, lai transportlīdzeklis būtu laikā. Ctrl+klikšķis, lai atiestatītu visu grupu, lai jaunākais transportlīdzeklis būtu laikā un pārējie būtu agri STR_TIMETABLE_AUTOFILL :{BLACK}Automātiska aizpildīšana STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Automātiski aizpildiet kustības grafiku ar vērtībām no nākamā brauciena. Ctrl+noklikšķiniet, lai mēģinātu saglabāt gaidīšanas laiku @@ -4763,6 +4850,7 @@ STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Spēles skripts STR_AI_SETTINGS_CLOSE :{BLACK}Aizvērt STR_AI_SETTINGS_RESET :{BLACK}Atiestatīt STR_AI_SETTINGS_SETTING :{STRING}: {ORANGE}{STRING} +STR_AI_SETTINGS_SETTING_DEVIATION :{STRING}: {ORANGE}[{STRING}, {STRING}] STR_AI_SETTINGS_JUST_DEVIATION :[{STRING}, {STRING}] @@ -5030,6 +5118,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Nevar at STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Nepareizs depo veids # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... var būt tikai viens atdalīts pasūtījums +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... nevar izmantot pilnas kravas pasūtījumus, ja transportlīdzeklim ir atdalīts pasūtījums +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... nevar atdalīt transportlīdzekli ar pilnu kravas pasūtījumu +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... nevar izmantot nosacījumu pasūtījumus, ja transportlīdzeklim ir atdalīts pasūtījums +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... nevar atdalīt transportlīdzekli ar nosacījumu pasūtījumu # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} pēc aizstāšanas ir pārāk garš @@ -5690,6 +5783,7 @@ STR_UNKNOWN_STATION :nezināma staci STR_DEFAULT_SIGN_NAME :Zīme STR_COMPANY_SOMEONE :kāds +STR_SAVEGAME_DURATION_REALTIME :{NUM}h {NUM}mlj. STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :Novērotājs, {1:STRING} @@ -5726,6 +5820,7 @@ STR_WAYPOINT_NAME :{WAYPOINT} STR_CURRENCY_SHORT_KILO :{NBSP}tk. STR_CURRENCY_SHORT_MEGA :{NBSP}m STR_CURRENCY_SHORT_GIGA :{NBSP}mljrd. +STR_CURRENCY_SHORT_TERA :{NBSP}tonna STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 23953206f3..ef1b6d6efc 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -4473,6 +4473,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vykti visuomet STR_ORDER_DROP_SERVICE_DEPOT :Vykti, jei reikia STR_ORDER_DROP_HALT_DEPOT :Nuvykti ir sustoti +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Transporto priemonės parametras, kuriuo bus remiamasi vykdant sąlyginę užduotį # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 95bbf7c997..030acc75b3 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -4284,6 +4284,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Géi ëmmer STR_ORDER_DROP_SERVICE_DEPOT :Revisioun falls néideg STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Gefierdaten als Basis fir den Optragssprong # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 3932ed0e08..564df399c9 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1877,6 +1877,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/malay.txt b/src/lang/malay.txt index a8f9f83b40..2ea48244e3 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -3535,6 +3535,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Sentiasa pergi STR_ORDER_DROP_SERVICE_DEPOT :Selenggara sekiranya perlu STR_ORDER_DROP_HALT_DEPOT :Berhenti +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Lompatan data kenderaan ke pengkalan diaktifkan # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 39c9af3805..044b9c049a 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -1267,6 +1267,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index 4f94543e75..bb7cc5d3a0 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -1677,6 +1677,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 8cec9e0327..bac7c042ba 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -4231,6 +4231,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alltid gå STR_ORDER_DROP_SERVICE_DEPOT :Vedlikehold ved behov STR_ORDER_DROP_HALT_DEPOT :Stopp +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Kjøretøydata å basere hopp på # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index b553b83763..0379084467 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -3754,6 +3754,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Alltid gå STR_ORDER_DROP_SERVICE_DEPOT :Vedlikehald om naudsynt STR_ORDER_DROP_HALT_DEPOT :Stopp +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Køyretøy-data å basere hopp på # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 25f79d2946..25b5f3f0d9 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -3313,6 +3313,10 @@ STR_ORDER_DROP_UNLOAD_IF_ACCEPTED :درصورت پ +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 8c18860fbe..523ba3d6db 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -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ń - - @@ -4811,6 +4892,14 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Zawsze do STR_ORDER_DROP_SERVICE_DEPOT :Serwisuj jeśli trzeba 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 # Conditional order variables, must follow order of OrderConditionVariable enum @@ -4852,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 @@ -5081,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 @@ -6050,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} @@ -6083,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} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index a9081a16f1..46bff439e3 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -402,14 +402,14 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Mostrar STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}Mostrar lista de aeronaves da empresa. Ctrl+Clique alterna entre abrir a lista de grupos/veículos STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}Ampliar STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}Reduzir -STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir caminhos-de-ferro +STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Construir infraestrutura ferroviária STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Construir infraestrutura rodoviária STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}Construir carris para elétricos STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Construir docas para navios STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construir aeroportos STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abra a barra de modelação ambiental para elevar ou baixar terreno, plantar árvores, etc. STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Mostrar janela som/música -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Mostrar a última mensagem/notícia, histórico de mensagens ou eliminar todas as mensagens +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Abrir a última mensagem/notícia, histórico de mensagens ou eliminar todas as mensagens STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Informações do terreno, captura de ecrã, sobre o OpenTTD e ferramentas de desenvolvedor STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Trocar barras de ferramentas @@ -428,7 +428,7 @@ STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}Construi STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}Construção de carris para elétricos STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantar árvores. "Ctrl" seleciona a área na diagonal. "Shift" alterna construir/mostrar custo estimado STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Colocar sinais -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl seleciona a área diagonalmente. Shift alterna construir/mostrar custo estimado +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Colocar objeto. Ctrl+Clique+Arrastar para selecionar a área diagonalmente. Pressione também Shift para mostrar o custo estimado # Scenario editor file menu ###length 7 @@ -720,10 +720,10 @@ STR_PLAYLIST_TRACK_INDEX :{TINY_FONT}{BLA STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLACK}Programa - '{STRING}' STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}Limpar STR_PLAYLIST_CHANGE_SET :{BLACK}Mudar conjunto -STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa actual (somente Personaliz. 1 ou Personaliz. 2) +STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}Limpar programa atual (apenas Personalizado 1 ou Personalizado 2) STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}Mudar selecção musical para outro conjunto instalado -STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa actual (somente Personaliz. 1 ou Personaliz. 2) -STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Faça clique numa faixa para a remover da lista (Personaliz. 1 ou Personaliz. 2 apenas) +STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Clique na faixa de música para a adicionar ao programa atual (apenas Personalização 1 ou Personalização 2) +STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Clique numa faixa para a remover da lista (apenas Personalização 1 ou Personalização 2) # Highscore window STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Melhores empresas @@ -814,7 +814,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Mostrar STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Mostrar a última mensagem ou notícia STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - STR_STATUSBAR_PAUSED :{YELLOW}* * EM PAUSA * * -STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * EM PAUSA (aguardando pela atualização do gráfico de links) * * +STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * EM PAUSA (em espera pela atualização do gráfico de ligações) * * STR_STATUSBAR_AUTOSAVE :{RED}AUTOGUARDADO STR_STATUSBAR_SAVING_GAME :{RED}* * A GUARDAR JOGO * * @@ -1305,7 +1305,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Custos de const STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Configurar o nível de construção e custos de compra STR_CONFIG_SETTING_RECESSIONS :Recessões: {STRING} -STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativo, podem ocorrer recessões em intervalos de poucos anos. Durante uma recessão a produção em geral é mais baixa (volta aos níveis anteriores quando termina) +STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Se ativo, podem ocorrer recessões periodicamente. Durante uma recessão a produção em geral é mais baixa (e regressa aos níveis anteriores quando termina a recessão) STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar inversão de combóios nas estações: {STRING} STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Quando ativo, os comboios não podem inverter marcha em estações não-terminais, mesmo se existir um caminho mais curto para o próximo destino ao inverter @@ -1921,7 +1921,7 @@ STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Ao arrastar, co STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_HELPTEXT :Define a distância a que os sinais serão construídos num carril até ao próximo obstáculo (sinal, junção), se os sinais são arrastados STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY_VALUE :{COMMA} quadrado{P 0 "" s} STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :Ao arrastar, manter distância fixa entre sinais: {STRING} -STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao usar Ctrl+arrasto. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE_HELPTEXT :Selecionar o comportamento da colocação de sinais ao arrastar os sinais. Se desativado, os sinais são colocados à volta de túneis ou pontes para evitar longos trajetos sem sinais. Se ativo, os sinais são colocados a cada N mosaicos, facilitando o alinhamento de sinais em linhas paralelas STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :Usar automaticamente sinais clássicos antes de: {STRING} STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o ano em que sinais eléctricos podem ser usados para os carris. Antes deste ano, sinais não-eléctricos serão usados (que têm a mesma funcionalidade, mas aspecto diferente) @@ -1929,6 +1929,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Configurar o an STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Trocar tipos de faróis: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Selecione os tipos de sinais a percorrer ao usar Ctrl+clique num sinal com a ferramenta de sinais ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Apenas grupo atual STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Todos visíveis STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Mostrar tipos de sinais: {STRING} @@ -2623,7 +2624,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :número de joga STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :a ligar clientes STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manual STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :script de jogo -STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :esperando pela atualização do gráfico de links +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :Em espera pela atualização do gráfico de ligações STR_NETWORK_MESSAGE_CLIENT_LEAVING :a sair STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} entrou no jogo @@ -2869,16 +2870,16 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}Construi STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}Construir secção de carris para elétricos. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Construir estradas usando o modo automático. Ctrl alterna a construção/remoção de estradas. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Construir carris para elétricos usando o modo automático. Ctrl alterna a construção/remoção de carris para elétricos. Shift alterna construir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem rodoviária (para compra e manutenção de veículos rodoviários). Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Construir garagem rodoviária (para compra e manutenção de veículos rodoviários). Pressione também Shift para apenas mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Construir garagem para elétricos (para compra e manutenção). Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Construir estação de autocarros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Construir paragem de elétricos para passageiros. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Construir estação de camiões. Ctrl+Clique para selecionar outra estação para se unir. Pressione também Shift para mostrar o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}Construir paragem de elétricos para carga. Ctrl permite juntar estações. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}Ativar/Desativar estradas de sentido único STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}Construir ponte rodoviária. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}Construir ponte para elétricos. Shift alterna construir/mostrar custo estimado -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Shift alterna construir/mostrar custo estimado +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}Construir túnel rodoviário. Pressione também Shift para mostrar apenas o custo estimado STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Construir túnel para elétricos. Shift alterna construir/mostrar custo estimado STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Alternar entre construir/remover estradas STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Alternar construir/remover linhas de eléctricos e sinais @@ -2910,7 +2911,7 @@ STR_WATERWAYS_TOOLBAR_CAPTION_SE :{WHITE}Canais STR_WATERWAYS_TOOLBAR_BUILD_CANALS_TOOLTIP :{BLACK}Construir canais. Shift alterna construção/estimativa de custos STR_WATERWAYS_TOOLBAR_BUILD_LOCKS_TOOLTIP :{BLACK}Construir eclusas. Shift alterna construir/mostrar custo estimado STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Construir estaleiro naval (para compra e manutenção de navios). Shift alterna construir/mostrar custo estimado -STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl permite juntar estações. Shift alterna construir/mostar custo estimado +STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Construir doca naval. Ctrl+Clique para selecionar outra estação para se juntar. Pressione também Shift para mostrar apenas o custo estimado STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Esta bóia de posição pode ser usada para marcar pontos de rota adicionais. Shift alterna construção/mostra de custos estimados STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Construir aqueduto. Shift alterna construir/mostrar custo estimado STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definir área de água.{}Construir um canal, a não ser que a tecla Ctrl esteja pressionada a nível do mar, nesse caso inundará as zonas circundantes @@ -3311,11 +3312,11 @@ STR_MAPGEN_VARIETY :{BLACK}Variedad STR_MAPGEN_GENERATE :{WHITE}Gerar STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Criar o mapa e jogar OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Definições de NewGRF -STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de NewGRF +STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Abrir definições de NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Definições de IA STR_MAPGEN_AI_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de IA STR_MAPGEN_GS_SETTINGS :{BLACK}Definições de Script de Jogo -STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Mostrar definições de script de jogo +STR_MAPGEN_GS_SETTINGS_TOOLTIP :{BLACK}Abrir definições de script de jogo ###length 21 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH :Inglês @@ -3935,7 +3936,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} e mais {NUM} ... -STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nomes de indústrias - clique no nome para centrar-se na indústria. Ctrl+Clique abre um novo visualizador na localização da indústria +STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Nomes de indústrias - clique no nome para centrar a visualização na indústria. Ctrl+Clique para abrir um novo visualizador na localização da indústria STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Carga aceite: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_PRODUCED_CARGO_FILTER :{BLACK}Carga produzida: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Todos os tipos de carga @@ -4091,7 +4092,7 @@ STR_CARGO_TYPE_FILTER_NONE :Nenhum ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Lista de veículos ferroviários - clique num veículo para informações STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Lista de veículos rodoviários - clique num veículo para informações -STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de selecção de barcos. Clique num navio para informações. Ctrl+Clique para alternar/ocultar o tipo de barco +STR_BUY_VEHICLE_SHIP_LIST_TOOLTIP :{BLACK}Lista de seleção de navios. Clique num navio para informações. Ctrl+Clique para mostrar/ocultar este tipo de navio STR_BUY_VEHICLE_AIRCRAFT_LIST_TOOLTIP :{BLACK}Lista de aeronaves - clique na aeronave para informações ###length VEHICLE_TYPES @@ -4166,7 +4167,7 @@ STR_DEPOT_VEHICLE_TOOLTIP_CHAIN :{BLACK}{NUM} ve STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT}) ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para acrescentar/retirar do comboio; clique com o botão direito para informações. Pressionando a tecla Ctrl aplica ambas as funções à cadeia seguinte +STR_DEPOT_TRAIN_LIST_TOOLTIP :{BLACK}Comboios - arraste o veículo com o botão esquerdo do rato para acrescentar/retirar do comboio; clique com o botão direito para informações. Ctrl+Clique para aplicar ambas as funções à cadeia seguinte STR_DEPOT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Veículos - clique com o botão direito num veículo para informações STR_DEPOT_SHIP_LIST_TOOLTIP :{BLACK}Navios - clique com o botão direito num navio para informações STR_DEPOT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Aeronave - Clique com o botão direito na aeronave para informações @@ -4214,7 +4215,7 @@ STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Esta aç STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esta ação irá comprar uma cópia de uma aeronave. Clique neste botão e de seguida, numa aeronave que se encontre dentro ou fora do hangar. Ctrl+Clique irá partilhar as ordens. Shift+Clique mostra a estimativa de custo, sem comprar ###length VEHICLE_TYPES -STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito ferroviário. Ctrl+Clique abre um novo visualizador na localização do depósito ferroviário +STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do depósito ferroviário. Ctrl+Clique para abrir um novo visualizador na localização do depósito ferroviário STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização da garagem de veículos rodoviários. Ctrl+Clique abre um novo visualizador na localização da garagem STR_DEPOT_SHIP_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do estaleiro naval. Ctrl+Clique abre um novo visualizador na localização do estaleiro naval STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrar visualização na localização do hangar. Ctrl+Clique abre um novo visualizador na localização do hangar @@ -4331,7 +4332,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK} Central ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar comboio para o depósito. Ctrl+Clique fará apenas manutenção STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar veículo para a garagem. Ctrl+Clique fará apenas manutenção -STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique fará apenas manutenção +STR_VEHICLE_VIEW_SHIP_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar navio para o estaleiro. Ctrl+Clique para fazer apenas manutenção STR_VEHICLE_VIEW_AIRCRAFT_SEND_TO_DEPOT_TOOLTIP :{BLACK}Mandar aeronave para o hangar. Ctrl+Clique fará apenas manutenção ###length VEHICLE_TYPES @@ -4343,7 +4344,7 @@ STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}Esta aç STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}Forçar comboio a prosseguir sem esperar pelo sinal STR_VEHICLE_VIEW_TRAIN_REVERSE_TOOLTIP :{BLACK}Inverter direcção do comboio STR_VEHICLE_VIEW_ROAD_VEHICLE_REVERSE_TOOLTIP :{BLACK}Forçar veículo a dar a volta -STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique abre um novo visualizador na localização do destino da ordem +STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Centrar visualização no destino da ordem. Ctrl+Clique para abrir um novo visualizador na localização do destino da ordem ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_REFIT_TOOLTIP :{BLACK}Converter comboio para transportar outro tipo de carga @@ -4372,6 +4373,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Ação a # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}A carregar / descarregar STR_VEHICLE_STATUS_LEAVING :{LTBLUE}A partir +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}Em espera por desagrupar STR_VEHICLE_STATUS_CRASHED :{RED}Acidentado! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Avariado STR_VEHICLE_STATUS_STOPPED :{RED}Parado @@ -4385,6 +4387,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}Sem ord STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dirige-se a {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}Dirige-se para {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manutenção em {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}Desagrupar e efetuar manutenção em {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Não é possível chegar a {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Não é possível chegar a {WAYPOINT}, {VELOCITY} @@ -4551,6 +4554,11 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :Mercadoria disp STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir sempre STR_ORDER_DROP_SERVICE_DEPOT :Manutenção, se necessária STR_ORDER_DROP_HALT_DEPOT :Parar +STR_ORDER_DROP_UNBUNCH :Desagrupar + +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados de veículo para ida à base @@ -4619,6 +4627,7 @@ STR_ORDER_REFIT_ORDER :(Adaptar para { STR_ORDER_REFIT_STOP_ORDER :(Adaptar para {STRING} e parar) STR_ORDER_STOP_ORDER :(Parar) +STR_ORDER_WAIT_TO_UNBUNCH :(esperar por desagrupar) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Não pode usar a estação){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4823,6 +4832,7 @@ STR_AI_SETTINGS_CLOSE :{BLACK}Fechar STR_AI_SETTINGS_RESET :{BLACK}Repor 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 @@ -5089,6 +5099,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}Não é STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Tipo de depósito errado # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}... só pode ter uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}... não é possível usar ordens de carga completa quando o veículo tem uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}... não é possível desagrupar um veículo com ordem de carga completa +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}... não é possível usar ordens condicionais quando um veículo tem uma ordem de desagrupar +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}... não é possível desagrupar um veículo com uma ordem condicional # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} é muito longo depois de substituído diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 9466182fec..7c9137a9a9 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -4416,6 +4416,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Merge mereu STR_ORDER_DROP_SERVICE_DEPOT :Service dacă este nevoie STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datele vehiculului pe care se bazează # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 697b17954f..02ee735444 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1074,6 +1074,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLAC STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Компания «{STRING}» получает субсидию!{}{}Перевозка {STRING.gen} по маршруту {STRING} - {STRING} будет оплачиваться в четырёхкратном размере в течение {UNITS_YEARS_OR_MINUTES}! STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}Хаос на дорогах г.{NBSP}{TOWN}!{}{}Реконструкция дорожной сети, профинансированная компанией «{STRING}», принесёт водителям полгода страданий! +STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}Хаос на дорогах г.{NBSP}{TOWN}!{}{}Реконструкция дорожной сети, профинансированная компанией «{STRING}», принесёт водителям 6{NBSP}минут страданий! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Транспортный монополист! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}Администрация г.{NBSP}{TOWN} предоставила компании «{STRING}» эксклюзивные транспортные права сроком на 12 месяцев! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}Администрация г.{NBSP}{TOWN} предоставила компании «{STRING}» эксклюзивные транспортные права сроком на 12 минут! @@ -1577,7 +1578,7 @@ 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 :Если компания покапает эксклюзивные транспортные права, то на станции конкурентов не будет поступать груз и не будут приходить пассажиры в течение 12{NBSP}месяцев STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :Если компания покапает эксклюзивные транспортные права, то на станции конкурентов не будет поступать груз и не будут приходить пассажиры в течение 12{NBSP}минут. STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Разрешить финансирование строительства зданий: {STRING} @@ -1636,7 +1637,8 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :у всех STR_CONFIG_SETTING_WARN_INCOME_LESS :Предупреждать, если доход ТС отрицателен: {STRING} ###length 2 -STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Включает сообщения о транспортых средствах, не принёсших прибыли по итогам прошедшего года +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Включает сообщения о транспортных средствах, не принёсших прибыли по итогам прошедшего года. +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Включает сообщения о транспортных средствах, не принёсших прибыли по итогам прошедшего цикла. STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Транспорт не будет выходить из эксплуатации: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :При включении все транспортные средства остаются доступными для покупки в любое время после начала их производства @@ -2079,6 +2081,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :Год, нач STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :Выбор сигналов (Ctrl+щелчок): {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :Выбор предлагаемых типов сигналов при их модификации с помощью Ctrl+щелчка по установленному сигналу ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :Только текущая группа STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :все отображаемые STR_CONFIG_SETTING_SIGNAL_GUI_MODE :Типы сигналов в панели строительства: {STRING} @@ -2968,7 +2971,7 @@ STR_RAIL_NAME_MAGLEV.n :Магнитн # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Направление депо -STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выбор направления депо +STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выбор ориентации депо # Rail waypoint construction window STR_WAYPOINT_CAPTION :{WHITE}Точка пути @@ -2977,7 +2980,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Выбо # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Выбор ж/д станции STR_STATION_BUILD_ORIENTATION :{BLACK}Направление -STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Выберите направление ж/д станции +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию ж/д станции STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Количество путей STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Укажите количество платформ ж/д станции STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Длина платформы @@ -3066,13 +3069,13 @@ STR_BUILD_DEPOT_TRAM_ORIENTATION_SELECT_TOOLTIP :{BLACK}Выбо # Road vehicle station construction window STR_STATION_BUILD_BUS_ORIENTATION :{WHITE}Направление остановки -STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Выберите направление остановки +STR_STATION_BUILD_BUS_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию остановки STR_STATION_BUILD_TRUCK_ORIENTATION :{WHITE}Ориентация терминала STR_STATION_BUILD_TRUCK_ORIENTATION_TOOLTIP :{BLACK}Выберите направление грузового терминала STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION :{WHITE}Направление пассажирской трамвайной остановки STR_STATION_BUILD_PASSENGER_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите направление пассажирской трамвайной остановки STR_STATION_BUILD_CARGO_TRAM_ORIENTATION :{WHITE}Направление грузовой трамвайной остановки -STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите направление грузовой трамвайной остановки +STR_STATION_BUILD_CARGO_TRAM_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию грузовой трамвайной станции # Waterways toolbar (last two for SE only) STR_WATERWAYS_TOOLBAR_CAPTION :{WHITE}Судоходные коммуникации @@ -3088,7 +3091,7 @@ STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Созд # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Направление дока -STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Выберите направление дока +STR_DEPOT_BUILD_SHIP_ORIENTATION_TOOLTIP :{BLACK}Выберите ориентацию дока # Dock construction window STR_STATION_BUILD_DOCK_CAPTION :{WHITE}Пристань @@ -4701,6 +4704,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}Пока STR_ORDERS_LIST_TOOLTIP :{BLACK}Список заданий - щёлкните задание для выделения. Ctrl+щелчок - обзор станции назначения. STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - Конец заданий - - STR_ORDERS_END_OF_SHARED_ORDERS :- - Конец общих заданий - - @@ -4738,6 +4742,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Всегда STR_ORDER_DROP_SERVICE_DEPOT :Если требуется STR_ORDER_DROP_HALT_DEPOT :Стоп +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Параметр транспорта для сравнения # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index c9c85f1841..795a880397 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -4520,6 +4520,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Uvek STR_ORDER_DROP_SERVICE_DEPOT :Servis po potrebi STR_ORDER_DROP_HALT_DEPOT :Zaustavljanje +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Skok na osnovu podatka o vozilu # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index dcfd3150b3..3f100d7136 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -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 :“打开”时,允许公司提供资助新建房屋 @@ -1516,11 +1516,11 @@ STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :当车辆报废时自动更新:{STRING} STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :“打开”时,车辆在临近它的报废期限时自动更新 -STR_CONFIG_SETTING_AUTORENEW_MONTHS :当车辆还有 {STRING} 到达最大年限时自动更新 +STR_CONFIG_SETTING_AUTORENEW_MONTHS :自动替换年龄到达使用期限{STRING}的载具。 STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :设置车辆自动更新的时间 ###length 2 -STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} 个月前 -STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} 个月后 +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :前 {COMMA} 个月 +STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :后 {COMMA} 个月 STR_CONFIG_SETTING_AUTORENEW_MONEY :启动自动更新需要的最少现金:{STRING} STR_CONFIG_SETTING_AUTORENEW_MONEY_HELPTEXT :启动自动更新车辆时需要保留的最少现金 @@ -1830,7 +1830,7 @@ STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :汽车默认保 STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :如果没有为汽车指定保养周期,设定汽车的默认保养周期 STR_CONFIG_SETTING_SERVINT_AIRCRAFT :飞机默认保养周期:{STRING} STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :如果没有为飞机指定保养周期,设定飞机的默认保养周期 -STR_CONFIG_SETTING_SERVINT_SHIPS :船只的默认保养周期:{STRING} +STR_CONFIG_SETTING_SERVINT_SHIPS :船只默认保养周期:{STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :如果没有为船只设定保养周期,按照这里设定的默认保养周期执行 STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}日 / 分钟 / % ###setting-zero-is-special @@ -1932,6 +1932,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :设置电子信 STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :在以下信号类型中循环: {STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :选择用Ctrl+点击的方式切换信号灯类型时的备选类型 ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :仅当前信号组 STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :全部可见 STR_CONFIG_SETTING_SIGNAL_GUI_MODE :显示信号类型: {STRING} @@ -2208,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' @@ -2660,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}打开该扩展包主页 @@ -2829,7 +2830,7 @@ STR_STATION_CLASS_WAYP_WAYPOINT :默认路点 # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}信号选择 -STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}选择是否显示高级信号灯类型 +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}切换显示逻辑信号机 STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}通过信号灯(悬臂){}是最基本的信号灯,只允许一列车进入该信号灯以后的区间 STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}入口信号灯(悬臂){}在下一轨道区间上至少有一个出口信号灯是绿色时此信号亮绿灯,否则亮红灯 STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}出口信号灯(悬臂){}信号显示条件与通过信号灯相同,但是它的状态可以触发入口及复合信号灯 @@ -2842,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}信号转换{}使用此工具时可以将现有的信号机转换成选择的信号种类及风格。按住 键单击以仅在灯式/悬臂式之间切换。按住 键单击以显示预计费用。 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}增加拖拽布置信号灯的间隔距离 @@ -2876,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}建设汽车货场。按住 键点击以合并站台,按住 键以显示预计费用。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}建设货运电车站。按住 键单击以合并站台。按住 键以显示预计费用。 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}选择是否建设单行道 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}建设公路桥梁 @@ -2962,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}选择要建设的物体。按住 键以沿对角线建设,按住 键操作以显示预计成本。 STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}选择要建造的物件类型 STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}物件预览 STR_OBJECT_BUILD_SIZE :{BLACK}大小: {GOLD}{NUM} x {NUM} 瓦 @@ -3312,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}显示游戏脚本设置 @@ -3762,7 +3763,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}评价 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}显示车站评价 STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}每月供应数量与本地评价: -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :每分钟供应量与本地评价: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}每分钟供应量与本地评价: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}群组方式 @@ -4339,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}复制这辆汽车。按住 键单击以共享调度计划,按住 键单击以显示预计费用。 +STR_VEHICLE_VIEW_CLONE_SHIP_INFO :{BLACK}复制这条船只。按住 键单击以共享调度计划,按住 键单击以显示所需资金。 STR_VEHICLE_VIEW_CLONE_AIRCRAFT_INFO :{BLACK}复制这架飞机。按住 Ctrl 键单击可以同时共享调度计划,按住 Shift 键单击可以显示所需资金 STR_VEHICLE_VIEW_TRAIN_IGNORE_SIGNAL_TOOLTIP :{BLACK}命令列车强行通过信号 @@ -4375,6 +4376,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}当前 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}装载/卸货 STR_VEHICLE_STATUS_LEAVING :{LTBLUE}发车 +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}等待班次均匀发车时间 STR_VEHICLE_STATUS_CRASHED :{RED}已撞毁! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}抛锚 STR_VEHICLE_STATUS_STOPPED :{RED}停运 @@ -4388,6 +4390,7 @@ STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}没有 STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正在前往{WAYPOINT},{VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正在前往 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}正在服务于 {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}正前往 {DEPOT} 以维护与调节班次, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}不能到达 {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达 {WAYPOINT}, {VELOCITY} @@ -4518,6 +4521,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}切换 STR_ORDERS_LIST_TOOLTIP :{BLACK}调度列表{}单击一个调度指令以选定{}CTRL+左键{}将视点移动到相应的车站 STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :-- 调度计划结束 -- STR_ORDERS_END_OF_SHARED_ORDERS :- - 共享调度计划结束 - - @@ -4528,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+单击 可以去掉改装计划 @@ -4554,6 +4558,15 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :可用类型 STR_ORDER_DROP_GO_ALWAYS_DEPOT :一直前进 STR_ORDER_DROP_SERVICE_DEPOT :若需要则维护 STR_ORDER_DROP_HALT_DEPOT :停留 +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}跳过所需的车辆数据值 @@ -4622,6 +4635,7 @@ STR_ORDER_REFIT_ORDER :(改装为 {STR STR_ORDER_REFIT_STOP_ORDER :(改装为{STRING}并停留) STR_ORDER_STOP_ORDER :(停留) +STR_ORDER_WAIT_TO_UNBUNCH :(班次均匀) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(不能使用车站){POP_COLOUR} {STRING} {STATION} {STRING} @@ -4844,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}' @@ -5093,6 +5107,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}在附 STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :车库类型错误 # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}……载具只能有一项班次均匀命令 +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}……不能对有班次均匀的载具应用满载命令 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}……不能对有满载命令的载具应用班次均匀 +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}……不能对有班次均匀的载具应用条件性命令 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}……不能对有条件性命令的载具应用班次均匀 # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE}在更新后总长会过长 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 34a211b4d0..1b19d1497c 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -4400,6 +4400,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vždy choď STR_ORDER_DROP_SERVICE_DEPOT :Servis, ak je potrebný STR_ORDER_DROP_HALT_DEPOT :Zastav +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Údaje vozidla na základe ktorých sa vykoná skok # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index fd5e978eae..d89253cd40 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -3999,6 +3999,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Vedno pojdi STR_ORDER_DROP_SERVICE_DEPOT :Servisiraj po potrebi STR_ORDER_DROP_HALT_DEPOT :Stop +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Podatki vozila na osnovni preskok # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index e463f153c3..3b39c6293e 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -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 @@ -4544,6 +4544,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre STR_ORDER_DROP_SERVICE_DEPOT :Mantenimiento si es necesario STR_ORDER_DROP_HALT_DEPOT :Detenerse +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Datos del vehículo en los que se basará para realizar el salto de orden # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index b9a3de3ccf..e055165a6a 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -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} @@ -4284,6 +4289,11 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ir siempre STR_ORDER_DROP_SERVICE_DEPOT :Mantto. si es necesario 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 # Conditional order variables, must follow order of OrderConditionVariable enum @@ -4995,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... diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index a34cf3ffdf..9e8b6eb911 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -4362,6 +4362,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Åk alltid STR_ORDER_DROP_SERVICE_DEPOT :Service vid behov STR_ORDER_DROP_HALT_DEPOT :Stanna +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Fordonsdata att basera hopp på # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index a3129f5430..9729f6aa95 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -3831,6 +3831,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :எப்போ STR_ORDER_DROP_SERVICE_DEPOT :தேவைப்பட்டால் பராமரிப்பிற்கு செல் STR_ORDER_DROP_HALT_DEPOT :நிறுத்து +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}அடிப்படை ஜம்பிங் செய்ய வாகனத் தரவு # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/thai.txt b/src/lang/thai.txt index 1f8e184d20..f0e4c5de86 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -3955,6 +3955,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :ไปทุก STR_ORDER_DROP_SERVICE_DEPOT :เข้าซ่อมบำรุงหากต้องการ STR_ORDER_DROP_HALT_DEPOT :หยุด +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}ข้อมูลยานพาหนะที่จะข้ามไป # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 537d032aff..70c108842b 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -4355,6 +4355,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :總是進行 STR_ORDER_DROP_SERVICE_DEPOT :若需要則維護 STR_ORDER_DROP_HALT_DEPOT :停留 +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳躍指令依據 # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index fff9c88647..db7ff8022a 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -4393,6 +4393,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Her zaman git STR_ORDER_DROP_SERVICE_DEPOT :Gerekiyorsa bakıma gir STR_ORDER_DROP_HALT_DEPOT :Dur +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dallanmanın temel alacağı araç verisi # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 269ad8cf9a..52d3b67253 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -4444,6 +4444,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Завжди п STR_ORDER_DROP_SERVICE_DEPOT :Прямувати при потребі в техогляді STR_ORDER_DROP_HALT_DEPOT :Прямувати і зупинитись +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Дані транспорту для базування наказу # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 50248b0f26..3f5410a63b 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -2627,6 +2627,10 @@ STR_ORDER_INDEX :{COMMA}:{NBSP} +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + # Conditional order variables, must follow order of OrderConditionVariable enum ###length 8 diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 937aa977bd..ec8e88bc06 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -4421,6 +4421,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Chạy suốt STR_ORDER_DROP_SERVICE_DEPOT :Bảo trì nếu cần STR_ORDER_DROP_HALT_DEPOT :Dừng +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dữ kiện của phương tiện để xác định # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index fed34c0368..9232a66892 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -3979,6 +3979,10 @@ STR_ORDER_DROP_GO_ALWAYS_DEPOT :Mynd bob tro STR_ORDER_DROP_SERVICE_DEPOT :Gwasanaethu os oes angen STR_ORDER_DROP_HALT_DEPOT :Stopio +# Depot action tooltips, one per vehicle type +###length VEHICLE_TYPES +###next-name-looks-similar + STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Data cerbyd i seilio'r naid arno # Conditional order variables, must follow order of OrderConditionVariable enum diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 6942875a2e..e2d8606bae 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -29,6 +29,7 @@ #include "rev.h" #include "timer/timer.h" #include "timer/timer_window.h" +#include "pathfinder/water_regions.h" #include "widgets/misc_widget.h" @@ -150,6 +151,8 @@ public: Debug(misc, LANDINFOD_LEVEL, "m6 = 0x{:x}", tile.m6()); Debug(misc, LANDINFOD_LEVEL, "m7 = 0x{:x}", tile.m7()); Debug(misc, LANDINFOD_LEVEL, "m8 = 0x{:x}", tile.m8()); + + PrintWaterRegionDebugInfo(tile); #undef LANDINFOD_LEVEL } diff --git a/src/network/core/config.h b/src/network/core/config.h index 6beaf9504f..df8991ad69 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -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? diff --git a/src/network/core/network_game_info.cpp b/src/network/core/network_game_info.cpp index ceffa9e227..adecf1643f 100644 --- a/src/network/core/network_game_info.cpp +++ b/src/network/core/network_game_info.cpp @@ -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::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(std::max(0, info->calendar_date.base() - info->calendar_start.base())) * Ticks::DAY_TICKS; + info.ticks_playing = static_cast(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); } diff --git a/src/network/core/network_game_info.h b/src/network/core/network_game_info.h index 293a20f92a..8b63d2d151 100644 --- a/src/network/core/network_game_info.h +++ b/src/network/core/network_game_info.h @@ -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 */ diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index 42de5c2653..d4cf165125 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -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; diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 8a1931e971..9cedfd63e1 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -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(); diff --git a/src/network/core/tcp.cpp b/src/network/core/tcp.cpp index 626f978b42..b01b8cd075 100644 --- a/src/network/core/tcp.cpp +++ b/src/network/core/tcp.cpp @@ -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) { 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(send, this->sock, 0); + while (!this->packet_queue.empty()) { + Packet &p = *this->packet_queue.front(); + ssize_t res = p.TransferOut(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 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(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(recv, this->sock, 0); + if (!p.HasPacketSizeData()) { + while (p.RemainingBytesToTransfer() != 0) { + res = p.TransferIn(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(recv, this->sock, 0); + while (p.RemainingBytesToTransfer() != 0) { + res = p.TransferIn(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); } /** diff --git a/src/network/core/tcp.h b/src/network/core/tcp.h index caade125b0..419a278587 100644 --- a/src/network/core/tcp.h +++ b/src/network/core/tcp.h @@ -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> packet_queue; ///< Packets that are awaiting delivery. Cannot be std::queue as that does not have a clear() function. + std::unique_ptr 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); SendPacketsState SendPackets(bool closing_down = false); - virtual Packet *ReceivePacket(); + virtual std::unique_ptr 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(); diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index 895817cad3..d29e08ba63 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -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 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); } diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 567a791496..4320a06f66 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -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; diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index 11df443b86..4c22c8e47c 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -98,9 +98,9 @@ std::optional 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 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. diff --git a/src/network/core/tcp_content.h b/src/network/core/tcp_content.h index 05924f05e4..95ee2805ef 100644 --- a/src/network/core/tcp_content.h +++ b/src/network/core/tcp_content.h @@ -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 diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index bc903bf234..23a0d65c4c 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -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 diff --git a/src/network/core/tcp_coordinator.cpp b/src/network/core/tcp_coordinator.cpp index cffb36ab6d..da030dd680 100644 --- a/src/network/core/tcp_coordinator.cpp +++ b/src/network/core/tcp_coordinator.cpp @@ -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 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); } diff --git a/src/network/core/tcp_coordinator.h b/src/network/core/tcp_coordinator.h index 6e6b98f5c1..9f00714891 100644 --- a/src/network/core/tcp_coordinator.h +++ b/src/network/core/tcp_coordinator.h @@ -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. diff --git a/src/network/core/tcp_game.cpp b/src/network/core/tcp_game.cpp index 0f8051eef6..4bd32ec153 100644 --- a/src/network/core/tcp_game.cpp +++ b/src/network/core/tcp_game.cpp @@ -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 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() { diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 86705a0723..ce031aa07b 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -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; /** 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; } diff --git a/src/network/core/tcp_stun.cpp b/src/network/core/tcp_stun.cpp index 1445fe30e5..a03bb7cf72 100644 --- a/src/network/core/tcp_stun.cpp +++ b/src/network/core/tcp_stun.cpp @@ -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); } diff --git a/src/network/core/tcp_stun.h b/src/network/core/tcp_stun.h index 2eca700181..0fce3b2a07 100644 --- a/src/network/core/tcp_stun.h +++ b/src/network/core/tcp_stun.h @@ -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: /** diff --git a/src/network/core/tcp_turn.cpp b/src/network/core/tcp_turn.cpp index 76096aeb2b..ae600e7bfb 100644 --- a/src/network/core/tcp_turn.cpp +++ b/src/network/core/tcp_turn.cpp @@ -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 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); } diff --git a/src/network/core/tcp_turn.h b/src/network/core/tcp_turn.h index b54a857982..e9558b252e 100644 --- a/src/network/core/tcp_turn.h +++ b/src/network/core/tcp_turn.h @@ -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. diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 2efb14e1dd..04324e0098 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -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(sendto, s.first, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength()); + ssize_t res = p.TransferOut(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); } diff --git a/src/network/core/udp.h b/src/network/core/udp.h index 61866351d8..fc5412b861 100644 --- a/src/network/core/udp.h +++ b/src/network/core/udp.h @@ -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(); }; diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index 3df0182937..a9633c4437 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -134,10 +134,10 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler() */ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode error) { - Packet *p = new Packet(ADMIN_PACKET_SERVER_ERROR); + auto p = std::make_unique(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(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(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(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(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(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(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(ADMIN_PACKET_SERVER_CLIENT_INFO); p->Send_uint32(ci->client_id); p->Send_string(cs == nullptr ? "" : const_cast(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(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(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(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(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(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(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(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(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); p->Send_uint8(company->index); @@ -402,7 +402,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy() p->Send_uint16(static_cast(std::min(UINT16_MAX, company->old_economy[i].delivered_cargo.GetSum()))); } - 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(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(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(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(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(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(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(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(ADMIN_PACKET_SERVER_CMD_NAMES); for (uint16_t i = 0; i < CMD_END; i++) { const char *cmdname = GetCommandName(static_cast(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(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(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; diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 0d39a313df..63c80545ce 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -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 { 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 */ diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 969687d9e6..ecbaa51164 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -92,19 +92,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(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 @@ -166,7 +166,6 @@ ClientNetworkGameSocketHandler::~ClientNetworkGameSocketHandler() assert(ClientNetworkGameSocketHandler::my_client == this); ClientNetworkGameSocketHandler::my_client = nullptr; - delete this->savegame; delete this->GetInfo(); } @@ -345,7 +344,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. */ @@ -359,14 +357,14 @@ 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_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 p->Send_uint8 (citymania::GetAvailableLoadFormats()); // Compressnion formats that we can decompress - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -375,8 +373,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_CLIENT_NEWGRFS_CHECKED); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -388,9 +386,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_CLIENT_GAME_PASSWORD); p->Send_string(password); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -402,9 +400,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_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; } @@ -416,8 +414,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_CLIENT_GETMAP); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -429,8 +427,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_CLIENT_MAP_OK); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -439,11 +437,11 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendAck() { Debug(net, 9, "Client::SendAck()"); - Packet *p = new Packet(PACKET_CLIENT_ACK); + auto p = std::make_unique(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; } @@ -451,14 +449,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_CLIENT_COMMAND); + my_client->NetworkGameSocketHandler::SendCommand(*p, cp); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -467,7 +465,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_CLIENT_CHAT); p->Send_uint8 (action); p->Send_uint8 (type); @@ -475,7 +473,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; } @@ -484,10 +482,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_CLIENT_ERROR); p->Send_uint8(errorno); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -499,10 +497,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_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; } @@ -514,10 +512,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_CLIENT_SET_NAME); p->Send_string(name); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -528,9 +526,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendQuit() { Debug(net, 9, "Client::SendSetName()"); - Packet *p = new Packet(PACKET_CLIENT_QUIT); + auto p = std::make_unique(PACKET_CLIENT_QUIT); - my_client->SendPacket(p); + my_client->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -543,10 +541,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_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; } @@ -559,10 +557,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_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; } @@ -578,12 +576,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, struct LoadFilter *lf = nullptr); +extern bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr lf); -NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet *) +NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FULL(Packet &) { Debug(net, 9, "Client::Receive_SERVER_FULL()"); @@ -593,7 +590,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()"); @@ -606,15 +603,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; @@ -674,7 +671,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 @@ -701,15 +698,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); @@ -721,11 +718,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); @@ -733,7 +730,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); @@ -754,7 +751,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"); @@ -771,7 +768,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"); @@ -779,8 +776,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()) { @@ -792,25 +789,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; @@ -820,13 +817,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"); @@ -834,9 +831,9 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_BEGIN(Packe if (this->savegame != nullptr) return NETWORK_RECV_STATUS_MALFORMED_PACKET; - this->savegame = new PacketReader(); + this->savegame = std::make_shared(); - _frame_counter = _frame_counter_server = _frame_counter_max = p->Recv_uint32(); + _frame_counter = _frame_counter_server = _frame_counter_max = p.Recv_uint32(); citymania::InitCommandQueue(); Debug(net, 9, "Client::Receive_SERVER_MAP_BEGIN(): frame_counter={}", _frame_counter); @@ -851,12 +848,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); @@ -864,7 +861,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; @@ -878,7 +875,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; @@ -889,20 +886,12 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MAP_DONE(Packet _network_join_status = NETWORK_JOIN_STATUS_PROCESSING; SetWindowDirty(WC_NETWORK_STATUS_WINDOW, WN_NETWORK_STATUS_WINDOW_JOIN); - /* - * Make sure everything is set for reading. - * - * We need the local copy and reset this->savegame because when - * loading fails the network gets reset upon loading the intro - * game, which would cause us to free this->savegame twice. - */ - LoadFilter *lf = this->savegame; - this->savegame = nullptr; - lf->Reset(); + this->savegame->Reset(); /* The map is done downloading, load it */ ClearErrorMessages(); - bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, lf); + bool load_success = SafeLoad({}, SLO_LOAD, DFT_GAME_FILE, GM_NORMAL, NO_DIRECTORY, this->savegame); + this->savegame = nullptr; /* Long savegame loads shouldn't affect the lag calculation! */ this->last_packet = std::chrono::steady_clock::now(); @@ -942,29 +931,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 ;) */ @@ -977,14 +966,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); @@ -992,14 +981,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); @@ -1007,23 +996,24 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_COMMAND(Packet IConsolePrint(CC_WARNING, "Dropping server connection due to {}.", err); 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); @@ -1064,14 +1054,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); @@ -1082,17 +1072,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; } @@ -1102,11 +1092,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); @@ -1127,11 +1117,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); @@ -1146,7 +1136,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()"); @@ -1161,7 +1151,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()"); @@ -1180,29 +1170,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); @@ -1228,12 +1218,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); @@ -1241,12 +1231,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()"); diff --git a/src/network/network_client.h b/src/network/network_client.h index 42caac9289..d314ddc41a 100644 --- a/src/network/network_client.h +++ b/src/network/network_client.h @@ -16,7 +16,7 @@ class ClientNetworkGameSocketHandler : public ZeroedMemoryAllocator, public NetworkGameSocketHandler { private: std::string connection_string; ///< Address we are connected to. - struct PacketReader *savegame; ///< Packet reader for reading the savegame. + std::shared_ptr savegame; ///< Packet reader for reading the savegame. byte token; ///< The token we need to send back to the server to prove we're the right client. /** Status of the connection with the server. */ @@ -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(); diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index baa3397a98..a0a712fd83 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -124,9 +124,9 @@ struct CallbackArgsHelper /* Helpers to generate the command dispatch table from the command traits. */ template static CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data); -template static void UnpackNetworkCommand(const CommandPacket *cp); +template static void UnpackNetworkCommand(const CommandPacket &cp); template static void NetworkReplaceCommandClientId(CommandPacket &cp, ClientID client_id); -using UnpackNetworkCommandProc = void (*)(const CommandPacket *); +using UnpackNetworkCommandProc = void (*)(const CommandPacket &); using UnpackDispatchT = std::array; struct CommandDispatch { CommandDataBuffer(*Sanitize)(const CommandDataBuffer &); @@ -167,76 +167,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. */ @@ -284,7 +214,7 @@ 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); citymania::AddCommandCallback(&c); return; } @@ -307,10 +237,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); } } @@ -323,8 +252,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; @@ -340,11 +269,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; @@ -368,8 +295,8 @@ namespace citymania { */ void NetworkFreeLocalCommandQueue() { - _local_wait_queue.Free(); - _local_execution_queue.Free(); + _local_wait_queue.clear(); + _local_execution_queue.clear(); } /** @@ -388,13 +315,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); } /** @@ -402,7 +329,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. */ @@ -415,11 +342,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); } } @@ -427,11 +363,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); } } @@ -441,19 +377,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(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(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; } @@ -462,19 +398,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. */ @@ -554,11 +490,11 @@ CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data) * @param cp Command packet to unpack. */ template -void UnpackNetworkCommand(const CommandPacket *cp) +void UnpackNetworkCommand(const CommandPacket &cp) { citymania::BeforeNetworkCommandExecution(cp); - auto args = EndianBufferReader::ToValue::Args>(cp->data); - Debug(misc, 5, "UnpackNetworkCommand cmd={} my={}", GetCommandName(cp->cmd), cp->my_cmd); - Command::PostFromNet(cp->err_msg, std::get(_callback_tuple), cp->my_cmd, args); + auto args = EndianBufferReader::ToValue::Args>(cp.data); + Debug(misc, 5, "UnpackNetworkCommand cmd={} my={}", GetCommandName(cp.cmd), cp.my_cmd); + Command::PostFromNet(cp.err_msg, std::get(_callback_tuple), cp.my_cmd, args); citymania::AfterNetworkCommandExecution(cp); } diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index e4a8ea8675..20a73af1a4 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -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_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(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_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(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(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_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(); diff --git a/src/network/network_content.h b/src/network/network_content.h index a5f75bcd84..1d4764feed 100644 --- a/src/network/network_content.h +++ b/src/network/network_content.h @@ -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); diff --git a/src/network/network_coordinator.cpp b/src/network/network_coordinator.cpp index b049376cc9..129b26f8fb 100644 --- a/src/network/network_coordinator.cpp +++ b/src/network/network_coordinator.cpp @@ -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_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_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_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_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_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_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_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)); } /** diff --git a/src/network/network_coordinator.h b/src/network/network_coordinator.h index ccb74e4921..f8aa88e6b8 100644 --- a/src/network/network_coordinator.h +++ b/src/network/network_coordinator.h @@ -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. */ diff --git a/src/network/network_internal.h b/src/network/network_internal.h index 395e12194f..66dea11be4 100644 --- a/src/network/network_internal.h +++ b/src/network/network_internal.h @@ -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" diff --git a/src/network/network_query.cpp b/src/network/network_query.cpp index 0fb128b610..34cbd09289 100644 --- a/src/network/network_query.cpp +++ b/src/network/network_query.cpp @@ -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_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); diff --git a/src/network/network_query.h b/src/network/network_query.h index ab0f8cd1d2..0f7348838f 100644 --- a/src/network/network_query.h +++ b/src/network/network_query.h @@ -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(); diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 8451f0e49d..5bdf02376b 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -63,9 +63,9 @@ template SocketList TCPListenHandler 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> 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. @@ -73,7 +73,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) { } @@ -86,11 +86,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; } /** @@ -127,14 +125,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 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; } @@ -142,32 +140,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_SERVER_MAP_DATA, TCP_MTU); std::lock_guard lock(this->mutex); @@ -177,8 +155,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_SERVER_MAP_DATA, TCP_MTU); } } @@ -193,16 +171,15 @@ struct PacketWriter : SaveFilter { std::lock_guard 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_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_SERVER_MAP_SIZE); + p->Send_uint32((uint32_t)this->total_size); + this->packets.push_front(std::move(p)); } }; @@ -241,7 +218,7 @@ ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler() } } -Packet *ServerNetworkGameSocketHandler::ReceivePacket() +std::unique_ptr ServerNetworkGameSocketHandler::ReceivePacket() { /* Only allow receiving when we have some buffer free; this value * can go negative, but eventually it will become positive again. */ @@ -249,7 +226,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 p = this->NetworkTCPSocketHandler::ReceivePacket(); if (p != nullptr) this->receive_limit -= p->Size(); return p; } @@ -341,7 +318,6 @@ static void NetworkHandleCommandQueue(NetworkClientSocket *cs); /*********** * Sending functions - * DEF_SERVER_SEND_COMMAND has parameter: NetworkClientSocket *cs ************/ /** @@ -353,12 +329,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_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; } @@ -368,10 +344,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_SERVER_GAME_INFO, TCP_MTU); + SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo()); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -385,11 +361,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_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); @@ -430,7 +406,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_SERVER_CHECK_NEWGRFS, TCP_MTU); const GRFConfig *c; uint grf_count = 0; @@ -440,16 +416,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 */ @@ -460,14 +441,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_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 */ @@ -478,10 +464,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_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; } @@ -490,8 +476,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); @@ -502,11 +486,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendWelcome() _network_game_info.clients_on++; - p = new Packet(PACKET_SERVER_WELCOME); + auto p = std::make_unique(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()) { @@ -524,7 +508,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()) { @@ -532,9 +515,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_SERVER_WAIT); p->Send_uint8(waiting); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -579,12 +562,12 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendMap() Debug(net, 9, "client[{}] SendMap(): first_packet", this->client_id); WaitTillSaved(); - this->savegame = new PacketWriter(this); + this->savegame = std::make_shared(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_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); @@ -625,18 +608,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_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_SERVER_FRAME); p->Send_uint32(_frame_counter); p->Send_uint32(_frame_counter_max); #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME @@ -652,7 +635,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendFrame() p->Send_uint8(this->last_token); } - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -661,14 +644,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_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; } @@ -676,17 +659,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_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; } @@ -704,7 +687,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_SERVER_CHAT); p->Send_uint8 (action); p->Send_uint32(client_id); @@ -712,7 +695,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; } @@ -729,14 +712,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_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; } @@ -749,12 +732,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_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; } @@ -766,11 +749,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_SERVER_QUIT); p->Send_uint32(client_id); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -779,8 +762,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_SERVER_SHUTDOWN); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -789,8 +772,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_SERVER_NEWGAME); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -803,11 +786,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_SERVER_RCON); p->Send_uint16(colour); p->Send_string(command); - this->SendPacket(p); + this->SendPacket(std::move(p)); return NETWORK_RECV_STATUS_OKAY; } @@ -820,11 +803,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_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; } @@ -833,11 +816,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_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; } @@ -846,27 +829,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_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 */ @@ -875,21 +857,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 */ @@ -901,8 +872,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); @@ -912,10 +883,10 @@ 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(); - p->Recv_uint8(); // former client_lang now 0 - uint8_t savegame_formats = p->CanReadFromPacket(1, false) ? p->Recv_uint8() : 23u /* assume non-modded has everything but zstd */; + std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH); + CompanyID playas = (Owner)p.Recv_uint8(); + p.Recv_uint8(); // former client_lang now 0 + uint8_t savegame_formats = p.CanReadFromPacket(1, false) ? p.Recv_uint8() : 23u /* assume non-modded has everything but zstd */; if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT; @@ -969,14 +940,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); @@ -984,7 +955,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() && @@ -993,16 +964,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); @@ -1010,7 +975,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 @@ -1025,7 +990,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 */ @@ -1049,7 +1014,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()) { @@ -1100,7 +1065,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 */ @@ -1108,14 +1073,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; @@ -1163,15 +1128,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); @@ -1198,7 +1163,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()) { @@ -1222,14 +1187,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); @@ -1248,7 +1213,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 @@ -1407,21 +1372,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) { @@ -1437,7 +1402,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 */ @@ -1446,14 +1411,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 */ @@ -1464,7 +1429,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; @@ -1487,7 +1452,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); @@ -1495,8 +1460,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); @@ -1511,11 +1476,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); @@ -1525,7 +1490,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) { @@ -1749,11 +1714,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(); } /** diff --git a/src/network/network_server.h b/src/network/network_server.h index 4a070e40d6..f35fc4a000 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -24,22 +24,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 { 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(); @@ -67,10 +67,10 @@ 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 - struct PacketWriter *savegame; ///< Writer used to write the savegame. + std::shared_ptr savegame; ///< Writer used to write the savegame. NetworkAddress client_address; ///< IP-address of the client (so they can be banned) citymania::SavePreset cm_preset; ///< Preset to use for the savegame @@ -78,7 +78,7 @@ public: ServerNetworkGameSocketHandler(SOCKET s); ~ServerNetworkGameSocketHandler(); - Packet *ReceivePacket() override; + std::unique_ptr ReceivePacket() override; NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override; std::string GetClientName() const; @@ -100,7 +100,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(); diff --git a/src/network/network_stun.cpp b/src/network/network_stun.cpp index dd394c669b..c606ff0c83 100644 --- a/src/network/network_stun.cpp +++ b/src/network/network_stun.cpp @@ -92,12 +92,12 @@ std::unique_ptr ClientNetworkStunSocketHandler:: stun_handler->Connect(token, family); - Packet *p = new Packet(PACKET_STUN_SERCLI_STUN); + auto p = std::make_unique(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; } diff --git a/src/network/network_turn.cpp b/src/network/network_turn.cpp index 7a9bd43fc5..c3dfa75a0b 100644 --- a/src/network/network_turn.cpp +++ b/src/network/network_turn.cpp @@ -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(token, tracking_number, connection_string); - Packet *p = new Packet(PACKET_TURN_SERCLI_CONNECT); + auto p = std::make_unique(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; } diff --git a/src/network/network_turn.h b/src/network/network_turn.h index 0b0ca8a851..961a961788 100644 --- a/src/network/network_turn.h +++ b/src/network/network_turn.h @@ -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 connecter{}; ///< Connecter instance. diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 4d5ff526ea..478e804eaf 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -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); } } diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 22455baf61..ffc16c067a 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1151,6 +1151,7 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop ei->cargo_type = INVALID_CARGO; GrfMsg(2, "RailVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype); } + ei->cargo_label = CT_INVALID; break; } @@ -1412,6 +1413,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop ei->cargo_type = INVALID_CARGO; GrfMsg(2, "RailVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype); } + ei->cargo_label = CT_INVALID; break; } @@ -1607,6 +1609,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop ei->cargo_type = INVALID_CARGO; GrfMsg(2, "ShipVehicleChangeInfo: Invalid cargo type {}, using first refittable", ctype); } + ei->cargo_label = CT_INVALID; break; } @@ -2426,7 +2429,9 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt * climate. This can cause problems when copying the properties * of a house that accepts food, where the new house is valid * in the temperate climate. */ - if (!CargoSpec::Get(housespec->accepts_cargo[2])->IsValid()) { + CargoID cid = housespec->accepts_cargo[2]; + if (!IsValidCargoID(cid)) cid = GetCargoIDByLabel(housespec->accepts_cargo_label[2]); + if (!IsValidCargoID(cid)) { housespec->cargo_acceptance[2] = 0; } } @@ -2462,13 +2467,14 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt /* If value of goods is negative, it means in fact food or, if in toyland, fizzy_drink acceptance. * Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */ - CargoID cid = (goods >= 0) ? ((_settings_game.game_creation.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) : - ((_settings_game.game_creation.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD); + CargoID cid = (goods >= 0) ? ((_settings_game.game_creation.landscape == LT_TOYLAND) ? GetCargoIDByLabel(CT_CANDY) : GetCargoIDByLabel(CT_GOODS)) : + ((_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; housespec->cargo_acceptance[2] = abs(goods); // but we do need positive value here break; } @@ -2636,7 +2642,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint hid, int numinfo, int prop, Byt * @return ChangeInfoResult. */ template -static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader *buf, T &translation_table, const char *name) +static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader *buf, std::vector &translation_table, const char *name) { if (gvid != 0) { GrfMsg(1, "LoadTranslationTable: {} translation table must start at zero", name); @@ -2645,8 +2651,7 @@ static ChangeInfoResult LoadTranslationTable(uint gvid, int numinfo, ByteReader translation_table.clear(); for (int i = 0; i < numinfo; i++) { - uint32_t item = buf->ReadDWord(); - translation_table.push_back(BSWAP32(item)); + translation_table.push_back(T(BSWAP32(buf->ReadDWord()))); } return CIR_SUCCESS; @@ -2991,6 +2996,7 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea } else { ClrBit(_cargo_mask, cid + i); } + BuildCargoLabelMap(); break; case 0x09: // String ID for cargo type name @@ -3058,8 +3064,8 @@ static ChangeInfoResult CargoChangeInfo(uint cid, int numinfo, int prop, ByteRea break; case 0x17: // Cargo label - cs->label = buf->ReadDWord(); - cs->label = BSWAP32(cs->label); + cs->label = CargoLabel{BSWAP32(buf->ReadDWord())}; + BuildCargoLabelMap(); break; case 0x18: { // Town growth substitute type @@ -3666,12 +3672,14 @@ static ChangeInfoResult IndustriesChangeInfo(uint indid, int numinfo, int prop, case 0x10: // Production cargo types for (byte j = 0; j < 2; j++) { indsp->produced_cargo[j] = GetCargoTranslation(buf->ReadByte(), _cur.grffile); + indsp->produced_cargo_label[j] = CT_INVALID; } break; case 0x11: // Acceptance cargo types for (byte j = 0; j < 3; j++) { indsp->accepts_cargo[j] = GetCargoTranslation(buf->ReadByte(), _cur.grffile); + indsp->accepts_cargo_label[j] = CT_INVALID; } buf->ReadByte(); // Unnused, eat it up break; @@ -5564,18 +5572,18 @@ static CargoID TranslateCargo(uint8_t feature, uint8_t ctype) /* Look up the cargo label from the translation table */ CargoLabel cl = _cur.grffile->cargo_list[ctype]; - if (cl == 0) { + if (cl == CT_INVALID) { GrfMsg(5, "TranslateCargo: Cargo type {} not available in this climate, skipping.", ctype); return INVALID_CARGO; } CargoID cid = GetCargoIDByLabel(cl); if (!IsValidCargoID(cid)) { - GrfMsg(5, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8)); + GrfMsg(5, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' unsupported, skipping.", GB(cl.base(), 24, 8), GB(cl.base(), 16, 8), GB(cl.base(), 8, 8), GB(cl.base(), 0, 8)); return INVALID_CARGO; } - GrfMsg(6, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' mapped to cargo type {}.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), cid); + GrfMsg(6, "TranslateCargo: Cargo '{:c}{:c}{:c}{:c}' mapped to cargo type {}.", GB(cl.base(), 24, 8), GB(cl.base(), 16, 8), GB(cl.base(), 8, 8), GB(cl.base(), 0, 8), cid); return cid; } @@ -6864,9 +6872,9 @@ static void SkipIf(ByteReader *buf) if (condtype >= 0x0B) { /* Tests that ignore 'param' */ switch (condtype) { - case 0x0B: result = !IsValidCargoID(GetCargoIDByLabel(BSWAP32(cond_val))); + case 0x0B: result = !IsValidCargoID(GetCargoIDByLabel(CargoLabel(BSWAP32(cond_val)))); break; - case 0x0C: result = IsValidCargoID(GetCargoIDByLabel(BSWAP32(cond_val))); + case 0x0C: result = IsValidCargoID(GetCargoIDByLabel(CargoLabel(BSWAP32(cond_val)))); break; case 0x0D: result = GetRailTypeByLabel(BSWAP32(cond_val)) == INVALID_RAILTYPE; break; @@ -8954,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 &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 &label) +{ + if (std::holds_alternative(label)) return std::get(label); + if (std::holds_alternative(label)) { + switch (std::get(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. @@ -8961,9 +9001,8 @@ GRFFile::~GRFFile() static void CalculateRefitMasks() { CargoTypes original_known_cargoes = 0; - for (int ct = 0; ct != NUM_ORIGINAL_CARGO; ++ct) { - CargoID cid = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast(ct)); - if (IsValidCargoID(cid)) SetBit(original_known_cargoes, cid); + for (CargoID cid = 0; cid != NUM_CARGO; ++cid) { + if (IsDefaultCargo(cid)) SetBit(original_known_cargoes, cid); } for (Engine *e : Engine::Iterate()) { @@ -8971,6 +9010,11 @@ static void CalculateRefitMasks() EngineInfo *ei = &e->info; bool only_defaultcargo; ///< Set if the vehicle shall carry only the default cargo + /* 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(GetActiveCargoLabel(e->info.cargo_label)); + } + /* If the NewGRF did not set any cargo properties, we apply default values. */ if (_gted[engine].defaultcargo_grf == nullptr) { /* If the vehicle has any capacity, apply the default refit masks */ @@ -8981,7 +9025,7 @@ static void CalculateRefitMasks() static constexpr byte Y = 1 << LT_TOYLAND; static const struct DefaultRefitMasks { byte climate; - CargoType cargo_type; + CargoLabel cargo_label; CargoTypes cargo_allowed; CargoTypes cargo_disallowed; } _default_refit_masks[] = { @@ -9005,13 +9049,14 @@ 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_type) { - case CT_PASSENGERS: + CargoLabel label = GetActiveCargoLabel(ei->cargo_label); + switch (label.base()) { + case CT_PASSENGERS.base(): /* Ferries */ _gted[engine].cargo_allowed = CC_PASSENGERS; _gted[engine].cargo_disallowed = 0; break; - case CT_OIL: + case CT_OIL.base(): /* Tankers */ _gted[engine].cargo_allowed = CC_LIQUID; _gted[engine].cargo_disallowed = 0; @@ -9036,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_type != ei->cargo_type) continue; + if (drm.cargo_label != label) continue; _gted[engine].cargo_allowed = drm.cargo_allowed; _gted[engine].cargo_disallowed = drm.cargo_disallowed; @@ -9051,8 +9097,6 @@ static void CalculateRefitMasks() } _gted[engine].UpdateRefittability(_gted[engine].cargo_allowed != 0); - /* Translate cargo_type using the original climate-specific cargo table. */ - ei->cargo_type = GetDefaultCargoID(_settings_game.game_creation.landscape, static_cast(ei->cargo_type)); if (IsValidCargoID(ei->cargo_type)) ClrBit(_gted[engine].ctt_exclude_mask, ei->cargo_type); } @@ -9206,10 +9250,10 @@ void FinaliseCargoArray() for (CargoSpec &cs : CargoSpec::array) { if (cs.town_production_effect == INVALID_TPE) { /* Set default town production effect by cargo label. */ - switch (cs.label) { - case 'PASS': cs.town_production_effect = TPE_PASSENGERS; break; - case 'MAIL': cs.town_production_effect = TPE_MAIL; break; - default: cs.town_production_effect = TPE_NONE; break; + switch (cs.label.base()) { + case CT_PASSENGERS.base(): cs.town_production_effect = TPE_PASSENGERS; break; + case CT_MAIL.base(): cs.town_production_effect = TPE_MAIL; break; + default: cs.town_production_effect = TPE_NONE; break; } } if (!cs.IsValid()) { @@ -9352,6 +9396,13 @@ static void FinaliseHouseArray() * this one in the pool is properly handled as 1x1 house. */ hs->building_flags = TILE_NO_FLAG; } + + /* Apply default cargo translation map for unset cargo slots */ + for (uint i = 0; i < lengthof(hs->accepts_cargo); ++i) { + if (!IsValidCargoID(hs->accepts_cargo[i])) hs->accepts_cargo[i] = GetCargoIDByLabel(hs->accepts_cargo_label[i]); + /* Disable acceptance if cargo type is invalid. */ + if (!IsValidCargoID(hs->accepts_cargo[i])) hs->cargo_acceptance[i] = 0; + } } HouseZones climate_mask = (HouseZones)(1 << (_settings_game.game_creation.landscape + 12)); @@ -9426,6 +9477,21 @@ static void FinaliseIndustriesArray() if (!indsp.enabled) { indsp.name = STR_NEWGRF_INVALID_INDUSTRYTYPE; } + + /* 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(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(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(GetActiveCargoLabel(indtsp.accepts_cargo_label[i])); + } } } diff --git a/src/newgrf_cargo.cpp b/src/newgrf_cargo.cpp index ffd1c44269..97eaebec87 100644 --- a/src/newgrf_cargo.cpp +++ b/src/newgrf_cargo.cpp @@ -30,7 +30,7 @@ GrfSpecFeature CargoResolverObject::GetFeature() const uint32_t CargoResolverObject::GetDebugID() const { - return this->cargospec->label; + return this->cargospec->label.base(); } /** diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp index 57a68941a8..0bd4924e34 100644 --- a/src/newgrf_town.cpp +++ b/src/newgrf_town.cpp @@ -17,6 +17,7 @@ /* virtual */ uint32_t TownScopeResolver::GetVariable(byte variable, [[maybe_unused]] uint32_t parameter, bool *available) const { + CargoID cid; switch (variable) { /* Larger towns */ case 0x40: @@ -81,24 +82,24 @@ case 0xB2: return this->t->statues; case 0xB6: return ClampTo(this->t->cache.num_houses); case 0xB9: return this->t->growth_rate / Ticks::TOWN_GROWTH_TICKS; - case 0xBA: return ClampTo(this->t->supplied[CT_PASSENGERS].new_max); - case 0xBB: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].new_max), 8, 8); - case 0xBC: return ClampTo(this->t->supplied[CT_MAIL].new_max); - case 0xBD: return GB(ClampTo(this->t->supplied[CT_MAIL].new_max), 8, 8); - case 0xBE: return ClampTo(this->t->supplied[CT_PASSENGERS].new_act); - case 0xBF: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].new_act), 8, 8); - case 0xC0: return ClampTo(this->t->supplied[CT_MAIL].new_act); - case 0xC1: return GB(ClampTo(this->t->supplied[CT_MAIL].new_act), 8, 8); - case 0xC2: return ClampTo(this->t->supplied[CT_PASSENGERS].old_max); - case 0xC3: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].old_max), 8, 8); - case 0xC4: return ClampTo(this->t->supplied[CT_MAIL].old_max); - case 0xC5: return GB(ClampTo(this->t->supplied[CT_MAIL].old_max), 8, 8); - case 0xC6: return ClampTo(this->t->supplied[CT_PASSENGERS].old_act); - case 0xC7: return GB(ClampTo(this->t->supplied[CT_PASSENGERS].old_act), 8, 8); - case 0xC8: return ClampTo(this->t->supplied[CT_MAIL].old_act); - case 0xC9: return GB(ClampTo(this->t->supplied[CT_MAIL].old_act), 8, 8); - case 0xCA: return this->t->GetPercentTransported(CT_PASSENGERS); - case 0xCB: return this->t->GetPercentTransported(CT_MAIL); + case 0xBA: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_max) : 0; + case 0xBB: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_max), 8, 8) : 0; + case 0xBC: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_max) : 0; + case 0xBD: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_max), 8, 8) : 0; + case 0xBE: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_act) : 0; + case 0xBF: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_act), 8, 8) : 0; + case 0xC0: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].new_act) : 0; + case 0xC1: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].new_act), 8, 8) : 0; + case 0xC2: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_max) : 0; + case 0xC3: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_max), 8, 8) : 0; + case 0xC4: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_max) : 0; + case 0xC5: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_max), 8, 8) : 0; + case 0xC6: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_act) : 0; + case 0xC7: cid = GetCargoIDByLabel(CT_PASSENGERS); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_act), 8, 8) : 0; + case 0xC8: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? ClampTo(this->t->supplied[cid].old_act) : 0; + case 0xC9: cid = GetCargoIDByLabel(CT_MAIL); return IsValidCargoID(cid) ? GB(ClampTo(this->t->supplied[cid].old_act), 8, 8) : 0; + case 0xCA: return this->t->GetPercentTransported(GetCargoIDByLabel(CT_PASSENGERS)); + case 0xCB: return this->t->GetPercentTransported(GetCargoIDByLabel(CT_MAIL)); case 0xCC: return this->t->received[TAE_FOOD].new_act; case 0xCD: return GB(this->t->received[TAE_FOOD].new_act, 8, 8); case 0xCE: return this->t->received[TAE_WATER].new_act; diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index e6cdac6380..8642ddab1b 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -631,23 +631,31 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg /* Top town building generates 10, so to make HQ interesting, the top * type makes 20. */ - acceptance[CT_PASSENGERS] += std::max(1U, level); - SetBit(*always_accepted, CT_PASSENGERS); + CargoID pass = GetCargoIDByLabel(CT_PASSENGERS); + if (IsValidCargoID(pass)) { + acceptance[pass] += std::max(1U, level); + SetBit(*always_accepted, pass); + } /* Top town building generates 4, HQ can make up to 8. The * proportion passengers:mail is different because such a huge * commercial building generates unusually high amount of mail * correspondence per physical visitor. */ - acceptance[CT_MAIL] += std::max(1U, level / 2); - SetBit(*always_accepted, CT_MAIL); + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail)) { + acceptance[mail] += std::max(1U, level / 2); + SetBit(*always_accepted, mail); + } } static void AddProducedCargo_Object(TileIndex tile, CargoArray &produced) { if (!IsObjectType(tile, OBJECT_HQ)) return; - produced[CT_PASSENGERS]++; - produced[CT_MAIL]++; + CargoID pass = GetCargoIDByLabel(CT_PASSENGERS); + if (IsValidCargoID(pass)) produced[pass]++; + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail)) produced[mail]++; } @@ -687,7 +695,8 @@ static void TileLoop_Object(TileIndex tile) uint r = Random(); /* Top town buildings generate 250, so the top HQ type makes 256. */ - if (GB(r, 0, 8) < (256 / 4 / (6 - level))) { + CargoID pass = GetCargoIDByLabel(CT_PASSENGERS); + if (IsValidCargoID(pass) && GB(r, 0, 8) < (256 / 4 / (6 - level))) { uint amt = GB(r, 0, 8) / 8 / 4 + 1; /* Production is halved during recessions. */ @@ -696,13 +705,14 @@ static void TileLoop_Object(TileIndex tile) /* Scale by cargo scale setting. */ amt = ScaleByCargoScale(amt, true); - MoveGoodsToStation(CT_PASSENGERS, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations()); + MoveGoodsToStation(pass, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations()); } /* Top town building generates 90, HQ can make up to 196. The * proportion passengers:mail is about the same as in the acceptance * equations. */ - if (GB(r, 8, 8) < (196 / 4 / (6 - level))) { + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail) && GB(r, 8, 8) < (196 / 4 / (6 - level))) { uint amt = GB(r, 8, 8) / 8 / 4 + 1; /* Production is halved during recessions. */ @@ -711,7 +721,7 @@ static void TileLoop_Object(TileIndex tile) /* Scale by cargo scale setting. */ amt = ScaleByCargoScale(amt, true); - MoveGoodsToStation(CT_MAIL, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations()); + MoveGoodsToStation(mail, amt, SourceType::Headquarters, GetTileOwner(tile), stations.GetStations()); } } diff --git a/src/openttd.cpp b/src/openttd.cpp index 3b3dfe931a..77a06a9e0b 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -998,7 +998,7 @@ static void MakeNewEditorWorld() * @param subdir default directory to look for filename, set to 0 if not needed * @param lf Load filter to use, if nullptr: use filename + subdir. */ -bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, struct LoadFilter *lf = nullptr) +bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileType dft, GameMode newgm, Subdirectory subdir, std::shared_ptr lf = nullptr) { assert(fop == SLO_LOAD); assert(dft == DFT_GAME_FILE || (lf == nullptr && dft == DFT_OLD_GAME_FILE)); diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index e76f71c57c..8c1f43e451 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1300,9 +1300,6 @@ CommandCost CmdModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se case MOF_DEPOT_ACTION: if (data >= DA_END) return CMD_ERROR; - /* The vehicle must always go to the depot (not just if it needs servicing) in order to unbunch there. */ - if ((data == DA_SERVICE) && (order->GetDepotActionType() & ODATFB_UNBUNCH)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED); - /* Check if we are allowed to add unbunching. We are always allowed to remove it. */ if (data == DA_UNBUNCH) { /* Only one unbunching order is allowed in a vehicle's orders. If this order already has an unbunching action, no error is needed. */ @@ -1312,8 +1309,6 @@ CommandCost CmdModifyOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se if (o->IsType(OT_CONDITIONAL)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL); /* We don't allow unbunching if the vehicle has a full load order. */ if (o->IsType(OT_GOTO_STATION) && o->GetLoadType() & (OLFB_FULL_LOAD | OLF_FULL_LOAD_ANY)) return_cmd_error(STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD); - /* The vehicle must always go to the depot (not just if it needs servicing) in order to unbunch there. */ - if (o->IsType(OT_GOTO_DEPOT) && o->GetDepotOrderType() & ODTFB_SERVICE) return_cmd_error(STR_ERROR_UNBUNCHING_NO_SERVICE_IF_NEEDED); } } break; diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 17abcdec97..b2232f047d 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -918,6 +918,9 @@ public: this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_O_SCROLLBAR); + if (NWidgetCore *nwid = this->GetWidget(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; @@ -1298,7 +1301,11 @@ public: case WID_O_DEPOT_ACTION: { VehicleOrderID sel = this->OrderGetSel(); const Order *order = this->vehicle->GetOrder(sel); - if (order == nullptr || !order->IsType(OT_GOTO_DEPOT)) break; + if (order == nullptr || !order->IsType(OT_GOTO_DEPOT)) { + /* We can't leave this param unset or the undefined behavior can cause a crash. */ + SetDParam(0, STR_EMPTY); + break; + }; /* Select the current action selected in the dropdown. The flags don't match the dropdown so we can't just use an index. */ if (order->GetDepotOrderType() & ODTFB_SERVICE) { @@ -1782,7 +1789,7 @@ static constexpr NWidgetPart _nested_orders_train_widgets[] = { NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_UNLOAD), SetMinimalSize(93, 12), SetFill(1, 0), SetDataTip(STR_ORDER_TOGGLE_UNLOAD, STR_ORDER_TOOLTIP_UNLOAD), SetResize(1, 0), NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_DEPOT_ACTION), SetMinimalSize(93, 12), SetFill(1, 0), - SetDataTip(STR_JUST_STRING, STR_ORDER_DEPOT_ACTION_TOOLTIP), SetResize(1, 0), + SetDataTip(STR_JUST_STRING, STR_NULL), SetResize(1, 0), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_O_SEL_TOP_RIGHT), NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(93, 12), SetFill(1, 0), SetResize(1, 0), EndContainer(), @@ -1860,7 +1867,7 @@ static constexpr NWidgetPart _nested_orders_widgets[] = { NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_O_REFIT), SetMinimalSize(186, 12), SetFill(1, 0), SetDataTip(STR_ORDER_REFIT, STR_ORDER_REFIT_TOOLTIP), SetResize(1, 0), NWidget(NWID_BUTTON_DROPDOWN, COLOUR_GREY, WID_O_DEPOT_ACTION), SetMinimalSize(124, 12), SetFill(1, 0), - SetDataTip(STR_JUST_STRING, STR_ORDER_DEPOT_ACTION_TOOLTIP), SetResize(1, 0), + SetDataTip(STR_JUST_STRING, STR_NULL), SetResize(1, 0), EndContainer(), /* Buttons for setting a condition. */ diff --git a/src/pathfinder/water_regions.cpp b/src/pathfinder/water_regions.cpp index 03cecf8e04..115213491a 100644 --- a/src/pathfinder/water_regions.cpp +++ b/src/pathfinder/water_regions.cpp @@ -77,7 +77,11 @@ public: bool IsInitialized() const { return this->initialized; } - void Invalidate() { this->initialized = false; } + void Invalidate() + { + if (!IsInitialized()) Debug(map, 3, "Invalidated water region ({},{})", GetWaterRegionX(this->tile_area.tile), GetWaterRegionY(this->tile_area.tile)); + this->initialized = false; + } /** * Returns a set of bits indicating whether an edge tile on a particular side is traversable or not. These @@ -120,16 +124,7 @@ public: this->has_cross_region_aqueducts = false; this->tile_patch_labels.fill(INVALID_WATER_REGION_PATCH); - - for (const TileIndex tile : this->tile_area) { - if (IsAqueductTile(tile)) { - const TileIndex other_aqueduct_end = GetOtherBridgeEnd(tile); - if (!tile_area.Contains(other_aqueduct_end)) { - this->has_cross_region_aqueducts = true; - break; - } - } - } + this->edge_traversability_bits.fill(0); TWaterRegionPatchLabel current_label = 1; TWaterRegionPatchLabel highest_assigned_label = 0; @@ -158,7 +153,18 @@ public: for (const Trackdir dir : SetTrackdirBitIterator(valid_dirs)) { /* By using a TrackFollower we "play by the same rules" as the actual ship pathfinder */ CFollowTrackWater ft; - if (ft.Follow(tile, dir) && this->tile_area.Contains(ft.m_new_tile)) tiles_to_check.push_back(ft.m_new_tile); + if (ft.Follow(tile, dir)) { + if (this->tile_area.Contains(ft.m_new_tile)) { + tiles_to_check.push_back(ft.m_new_tile); + } else if (!ft.m_is_bridge) { + assert(DistanceManhattan(ft.m_new_tile, tile) == 1); + const auto side = DiagdirBetweenTiles(tile, ft.m_new_tile); + const int local_x_or_y = DiagDirToAxis(side) == AXIS_X ? TileY(tile) - TileY(this->tile_area.tile) : TileX(tile) - TileX(this->tile_area.tile); + SetBit(this->edge_traversability_bits[side], local_x_or_y); + } else { + this->has_cross_region_aqueducts = true; + } + } } } @@ -167,18 +173,6 @@ public: this->number_of_patches = highest_assigned_label; this->initialized = true; - - /* Calculate the traversability (whether the tile can be entered / exited) for all edges. Note that - * we always follow the same X and Y scanning direction, this is important for comparisons later on! */ - this->edge_traversability_bits.fill(0); - const int top_x = TileX(tile_area.tile); - const int top_y = TileY(tile_area.tile); - for (int i = 0; i < WATER_REGION_EDGE_LENGTH; ++i) { - if (GetWaterTracks(TileXY(top_x + i, top_y)) & TRACK_BIT_3WAY_NW) SetBit(this->edge_traversability_bits[DIAGDIR_NW], i); // NW edge - if (GetWaterTracks(TileXY(top_x + i, top_y + WATER_REGION_EDGE_LENGTH - 1)) & TRACK_BIT_3WAY_SE) SetBit(this->edge_traversability_bits[DIAGDIR_SE], i); // SE edge - if (GetWaterTracks(TileXY(top_x, top_y + i)) & TRACK_BIT_3WAY_NE) SetBit(this->edge_traversability_bits[DIAGDIR_NE], i); // NE edge - if (GetWaterTracks(TileXY(top_x + WATER_REGION_EDGE_LENGTH - 1, top_y + i)) & TRACK_BIT_3WAY_SW) SetBit(this->edge_traversability_bits[DIAGDIR_SW], i); // SW edge - } } /** @@ -188,6 +182,33 @@ public: { if (!this->initialized) ForceUpdate(); } + + void PrintDebugInfo() + { + Debug(map, 9, "Water region {},{} labels and edge traversability = ...", GetWaterRegionX(tile_area.tile), GetWaterRegionY(tile_area.tile)); + + const size_t max_element_width = std::to_string(this->number_of_patches).size(); + + std::array traversability_NW{0}; + for (auto bitIndex : SetBitIterator(edge_traversability_bits[DIAGDIR_NW])) *(traversability_NW.rbegin() + bitIndex) = 1; + Debug(map, 9, " {:{}}", fmt::join(traversability_NW, " "), max_element_width); + Debug(map, 9, " +{:->{}}+", "", WATER_REGION_EDGE_LENGTH * (max_element_width + 1) + 1); + + for (int y = 0; y < WATER_REGION_EDGE_LENGTH; ++y) { + std::string line{}; + for (int x = 0; x < WATER_REGION_EDGE_LENGTH; ++x) { + const auto label = this->tile_patch_labels[x + y * WATER_REGION_EDGE_LENGTH]; + const std::string label_str = label == INVALID_WATER_REGION_PATCH ? "." : std::to_string(label); + line = fmt::format("{:{}}", label_str, max_element_width) + " " + line; + } + Debug(map, 9, "{} | {}| {}", GB(this->edge_traversability_bits[DIAGDIR_SW], y, 1), line, GB(this->edge_traversability_bits[DIAGDIR_NE], y, 1)); + } + + Debug(map, 9, " +{:->{}}+", "", WATER_REGION_EDGE_LENGTH * (max_element_width + 1) + 1); + std::array traversability_SE{0}; + for (auto bitIndex : SetBitIterator(edge_traversability_bits[DIAGDIR_SE])) *(traversability_SE.rbegin() + bitIndex) = 1; + Debug(map, 9, " {:{}}", fmt::join(traversability_SE, " "), max_element_width); + } }; std::vector _water_regions; @@ -278,10 +299,17 @@ WaterRegionPatchDesc GetWaterRegionPatchInfo(TileIndex tile) */ void InvalidateWaterRegion(TileIndex tile) { - const int index = GetWaterRegionIndex(tile); - _water_regions[index].Invalidate(); + if (!IsValidTile(tile)) return; + const int water_region_index = GetWaterRegionIndex(tile); + _water_regions[water_region_index].Invalidate(); - Debug(map, 3, "Invalidated water region ({},{})", GetWaterRegionX(tile), GetWaterRegionY(tile)); + /* When updating the water region we look into the first tile of adjacent water regions to determine edge + * traversability. This means that if we invalidate any region edge tiles we might also change the traversability + * of the adjacent region. This code ensures the adjacent regions also get invalidated in such a case. */ + for (DiagDirection side = DIAGDIR_BEGIN; side < DIAGDIR_END; side++) { + const int adjacent_region_index = GetWaterRegionIndex(TileAddByDiagDir(tile, side)); + if (adjacent_region_index != water_region_index) _water_regions[adjacent_region_index].Invalidate(); + } } /** @@ -371,3 +399,8 @@ void AllocateWaterRegions() } } } + +void PrintWaterRegionDebugInfo(TileIndex tile) +{ + GetUpdatedWaterRegion(tile).PrintDebugInfo(); +} diff --git a/src/pathfinder/water_regions.h b/src/pathfinder/water_regions.h index 0ecb94cd8a..88a9df8ef3 100644 --- a/src/pathfinder/water_regions.h +++ b/src/pathfinder/water_regions.h @@ -64,4 +64,6 @@ void VisitWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_pat void AllocateWaterRegions(); +void PrintWaterRegionDebugInfo(TileIndex tile); + #endif /* WATER_REGIONS_H */ diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 0247548886..4feafd8b2a 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -256,7 +256,7 @@ static void GenericPlaceSignals(TileIndex tile) Command::Post(STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM, CcPlaySound_CONSTRUCTION_RAIL, tile, track); } else { /* Which signals should we cycle through? */ - bool tile_has_signal = IsValidTrack(track) && HasSignalOnTrack(tile, track); + bool tile_has_signal = IsPlainRailTile(tile) && IsValidTrack(track) && HasSignalOnTrack(tile, track); SignalType cur_signal_on_tile = tile_has_signal ? GetSignalType(tile, track) : _cur_signal_type; SignalType cycle_start; SignalType cycle_end; @@ -1903,12 +1903,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); @@ -1917,9 +1914,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 */ @@ -1996,7 +1991,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); } } diff --git a/src/rev.cpp.in b/src/rev.cpp.in index 38e163f412..5942217a67 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -35,7 +35,7 @@ bool IsReleasedVersion() * * shows a "M", if the binary is made from modified source code. */ -const char _openttd_revision[] = "14.0-beta1"; +const char _openttd_revision[] = "14.0-beta3"; /** * The text version of OpenTTD's build date. @@ -48,7 +48,7 @@ const char _openttd_build_date[] = __DATE__ " " __TIME__; /** * The git revision hash of this version. */ -const char _openttd_revision_hash[] = "22eed9616efebf65a19bdb25e2c4bd968f719665"; +const char _openttd_revision_hash[] = "b085f610e2a92eb78aee547f1345007e5c4d8baf"; /** * The year of this version. diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 231c517c23..ff1355314a 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -286,6 +286,7 @@ CommandCost CmdBuildRoadVehicle(DoCommandFlag flags, TileIndex tile, const Engin v->spritenum = rvi->image_index; v->cargo_type = e->GetDefaultCargoType(); + assert(IsValidCargoID(v->cargo_type)); v->cargo_cap = rvi->capacity; v->refit_cap = 0; diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 234402b816..565b1b905f 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1479,6 +1479,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; diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 57510b739a..8448367c9e 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -590,14 +590,15 @@ static const OldChunks town_chunk[] = { OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Town, time_until_rebuild ), OCL_SVAR( OC_FILE_U8 | OC_VAR_U16, Town, growth_rate ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_PASSENGERS].new_max ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_MAIL].new_max ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_PASSENGERS].new_act ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_MAIL].new_act ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_PASSENGERS].old_max ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_MAIL].old_max ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_PASSENGERS].old_act ), - OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[CT_MAIL].old_act ), + /* Slots 0 and 2 are passengers and mail respectively for old saves. */ + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].new_max ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].new_max ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].new_act ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].new_act ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].old_max ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].old_max ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[0].old_act ), + OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, supplied[2].old_act ), OCL_NULL( 2 ), ///< pct_pass_transported / pct_mail_transported, now computed on the fly @@ -1301,10 +1302,10 @@ bool LoadOldVehicle(LoadgameState *ls, int num) switch (v->spritenum) { case 2: // oil tanker && cargo type != oil - if (v->cargo_type != CT_OIL) v->spritenum = 0; // make it a coal/goods ship + if (v->cargo_type != 3) v->spritenum = 0; // make it a coal/goods ship break; case 4: // passenger ship && cargo type == mail - if (v->cargo_type == CT_MAIL) v->spritenum = 0; // make it a mail ship + if (v->cargo_type == 2) v->spritenum = 0; // make it a mail ship break; default: break; diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 2106cd0bb2..889f14b301 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -89,14 +89,14 @@ struct ReadBuffer { byte buf[MEMORY_CHUNK_SIZE]; ///< Buffer we're going to read from. byte *bufp; ///< Location we're at reading the buffer. byte *bufe; ///< End of the buffer we can read from. - LoadFilter *reader; ///< The filter used to actually read. + std::shared_ptr reader; ///< The filter used to actually read. size_t read; ///< The amount of read bytes so far from the filter. /** * Initialise our variables. * @param reader The filter to actually read data. */ - ReadBuffer(LoadFilter *reader) : bufp(nullptr), bufe(nullptr), reader(reader), read(0) + ReadBuffer(std::shared_ptr reader) : bufp(nullptr), bufe(nullptr), reader(reader), read(0) { } @@ -163,7 +163,7 @@ struct MemoryDumper { * Flush this dumper into a writer. * @param writer The filter we want to use. */ - void Flush(SaveFilter *writer) + void Flush(std::shared_ptr writer) { uint i = 0; size_t t = this->GetSize(); @@ -199,11 +199,11 @@ struct SaveLoadParams { int array_index, last_array_index; ///< in the case of an array, the current and last positions bool expect_table_header; ///< In the case of a table, if the header is saved/loaded. - MemoryDumper *dumper; ///< Memory dumper to write the savegame to. - SaveFilter *sf; ///< Filter to write the savegame to. + std::unique_ptr dumper; ///< Memory dumper to write the savegame to. + std::shared_ptr sf; ///< Filter to write the savegame to. - ReadBuffer *reader; ///< Savegame reading buffer. - LoadFilter *lf; ///< Filter to read the savegame from. + std::unique_ptr reader; ///< Savegame reading buffer. + std::shared_ptr lf; ///< Filter to read the savegame from. StringID error_str; ///< the translatable error message to show std::string extra_msg; ///< the error message @@ -2176,9 +2176,6 @@ struct FileReader : LoadFilter { { if (this->file != nullptr) fclose(this->file); this->file = nullptr; - - /* Make sure we don't double free. */ - _sl.sf = nullptr; } size_t Read(byte *buf, size_t size) override @@ -2214,9 +2211,6 @@ struct FileWriter : SaveFilter { ~FileWriter() { this->Finish(); - - /* Make sure we don't double free. */ - _sl.sf = nullptr; } void Write(byte *buf, size_t size) override @@ -2250,7 +2244,7 @@ struct LZOLoadFilter : LoadFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - LZOLoadFilter(LoadFilter *chain) : LoadFilter(chain) + LZOLoadFilter(std::shared_ptr chain) : LoadFilter(chain) { if (lzo_init() != LZO_E_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize decompressor"); } @@ -2297,7 +2291,7 @@ struct LZOSaveFilter : SaveFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - LZOSaveFilter(SaveFilter *chain, byte) : SaveFilter(chain) + LZOSaveFilter(std::shared_ptr chain, byte) : SaveFilter(chain) { if (lzo_init() != LZO_E_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor"); } @@ -2337,7 +2331,7 @@ struct NoCompLoadFilter : LoadFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - NoCompLoadFilter(LoadFilter *chain) : LoadFilter(chain) + NoCompLoadFilter(std::shared_ptr chain) : LoadFilter(chain) { } @@ -2353,7 +2347,7 @@ struct NoCompSaveFilter : SaveFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - NoCompSaveFilter(SaveFilter *chain, byte) : SaveFilter(chain) + NoCompSaveFilter(std::shared_ptr chain, byte) : SaveFilter(chain) { } @@ -2379,7 +2373,7 @@ struct ZlibLoadFilter : LoadFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - ZlibLoadFilter(LoadFilter *chain) : LoadFilter(chain) + ZlibLoadFilter(std::shared_ptr chain) : LoadFilter(chain) { memset(&this->z, 0, sizeof(this->z)); if (inflateInit(&this->z) != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize decompressor"); @@ -2424,7 +2418,7 @@ struct ZlibSaveFilter : SaveFilter { * @param chain The next filter in this chain. * @param compression_level The requested level of compression. */ - ZlibSaveFilter(SaveFilter *chain, byte compression_level) : SaveFilter(chain) + ZlibSaveFilter(std::shared_ptr chain, byte compression_level) : SaveFilter(chain) { memset(&this->z, 0, sizeof(this->z)); if (deflateInit(&this->z, compression_level) != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor"); @@ -2508,7 +2502,7 @@ struct LZMALoadFilter : LoadFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - LZMALoadFilter(LoadFilter *chain) : LoadFilter(chain), lzma(_lzma_init) + LZMALoadFilter(std::shared_ptr chain) : LoadFilter(chain), lzma(_lzma_init) { /* Allow saves up to 256 MB uncompressed */ if (lzma_auto_decoder(&this->lzma, 1 << 28, 0) != LZMA_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize decompressor"); @@ -2552,7 +2546,7 @@ struct LZMASaveFilter : SaveFilter { * @param chain The next filter in this chain. * @param compression_level The requested level of compression. */ - LZMASaveFilter(SaveFilter *chain, byte compression_level) : SaveFilter(chain), lzma(_lzma_init) + LZMASaveFilter(std::shared_ptr chain, byte compression_level) : SaveFilter(chain), lzma(_lzma_init) { if (lzma_easy_encoder(&this->lzma, compression_level, LZMA_CHECK_CRC32) != LZMA_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor"); } @@ -2621,7 +2615,7 @@ struct ZSTDLoadFilter : LoadFilter { * Initialise this filter. * @param chain The next filter in this chain. */ - ZSTDLoadFilter(LoadFilter *chain) : LoadFilter(chain) + ZSTDLoadFilter(std::shared_ptr chain) : LoadFilter(chain) { this->zstd = ZSTD_createDCtx(); if (!this->zstd) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor"); @@ -2663,7 +2657,7 @@ struct ZSTDSaveFilter : SaveFilter { * @param chain The next filter in this chain. * @param compression_level The requested level of compression. */ - ZSTDSaveFilter(SaveFilter *chain, byte compression_level) : SaveFilter(chain) + ZSTDSaveFilter(std::shared_ptr chain, byte compression_level) : SaveFilter(chain) { this->zstd = ZSTD_createCCtx(); if (!this->zstd) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor"); @@ -2720,12 +2714,13 @@ struct ZSTDSaveFilter : SaveFilter { *******************************************/ /** The format for a reader/writer type of a savegame */ +// CityMania moved to saveload.h // struct SaveLoadFormat { // const char *name; ///< name of the compressor/decompressor (debug-only) // uint32_t tag; ///< the 4-letter tag by which it is identified in the savegame -// LoadFilter *(*init_load)(LoadFilter *chain); ///< Constructor for the load filter. -// SaveFilter *(*init_write)(SaveFilter *chain, byte compression); ///< Constructor for the save filter. +// std::shared_ptr (*init_load)(std::shared_ptr chain); ///< Constructor for the load filter. +// std::shared_ptr (*init_write)(std::shared_ptr chain, byte compression); ///< Constructor for the save filter. // byte min_compression; ///< the minimum compression level of this format // byte default_compression; ///< the default compression level of this format @@ -2943,16 +2938,9 @@ static void ResetSaveloadData() */ static inline void ClearSaveLoadState() { - delete _sl.dumper; _sl.dumper = nullptr; - - delete _sl.sf; _sl.sf = nullptr; - - delete _sl.reader; _sl.reader = nullptr; - - delete _sl.lf; _sl.lf = nullptr; } @@ -3065,11 +3053,11 @@ void WaitTillSaved() * @param threaded Whether to try to perform the saving asynchronously. * @return Return the result of the action. #SL_OK or #SL_ERROR */ -static SaveOrLoadResult DoSave(SaveFilter *writer, bool threaded, citymania::SavePreset preset) +static SaveOrLoadResult DoSave(std::shared_ptr writer, bool threaded, citymania::SavePreset preset) { assert(!_sl.saveinprogress); - _sl.dumper = new MemoryDumper(); + _sl.dumper = std::make_unique(); _sl.sf = writer; _sl_version = SAVEGAME_VERSION; @@ -3097,7 +3085,7 @@ static SaveOrLoadResult DoSave(SaveFilter *writer, bool threaded, citymania::Sav * @param threaded Whether to try to perform the saving asynchronously. * @return Return the result of the action. #SL_OK or #SL_ERROR */ -SaveOrLoadResult SaveWithFilter(SaveFilter *writer, bool threaded, citymania::SavePreset preset) +SaveOrLoadResult SaveWithFilter(std::shared_ptr writer, bool threaded, citymania::SavePreset preset) { try { _sl.action = SLA_SAVE; @@ -3114,7 +3102,7 @@ SaveOrLoadResult SaveWithFilter(SaveFilter *writer, bool threaded, citymania::Sa * @param load_check Whether to perform the checking ("preview") or actually load the game. * @return Return the result of the action. #SL_OK or #SL_REINIT ("unload" the game) */ -static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check) +static SaveOrLoadResult DoLoad(std::shared_ptr reader, bool load_check) { _sl.lf = reader; @@ -3178,7 +3166,7 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check) Debug(sl, 2, "Using saveload format '%s'", fmt->name); _sl.lf = fmt->init_load(_sl.lf); - _sl.reader = new ReadBuffer(_sl.lf); + _sl.reader = std::make_unique(_sl.lf); _next_offs = 0; if (!load_check) { @@ -3255,7 +3243,7 @@ static SaveOrLoadResult DoLoad(LoadFilter *reader, bool load_check) * @param reader The filter to read the savegame from. * @return Return the result of the action. #SL_OK or #SL_REINIT ("unload" the game) */ -SaveOrLoadResult LoadWithFilter(LoadFilter *reader) +SaveOrLoadResult LoadWithFilter(std::shared_ptr reader) { try { _sl.action = SLA_LOAD; @@ -3342,13 +3330,13 @@ SaveOrLoadResult SaveOrLoad(const std::string &filename, SaveLoadOperation fop, Debug(desync, 1, "save: {:08x}; {:02x}; {}", TimerGameEconomy::date, TimerGameEconomy::date_fract, filename); if (!_settings_client.gui.threaded_saves) threaded = false; - return DoSave(new FileWriter(fh), threaded, citymania::GetLocalSavePreset()); + return DoSave(std::make_shared(fh), threaded, citymania::GetLocalSavePreset()); } /* LOAD game */ assert(fop == SLO_LOAD || fop == SLO_CHECK); Debug(desync, 1, "load: {}", filename); - return DoLoad(new FileReader(fh), fop == SLO_CHECK); + return DoLoad(std::make_shared(fh), fop == SLO_CHECK); } catch (...) { /* This code may be executed both for old and new save games. */ ClearSaveLoadState(); diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 79028b4805..f150f4b043 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -426,8 +426,8 @@ struct SaveLoadFormat { const char *name; ///< name of the compressor/decompressor (debug-only) uint32_t tag; ///< the 4-letter tag by which it is identified in the savegame - LoadFilter *(*init_load)(LoadFilter *chain); ///< Constructor for the load filter. - SaveFilter *(*init_write)(SaveFilter *chain, byte compression); ///< Constructor for the save filter. + std::shared_ptr (*init_load)(std::shared_ptr chain); ///< Constructor for the load filter. + std::shared_ptr (*init_write)(std::shared_ptr chain, byte compression); ///< Constructor for the save filter. CompressionMethod method; ///< compression method used in this format byte min_compression; ///< the minimum compression level of this format @@ -458,8 +458,8 @@ void DoExitSave(); void DoAutoOrNetsave(FiosNumberedSaveName &counter); -SaveOrLoadResult SaveWithFilter(struct SaveFilter *writer, bool threaded, citymania::SavePreset preset); -SaveOrLoadResult LoadWithFilter(struct LoadFilter *reader); +SaveOrLoadResult SaveWithFilter(std::shared_ptr writer, bool threaded, citymania::SavePreset preset); +SaveOrLoadResult LoadWithFilter(std::shared_ptr reader); typedef void AutolengthProc(void *arg); diff --git a/src/saveload/saveload_filter.h b/src/saveload/saveload_filter.h index 490daec872..445208f041 100644 --- a/src/saveload/saveload_filter.h +++ b/src/saveload/saveload_filter.h @@ -13,20 +13,19 @@ /** Interface for filtering a savegame till it is loaded. */ struct LoadFilter { /** Chained to the (savegame) filters. */ - LoadFilter *chain; + std::shared_ptr chain; /** * Initialise this filter. * @param chain The next filter in this chain. */ - LoadFilter(LoadFilter *chain) : chain(chain) + LoadFilter(std::shared_ptr chain) : chain(chain) { } /** Make sure the writers are properly closed. */ virtual ~LoadFilter() { - delete this->chain; } /** @@ -51,28 +50,27 @@ struct LoadFilter { * @param chain The next filter in this chain. * @tparam T The type of load filter to create. */ -template LoadFilter *CreateLoadFilter(LoadFilter *chain) +template std::shared_ptr CreateLoadFilter(std::shared_ptr chain) { - return new T(chain); + return std::make_shared(chain); } /** Interface for filtering a savegame till it is written. */ struct SaveFilter { /** Chained to the (savegame) filters. */ - SaveFilter *chain; + std::shared_ptr chain; /** * Initialise this filter. * @param chain The next filter in this chain. */ - SaveFilter(SaveFilter *chain) : chain(chain) + SaveFilter(std::shared_ptr chain) : chain(chain) { } /** Make sure the writers are properly closed. */ virtual ~SaveFilter() { - delete this->chain; } /** @@ -97,9 +95,9 @@ struct SaveFilter { * @param compression_level The requested level of compression. * @tparam T The type of save filter to create. */ -template SaveFilter *CreateSaveFilter(SaveFilter *chain, byte compression_level) +template std::shared_ptr CreateSaveFilter(std::shared_ptr chain, byte compression_level) { - return new T(chain, compression_level); + return std::make_shared(chain, compression_level); } #endif /* SAVELOAD_FILTER_H */ diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index ecc252802e..6b1f10972c 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -226,22 +226,23 @@ static const SaveLoad _town_desc[] = { SLE_CONDARR(Town, unwanted, SLE_INT8, 8, SLV_4, SLV_104), SLE_CONDARR(Town, unwanted, SLE_INT8, MAX_COMPANIES, SLV_104, SL_MAX_VERSION), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_max, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_max, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_MAIL].old_max, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_MAIL].old_max, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_max, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_max, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_MAIL].new_max, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_MAIL].new_max, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].old_act, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_MAIL].old_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_MAIL].old_act, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_PASSENGERS].new_act, SLE_UINT32, SLV_9, SLV_165), - SLE_CONDVAR(Town, supplied[CT_MAIL].new_act, SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), - SLE_CONDVAR(Town, supplied[CT_MAIL].new_act, SLE_UINT32, SLV_9, SLV_165), + /* Slots 0 and 2 are passengers and mail respectively for old saves. */ + SLE_CONDVARNAME(Town, supplied[0].old_max, "supplied[CT_PASSENGERS].old_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[0].old_max, "supplied[CT_PASSENGERS].old_max", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[2].old_max, "supplied[CT_MAIL].old_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[2].old_max, "supplied[CT_MAIL].old_max", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[0].new_max, "supplied[CT_PASSENGERS].new_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[0].new_max, "supplied[CT_PASSENGERS].new_max", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[2].new_max, "supplied[CT_MAIL].new_max", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[2].new_max, "supplied[CT_MAIL].new_max", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[0].old_act, "supplied[CT_PASSENGERS].old_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[0].old_act, "supplied[CT_PASSENGERS].old_act", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[2].old_act, "supplied[CT_MAIL].old_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[2].old_act, "supplied[CT_MAIL].old_act", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[0].new_act, "supplied[CT_PASSENGERS].new_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[0].new_act, "supplied[CT_PASSENGERS].new_act", SLE_UINT32, SLV_9, SLV_165), + SLE_CONDVARNAME(Town, supplied[2].new_act, "supplied[CT_MAIL].new_act", SLE_FILE_U16 | SLE_VAR_U32, SL_MIN_VERSION, SLV_9), + SLE_CONDVARNAME(Town, supplied[2].new_act, "supplied[CT_MAIL].new_act", SLE_UINT32, SLV_9, SLV_165), SLE_CONDVARNAME(Town, received[TAE_FOOD].old_act, "received[TE_FOOD].old_act", SLE_UINT16, SL_MIN_VERSION, SLV_165), SLE_CONDVARNAME(Town, received[TAE_WATER].old_act, "received[TE_WATER].old_act", SLE_UINT16, SL_MIN_VERSION, SLV_165), diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 96f4bc32a6..96ecbed7f5 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -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. diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 810bea83e2..8736cce8b8 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -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 diff --git a/src/script/api/script_cargo.cpp b/src/script/api/script_cargo.cpp index 4f6ab51f67..6f86b6f9e2 100644 --- a/src/script/api/script_cargo.cpp +++ b/src/script/api/script_cargo.cpp @@ -45,7 +45,7 @@ * like "PASS", "COAL", "OIL_". New ones can be defined by NewGRFs */ std::string cargo_label; for (uint i = 0; i < sizeof(cargo->label); i++) { - cargo_label.push_back(GB(cargo->label, (uint8_t)(sizeof(cargo->label) - i - 1) * 8, 8)); + cargo_label.push_back(GB(cargo->label.base(), (uint8_t)(sizeof(cargo->label) - i - 1) * 8, 8)); } return cargo_label; } diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index 717aee5f50..881af1ec05 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -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); } diff --git a/src/script/api/script_company.hpp b/src/script/api/script_company.hpp index 762b8ffcdf..bfdc2a70c2 100644 --- a/src/script/api/script_company.hpp +++ b/src/script/api/script_company.hpp @@ -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); diff --git a/src/script/api/script_text.cpp b/src/script/api/script_text.cpp index d0b2157b66..2b16a6de9e 100644 --- a/src/script/api/script_text.cpp +++ b/src/script/api/script_text.cpp @@ -181,6 +181,15 @@ void ScriptText::_FillParamList(ParamList ¶ms) } } +void ScriptText::ParamCheck::Encode(std::back_insert_iterator &output) +{ + if (this->used) return; + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":\"{}\"", std::get(*this->param)); + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":{:X}", std::get(*this->param)); + if (std::holds_alternative(*this->param)) fmt::format_to(output, ":{:X}", this->owner); + this->used = true; +} + void ScriptText::_GetEncodedText(std::back_insert_iterator &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 &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 &output, break; case StringParam::RAW_STRING: { - Param *p = get_next_arg(); - if (!std::holds_alternative(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects a raw string", name, param_count + 1, cur_param.cmd)); - fmt::format_to(output, ":\"{}\"", std::get(*p)); + ParamCheck &p = *get_next_arg(); + if (!std::holds_alternative(*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(*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(*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(*p); + ScriptTextRef &ref = std::get(*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 &output, default: for (int i = 0; i < cur_param.consumes; i++) { - Param *p = get_next_arg(); - if (!std::holds_alternative(*p)) throw Script_FatalError(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd)); - fmt::format_to(output, ":{:X}", std::get(*p)); + ParamCheck &p = *get_next_arg(); + if (!std::holds_alternative(*p.param)) ScriptLog::Error(fmt::format("{}({}): {{{}}} expects an integer", name, param_count + i + 1, cur_param.cmd)); + p.Encode(output); } } diff --git a/src/script/api/script_text.hpp b/src/script/api/script_text.hpp index f46490fbae..9e6f1333c7 100644 --- a/src/script/api/script_text.hpp +++ b/src/script/api/script_text.hpp @@ -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 &output); }; using ParamList = std::vector; diff --git a/src/script/api/script_tilelist.cpp b/src/script/api/script_tilelist.cpp index 6262db3acc..7b3d101490 100644 --- a/src/script/api/script_tilelist.cpp +++ b/src/script/api/script_tilelist.cpp @@ -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); + } +} diff --git a/src/script/api/script_tilelist.hpp b/src/script/api/script_tilelist.hpp index ea584b7111..67779bb2d2 100644 --- a/src/script/api/script_tilelist.hpp +++ b/src/script/api/script_tilelist.hpp @@ -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 */ diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 5b64dfbcc9..b80b221728 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -934,6 +934,7 @@ CommandCost CmdBuildShip(DoCommandFlag flags, TileIndex tile, const Engine *e, V v->spritenum = svi->image_index; v->cargo_type = e->GetDefaultCargoType(); + assert(IsValidCargoID(v->cargo_type)); v->cargo_cap = svi->capacity; v->refit_cap = 0; diff --git a/src/table/build_industry.h b/src/table/build_industry.h index 43881e8309..72abeb5db0 100644 --- a/src/table/build_industry.h +++ b/src/table/build_industry.h @@ -1128,8 +1128,10 @@ enum IndustryTypes { #define MI(tbl, sndc, snd, d, pc, ai1, ai2, ai3, ai4, ag1, ag2, ag3, ag4, col, \ c1, c2, c3, proc, p1, r1, p2, r2, m, a1, im1, a2, im2, a3, im3, pr, clim, bev, in, intx, s1, s2, s3) \ {tbl, d, 0, pc, {c1, c2, c3}, proc, \ + {INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \ {p1, p2, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ {r1, r2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, m, \ + {INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \ {a1, a2, a3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ {{im1, 0}, {im2, 0}, {im3, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, \ pr, clim, bev, col, in, intx, s1, s2, s3, STR_UNDEFINED, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \ @@ -1209,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, @@ -1238,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, @@ -1268,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, @@ -1279,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, @@ -1298,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, @@ -1309,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, @@ -1318,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, @@ -1338,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, @@ -1388,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, @@ -1530,7 +1532,11 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { * @param a2 next frame of animation * @param a3 chooses between animation or construction state */ -#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, {0, ANIM_STATUS_NO_ANIMATION, 2, 0}, INDTILE_SPECIAL_NONE, true, GRFFileProps(INVALID_INDUSTRYTILE)} +#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) { \ + {INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \ + {c1, c2, c3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ + {ca1, ca2, ca3}, sl, a1, a2, a3, 0, {0, ANIM_STATUS_NO_ANIMATION, 2, 0}, INDTILE_SPECIAL_NONE, true, GRFFileProps(INVALID_INDUSTRYTILE) \ +} static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = { /* Coal Mine */ MT(0, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, SLOPE_STEEP, INDUSTRYTILE_NOANIM, INDUSTRYTILE_NOANIM, false), @@ -1588,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), @@ -1615,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), @@ -1654,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), diff --git a/src/table/cargo_const.h b/src/table/cargo_const.h index f182e039df..657dd323d6 100644 --- a/src/table/cargo_const.h +++ b/src/table/cargo_const.h @@ -50,56 +50,56 @@ /** Cargo types available by default. */ static const CargoSpec _default_cargo[] = { - MK( 0, 'PASS', 152, 1, 0x400, 3185, 0, 24, false, TAE_PASSENGERS, PASSENGERS, PASSENGER, STR_PASSENGERS, CC_PASSENGERS), - MK( 1, 'COAL', 6, 16, 0x100, 5916, 7, 255, true, TAE_NONE, COAL, COAL, STR_TONS, CC_BULK), - MK( 2, 'MAIL', 15, 4, 0x200, 4550, 20, 90, false, TAE_MAIL, MAIL, MAIL, STR_BAGS, CC_MAIL), + MK( 0, CT_PASSENGERS, 152, 1, 0x400, 3185, 0, 24, false, TAE_PASSENGERS, PASSENGERS, PASSENGER, STR_PASSENGERS, CC_PASSENGERS), + MK( 1, CT_COAL, 6, 16, 0x100, 5916, 7, 255, true, TAE_NONE, COAL, COAL, STR_TONS, CC_BULK), + MK( 2, CT_MAIL, 15, 4, 0x200, 4550, 20, 90, false, TAE_MAIL, MAIL, MAIL, STR_BAGS, CC_MAIL), /* Oil in temperate and arctic */ - MK( 3, 'OIL_', 174, 16, 0x100, 4437, 25, 255, true, TAE_NONE, OIL, OIL, STR_LITERS, CC_LIQUID), + MK( 3, CT_OIL, 174, 16, 0x100, 4437, 25, 255, true, TAE_NONE, OIL, OIL, STR_LITERS, CC_LIQUID), /* Oil in subtropic */ - MK( 3, 'OIL_', 174, 16, 0x100, 4892, 25, 255, true, TAE_NONE, OIL, OIL, STR_LITERS, CC_LIQUID), - MK( 4, 'LVST', 208, 3, 0x100, 4322, 4, 18, true, TAE_NONE, LIVESTOCK, LIVESTOCK, STR_ITEMS, CC_PIECE_GOODS), - MK( 5, 'GOOD', 194, 8, 0x200, 6144, 5, 28, true, TAE_GOODS, GOODS, GOODS, STR_CRATES, CC_EXPRESS), - MK( 6, 'GRAI', 191, 16, 0x100, 4778, 4, 40, true, TAE_NONE, GRAIN, GRAIN, STR_TONS, CC_BULK), - MK( 6, 'WHEA', 191, 16, 0x100, 4778, 4, 40, true, TAE_NONE, WHEAT, WHEAT, STR_TONS, CC_BULK), - MK( 6, 'MAIZ', 191, 16, 0x100, 4322, 4, 40, true, TAE_NONE, MAIZE, MAIZE, STR_TONS, CC_BULK), + MK( 3, CT_OIL, 174, 16, 0x100, 4892, 25, 255, true, TAE_NONE, OIL, OIL, STR_LITERS, CC_LIQUID), + MK( 4, CT_LIVESTOCK, 208, 3, 0x100, 4322, 4, 18, true, TAE_NONE, LIVESTOCK, LIVESTOCK, STR_ITEMS, CC_PIECE_GOODS), + MK( 5, CT_GOODS, 194, 8, 0x200, 6144, 5, 28, true, TAE_GOODS, GOODS, GOODS, STR_CRATES, CC_EXPRESS), + MK( 6, CT_GRAIN, 191, 16, 0x100, 4778, 4, 40, true, TAE_NONE, GRAIN, GRAIN, STR_TONS, CC_BULK), + MK( 6, CT_WHEAT, 191, 16, 0x100, 4778, 4, 40, true, TAE_NONE, WHEAT, WHEAT, STR_TONS, CC_BULK), + MK( 6, CT_MAIZE, 191, 16, 0x100, 4322, 4, 40, true, TAE_NONE, MAIZE, MAIZE, STR_TONS, CC_BULK), /* Wood in temperate and arctic */ - MK( 7, 'WOOD', 84, 16, 0x100, 5005, 15, 255, true, TAE_NONE, WOOD, WOOD, STR_TONS, CC_PIECE_GOODS), + MK( 7, CT_WOOD, 84, 16, 0x100, 5005, 15, 255, true, TAE_NONE, WOOD, WOOD, STR_TONS, CC_PIECE_GOODS), /* Wood in subtropic */ - MK( 7, 'WOOD', 84, 16, 0x100, 7964, 15, 255, true, TAE_NONE, WOOD, WOOD, STR_TONS, CC_PIECE_GOODS), - MK( 8, 'IORE', 184, 16, 0x100, 5120, 9, 255, true, TAE_NONE, IRON_ORE, IRON_ORE, STR_TONS, CC_BULK), - MK( 9, 'STEL', 10, 16, 0x100, 5688, 7, 255, true, TAE_NONE, STEEL, STEEL, STR_TONS, CC_PIECE_GOODS), - MK( 10, 'VALU', 202, 2, 0x100, 7509, 1, 32, true, TAE_NONE, VALUABLES, VALUABLES, STR_BAGS, CC_ARMOURED), - MK( 10, 'GOLD', 202, 8, 0x100, 5802, 10, 40, true, TAE_NONE, GOLD, GOLD, STR_BAGS, CC_ARMOURED), - MK( 10, 'DIAM', 202, 2, 0x100, 5802, 10, 255, true, TAE_NONE, DIAMONDS, DIAMOND, STR_BAGS, CC_ARMOURED), - MK( 11, 'PAPR', 10, 16, 0x100, 5461, 7, 60, true, TAE_NONE, PAPER, PAPER, STR_TONS, CC_PIECE_GOODS), - MK( 12, 'FOOD', 48, 16, 0x100, 5688, 0, 30, true, TAE_FOOD, FOOD, FOOD, STR_TONS, CC_EXPRESS | CC_REFRIGERATED), - MK( 13, 'FRUT', 208, 16, 0x100, 4209, 0, 15, true, TAE_NONE, FRUIT, FRUIT, STR_TONS, CC_BULK | CC_REFRIGERATED), - MK( 14, 'CORE', 184, 16, 0x100, 4892, 12, 255, true, TAE_NONE, COPPER_ORE, COPPER_ORE, STR_TONS, CC_BULK), - MK( 15, 'WATR', 10, 16, 0x100, 4664, 20, 80, true, TAE_WATER, WATER, WATER, STR_LITERS, CC_LIQUID), - MK( 16, 'RUBR', 6, 16, 0x100, 4437, 2, 20, true, TAE_NONE, RUBBER, RUBBER, STR_LITERS, CC_LIQUID), - MK( 17, 'SUGR', 6, 16, 0x100, 4437, 20, 255, true, TAE_NONE, SUGAR, SUGAR, STR_TONS, CC_BULK), - MK( 18, 'TOYS', 174, 2, 0x100, 5574, 25, 255, true, TAE_NONE, TOYS, TOY, STR_ITEMS, CC_PIECE_GOODS), - MK( 19, 'BATT', 208, 4, 0x100, 4322, 2, 30, true, TAE_NONE, BATTERIES, BATTERY, STR_ITEMS, CC_PIECE_GOODS), - MK( 20, 'SWET', 194, 5, 0x200, 6144, 8, 40, true, TAE_GOODS, SWEETS, SWEETS, STR_BAGS, CC_EXPRESS), - MK( 21, 'TOFF', 191, 16, 0x100, 4778, 14, 60, true, TAE_NONE, TOFFEE, TOFFEE, STR_TONS, CC_BULK), - MK( 22, 'COLA', 84, 16, 0x100, 4892, 5, 75, true, TAE_NONE, COLA, COLA, STR_LITERS, CC_LIQUID), - MK( 23, 'CTCD', 184, 16, 0x100, 5005, 10, 25, true, TAE_NONE, CANDYFLOSS, CANDYFLOSS, STR_TONS, CC_BULK), - MK( 24, 'BUBL', 10, 1, 0x100, 5077, 20, 80, true, TAE_NONE, BUBBLES, BUBBLE, STR_ITEMS, CC_PIECE_GOODS), - MK( 25, 'PLST', 202, 16, 0x100, 4664, 30, 255, true, TAE_NONE, PLASTIC, PLASTIC, STR_LITERS, CC_LIQUID), - MK( 26, 'FZDR', 48, 2, 0x100, 6250, 30, 50, true, TAE_FOOD, FIZZY_DRINKS, FIZZY_DRINK, STR_ITEMS, CC_PIECE_GOODS), + MK( 7, CT_WOOD, 84, 16, 0x100, 7964, 15, 255, true, TAE_NONE, WOOD, WOOD, STR_TONS, CC_PIECE_GOODS), + MK( 8, CT_IRON_ORE, 184, 16, 0x100, 5120, 9, 255, true, TAE_NONE, IRON_ORE, IRON_ORE, STR_TONS, CC_BULK), + MK( 9, CT_STEEL, 10, 16, 0x100, 5688, 7, 255, true, TAE_NONE, STEEL, STEEL, STR_TONS, CC_PIECE_GOODS), + MK( 10, CT_VALUABLES, 202, 2, 0x100, 7509, 1, 32, true, TAE_NONE, VALUABLES, VALUABLES, STR_BAGS, CC_ARMOURED), + MK( 10, CT_GOLD, 202, 8, 0x100, 5802, 10, 40, true, TAE_NONE, GOLD, GOLD, STR_BAGS, CC_ARMOURED), + MK( 10, CT_DIAMONDS, 202, 2, 0x100, 5802, 10, 255, true, TAE_NONE, DIAMONDS, DIAMOND, STR_BAGS, CC_ARMOURED), + MK( 11, CT_PAPER, 10, 16, 0x100, 5461, 7, 60, true, TAE_NONE, PAPER, PAPER, STR_TONS, CC_PIECE_GOODS), + MK( 12, CT_FOOD, 48, 16, 0x100, 5688, 0, 30, true, TAE_FOOD, FOOD, FOOD, STR_TONS, CC_EXPRESS | CC_REFRIGERATED), + MK( 13, CT_FRUIT, 208, 16, 0x100, 4209, 0, 15, true, TAE_NONE, FRUIT, FRUIT, STR_TONS, CC_BULK | CC_REFRIGERATED), + MK( 14, CT_COPPER_ORE, 184, 16, 0x100, 4892, 12, 255, true, TAE_NONE, COPPER_ORE, COPPER_ORE, STR_TONS, CC_BULK), + MK( 15, CT_WATER, 10, 16, 0x100, 4664, 20, 80, true, TAE_WATER, WATER, WATER, STR_LITERS, CC_LIQUID), + MK( 16, CT_RUBBER, 6, 16, 0x100, 4437, 2, 20, true, TAE_NONE, RUBBER, RUBBER, STR_LITERS, CC_LIQUID), + MK( 17, CT_SUGAR, 6, 16, 0x100, 4437, 20, 255, true, TAE_NONE, SUGAR, SUGAR, STR_TONS, CC_BULK), + MK( 18, CT_TOYS, 174, 2, 0x100, 5574, 25, 255, true, TAE_NONE, TOYS, TOY, STR_ITEMS, CC_PIECE_GOODS), + MK( 19, CT_BATTERIES, 208, 4, 0x100, 4322, 2, 30, true, TAE_NONE, BATTERIES, BATTERY, STR_ITEMS, CC_PIECE_GOODS), + MK( 20, CT_CANDY, 194, 5, 0x200, 6144, 8, 40, true, TAE_GOODS, SWEETS, SWEETS, STR_BAGS, CC_EXPRESS), + MK( 21, CT_TOFFEE, 191, 16, 0x100, 4778, 14, 60, true, TAE_NONE, TOFFEE, TOFFEE, STR_TONS, CC_BULK), + MK( 22, CT_COLA, 84, 16, 0x100, 4892, 5, 75, true, TAE_NONE, COLA, COLA, STR_LITERS, CC_LIQUID), + MK( 23, CT_COTTON_CANDY, 184, 16, 0x100, 5005, 10, 25, true, TAE_NONE, CANDYFLOSS, CANDYFLOSS, STR_TONS, CC_BULK), + MK( 24, CT_BUBBLES, 10, 1, 0x100, 5077, 20, 80, true, TAE_NONE, BUBBLES, BUBBLE, STR_ITEMS, CC_PIECE_GOODS), + MK( 25, CT_PLASTIC, 202, 16, 0x100, 4664, 30, 255, true, TAE_NONE, PLASTIC, PLASTIC, STR_LITERS, CC_LIQUID), + MK( 26, CT_FIZZY_DRINKS, 48, 2, 0x100, 6250, 30, 50, true, TAE_FOOD, FIZZY_DRINKS, FIZZY_DRINK, STR_ITEMS, CC_PIECE_GOODS), /* Void slot in temperate */ - MK(0xFF, 0, 1, 0, 0x100, 5688, 0, 30, true, TAE_NONE, NOTHING, NOTHING, STR_TONS, CC_NOAVAILABLE), + MK(0xFF, CT_INVALID, 1, 0, 0x100, 5688, 0, 30, true, TAE_NONE, NOTHING, NOTHING, STR_TONS, CC_NOAVAILABLE), /* Void slot in arctic */ - MK(0xFF, 0, 184, 0, 0x100, 5120, 9, 255, true, TAE_NONE, NOTHING, NOTHING, STR_TONS, CC_NOAVAILABLE), + MK(0xFF, CT_INVALID, 184, 0, 0x100, 5120, 9, 255, true, TAE_NONE, NOTHING, NOTHING, STR_TONS, CC_NOAVAILABLE), }; /** Table of cargo types available in each climate, by default */ -static const CargoLabel _default_climate_cargo[NUM_LANDSCAPE][NUM_ORIGINAL_CARGO] = { - { 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'GRAI', 'WOOD', 'IORE', 'STEL', 'VALU', 33, }, - { 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'WHEA', 'WOOD', 34, 'PAPR', 'GOLD', 'FOOD', }, - { 'PASS', 'RUBR', 'MAIL', 4, 'FRUT', 'GOOD', 'MAIZ', 11, 'CORE', 'WATR', 'DIAM', 'FOOD', }, - { 'PASS', 'SUGR', 'MAIL', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR', }, +static const std::variant _default_climate_cargo[NUM_LANDSCAPE][NUM_ORIGINAL_CARGO] = { + { CT_PASSENGERS, CT_COAL, CT_MAIL, CT_OIL, CT_LIVESTOCK, CT_GOODS, CT_GRAIN, CT_WOOD, CT_IRON_ORE, CT_STEEL, CT_VALUABLES, 33, }, + { CT_PASSENGERS, CT_COAL, CT_MAIL, CT_OIL, CT_LIVESTOCK, CT_GOODS, CT_WHEAT, CT_WOOD, 34, CT_PAPER, CT_GOLD, CT_FOOD, }, + { CT_PASSENGERS, CT_RUBBER, CT_MAIL, 4, CT_FRUIT, CT_GOODS, CT_MAIZE, 11, CT_COPPER_ORE, CT_WATER, CT_DIAMONDS, CT_FOOD, }, + { CT_PASSENGERS, CT_SUGAR, CT_MAIL, CT_TOYS, CT_BATTERIES, CT_CANDY, CT_TOFFEE, CT_COLA, CT_COTTON_CANDY, CT_BUBBLES, CT_PLASTIC, CT_FIZZY_DRINKS, }, }; diff --git a/src/table/engines.h b/src/table/engines.h index ec02f6b908..e1f42c1c1e 100644 --- a/src/table/engines.h +++ b/src/table/engines.h @@ -24,7 +24,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MT(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MT(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, INVALID_CARGO, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a multiple-unit train into the EngineInfo struct. @@ -37,7 +37,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MM(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MM(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, INVALID_CARGO, e, 0, 8, 1 << EF_RAIL_IS_MU, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a train carriage into the EngineInfo struct. @@ -50,7 +50,7 @@ * @see MT * @note the 5 between b and f is the load amount */ -#define MW(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MW(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, INVALID_CARGO, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a road vehicle into the EngineInfo struct. @@ -63,7 +63,7 @@ * @param f Bitmask of the climates * @note the 5 between b and f is the load amount */ -#define MR(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MR(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, f, INVALID_CARGO, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of a ship into the EngineInfo struct. @@ -75,7 +75,7 @@ * @param f Bitmask of the climates * @note the 10 between b and f is the load amount */ -#define MS(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MS(a, b, c, d, e, f) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, f, INVALID_CARGO, e, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /** * Writes the properties of an aeroplane into the EngineInfo struct. @@ -86,7 +86,7 @@ * @param e Bitmask of the climates * @note the 20 between b and e is the load amount */ -#define MA(a, b, c, d, e) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } +#define MA(a, b, c, d, e) { CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, INVALID_CARGO, CT_INVALID, 0, 8, 0, 0, 0, STR_EMPTY, Ticks::CARGO_AGING_TICKS, INVALID_ENGINE, ExtraEngineFlags::None } /* Climates * T = Temperate @@ -102,44 +102,44 @@ static const EngineInfo _orig_engine_info[] = { * | decay_speed cargo_type * | | lifelength | climates * | | | | | | */ - MT( 1827, 20, 15, 30, 0 , T ), // 0 Kirby Paul Tank (Steam) - MT( 12784, 20, 22, 30, 0 , A|S ), // 1 MJS 250 (Diesel) - MT( 9497, 20, 20, 50, 0 , Y), // 2 Ploddyphut Choo-Choo - MT( 11688, 20, 20, 30, 0 , Y), // 3 Powernaut Choo-Choo - MT( 16802, 20, 20, 30, 0 , Y), // 4 Mightymover Choo-Choo - MT( 18993, 20, 20, 30, 0 , Y), // 5 Ploddyphut Diesel - MT( 20820, 20, 20, 30, 0 , Y), // 6 Powernaut Diesel - MT( 8766, 20, 20, 30, 0 , A|S ), // 7 Wills 2-8-0 (Steam) - MT( 5114, 20, 21, 30, 0 , T ), // 8 Chaney 'Jubilee' (Steam) - MT( 5479, 20, 20, 30, 0 , T ), // 9 Ginzu 'A4' (Steam) - MT( 12419, 20, 23, 25, 0 , T ), // 10 SH '8P' (Steam) + MT( 1827, 20, 15, 30, CT_NONE , T ), // 0 Kirby Paul Tank (Steam) + MT( 12784, 20, 22, 30, CT_NONE , A|S ), // 1 MJS 250 (Diesel) + MT( 9497, 20, 20, 50, CT_NONE , Y), // 2 Ploddyphut Choo-Choo + MT( 11688, 20, 20, 30, CT_NONE , Y), // 3 Powernaut Choo-Choo + MT( 16802, 20, 20, 30, CT_NONE , Y), // 4 Mightymover Choo-Choo + MT( 18993, 20, 20, 30, CT_NONE , Y), // 5 Ploddyphut Diesel + MT( 20820, 20, 20, 30, CT_NONE , Y), // 6 Powernaut Diesel + MT( 8766, 20, 20, 30, CT_NONE , A|S ), // 7 Wills 2-8-0 (Steam) + MT( 5114, 20, 21, 30, CT_NONE , T ), // 8 Chaney 'Jubilee' (Steam) + MT( 5479, 20, 20, 30, CT_NONE , T ), // 9 Ginzu 'A4' (Steam) + MT( 12419, 20, 23, 25, CT_NONE , T ), // 10 SH '8P' (Steam) MM( 13149, 20, 12, 30, CT_PASSENGERS , T ), // 11 Manley-Morel DMU (Diesel) MM( 23376, 20, 15, 35, CT_PASSENGERS , T ), // 12 'Dash' (Diesel) - MT( 14976, 20, 18, 28, 0 , T ), // 13 SH/Hendry '25' (Diesel) - MT( 14245, 20, 20, 30, 0 , T ), // 14 UU '37' (Diesel) - MT( 15341, 20, 22, 33, 0 , T ), // 15 Floss '47' (Diesel) - MT( 14976, 20, 20, 25, 0 , A|S ), // 16 CS 4000 (Diesel) - MT( 16437, 20, 20, 30, 0 , A|S ), // 17 CS 2400 (Diesel) - MT( 18993, 20, 22, 30, 0 , A|S ), // 18 Centennial (Diesel) - MT( 13880, 20, 22, 30, 0 , A|S ), // 19 Kelling 3100 (Diesel) - MM( 20454, 20, 22, 30, 0 , A|S ), // 20 Turner Turbo (Diesel) - MT( 16071, 20, 22, 30, 0 , A|S ), // 21 MJS 1000 (Diesel) + MT( 14976, 20, 18, 28, CT_NONE , T ), // 13 SH/Hendry '25' (Diesel) + MT( 14245, 20, 20, 30, CT_NONE , T ), // 14 UU '37' (Diesel) + MT( 15341, 20, 22, 33, CT_NONE , T ), // 15 Floss '47' (Diesel) + MT( 14976, 20, 20, 25, CT_NONE , A|S ), // 16 CS 4000 (Diesel) + MT( 16437, 20, 20, 30, CT_NONE , A|S ), // 17 CS 2400 (Diesel) + MT( 18993, 20, 22, 30, CT_NONE , A|S ), // 18 Centennial (Diesel) + MT( 13880, 20, 22, 30, CT_NONE , A|S ), // 19 Kelling 3100 (Diesel) + MM( 20454, 20, 22, 30, CT_NONE , A|S ), // 20 Turner Turbo (Diesel) + MT( 16071, 20, 22, 30, CT_NONE , A|S ), // 21 MJS 1000 (Diesel) MT( 20820, 20, 20, 25, CT_MAIL , T ), // 22 SH '125' (Diesel) - MT( 16437, 20, 23, 30, 0 , T ), // 23 SH '30' (Electric) - MT( 19359, 20, 23, 80, 0 , T ), // 24 SH '40' (Electric) - MM( 23376, 20, 25, 30, 0 , T ), // 25 'T.I.M.' (Electric) - MM( 26298, 20, 25, 50, 0 , T ), // 26 'AsiaStar' (Electric) + MT( 16437, 20, 23, 30, CT_NONE , T ), // 23 SH '30' (Electric) + MT( 19359, 20, 23, 80, CT_NONE , T ), // 24 SH '40' (Electric) + MM( 23376, 20, 25, 30, CT_NONE , T ), // 25 'T.I.M.' (Electric) + MM( 26298, 20, 25, 50, CT_NONE , T ), // 26 'AsiaStar' (Electric) MW( 1827, 20, 20, 50, CT_PASSENGERS , T|A|S|Y), // 27 Passenger Carriage MW( 1827, 20, 20, 50, CT_MAIL , T|A|S|Y), // 28 Mail Van MW( 1827, 20, 20, 50, CT_COAL , T|A ), // 29 Coal Truck 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 @@ -156,20 +156,20 @@ static const EngineInfo _orig_engine_info[] = { MW( 1827, 20, 20, 50, CT_BATTERIES , Y), // 51 Battery Truck MW( 1827, 20, 20, 50, CT_FIZZY_DRINKS, Y), // 52 Fizzy Drink Truck MW( 1827, 20, 20, 50, CT_PLASTIC , Y), // 53 Plastic Truck - MT( 28490, 20, 20, 50, 0 , T|A|S ), // 54 'X2001' (Electric) + MT( 28490, 20, 20, 50, CT_NONE , T|A|S ), // 54 'X2001' (Electric) MT( 31047, 20, 20, 50, CT_PASSENGERS , T|A|S ), // 55 'Millennium Z1' (Electric) - MT( 28855, 20, 20, 50, 0 , Y), // 56 Wizzowow Z99 + MT( 28855, 20, 20, 50, CT_NONE , Y), // 56 Wizzowow Z99 MW( 1827, 20, 20, 50, CT_PASSENGERS , T|A|S|Y), // 57 Passenger Carriage MW( 1827, 20, 20, 50, CT_MAIL , T|A|S|Y), // 58 Mail Van MW( 1827, 20, 20, 50, CT_COAL , T|A ), // 59 Coal Truck 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 @@ -186,22 +186,22 @@ static const EngineInfo _orig_engine_info[] = { MW( 1827, 20, 20, 50, CT_BATTERIES , Y), // 81 Battery Truck MW( 1827, 20, 20, 50, CT_FIZZY_DRINKS, Y), // 82 Fizzy Drink Truck MW( 1827, 20, 20, 50, CT_PLASTIC , Y), // 83 Plastic Truck - MT( 36525, 20, 20, 50, 0 , T|A|S ), // 84 Lev1 'Leviathan' (Electric) - MT( 39447, 20, 20, 50, 0 , T|A|S ), // 85 Lev2 'Cyclops' (Electric) - MT( 42004, 20, 20, 50, 0 , T|A|S ), // 86 Lev3 'Pegasus' (Electric) - MT( 42735, 20, 20, 50, 0 , T|A|S ), // 87 Lev4 'Chimaera' (Electric) - MT( 36891, 20, 20, 60, 0 , Y), // 88 Wizzowow Rocketeer + MT( 36525, 20, 20, 50, CT_NONE , T|A|S ), // 84 Lev1 'Leviathan' (Electric) + MT( 39447, 20, 20, 50, CT_NONE , T|A|S ), // 85 Lev2 'Cyclops' (Electric) + MT( 42004, 20, 20, 50, CT_NONE , T|A|S ), // 86 Lev3 'Pegasus' (Electric) + MT( 42735, 20, 20, 50, CT_NONE , T|A|S ), // 87 Lev4 'Chimaera' (Electric) + MT( 36891, 20, 20, 60, CT_NONE , Y), // 88 Wizzowow Rocketeer MW( 1827, 20, 20, 50, CT_PASSENGERS , T|A|S|Y), // 89 Passenger Carriage MW( 1827, 20, 20, 50, CT_MAIL , T|A|S|Y), // 90 Mail Van MW( 1827, 20, 20, 50, CT_COAL , T|A ), // 91 Coal Truck 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 diff --git a/src/table/town_land.h b/src/table/town_land.h index d2d991c328..2ba1bc173b 100644 --- a/src/table/town_land.h +++ b/src/table/town_land.h @@ -1812,6 +1812,7 @@ static_assert(lengthof(_town_draw_tile_data) == (NEW_HOUSE_OFFSET) * 4 * 4); #define MS(mnd, mxd, p, rc, bn, rr, mg, ca1, ca2, ca3, bf, ba, cg1, cg2, cg3) \ {mnd, mxd, p, rc, bn, rr, mg, \ {ca1, ca2, ca3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \ + {INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \ {cg1, cg2, cg3, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID, CT_INVALID}, \ bf, ba, true, GRFFileProps(INVALID_HOUSE_ID), 0, {COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN}, \ 16, NO_EXTRA_FLAG, HOUSE_NO_CLASS, {0, 2, 0, 0}, 0, 0, 0} diff --git a/src/textfile_gui.cpp b/src/textfile_gui.cpp index 0e840b01a6..c07133f248 100644 --- a/src/textfile_gui.cpp +++ b/src/textfile_gui.cpp @@ -850,6 +850,9 @@ void TextfileWindow::LoadText(std::string_view buf) this->AfterLoadText(); CheckForMissingGlyphs(true, this); + + /* The font may have changed when searching for glyphs, so ensure widget sizes are updated just in case. */ + this->ReInit(); } /** diff --git a/src/town.h b/src/town.h index 8431c560a5..3d567e5232 100644 --- a/src/town.h +++ b/src/town.h @@ -116,7 +116,11 @@ struct Town : TownPool::PoolItem<&_town_pool> { std::string text; ///< General text with additional information. - inline byte GetPercentTransported(CargoID cid) const { return this->supplied[cid].old_act * 256 / (this->supplied[cid].old_max + 1); } + inline byte GetPercentTransported(CargoID cid) const + { + if (!IsValidCargoID(cid)) return 0; + return this->supplied[cid].old_act * 256 / (this->supplied[cid].old_max + 1); + } StationList stations_near; ///< NOSAVE: List of nearby stations. diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index d326eb188a..8abca2e3cf 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -852,7 +852,7 @@ static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoT AddAcceptedCargoSetMask(accepts[1], GB(callback, 4, 4), acceptance, always_accepted); if (_settings_game.game_creation.landscape != LT_TEMPERATE && HasBit(callback, 12)) { /* The 'S' bit indicates food instead of goods */ - AddAcceptedCargoSetMask(CT_FOOD, GB(callback, 8, 4), acceptance, always_accepted); + AddAcceptedCargoSetMask(GetCargoIDByLabel(CT_FOOD), GB(callback, 8, 4), acceptance, always_accepted); } else { AddAcceptedCargoSetMask(accepts[2], GB(callback, 8, 4), acceptance, always_accepted); } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 3d23b6ddf3..3d1f66db2f 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -649,6 +649,7 @@ static CommandCost CmdBuildRailWagon(DoCommandFlag flags, TileIndex tile, const InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); v->cargo_type = e->GetDefaultCargoType(); + assert(IsValidCargoID(v->cargo_type)); v->cargo_cap = rvi->capacity; v->refit_cap = 0; @@ -773,6 +774,7 @@ CommandCost CmdBuildRailVehicle(DoCommandFlag flags, TileIndex tile, const Engin v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL; v->spritenum = rvi->image_index; v->cargo_type = e->GetDefaultCargoType(); + assert(IsValidCargoID(v->cargo_type)); v->cargo_cap = rvi->capacity; v->refit_cap = 0; v->last_station_visited = INVALID_STATION; diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 297c96c899..fccc299eb0 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1955,7 +1955,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ } if (!IsValidCargoID(cargo_type)) cargo_type = e->GetDefaultCargoType(); - if (!IsValidCargoID(cargo_type)) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo + if (!IsValidCargoID(cargo_type)) cargo_type = GetCargoIDByLabel(CT_GOODS); // The vehicle does not carry anything, let's pick some freight cargo + assert(IsValidCargoID(cargo_type)); if (e->u.rail.railveh_type == RAILVEH_WAGON) { if (!CargoSpec::Get(cargo_type)->is_freight) { if (parent_engine_type == INVALID_ENGINE) { @@ -1995,7 +1996,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ cargo_type = v->First()->cargo_type; } if (!IsValidCargoID(cargo_type)) cargo_type = e->GetDefaultCargoType(); - if (!IsValidCargoID(cargo_type)) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo + if (!IsValidCargoID(cargo_type)) cargo_type = GetCargoIDByLabel(CT_GOODS); // The vehicle does not carry anything, let's pick some freight cargo + assert(IsValidCargoID(cargo_type)); /* Important: Use Tram Flag of front part. Luckily engine_type refers to the front part here. */ if (HasBit(e->info.misc_flags, EF_ROAD_TRAM)) { @@ -2008,7 +2010,8 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_ case VEH_SHIP: if (!IsValidCargoID(cargo_type)) cargo_type = e->GetDefaultCargoType(); - if (!IsValidCargoID(cargo_type)) cargo_type = CT_GOODS; // The vehicle does not carry anything, let's pick some freight cargo + if (!IsValidCargoID(cargo_type)) cargo_type = GetCargoIDByLabel(CT_GOODS); // The vehicle does not carry anything, let's pick some freight cargo + assert(IsValidCargoID(cargo_type)); return IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_SHIP : LS_FREIGHT_SHIP; case VEH_AIRCRAFT: diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index eb8da1ebb1..4817627e8c 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -167,7 +167,8 @@ std::tuple CmdBuildVehicle(D } else { refitted_capacity = e->GetDisplayDefaultCapacity(&refitted_mail_capacity); cargo_capacities[default_cargo] = refitted_capacity; - cargo_capacities[CT_MAIL] = refitted_mail_capacity; + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail)) cargo_capacities[mail] = refitted_mail_capacity; } } @@ -410,7 +411,8 @@ static std::tuple RefitVehicle(Vehicle total_mail_capacity += mail_capacity; cargo_capacities[new_cid] += amount; - cargo_capacities[CT_MAIL] += mail_capacity; + CargoID mail = GetCargoIDByLabel(CT_MAIL); + if (IsValidCargoID(mail)) cargo_capacities[mail] += mail_capacity; if (!refittable) continue; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 453c8d5c96..ac0853591c 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -951,7 +951,7 @@ struct RefitWindow : public Window { Money money = cost.GetCost(); if (mail_capacity > 0) { - SetDParam(2, CT_MAIL); + SetDParam(2, GetCargoIDByLabel(CT_MAIL)); SetDParam(3, mail_capacity); if (this->order != INVALID_VEH_ORDER_ID) { /* No predictable cost */