Merge branch 'master' into jgrpp

# Conflicts:
#	src/signs_cmd.cpp
#	src/station.cpp
#	src/station_cmd.cpp
#	src/town_cmd.cpp
#	src/viewport.cpp
#	src/waypoint.cpp
#	src/waypoint_cmd.cpp
This commit is contained in:
Jonathan G Rennison
2019-12-11 18:20:24 +00:00
18 changed files with 157 additions and 111 deletions

View File

@@ -54,7 +54,7 @@ struct StationRect : public Rect {
/** Base class for all station-ish types */ /** Base class for all station-ish types */
struct BaseStation : StationPool::PoolItem<&_station_pool> { struct BaseStation : StationPool::PoolItem<&_station_pool> {
TileIndex xy; ///< Base tile of the station 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. 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 char *name; ///< Custom name
@@ -78,8 +78,6 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
TileArea train_station; ///< Tile area the train 'station' part covers TileArea train_station; ///< Tile area the train 'station' part covers
StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions
Point viewport_sign_kdtree_pt; ///< NOSAVE: Viewport sign kd tree: saved point (for tree removals)
/** /**
* Initialize the base station. * Initialize the base station.
* @param tile The location of the station sign * @param tile The location of the station sign

View File

@@ -487,7 +487,8 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left,
* @param right The right most position to draw on. * @param right The right most position to draw on.
* @param top The top most position to draw on. * @param top The top most position to draw on.
* @param str String to draw. * @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 * @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 * case a right-to-left language is chosen this is inverted so it
* will be drawn in the right direction. * will be drawn in the right direction.
@@ -522,7 +523,8 @@ int DrawString(int left, int right, int top, const char *str, TextColour colour,
* @param right The right most position to draw on. * @param right The right most position to draw on.
* @param top The top most position to draw on. * @param top The top most position to draw on.
* @param str String to draw. * @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 * @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 * case a right-to-left language is chosen this is inverted so it
* will be drawn in the right direction. * will be drawn in the right direction.
@@ -610,7 +612,8 @@ Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &sugges
* @param top The top most position to draw on. * @param top The top most position to draw on.
* @param bottom The bottom most position to draw on. * @param bottom The bottom most position to draw on.
* @param str String to draw. * @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 align The horizontal and vertical alignment of the string.
* @param underline Whether to underline all strings * @param underline Whether to underline all strings
* @param fontsize The size of the initial characters. * @param fontsize The size of the initial characters.
@@ -671,7 +674,8 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, const char *st
* @param top The top most position to draw on. * @param top The top most position to draw on.
* @param bottom The bottom most position to draw on. * @param bottom The bottom most position to draw on.
* @param str String to draw. * @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 align The horizontal and vertical alignment of the string.
* @param underline Whether to underline all strings * @param underline Whether to underline all strings
* @param fontsize The size of the initial characters. * @param fontsize The size of the initial characters.
@@ -749,7 +753,8 @@ const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize)
* @param c Character (glyph) to draw * @param c Character (glyph) to draw
* @param x X position to draw character * @param x X position to draw character
* @param y Y 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) void DrawCharCentered(WChar c, int x, int y, TextColour colour)
{ {

View File

@@ -857,7 +857,7 @@ public:
switch (widget) { switch (widget) {
case WID_GL_ALL_VEHICLES: // All vehicles 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) { 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)); DoCommandP(0, this->group_sel | (1 << 16), INVALID_GROUP, CMD_ALTER_GROUP | CMD_MSG(STR_ERROR_GROUP_CAN_T_SET_PARENT));
} }

View File

@@ -3454,6 +3454,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Gazdasági épületek STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Gazdasági épületek
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs - STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs -
STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} 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 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 # Industry view

View File

@@ -360,6 +360,8 @@ STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Обер
STR_BUTTON_SORT_BY :{BLACK}Сортувати STR_BUTTON_SORT_BY :{BLACK}Сортувати
STR_BUTTON_LOCATION :{BLACK}Показати STR_BUTTON_LOCATION :{BLACK}Показати
STR_BUTTON_RENAME :{BLACK}Назва STR_BUTTON_RENAME :{BLACK}Назва
STR_BUTTON_CATCHMENT :{BLACK}Покриття
STR_TOOLTIP_CATCHMENT :{BLACK}Вкл./викл. відображення області покриття
STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закрити вікно STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закрити вікно
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{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_DEFAULT :{BLACK}Стандартно
STR_BUTTON_CANCEL :{BLACK}Відміна STR_BUTTON_CANCEL :{BLACK}Відміна
STR_BUTTON_OK :{BLACK}Так STR_BUTTON_OK :{BLACK}Так
STR_WARNING_PASSWORD_SECURITY :{YELLOW}Попередження: Адміністратори серверів можуть мати можливість читати будь-який текст, введений тут.
# On screen keyboard window # On screen keyboard window
STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\йцукенгшщзхїфівапролджє ячсмитьбю. . STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\йцукенгшщзхїфівапролджє ячсмитьбю. .
@@ -1061,6 +1064,9 @@ STR_GAME_OPTIONS_CURRENCY_GEL :Грузинс
STR_GAME_OPTIONS_CURRENCY_IRR :Іранський ріал (IRR) STR_GAME_OPTIONS_CURRENCY_IRR :Іранський ріал (IRR)
STR_GAME_OPTIONS_CURRENCY_RUB :Російський новий рубель (RUB) STR_GAME_OPTIONS_CURRENCY_RUB :Російський новий рубель (RUB)
STR_GAME_OPTIONS_CURRENCY_MXN :Мексиканське песо (MXN) 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 ############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Сторона руху транспорту 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 :Густота підприємств: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Встановіть кількість підприємств, що будуть створені і кількість підприємств, що існуватимуть впродовж гри STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Встановіть кількість підприємств, що будуть створені і кількість підприємств, що існуватимуть впродовж гри
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. відстань від краю карти до нафтопереробних заводів: {STRING} 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 :Рівень снігової шапки: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Контроль висоти, вище якої лежить сніг в субарктичному ландшафті. Сніг впливає на генерування підприємств та на умови росту міст STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Контроль висоти, вище якої лежить сніг в субарктичному ландшафті. Сніг впливає на генерування підприємств та на умови росту міст
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Грубість ландшафту: {STRING} 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_AI_IN_MULTIPLAYER_HELPTEXT :Дозволяє участь віртуальних гравців у колективній грі
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Максимально допустима кількість #opcodes: {STRING} STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :Максимально допустима кількість #opcodes: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Максимально допустима кількість розрахунків, що можуть виконати скрипти віртуальних гравців впродовж одного ходу. 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 :Інтервали техогляду вказано у відсотках: {STRING}
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Налаштування способу визначення необхідності проведення техогляду: через вказаний проміжок часу після попереднього техогляду чи коли поточна надійність транспортного засобу стане нижчою від максимальної його надійності на вказаний процент. 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_SMOOTH_ECONOMY_HELPTEXT :При включенні обсяги виробництва підприємств змінюються часто, але не дуже суттєво. Зазвичай ця опція не впливає на підприємства, додані за допомогою NewGRF.
STR_CONFIG_SETTING_ALLOW_SHARES :Дозволити придбання акції інших компаній: {STRING} STR_CONFIG_SETTING_ALLOW_SHARES :Дозволити придбання акції інших компаній: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :При включенні дозволяє придбання та продаж акцій команій. Акції компанії стають доступними після досягнення деякого віку. 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 :Відсоток прибутку за часткове перевезення: {STRING}
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Налаштування проценту прибутку, що нараховується за часткове перевезення вантажу. За допомогою даної опції можна контролювати розподіл прибутків між учасниками багатоланкових перевезень. STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Налаштування проценту прибутку, що нараховується за часткове перевезення вантажу. За допомогою даної опції можна контролювати розподіл прибутків між учасниками багатоланкових перевезень.
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :При протягуванні встановлювати сигнали через {STRING} STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :При протягуванні встановлювати сигнали через {STRING}
@@ -2264,7 +2275,7 @@ STR_NETWORK_CHAT_ALL :[Всім] {STR
STR_NETWORK_CHAT_OSKTITLE :{BLACK}Введіть текст для мережевого чату STR_NETWORK_CHAT_OSKTITLE :{BLACK}Введіть текст для мережевого чату
# Network messages # Network messages
STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Не знайдено мережевого пристрою або скомпільовано без ENABLE_NETWORK STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Не знайдено мережевого пристрою
STR_NETWORK_ERROR_NOSERVER :{WHITE}Не знайдено жодної мережевої гри STR_NETWORK_ERROR_NOSERVER :{WHITE}Не знайдено жодної мережевої гри
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Сервер не відповів на запит STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Сервер не відповів на запит
STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Не можна з'єднатись внаслідок неспівпадання NewGRF STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Не можна з'єднатись внаслідок неспівпадання NewGRF
@@ -2560,7 +2571,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_ROAD :{BLACK}Будувати/зруйнувати дорогу
STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Будувати/демонтувати колію STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Будувати/демонтувати колію
STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}Модернізувати дорогу. Утримуйте Shift для показу витрат на модернізацію 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 # Road depot construction window
STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Орієнтація депо STR_BUILD_DEPOT_ROAD_ORIENTATION_CAPTION :{WHITE}Орієнтація депо
@@ -2746,8 +2760,10 @@ STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Прий
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Тип зал.колії: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Тип зал.колії: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_ROAD_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_RAIL_SPEED_LIMIT :{BLACK}Ліміт швидкості залізниці: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_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 # Description of land area of different tiles
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Каміння STR_LAI_CLEAR_DESCRIPTION_ROCKS :Каміння
@@ -2857,6 +2873,7 @@ STR_FRAMERATE_SPEED_FACTOR :{BLACK}Наяв
STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK} Як швидко гра біжить в даний час, в порівнянні з очікуваною швидкістю при звичайній швидкості моделювання. STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK} Як швидко гра біжить в даний час, в порівнянні з очікуваною швидкістю при звичайній швидкості моделювання.
STR_FRAMERATE_CURRENT :{WHITE}Зараз STR_FRAMERATE_CURRENT :{WHITE}Зараз
STR_FRAMERATE_AVERAGE :{WHITE}Середнє STR_FRAMERATE_AVERAGE :{WHITE}Середнє
STR_FRAMERATE_MEMORYUSE :{WHITE}Пам'ять
STR_FRAMERATE_DATA_POINTS :{BLACK}Дані отримано з {COMMA} вимірюван {P "ня" "нь" "нь" } STR_FRAMERATE_DATA_POINTS :{BLACK}Дані отримано з {COMMA} вимірюван {P "ня" "нь" "нь" }
STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} мс STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} мс
STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
@@ -2864,6 +2881,9 @@ STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}
STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} кадрів/сек STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} кадрів/сек
STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} кадр{P "" "и" "ів"}/сек STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} кадр{P "" "и" "ів"}/сек
STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} кадрів/сек 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_MILLISECONDS :{TINY_FONT}{COMMA} мс
STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} с STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA} с
############ Leave those lines in this order!! ############ Leave those lines in this order!!
@@ -3131,6 +3151,7 @@ STR_NEWGRF_ERROR_GRM_FAILED :Недосту
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} був вимкнений {STRING} STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} був вимкнений {STRING}
STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Некоректний або невідомий формат розміщення спрайтів (спрайт {3:NUM}) STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Некоректний або невідомий формат розміщення спрайтів (спрайт {3:NUM})
STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Дуже багато елементів у списку значень (спрайт {3:NUM}, властивість {4:HEX}) STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Дуже багато елементів у списку значень (спрайт {3:NUM}, властивість {4:HEX})
STR_NEWGRF_ERROR_INDPROD_CALLBACK :Невірна обробка продукції підприємства (спрайт {3:NUM}, "{2:STRING}")
# NewGRF related 'general' warnings # NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Обережно! STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Обережно!
@@ -3162,6 +3183,7 @@ STR_NEWGRF_BUGGY :{WHITE}NewGRF '
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Інформація про вантаж/переобладнання для '{1:ENGINE}' відрізняється від списку покупки після побудови. Це може спричинити невідповідності під час автооновлення/заміни STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Інформація про вантаж/переобладнання для '{1:ENGINE}' відрізняється від списку покупки після побудови. Це може спричинити невідповідності під час автооновлення/заміни
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' спричинив нескінченний цикл у виклику виробництва STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' спричинив нескінченний цикл у виклику виробництва
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Виклик {1:HEX} повернув невідомий/неправильний результат {2:HEX} 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 # 'User removed essential NewGRFs'-placeholders for stuff without specs
STR_NEWGRF_INVALID_CARGO :<невідомий вантаж> STR_NEWGRF_INVALID_CARGO :<невідомий вантаж>
@@ -3228,6 +3250,8 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :Перейме
# Town local authority window # Town local authority window
STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} - місцева влада 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_RATINGS :{BLACK}Рейтинги компаній:
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING} STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Доступні дії: STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}Доступні дії:
@@ -3487,6 +3511,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}Інфр
STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Залізничні ділянки: STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT :{GOLD}Залізничні ділянки:
STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}З сигналами STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS :{WHITE}З сигналами
STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT :{GOLD}Дорожні ділянки: 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_WATER_SECT :{GOLD}Судноплавні ділянки:
STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Канали STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS :{WHITE}Канали
STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станції: STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT :{GOLD}Станції:
@@ -3497,7 +3522,12 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}{CURRENC
# Industry directory # Industry directory
STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Підприємства STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Підприємства
STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- немає - 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_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+клац мишою відкриває нове вікно з видом на підприємство STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Назви підприємств - клацніть мишою на назву, щоб показати підприємство у центрі екрану. Ctrl+клац мишою відкриває нове вікно з видом на підприємство
# Industry view # Industry view
@@ -3593,14 +3623,17 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Новий мо
STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Новий магнітний поїзд STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Новий магнітний поїзд
STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Нові автомобілі STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Нові автомобілі
STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Нові трамваї
############ range for vehicle availability starts ############ range for vehicle availability starts
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Нові потяги STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Нові потяги
STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Нові автомобілі
STR_BUY_VEHICLE_SHIP_CAPTION :Нові кораблі STR_BUY_VEHICLE_SHIP_CAPTION :Нові кораблі
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Нові літаки STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Нові літаки
############ range for vehicle availability ends ############ range for vehicle availability ends
STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} Вага: {GOLD}{WEIGHT_SHORT} 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_POWER :{BLACK}Швидкість: {GOLD}{VELOCITY}{BLACK} Потужність: {GOLD}{POWER}
STR_PURCHASE_INFO_SPEED :{BLACK}Швидкість: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED :{BLACK}Швидкість: {GOLD}{VELOCITY}
STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Швидкість в океані: {GOLD}{VELOCITY} STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}Швидкість в океані: {GOLD}{VELOCITY}
@@ -3611,8 +3644,10 @@ STR_PURCHASE_INFO_REFITTABLE :(змінюєт
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Рік випуску: {GOLD}{NUM}{BLACK} Вік: {GOLD}{COMMA} р{P ік оки оків} STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}Рік випуску: {GOLD}{NUM}{BLACK} Вік: {GOLD}{COMMA} р{P ік оки оків}
STR_PURCHASE_INFO_RELIABILITY :{BLACK}Надійність: {GOLD}{COMMA}% STR_PURCHASE_INFO_RELIABILITY :{BLACK}Надійність: {GOLD}{COMMA}%
STR_PURCHASE_INFO_COST :{BLACK}Ціна: {GOLD}{CURRENCY_LONG} 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_WEIGHT_CWEIGHT :{BLACK}Вага: {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT})
STR_PURCHASE_INFO_COST_SPEED :{BLACK}Ціна: {GOLD}{CURRENCY_LONG}{BLACK} Швидкість: {GOLD}{VELOCITY} 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_AIRCRAFT_CAPACITY :{BLACK}Місткість: {GOLD}{CARGO_LONG}, {CARGO_LONG}
STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Потужність: {GOLD}+{POWER}{BLACK} Вага: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Потужність: {GOLD}+{POWER}{BLACK} Вага: {GOLD}+{WEIGHT_SHORT}
STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Може бути переобладненим на: {GOLD}{STRING} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Може бути переобладненим на: {GOLD}{STRING}
@@ -3633,12 +3668,20 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Купи
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Купити STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Купити
STR_BUY_VEHICLE_AIRCRAFT_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_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибраний поїзд. Утримуйте Shift для показу витрат на придбання
STR_BUY_VEHICLE_ROAD_VEHICLE_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_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Купити вибраний корабель. Утримуйте Shift для показу витрат на придбання
STR_BUY_VEHICLE_AIRCRAFT_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_TRAIN_RENAME_BUTTON :{BLACK}Назва
STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Зміна назви STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Зміна назви
@@ -3750,10 +3793,12 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Пові
STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Ми розробили новий {STRING} - чи бажаєте ексклюзивно користуватись ним протягом року, так ми побачимо, як він зарекомендує себе, перед тим як буде доступним для всіх? STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Ми розробили новий {STRING} - чи бажаєте ексклюзивно користуватись ним протягом року, так ми побачимо, як він зарекомендує себе, перед тим як буде доступним для всіх?
STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :локомотив STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :локомотив
STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :електрифікований залізничний локомотив
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :монорейковий локомотив STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :монорейковий локомотив
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :магнітний локомотив STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :магнітний локомотив
STR_ENGINE_PREVIEW_ROAD_VEHICLE :автомобіль STR_ENGINE_PREVIEW_ROAD_VEHICLE :автомобіль
STR_ENGINE_PREVIEW_TRAM_VEHICLE :трамваї
STR_ENGINE_PREVIEW_AIRCRAFT :літак STR_ENGINE_PREVIEW_AIRCRAFT :літак
STR_ENGINE_PREVIEW_SHIP :корабель STR_ENGINE_PREVIEW_SHIP :корабель
@@ -3795,14 +3840,18 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Пере
STR_REPLACE_ENGINES :Локомотиви STR_REPLACE_ENGINES :Локомотиви
STR_REPLACE_WAGONS :Вагони STR_REPLACE_WAGONS :Вагони
STR_REPLACE_ALL_RAILTYPE :Весь з/д транспорт STR_REPLACE_ALL_RAILTYPE :Весь з/д транспорт
STR_REPLACE_ALL_ROADTYPE :Всі автомобілі
STR_REPLACE_HELP_RAILTYPE :{BLACK}Виберіть тип колії, для якого ви збираєтесь оновити потяги STR_REPLACE_HELP_RAILTYPE :{BLACK}Виберіть тип колії, для якого ви збираєтесь оновити потяги
STR_REPLACE_HELP_ROADTYPE :{BLACK}Виберіть тип дороги, на який хочете замінити двигуни
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Показує, яким потягом буде замінено потяг, вибраний ліворуч STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Показує, яким потягом буде замінено потяг, вибраний ліворуч
STR_REPLACE_RAIL_VEHICLES :Неелектрифіковані поїзди STR_REPLACE_RAIL_VEHICLES :Неелектрифіковані поїзди
STR_REPLACE_ELRAIL_VEHICLES :Електрифіковані поїзди STR_REPLACE_ELRAIL_VEHICLES :Електрифіковані поїзди
STR_REPLACE_MONORAIL_VEHICLES :Монорейкові поїзди STR_REPLACE_MONORAIL_VEHICLES :Монорейкові поїзди
STR_REPLACE_MAGLEV_VEHICLES :Магнітні поїзди STR_REPLACE_MAGLEV_VEHICLES :Магнітні поїзди
STR_REPLACE_ROAD_VEHICLES :Авто
STR_REPLACE_TRAM_VEHICLES :Трамвайні транспортні засоби
STR_REPLACE_REMOVE_WAGON :{BLACK}Ліквідація зайвих вагонів: {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON :{BLACK}Ліквідація зайвих вагонів: {ORANGE}{STRING}
STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Дозволити автооновленню видаляти вагони, зберігаючи довжину потягу (починаючи спереду), якщо оновлення робить поїзд довшим STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Дозволити автооновленню видаляти вагони, зберігаючи довжину потягу (починаючи спереду), якщо оновлення робить поїзд довшим
@@ -4547,6 +4596,11 @@ STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Не м
STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... тут немає дороги STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... тут немає дороги
STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... тут немає трамвайних шляхів STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... тут немає трамвайних шляхів
STR_ERROR_CAN_T_CONVERT_ROAD :{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 # Waterway construction errors
STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Неможливо будувати канал тут... STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}Неможливо будувати канал тут...

View File

@@ -8060,8 +8060,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); grfmsg(2, "StaticGRFInfo: expected 8 bytes for 'INFO'->'PARA'->'LIMI' but got " PRINTF_SIZE ", ignoring this field", len);
buf->Skip(len); buf->Skip(len);
} else { } else {
_cur_parameter->min_value = buf->ReadDWord(); uint32 min_value = buf->ReadDWord();
_cur_parameter->max_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; return true;
} }

View File

@@ -13,6 +13,7 @@
#include "signs_func.h" #include "signs_func.h"
#include "strings_func.h" #include "strings_func.h"
#include "core/pool_func.hpp" #include "core/pool_func.hpp"
#include "viewport_kdtree.h"
#include "table/strings.h" #include "table/strings.h"
@@ -46,8 +47,13 @@ Sign::~Sign()
void Sign::UpdateVirtCoord() void Sign::UpdateVirtCoord()
{ {
Point pt = RemapCoords(this->x, this->y, this->z); Point pt = RemapCoords(this->x, this->y, this->z);
if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(this->index));
SetDParam(0, this->index); SetDParam(0, this->index);
this->sign.UpdatePosition(pt.x, pt.y - 6 * ZOOM_LVL_BASE, STR_WHITE_SIGN); this->sign.UpdatePosition(pt.x, pt.y - 6 * ZOOM_LVL_BASE, STR_WHITE_SIGN);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(this->index));
} }
/** Update the coordinates of all signs */ /** Update the coordinates of all signs */

View File

@@ -19,12 +19,12 @@ typedef Pool<Sign, SignID, 16, 64000> SignPool;
extern SignPool _sign_pool; extern SignPool _sign_pool;
struct Sign : SignPool::PoolItem<&_sign_pool> { struct Sign : SignPool::PoolItem<&_sign_pool> {
char *name; char *name;
ViewportSign sign; TrackedViewportSign sign;
int32 x; int32 x;
int32 y; int32 y;
int32 z; int32 z;
Owner owner; // placed by this company. Anyone can delete them though. OWNER_NONE for gray signs from old games. 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(Owner owner = INVALID_OWNER);
~Sign(); ~Sign();

View File

@@ -57,7 +57,6 @@ CommandCost CmdPlaceSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
si->name = stredup(text); si->name = stredup(text);
} }
si->UpdateVirtCoord(); si->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(si->index));
InvalidateWindowData(WC_SIGN_LIST, 0, 0); InvalidateWindowData(WC_SIGN_LIST, 0, 0);
_new_sign_id = si->index; _new_sign_id = si->index;
} }
@@ -99,7 +98,7 @@ CommandCost CmdRenameSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
} else { // Delete sign } else { // Delete sign
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
si->sign.MarkDirty(); si->sign.MarkDirty();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index)); if (_viewport_sign_kdtree_valid && si->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeSign(si->index));
delete si; delete si;
InvalidateWindowData(WC_SIGN_LIST, 0, 0); InvalidateWindowData(WC_SIGN_LIST, 0, 0);

