From d865916a071329ce216c50a2d8b6e6ccbd4fcedd Mon Sep 17 00:00:00 2001 From: glx22 Date: Sat, 23 Nov 2019 14:21:01 +0100 Subject: [PATCH 1/6] Fix #7836: Check coherency of NewGRF parameter min/max (#7840) --- src/newgrf.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 9cebb7a592..ce1b2babe6 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -7941,8 +7941,14 @@ static bool ChangeGRFParamLimits(size_t len, ByteReader *buf) grfmsg(2, "StaticGRFInfo: expected 8 bytes for 'INFO'->'PARA'->'LIMI' but got " PRINTF_SIZE ", ignoring this field", len); buf->Skip(len); } else { - _cur_parameter->min_value = buf->ReadDWord(); - _cur_parameter->max_value = buf->ReadDWord(); + uint32 min_value = buf->ReadDWord(); + uint32 max_value = buf->ReadDWord(); + if (min_value <= max_value) { + _cur_parameter->min_value = min_value; + _cur_parameter->max_value = max_value; + } else { + grfmsg(2, "StaticGRFInfo: 'INFO'->'PARA'->'LIMI' values are incoherent, ignoring this field"); + } } return true; } From 40ebf3c7659201b5365839b1371c4f9e84feea50 Mon Sep 17 00:00:00 2001 From: stormcone <48624099+stormcone@users.noreply.github.com> Date: Mon, 25 Nov 2019 22:59:03 +0100 Subject: [PATCH 2/6] Fix: Do not refer to a function in the documentation that was removed years ago (#7844) The 'DoDrawString' was removed with this commit: f11300d --- src/gfx.cpp | 15 ++++++++++----- src/group_gui.cpp | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 98439d01fe..478acc1f27 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -485,7 +485,8 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, * @param right The right most position to draw on. * @param top The top most position to draw on. * @param str String to draw. - * @param colour Colour used for drawing the string, see DoDrawString() for details + * @param colour Colour used for drawing the string, for details see _string_colourmap in + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * @param align The alignment of the string when drawing left-to-right. In the * case a right-to-left language is chosen this is inverted so it * will be drawn in the right direction. @@ -520,7 +521,8 @@ int DrawString(int left, int right, int top, const char *str, TextColour colour, * @param right The right most position to draw on. * @param top The top most position to draw on. * @param str String to draw. - * @param colour Colour used for drawing the string, see DoDrawString() for details + * @param colour Colour used for drawing the string, for details see _string_colourmap in + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * @param align The alignment of the string when drawing left-to-right. In the * case a right-to-left language is chosen this is inverted so it * will be drawn in the right direction. @@ -608,7 +610,8 @@ Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &sugges * @param top The top most position to draw on. * @param bottom The bottom most position to draw on. * @param str String to draw. - * @param colour Colour used for drawing the string, see DoDrawString() for details + * @param colour Colour used for drawing the string, for details see _string_colourmap in + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * @param align The horizontal and vertical alignment of the string. * @param underline Whether to underline all strings * @param fontsize The size of the initial characters. @@ -669,7 +672,8 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, const char *st * @param top The top most position to draw on. * @param bottom The bottom most position to draw on. * @param str String to draw. - * @param colour Colour used for drawing the string, see DoDrawString() for details + * @param colour Colour used for drawing the string, for details see _string_colourmap in + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h * @param align The horizontal and vertical alignment of the string. * @param underline Whether to underline all strings * @param fontsize The size of the initial characters. @@ -747,7 +751,8 @@ const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize) * @param c Character (glyph) to draw * @param x X position to draw character * @param y Y position to draw character - * @param colour Colour to use, see DoDrawString() for details + * @param colour Colour to use, for details see _string_colourmap in + * table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h */ void DrawCharCentered(WChar c, int x, int y, TextColour colour) { diff --git a/src/group_gui.cpp b/src/group_gui.cpp index bd0ab45e21..b655433752 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -792,7 +792,7 @@ public: switch (widget) { case WID_GL_ALL_VEHICLES: // All vehicles - case WID_GL_DEFAULT_VEHICLES: // Ungroupd vehicles + case WID_GL_DEFAULT_VEHICLES: // Ungrouped vehicles if (g->parent != INVALID_GROUP) { DoCommandP(0, this->group_sel | (1 << 16), INVALID_GROUP, CMD_ALTER_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_SET_PARENT)); } From f91c701ffebe098f05b237642dd37002181f1a7f Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 1 Dec 2019 19:45:40 +0100 Subject: [PATCH 3/6] Update: Translations from eints hungarian: 1 change by Brumi --- src/lang/hungarian.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index c061b26362..dc0c874acf 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -3455,6 +3455,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Gazdasági épületek STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs - STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Gazdasági épületek neve - a névre kattintva a fő nézetet a választott objektumra irányíthatod. Ctrl+kattintással új látképet nyit a gazdasági épület pozíciójára # Industry view From 9900af38f58c84a90bd1a3830b9acd08438c46c5 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Sun, 1 Dec 2019 23:17:33 +0100 Subject: [PATCH 4/6] Fix #7847: Use ViewportSign coordinates for sign Kdtree coordinates (#7849) Ensure the same coordinates are used for station/town/player signs regardless of how the landscape changes below it after the coordinates were first determined. By keeping track of whether each ViewportSign is valid for Kdtree use (and only ever registering the viewport sign when the object is valid) a lot of code can be simplified and become more robust at the same time. --- src/base_station_base.h | 2 +- src/signs.cpp | 6 ++++++ src/signs_base.h | 12 +++++------ src/signs_cmd.cpp | 3 +-- src/station.cpp | 2 +- src/station_cmd.cpp | 8 +++---- src/town.h | 2 +- src/town_cmd.cpp | 8 +++++-- src/viewport.cpp | 47 ++++++++++++++--------------------------- src/viewport_type.h | 20 ++++++++++++++++++ src/waypoint.cpp | 2 +- src/waypoint_cmd.cpp | 16 +++++--------- 12 files changed, 68 insertions(+), 60 deletions(-) diff --git a/src/base_station_base.h b/src/base_station_base.h index 112fa722b2..a23a7bf510 100644 --- a/src/base_station_base.h +++ b/src/base_station_base.h @@ -51,7 +51,7 @@ struct StationRect : public Rect { /** Base class for all station-ish types */ struct BaseStation : StationPool::PoolItem<&_station_pool> { TileIndex xy; ///< Base tile of the station - ViewportSign sign; ///< NOSAVE: Dimensions of sign + TrackedViewportSign sign; ///< NOSAVE: Dimensions of sign byte delete_ctr; ///< Delete counter. If greater than 0 then it is decremented until it reaches 0; the waypoint is then is deleted. char *name; ///< Custom name diff --git a/src/signs.cpp b/src/signs.cpp index 407ab86068..c42644269a 100644 --- a/src/signs.cpp +++ b/src/signs.cpp @@ -13,6 +13,7 @@ #include "signs_func.h" #include "strings_func.h" #include "core/pool_func.hpp" +#include "viewport_kdtree.h" #include "table/strings.h" @@ -46,8 +47,13 @@ Sign::~Sign() void Sign::UpdateVirtCoord() { Point pt = RemapCoords(this->x, this->y, this->z); + + if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(this->index)); + SetDParam(0, this->index); this->sign.UpdatePosition(pt.x, pt.y - 6 * ZOOM_LVL_BASE, STR_WHITE_SIGN); + + _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(this->index)); } /** Update the coordinates of all signs */ diff --git a/src/signs_base.h b/src/signs_base.h index 1c677db175..e92a05e2f6 100644 --- a/src/signs_base.h +++ b/src/signs_base.h @@ -19,12 +19,12 @@ typedef Pool SignPool; extern SignPool _sign_pool; struct Sign : SignPool::PoolItem<&_sign_pool> { - char *name; - ViewportSign sign; - int32 x; - int32 y; - int32 z; - Owner owner; // placed by this company. Anyone can delete them though. OWNER_NONE for gray signs from old games. + char *name; + TrackedViewportSign sign; + int32 x; + int32 y; + int32 z; + Owner owner; // placed by this company. Anyone can delete them though. OWNER_NONE for gray signs from old games. Sign(Owner owner = INVALID_OWNER); ~Sign(); diff --git a/src/signs_cmd.cpp b/src/signs_cmd.cpp index 8b074e46be..d2caa4a235 100644 --- a/src/signs_cmd.cpp +++ b/src/signs_cmd.cpp @@ -57,7 +57,6 @@ CommandCost CmdPlaceSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 si->name = stredup(text); } si->UpdateVirtCoord(); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index)); InvalidateWindowData(WC_SIGN_LIST, 0, 0); _new_sign_id = si->index; } @@ -99,7 +98,7 @@ CommandCost CmdRenameSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 } else { // Delete sign if (flags & DC_EXEC) { si->sign.MarkDirty(); - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index)); + if (si->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index)); delete si; InvalidateWindowData(WC_SIGN_LIST, 0, 0); diff --git a/src/station.cpp b/src/station.cpp index 7e89bc1e26..59fee57daa 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -162,7 +162,7 @@ Station::~Station() CargoPacket::InvalidateAllFrom(this->index); _station_kdtree.Remove(this->index); - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); + if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); } diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index cb64873b6e..78a0896eae 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -420,10 +420,14 @@ void Station::UpdateVirtCoord() pt.y -= 32 * ZOOM_LVL_BASE; if ((this->facilities & FACIL_AIRPORT) && this->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE; + if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); + SetDParam(0, this->index); SetDParam(1, this->facilities); this->sign.UpdatePosition(pt.x, pt.y, STR_VIEWPORT_STATION); + _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index)); + SetWindowDirty(WC_STATION_VIEW, this->index); } @@ -435,13 +439,11 @@ void Station::MoveSign(TileIndex new_xy) { if (this->xy == new_xy) return; - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index)); _station_kdtree.Remove(this->index); this->BaseStation::MoveSign(new_xy); _station_kdtree.Insert(this->index); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index)); } /** Update the virtual coords needed to draw the station sign for all stations. */ @@ -692,7 +694,6 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus if (flags & DC_EXEC) { *st = new Station(area.tile); _station_kdtree.Insert((*st)->index); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index)); (*st)->town = ClosestTownFromTile(area.tile, UINT_MAX); (*st)->string_id = GenerateStationName(*st, area.tile, name_class); @@ -4157,7 +4158,6 @@ void BuildOilRig(TileIndex tile) st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE); st->UpdateVirtCoord(); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index)); st->RecomputeCatchment(); UpdateStationAcceptance(st, false); } diff --git a/src/town.h b/src/town.h index 818ee643be..d07f9cc239 100644 --- a/src/town.h +++ b/src/town.h @@ -43,7 +43,7 @@ extern TownPool _town_pool; struct TownCache { uint32 num_houses; ///< Amount of houses uint32 population; ///< Current population of people - ViewportSign sign; ///< Location of name sign, UpdateVirtCoord updates this + TrackedViewportSign sign; ///< Location of name sign, UpdateVirtCoord updates this PartOfSubsidy part_of_subsidy; ///< Is this town a source/destination of a subsidy? uint32 squared_town_zone_radius[HZB_END]; ///< UpdateTownRadius updates this given the house count BuildingCounts building_counts; ///< The number of each type of building in the town diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 139e0217d8..fbfd874921 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -394,12 +394,17 @@ static bool IsCloseToTown(TileIndex tile, uint dist) void Town::UpdateVirtCoord() { Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE); + + if (this->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(this->index)); + SetDParam(0, this->index); SetDParam(1, this->cache.population); this->cache.sign.UpdatePosition(pt.x, pt.y - 24 * ZOOM_LVL_BASE, _settings_client.gui.population_in_label ? STR_VIEWPORT_TOWN_POP : STR_VIEWPORT_TOWN, STR_VIEWPORT_TOWN); + _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(this->index)); + SetWindowDirty(WC_TOWN_VIEW, this->index); } @@ -1782,7 +1787,6 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize t->townnameparts = townnameparts; t->UpdateVirtCoord(); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index)); InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0); t->InitializeLayout(layout); @@ -2942,7 +2946,7 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 /* The town destructor will delete the other things related to the town. */ if (flags & DC_EXEC) { _town_kdtree.Remove(t->index); - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index)); + if (t->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index)); delete t; } diff --git a/src/viewport.cpp b/src/viewport.cpp index 552fb467df..94245cf6c6 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -2178,13 +2178,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id) item.id.station = id; const Station *st = Station::Get(id); - Point pt = RemapCoords(TileX(st->xy) * TILE_SIZE, TileY(st->xy) * TILE_SIZE, GetTileMaxZ(st->xy) * TILE_HEIGHT); - - pt.y -= 32 * ZOOM_LVL_BASE; - if ((st->facilities & FACIL_AIRPORT) && st->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE; - - item.center = pt.x; - item.top = pt.y; + assert(st->sign.kdtree_valid); + item.center = st->sign.center; + item.top = st->sign.top; /* Assume the sign can be a candidate for drawing, so measure its width */ _viewport_sign_maxwidth = max(_viewport_sign_maxwidth, st->sign.width_normal); @@ -2199,12 +2195,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id) item.id.station = id; const Waypoint *st = Waypoint::Get(id); - Point pt = RemapCoords(TileX(st->xy) * TILE_SIZE, TileY(st->xy) * TILE_SIZE, GetTileMaxZ(st->xy) * TILE_HEIGHT); - - pt.y -= 32 * ZOOM_LVL_BASE; - - item.center = pt.x; - item.top = pt.y; + assert(st->sign.kdtree_valid); + item.center = st->sign.center; + item.top = st->sign.top; /* Assume the sign can be a candidate for drawing, so measure its width */ _viewport_sign_maxwidth = max(_viewport_sign_maxwidth, st->sign.width_normal); @@ -2219,14 +2212,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeTown(TownID id) item.id.town = id; const Town *town = Town::Get(id); - /* Avoid using RemapCoords2, it has dependency on the foundations status of the tile, and that can be unavailable during saveload, leading to crashes. - * Instead "fake" foundations by taking the highest Z coordinate of any corner of the tile. */ - Point pt = RemapCoords(TileX(town->xy) * TILE_SIZE, TileY(town->xy) * TILE_SIZE, GetTileMaxZ(town->xy) * TILE_HEIGHT); - - pt.y -= 24 * ZOOM_LVL_BASE; - - item.center = pt.x; - item.top = pt.y; + assert(town->cache.sign.kdtree_valid); + item.center = town->cache.sign.center; + item.top = town->cache.sign.top; /* Assume the sign can be a candidate for drawing, so measure its width */ _viewport_sign_maxwidth = max(_viewport_sign_maxwidth, town->cache.sign.width_normal); @@ -2241,12 +2229,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeSign(SignID id) item.id.sign = id; const Sign *sign = Sign::Get(id); - Point pt = RemapCoords(sign->x, sign->y, sign->z); - - pt.y -= 6 * ZOOM_LVL_BASE; - - item.center = pt.x; - item.top = pt.y; + assert(sign->sign.kdtree_valid); + item.center = sign->sign.center; + item.top = sign->sign.top; /* Assume the sign can be a candidate for drawing, so measure its width */ _viewport_sign_maxwidth = max(_viewport_sign_maxwidth, sign->sign.width_normal); @@ -2264,22 +2249,22 @@ void RebuildViewportKdtree() const Station *st; FOR_ALL_STATIONS(st) { - items.push_back(ViewportSignKdtreeItem::MakeStation(st->index)); + if (st->sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeStation(st->index)); } const Waypoint *wp; FOR_ALL_WAYPOINTS(wp) { - items.push_back(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); + if (wp->sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); } const Town *town; FOR_ALL_TOWNS(town) { - items.push_back(ViewportSignKdtreeItem::MakeTown(town->index)); + if (town->cache.sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeTown(town->index)); } const Sign *sign; FOR_ALL_SIGNS(sign) { - items.push_back(ViewportSignKdtreeItem::MakeSign(sign->index)); + if (sign->sign.kdtree_valid) items.push_back(ViewportSignKdtreeItem::MakeSign(sign->index)); } _viewport_sign_kdtree.Build(items.begin(), items.end()); diff --git a/src/viewport_type.h b/src/viewport_type.h index 2d986493e0..f6a9ce4ae4 100644 --- a/src/viewport_type.h +++ b/src/viewport_type.h @@ -53,6 +53,26 @@ struct ViewportSign { void MarkDirty(ZoomLevel maxzoom = ZOOM_LVL_MAX) const; }; +/** Specialised ViewportSign that tracks whether it is valid for entering into a Kdtree */ +struct TrackedViewportSign : ViewportSign { + bool kdtree_valid; ///< Are the sign data valid for use with the _viewport_sign_kdtree? + + /** + * Update the position of the viewport sign. + * Note that this function hides the base class function. + */ + void UpdatePosition(int center, int top, StringID str, StringID str_small = STR_NULL) + { + this->kdtree_valid = true; + this->ViewportSign::UpdatePosition(center, top, str, str_small); + } + + + TrackedViewportSign() : kdtree_valid{ false } + { + } +}; + /** * Directions of zooming. * @see DoZoomInOutWindow diff --git a/src/waypoint.cpp b/src/waypoint.cpp index cf3e746d79..f602eee6d0 100644 --- a/src/waypoint.cpp +++ b/src/waypoint.cpp @@ -53,5 +53,5 @@ Waypoint::~Waypoint() if (CleaningPool()) return; DeleteWindowById(WC_WAYPOINT_VIEW, this->index); RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index); - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); + if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); } diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 70a6fea832..d55b1b459e 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -39,8 +39,13 @@ void Waypoint::UpdateVirtCoord() { Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE); + if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); + SetDParam(0, this->index); this->sign.UpdatePosition(pt.x, pt.y - 32 * ZOOM_LVL_BASE, STR_VIEWPORT_WAYPOINT); + + _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index)); + /* Recenter viewport */ InvalidateWindowData(WC_WAYPOINT_VIEW, this->index); } @@ -53,11 +58,7 @@ void Waypoint::MoveSign(TileIndex new_xy) { if (this->xy == new_xy) return; - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index)); - this->BaseStation::MoveSign(new_xy); - - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index)); } /** @@ -239,15 +240,11 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint } if (flags & DC_EXEC) { - bool need_sign_update = false; if (wp == nullptr) { wp = new Waypoint(start_tile); - need_sign_update = true; } else if (!wp->IsInUse()) { /* Move existing (recently deleted) waypoint to the new location */ - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); wp->xy = start_tile; - need_sign_update = true; } wp->owner = GetTileOwner(start_tile); @@ -262,7 +259,6 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint if (wp->town == nullptr) MakeDefaultName(wp); wp->UpdateVirtCoord(); - if (need_sign_update) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); const StationSpec *spec = StationClass::Get(spec_class)->GetSpec(spec_index); byte *layout_ptr = AllocaM(byte, count); @@ -329,7 +325,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 wp = new Waypoint(tile); } else { /* Move existing (recently deleted) buoy to the new location */ - _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); wp->xy = tile; InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); } @@ -349,7 +344,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 MarkTileDirtyByTile(tile); wp->UpdateVirtCoord(); - _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index)); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); } From 03bbae7fe9a24d894731d545a79697362588bcca Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 7 Dec 2019 19:45:40 +0100 Subject: [PATCH 5/6] Update: Translations from eints ukrainian: 56 changes by nsergiy --- src/lang/ukrainian.txt | 58 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 08d991e8c4..a29d94c98f 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -360,6 +360,8 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Обер STR_BUTTON_SORT_BY :{BLACK}Сортувати STR_BUTTON_LOCATION :{BLACK}Показати STR_BUTTON_RENAME :{BLACK}Назва +STR_BUTTON_CATCHMENT :{BLACK}Покриття +STR_TOOLTIP_CATCHMENT :{BLACK}Вкл./викл. відображення області покриття STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закрити вікно STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Заголовок вікна - потягніть для переміщення вікна @@ -388,6 +390,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}нати STR_BUTTON_DEFAULT :{BLACK}Стандартно STR_BUTTON_CANCEL :{BLACK}Відміна STR_BUTTON_OK :{BLACK}Так +STR_WARNING_PASSWORD_SECURITY :{YELLOW}Попередження: Адміністратори серверів можуть мати можливість читати будь-який текст, введений тут. # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\йцукенгшщзхїфівапролджє ячсмитьбю. . @@ -1061,6 +1064,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Грузинс STR_GAME_OPTIONS_CURRENCY_IRR :Іранський ріал (IRR) STR_GAME_OPTIONS_CURRENCY_RUB :Російський новий рубель (RUB) STR_GAME_OPTIONS_CURRENCY_MXN :Мексиканське песо (MXN) +STR_GAME_OPTIONS_CURRENCY_NTD :Новий тайваньський долар (NTD) +STR_GAME_OPTIONS_CURRENCY_CNY :Китайські ренміні (CNY) +STR_GAME_OPTIONS_CURRENCY_HKD :Гонконгський долар (HKD) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Сторона руху транспорту @@ -1447,7 +1453,7 @@ STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Тільки T STR_CONFIG_SETTING_INDUSTRY_DENSITY :Густота підприємств: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Встановіть кількість підприємств, що будуть створені і кількість підприємств, що існуватимуть впродовж гри STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. відстань від краю карти до нафтопереробних заводів: {STRING} -STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Нафтопереробні заводи завжди будуються не далеко від краю карти або узбережжя. +STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Обмеження того, наскільки далеко може бути побудований кордон нафтопереробних заводів та нафтових установок. На островних картах це гарантує, що вони знаходяться біля узбережжя. На картах більше 256 плиток це значення збільшується. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Рівень снігової шапки: {STRING} STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Контроль висоти, вище якої лежить сніг в субарктичному ландшафті. Сніг впливає на генерування підприємств та на умови росту міст STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Грубість ландшафту: {STRING} @@ -1611,6 +1617,9 @@ STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Дозволи STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Дозволяє участь віртуальних гравців у колективній грі STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Максимально допустима кількість #opcodes: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Максимально допустима кількість розрахунків, що можуть виконати скрипти віртуальних гравців впродовж одного ходу. +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Максимальне використаня пам'яті скриптом: {STRING} +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Скільки пам'яті може зайняти один сценарій до примусового припинення. Це може знадобитися збільшити для великих карт. +STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Інтервали техогляду вказано у відсотках: {STRING} STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Налаштування способу визначення необхідності проведення техогляду: через вказаний проміжок часу після попереднього техогляду чи коли поточна надійність транспортного засобу стане нижчою від максимальної його надійності на вказаний процент. @@ -1673,6 +1682,8 @@ STR_CONFIG_SETTING_SMOOTH_ECONOMY :Стабіль STR_CONFIG_SETTING_SMOOTH_ECONOMY_HELPTEXT :При включенні обсяги виробництва підприємств змінюються часто, але не дуже суттєво. Зазвичай ця опція не впливає на підприємства, додані за допомогою NewGRF. STR_CONFIG_SETTING_ALLOW_SHARES :Дозволити придбання акції інших компаній: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :При включенні дозволяє придбання та продаж акцій команій. Акції компанії стають доступними після досягнення деякого віку. +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Мінімальний вік компанії для торгівлі акціями: {STRING} +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Встановіть мінімальний вік компанії, щоб інші могли купувати та продавати акції у них. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Відсоток прибутку за часткове перевезення: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Налаштування проценту прибутку, що нараховується за часткове перевезення вантажу. За допомогою даної опції можна контролювати розподіл прибутків між учасниками багатоланкових перевезень. STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :При протягуванні встановлювати сигнали через {STRING} @@ -2267,7 +2278,7 @@ STR_NETWORK_CHAT_ALL :[Всім] {STR STR_NETWORK_CHAT_OSKTITLE :{BLACK}Введіть текст для мережевого чату # Network messages -STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Не знайдено мережевого пристрою або скомпільовано без ENABLE_NETWORK +STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Не знайдено мережевого пристрою STR_NETWORK_ERROR_NOSERVER :{WHITE}Не знайдено жодної мережевої гри STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Сервер не відповів на запит STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Не можна з'єднатись внаслідок неспівпадання NewGRF @@ -2563,7 +2574,10 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}Побу STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}Будувати/зруйнувати дорогу STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Будувати/демонтувати колію STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Модернізувати дорогу. Утримуйте Shift для показу витрат на модернізацію +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}Convert/Перетворення / оновлення типу трамваю. Shift перемикає будівництво / показ кошторису витрат +STR_ROAD_NAME_ROAD :Дорога +STR_ROAD_NAME_TRAM :Трамвай # Road depot construction window STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Орієнтація депо @@ -2749,8 +2763,10 @@ STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Прий STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Тип зал.колії: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}Тип дороги: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_TRAM_TYPE :{BLACK}Тип трамваю: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Ліміт швидкості залізниці: {LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Ліміт швидкості авто: {LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}Обмеження швидкості руху трамваїв: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :Каміння @@ -2860,6 +2876,7 @@ STR_FRAMERATE_SPEED_FACTOR :{BLACK}Наяв STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK} Як швидко гра біжить в даний час, в порівнянні з очікуваною швидкістю при звичайній швидкості моделювання. STR_FRAMERATE_CURRENT :{WHITE}Зараз STR_FRAMERATE_AVERAGE :{WHITE}Середнє +STR_FRAMERATE_MEMORYUSE :{WHITE}Пам'ять STR_FRAMERATE_DATA_POINTS :{BLACK}Дані отримано з {COMMA} вимірюван {P "ня" "нь" "нь" } STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} мс STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms @@ -2867,6 +2884,9 @@ STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} кадрів/сек STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} кадр{P "" "и" "ів"}/сек STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} кадрів/сек +STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} +STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES} +STR_FRAMERATE_BYTES_BAD :{RED}{BYTES} STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA} мс STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} с ############ Leave those lines in this order!! @@ -3134,6 +3154,7 @@ STR_NEWGRF_ERROR_GRM_FAILED :Недосту STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} був вимкнений {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Некоректний або невідомий формат розміщення спрайтів (спрайт {3:NUM}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Дуже багато елементів у списку значень (спрайт {3:NUM}, властивість {4:HEX}) +STR_NEWGRF_ERROR_INDPROD_CALLBACK :Невірна обробка продукції підприємства (спрайт {3:NUM}, "{2:STRING}") # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Обережно! @@ -3165,6 +3186,7 @@ STR_NEWGRF_BUGGY :{WHITE}NewGRF ' STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Інформація про вантаж/переобладнання для '{1:ENGINE}' відрізняється від списку покупки після побудови. Це може спричинити невідповідності під час автооновлення/заміни STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' спричинив нескінченний цикл у виклику виробництва STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Виклик {1:HEX} повернув невідомий/неправильний результат {2:HEX} +STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}'повернув недійсний тип вантажу у виробничому зворотному режимі о {2:HEX} # 'User removed essential NewGRFs'-placeholders for stuff without specs STR_NEWGRF_INVALID_CARGO :<невідомий вантаж> @@ -3231,6 +3253,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Перейме # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} - місцева влада +STR_LOCAL_AUTHORITY_ZONE :{BLACK}Зона +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}Показати зону в межах місцевих повноважень STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}Рейтинги компаній: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Доступні дії: @@ -3488,6 +3512,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Інфр STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Залізничні ділянки: STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}З сигналами STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Дорожні ділянки: +STR_COMPANY_INFRASTRUCTURE_VIEW_TRAM_SECT :{GOLD}Трамвайні вагони: STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT :{GOLD}Судноплавні ділянки: STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Канали STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станції: @@ -3498,7 +3523,12 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Підприємства STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- немає - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% перевезено){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} +STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +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} і {NUM} ще... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Назви підприємств - клацніть мишою на назву, щоб показати підприємство у центрі екрану. Ctrl+клац мишою відкриває нове вікно з видом на підприємство # Industry view @@ -3594,14 +3624,17 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Новий мо STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Новий магнітний поїзд STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Нові автомобілі +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Нові трамваї ############ range for vehicle availability starts STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Нові потяги +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Нові автомобілі STR_BUY_VEHICLE_SHIP_CAPTION :Нові кораблі STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Нові літаки ############ range for vehicle availability ends STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} Вага: {GOLD}{WEIGHT_SHORT} +STR_PURCHASE_INFO_COST_REFIT_WEIGHT :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} (Вартість переобладнання: {GOLD}{CURRENCY_LONG}{BLACK}) Вага: {GOLD}{WEIGHT_SHORT} STR_PURCHASE_INFO_SPEED_POWER :{BLACK}Швидкість: {GOLD}{VELOCITY}{BLACK} Потужність: {GOLD}{POWER} STR_PURCHASE_INFO_SPEED :{BLACK}Швидкість: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Швидкість в океані: {GOLD}{VELOCITY} @@ -3612,8 +3645,10 @@ STR_PURCHASE_INFO_REFITTABLE :(змінюєт STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Рік випуску: {GOLD}{NUM}{BLACK} Вік: {GOLD}{COMMA} р{P ік оки оків} STR_PURCHASE_INFO_RELIABILITY :{BLACK}Надійність: {GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}Ціна: {GOLD}{CURRENCY_LONG} +STR_PURCHASE_INFO_COST_REFIT :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} (Вартість переобладнання:: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}Вага: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} Швидкість: {GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} (Вартість переобладнання: {GOLD}{CURRENCY_LONG}{BLACK}) Швидкість: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Місткість: {GOLD}{CARGO_LONG}, {CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Потужність: {GOLD}+{POWER}{BLACK} Вага: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Може бути переобладненим на: {GOLD}{STRING} @@ -3634,12 +3669,20 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Купи STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Купити STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Купити +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купити і переобладнати авто +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купити і переобладнати авто +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купіть і переобладнайте корабель +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купуйте та переобладнайте літаки STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибраний поїзд. Утримуйте Shift для показу витрат на придбання STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибране авто. Утримуйте Shift для показу витрат на придбання STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибраний корабель. Утримуйте Shift для показу витрат на придбання STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибраний літак. Утримуйте Shift для показу витрат на придбання +STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Придбайте та переобладнайте виділений поїзд. Shift + Click показує орієнтовну вартість без покупки +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Придбайте та переобладнайте авто. Shift + Click показує орієнтовну вартість без покупки +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Придбайте та переобладнайте виділене судно. Shift + Click показує орієнтовну вартість без покупки +STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Придбайте та переобладнайте виділені літаки. Shift + Click показує орієнтовну вартість без покупки STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Назва STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Зміна назви @@ -3751,10 +3794,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Пові STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Ми розробили новий {STRING} - чи бажаєте ексклюзивно користуватись ним протягом року, так ми побачимо, як він зарекомендує себе, перед тим як буде доступним для всіх? STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :локомотив +STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :електрифікований залізничний локомотив STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :монорейковий локомотив STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :магнітний локомотив STR_ENGINE_PREVIEW_ROAD_VEHICLE :автомобіль +STR_ENGINE_PREVIEW_TRAM_VEHICLE :трамваї STR_ENGINE_PREVIEW_AIRCRAFT :літак STR_ENGINE_PREVIEW_SHIP :корабель @@ -3796,14 +3841,18 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Пере STR_REPLACE_ENGINES :Локомотиви STR_REPLACE_WAGONS :Вагони STR_REPLACE_ALL_RAILTYPE :Весь з/д транспорт +STR_REPLACE_ALL_ROADTYPE :Всі автомобілі STR_REPLACE_HELP_RAILTYPE :{BLACK}Виберіть тип колії, для якого ви збираєтесь оновити потяги +STR_REPLACE_HELP_ROADTYPE :{BLACK}Виберіть тип дороги, на який хочете замінити двигуни STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Показує, яким потягом буде замінено потяг, вибраний ліворуч STR_REPLACE_RAIL_VEHICLES :Неелектрифіковані поїзди STR_REPLACE_ELRAIL_VEHICLES :Електрифіковані поїзди STR_REPLACE_MONORAIL_VEHICLES :Монорейкові поїзди STR_REPLACE_MAGLEV_VEHICLES :Магнітні поїзди +STR_REPLACE_ROAD_VEHICLES :Авто +STR_REPLACE_TRAM_VEHICLES :Трамвайні транспортні засоби STR_REPLACE_REMOVE_WAGON :{BLACK}Ліквідація зайвих вагонів: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Дозволити автооновленню видаляти вагони, зберігаючи довжину потягу (починаючи спереду), якщо оновлення робить поїзд довшим @@ -4548,6 +4597,11 @@ STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Не м STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... тут немає дороги STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... тут немає трамвайних шляхів STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Тут не можна модернізувати дорогу... +STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Тут не можна перетворити тип трамваю ... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Немає підходящої дороги +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Немає підходящої трамвайної колії +STR_ERROR_INCOMPATIBLE_ROAD :{WHITE}... несумісна дорога +STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... несумісний трамвай # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Неможливо будувати канал тут... From 35dc377a58c90abb67304a0c557449b6db3c0d3f Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 8 Dec 2019 12:16:11 +0000 Subject: [PATCH 6/6] Fix: Infrastructure total update when removing tram road stop The wrong road owner was used when updating the tram infrastructure total. This could result in desyncs, negative infrastructure totals, etc. --- src/station_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 78a0896eae..aa5afb97ce 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2126,7 +2126,7 @@ CommandCost CmdRemoveRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, ui /* Update company infrastructure counts. */ int count = CountBits(road_bits); UpdateCompanyRoadInfrastructure(road_type[RTT_ROAD], road_owner[RTT_ROAD], count); - UpdateCompanyRoadInfrastructure(road_type[RTT_TRAM], road_owner[RTT_ROAD], count); + UpdateCompanyRoadInfrastructure(road_type[RTT_TRAM], road_owner[RTT_TRAM], count); } }