View File

@@ -167,7 +167,7 @@ Station::~Station()
CargoPacket::InvalidateAllFrom(this->index); CargoPacket::InvalidateAllFrom(this->index);
_station_kdtree.Remove(this->index); _station_kdtree.Remove(this->index);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index, this->viewport_sign_kdtree_pt)); if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
} }

View File

@@ -414,10 +414,14 @@ void Station::UpdateVirtCoord()
pt.y -= 32 * ZOOM_LVL_BASE; pt.y -= 32 * ZOOM_LVL_BASE;
if ((this->facilities & FACIL_AIRPORT) && this->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE; if ((this->facilities & FACIL_AIRPORT) && this->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE;
if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index));
SetDParam(0, this->index); SetDParam(0, this->index);
SetDParam(1, this->facilities); SetDParam(1, this->facilities);
this->sign.UpdatePosition(pt.x, pt.y, STR_VIEWPORT_STATION); this->sign.UpdatePosition(pt.x, pt.y, STR_VIEWPORT_STATION);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
SetWindowDirty(WC_STATION_VIEW, this->index); SetWindowDirty(WC_STATION_VIEW, this->index);
} }
@@ -429,13 +433,11 @@ void Station::MoveSign(TileIndex new_xy)
{ {
if (this->xy == new_xy) return; if (this->xy == new_xy) return;
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index, this->viewport_sign_kdtree_pt));
_station_kdtree.Remove(this->index); _station_kdtree.Remove(this->index);
this->BaseStation::MoveSign(new_xy); this->BaseStation::MoveSign(new_xy);
_station_kdtree.Insert(this->index); _station_kdtree.Insert(this->index);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index));
} }
/** Update the virtual coords needed to draw the station sign for all stations. */ /** Update the virtual coords needed to draw the station sign for all stations. */
@@ -707,7 +709,6 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
*st = new Station(area.tile); *st = new Station(area.tile);
_station_kdtree.Insert((*st)->index); _station_kdtree.Insert((*st)->index);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation((*st)->index));
(*st)->town = ClosestTownFromTile(area.tile, UINT_MAX); (*st)->town = ClosestTownFromTile(area.tile, UINT_MAX);
(*st)->string_id = GenerateStationName(*st, area.tile, name_class); (*st)->string_id = GenerateStationName(*st, area.tile, name_class);
@@ -4404,7 +4405,6 @@ void BuildOilRig(TileIndex tile)
st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE); st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
st->UpdateVirtCoord(); st->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
st->RecomputeCatchment(); st->RecomputeCatchment();
UpdateStationAcceptance(st, false); UpdateStationAcceptance(st, false);
ZoningMarkDirtyStationCoverageArea(st); ZoningMarkDirtyStationCoverageArea(st);

View File

@@ -48,7 +48,7 @@ extern TownPool _town_pool;
struct TownCache { struct TownCache {
uint32 num_houses; ///< Amount of houses uint32 num_houses; ///< Amount of houses
uint32 population; ///< Current population of people 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? 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 uint32 squared_town_zone_radius[HZB_END]; ///< UpdateTownRadius updates this given the house count
BuildingCounts<uint16> building_counts; ///< The number of each type of building in the town BuildingCounts<uint16> building_counts; ///< The number of each type of building in the town

View File

@@ -514,10 +514,15 @@ void Town::UpdateVirtCoord()
{ {
this->UpdateLabel(); this->UpdateLabel();
Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE); Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE);
if (_viewport_sign_kdtree_valid && this->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(this->index));
SetDParam(0, this->index); SetDParam(0, this->index);
SetDParam(1, this->cache.population); SetDParam(1, this->cache.population);
this->cache.sign.UpdatePosition(pt.x, pt.y - 24 * ZOOM_LVL_BASE, this->Label(), STR_VIEWPORT_TOWN); this->cache.sign.UpdatePosition(pt.x, pt.y - 24 * ZOOM_LVL_BASE, this->Label(), STR_VIEWPORT_TOWN);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(this->index));
SetWindowDirty(WC_TOWN_VIEW, this->index); SetWindowDirty(WC_TOWN_VIEW, this->index);
} }
@@ -2013,7 +2018,6 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize
t->townnameparts = townnameparts; t->townnameparts = townnameparts;
t->UpdateVirtCoord(); t->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index));
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0); InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0);
t->InitializeLayout(layout); t->InitializeLayout(layout);
@@ -3251,7 +3255,7 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
/* The town destructor will delete the other things related to the town. */ /* The town destructor will delete the other things related to the town. */
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
_town_kdtree.Remove(t->index); _town_kdtree.Remove(t->index);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index)); if (_viewport_sign_kdtree_valid && t->cache.sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeTown(t->index));
delete t; delete t;
} }

View File

@@ -3368,16 +3368,10 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id)
item.type = VKI_STATION; item.type = VKI_STATION;
item.id.station = id; item.id.station = id;
Station *st = Station::Get(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); assert(st->sign.kdtree_valid);
item.center = st->sign.center;
pt.y -= 32 * ZOOM_LVL_BASE; item.top = st->sign.top;
if ((st->facilities & FACIL_AIRPORT) && st->airport.type == AT_OILRIG) pt.y -= 16 * ZOOM_LVL_BASE;
st->viewport_sign_kdtree_pt = pt;
item.center = pt.x;
item.top = pt.y;
/* Assume the sign can be a candidate for drawing, so measure its width */ /* Assume the sign can be a candidate for drawing, so measure its width */
_viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, st->sign.width_normal); _viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, st->sign.width_normal);
@@ -3385,31 +3379,16 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id)
return item; return item;
} }
ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id, Point pt)
{
ViewportSignKdtreeItem item;
item.type = VKI_STATION;
item.id.station = id;
item.center = pt.x;
item.top = pt.y;
return item;
}
ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id) ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id)
{ {
ViewportSignKdtreeItem item; ViewportSignKdtreeItem item;
item.type = VKI_WAYPOINT; item.type = VKI_WAYPOINT;
item.id.station = id; item.id.station = id;
Waypoint *st = Waypoint::Get(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); assert(st->sign.kdtree_valid);
item.center = st->sign.center;
pt.y -= 32 * ZOOM_LVL_BASE; item.top = st->sign.top;
st->viewport_sign_kdtree_pt = pt;
item.center = pt.x;
item.top = pt.y;
/* Assume the sign can be a candidate for drawing, so measure its width */ /* Assume the sign can be a candidate for drawing, so measure its width */
_viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, st->sign.width_normal); _viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, st->sign.width_normal);
@@ -3417,16 +3396,6 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id)
return item; return item;
} }
ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id, Point pt)
{
ViewportSignKdtreeItem item;
item.type = VKI_WAYPOINT;
item.id.station = id;
item.center = pt.x;
item.top = pt.y;
return item;
}
ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeTown(TownID id) ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeTown(TownID id)
{ {
ViewportSignKdtreeItem item; ViewportSignKdtreeItem item;
@@ -3434,14 +3403,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeTown(TownID id)
item.id.town = id; item.id.town = id;
const Town *town = Town::Get(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. assert(town->cache.sign.kdtree_valid);
* Instead "fake" foundations by taking the highest Z coordinate of any corner of the tile. */ item.center = town->cache.sign.center;
Point pt = RemapCoords(TileX(town->xy) * TILE_SIZE, TileY(town->xy) * TILE_SIZE, GetTileMaxZ(town->xy) * TILE_HEIGHT); item.top = town->cache.sign.top;
pt.y -= 24 * ZOOM_LVL_BASE;
item.center = pt.x;
item.top = pt.y;
/* Assume the sign can be a candidate for drawing, so measure its width */ /* Assume the sign can be a candidate for drawing, so measure its width */
_viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, town->cache.sign.width_normal); _viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, town->cache.sign.width_normal);
@@ -3456,12 +3420,9 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeSign(SignID id)
item.id.sign = id; item.id.sign = id;
const Sign *sign = Sign::Get(id); const Sign *sign = Sign::Get(id);
Point pt = RemapCoords(sign->x, sign->y, sign->z); assert(sign->sign.kdtree_valid);
item.center = sign->sign.center;
pt.y -= 6 * ZOOM_LVL_BASE; item.top = sign->sign.top;
item.center = pt.x;
item.top = pt.y;
/* Assume the sign can be a candidate for drawing, so measure its width */ /* Assume the sign can be a candidate for drawing, so measure its width */
_viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, sign->sign.width_normal); _viewport_sign_maxwidth = max<int>(_viewport_sign_maxwidth, sign->sign.width_normal);
@@ -3487,22 +3448,22 @@ void RebuildViewportKdtree()
const Station *st; const Station *st;
FOR_ALL_STATIONS(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; const Waypoint *wp;
FOR_ALL_WAYPOINTS(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; const Town *town;
FOR_ALL_TOWNS(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; const Sign *sign;
FOR_ALL_SIGNS(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()); _viewport_sign_kdtree.Build(items.begin(), items.end());

View File

@@ -65,9 +65,7 @@ struct ViewportSignKdtreeItem {
} }
static ViewportSignKdtreeItem MakeStation(StationID id); static ViewportSignKdtreeItem MakeStation(StationID id);
static ViewportSignKdtreeItem MakeStation(StationID id, Point pt);
static ViewportSignKdtreeItem MakeWaypoint(StationID id); static ViewportSignKdtreeItem MakeWaypoint(StationID id);
static ViewportSignKdtreeItem MakeWaypoint(StationID id, Point pt);
static ViewportSignKdtreeItem MakeTown(TownID id); static ViewportSignKdtreeItem MakeTown(TownID id);
static ViewportSignKdtreeItem MakeSign(SignID id); static ViewportSignKdtreeItem MakeSign(SignID id);
}; };

View File

@@ -66,6 +66,26 @@ struct ViewportSign {
void MarkDirty(ZoomLevel maxzoom = ZOOM_LVL_MAX) const; 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. * Directions of zooming.
* @see DoZoomInOutWindow * @see DoZoomInOutWindow

View File

@@ -49,26 +49,11 @@ void Waypoint::GetTileArea(TileArea *ta, StationType type) const
} }
} }
/**
* Move the waypoint main coordinate somewhere else.
* @param new_xy new tile location of the sign
*/
void Waypoint::MoveSign(TileIndex new_xy)
{
if (this->xy == new_xy) return;
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index, this->viewport_sign_kdtree_pt));
this->BaseStation::MoveSign(new_xy);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index));
}
Waypoint::~Waypoint() Waypoint::~Waypoint()
{ {
if (CleaningPool()) return; if (CleaningPool()) return;
DeleteWindowById(WC_WAYPOINT_VIEW, this->index); DeleteWindowById(WC_WAYPOINT_VIEW, this->index);
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index); RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index, this->viewport_sign_kdtree_pt)); if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index); TraceRestrictRemoveDestinationID(TROCAF_WAYPOINT, this->index);
} }

View File

@@ -39,12 +39,28 @@
void Waypoint::UpdateVirtCoord() void Waypoint::UpdateVirtCoord()
{ {
Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE); Point pt = RemapCoords2(TileX(this->xy) * TILE_SIZE, TileY(this->xy) * TILE_SIZE);
if (_viewport_sign_kdtree_valid && this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
SetDParam(0, this->index); SetDParam(0, this->index);
this->sign.UpdatePosition(pt.x, pt.y - 32 * ZOOM_LVL_BASE, STR_VIEWPORT_WAYPOINT); this->sign.UpdatePosition(pt.x, pt.y - 32 * ZOOM_LVL_BASE, STR_VIEWPORT_WAYPOINT);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(this->index));
/* Recenter viewport */ /* Recenter viewport */
InvalidateWindowData(WC_WAYPOINT_VIEW, this->index); InvalidateWindowData(WC_WAYPOINT_VIEW, this->index);
} }
/**
* Move the waypoint main coordinate somewhere else.
* @param new_xy new tile location of the sign
*/
void Waypoint::MoveSign(TileIndex new_xy)
{
if (this->xy == new_xy) return;
this->BaseStation::MoveSign(new_xy);
}
/** /**
* Find a deleted waypoint close to a tile. * Find a deleted waypoint close to a tile.
* @param tile to search from * @param tile to search from
@@ -237,15 +253,11 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
} }
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
bool need_sign_update = false;
if (wp == nullptr) { if (wp == nullptr) {
wp = new Waypoint(start_tile); wp = new Waypoint(start_tile);
need_sign_update = true;
} else if (!wp->IsInUse()) { } else if (!wp->IsInUse()) {
/* Move existing (recently deleted) waypoint to the new location */ /* Move existing (recently deleted) waypoint to the new location */
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index, wp->viewport_sign_kdtree_pt));
wp->xy = start_tile; wp->xy = start_tile;
need_sign_update = true;
} }
wp->owner = GetTileOwner(start_tile); wp->owner = GetTileOwner(start_tile);
@@ -260,7 +272,6 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
if (wp->town == nullptr) MakeDefaultName(wp); if (wp->town == nullptr) MakeDefaultName(wp);
wp->UpdateVirtCoord(); wp->UpdateVirtCoord();
if (need_sign_update && _viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
byte map_spec_index = AllocateSpecToStation(spec, wp, true); byte map_spec_index = AllocateSpecToStation(spec, wp, true);
@@ -317,7 +328,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
wp = new Waypoint(tile); wp = new Waypoint(tile);
} else { } else {
/* Move existing (recently deleted) buoy to the new location */ /* Move existing (recently deleted) buoy to the new location */
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index, wp->viewport_sign_kdtree_pt));
wp->xy = tile; wp->xy = tile;
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
} }
@@ -337,7 +347,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
wp->UpdateVirtCoord(); wp->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
} }