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
pull/121/head
Jonathan G Rennison 5 years ago
commit fe9b024f1a

@ -54,7 +54,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
@ -78,8 +78,6 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
TileArea train_station; ///< Tile area the train 'station' part covers
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.
* @param tile The location of the station sign

@ -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 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.
@ -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 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.
@ -610,7 +612,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.
@ -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 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.
@ -749,7 +753,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)
{

@ -857,7 +857,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));
}

@ -3454,6 +3454,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

@ -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}
@ -2264,7 +2275,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
@ -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_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}Орієнтація депо
@ -2746,8 +2760,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 :Каміння
@ -2857,6 +2873,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
@ -2864,6 +2881,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!!
@ -3131,6 +3151,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}Обережно!
@ -3162,6 +3183,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 :<невідомий вантаж>
@ -3228,6 +3250,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}Доступні дії:
@ -3487,6 +3511,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}Станції:
@ -3497,7 +3522,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
@ -3593,14 +3623,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}
@ -3611,8 +3644,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}
@ -3633,12 +3668,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}Зміна назви
@ -3750,10 +3793,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 :корабель
@ -3795,14 +3840,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}Дозволити автооновленню видаляти вагони, зберігаючи довжину потягу (починаючи спереду), якщо оновлення робить поїзд довшим
@ -4547,6 +4596,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}Неможливо будувати канал тут...

@ -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);
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;
}

@ -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 (_viewport_sign_kdtree_valid && 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);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeSign(this->index));
}
/** Update the coordinates of all signs */

@ -19,12 +19,12 @@ typedef Pool<Sign, SignID, 16, 64000> 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();

@ -57,7 +57,6 @@ CommandCost CmdPlaceSign(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
si->name = stredup(text);
}
si->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _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();
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;
InvalidateWindowData(WC_SIGN_LIST, 0, 0);

@ -167,7 +167,7 @@ Station::~Station()
CargoPacket::InvalidateAllFrom(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));
}

@ -414,10 +414,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 (_viewport_sign_kdtree_valid && 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);
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(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 (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeStation(this->index, this->viewport_sign_kdtree_pt));
_station_kdtree.Remove(this->index);
this->BaseStation::MoveSign(new_xy);
_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. */
@ -707,7 +709,6 @@ static CommandCost BuildStationPart(Station **st, DoCommandFlag flags, bool reus
if (flags & DC_EXEC) {
*st = new Station(area.tile);
_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)->string_id = GenerateStationName(*st, area.tile, name_class);
@ -4404,7 +4405,6 @@ void BuildOilRig(TileIndex tile)
st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
st->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(st->index));
st->RecomputeCatchment();
UpdateStationAcceptance(st, false);
ZoningMarkDirtyStationCoverageArea(st);

@ -48,7 +48,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<uint16> building_counts; ///< The number of each type of building in the town

@ -514,10 +514,15 @@ void Town::UpdateVirtCoord()
{
this->UpdateLabel();
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(1, this->cache.population);
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);
}
@ -2013,7 +2018,6 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize
t->townnameparts = townnameparts;
t->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeTown(t->index));
InvalidateWindowData(WC_TOWN_DIRECTORY, 0, 0);
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. */
if (flags & DC_EXEC) {
_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;
}

@ -3368,16 +3368,10 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id)
item.type = VKI_STATION;
item.id.station = id;
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;
st->viewport_sign_kdtree_pt = pt;
item.center = pt.x;
item.top = pt.y;
const Station *st = Station::Get(id);
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<int>(_viewport_sign_maxwidth, st->sign.width_normal);
@ -3385,31 +3379,16 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeStation(StationID id)
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 item;
item.type = VKI_WAYPOINT;
item.id.station = id;
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;
st->viewport_sign_kdtree_pt = pt;
item.center = pt.x;
item.top = pt.y;
const Waypoint *st = Waypoint::Get(id);
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<int>(_viewport_sign_maxwidth, st->sign.width_normal);
@ -3417,16 +3396,6 @@ ViewportSignKdtreeItem ViewportSignKdtreeItem::MakeWaypoint(StationID id)
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 item;
@ -3434,14 +3403,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<int>(_viewport_sign_maxwidth, town->cache.sign.width_normal);
@ -3456,12 +3420,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<int>(_viewport_sign_maxwidth, sign->sign.width_normal);
@ -3487,22 +3448,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());

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

@ -66,6 +66,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

@ -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()
{
if (CleaningPool()) return;
DeleteWindowById(WC_WAYPOINT_VIEW, 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);
}

@ -39,12 +39,28 @@
void Waypoint::UpdateVirtCoord()
{
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);
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 */
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.
* @param tile to search from
@ -237,15 +253,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 */
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(wp->index, wp->viewport_sign_kdtree_pt));
wp->xy = start_tile;
need_sign_update = true;
}
wp->owner = GetTileOwner(start_tile);
@ -260,7 +272,6 @@ CommandCost CmdBuildRailWaypoint(TileIndex start_tile, DoCommandFlag flags, uint
if (wp->town == nullptr) MakeDefaultName(wp);
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);
@ -317,7 +328,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
wp = new Waypoint(tile);
} else {
/* 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;
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
}
@ -337,7 +347,6 @@ CommandCost CmdBuildBuoy(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
MarkTileDirtyByTile(tile);
wp->UpdateVirtCoord();
if (_viewport_sign_kdtree_valid) _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeWaypoint(wp->index));
InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index);
}

Loading…
Cancel
Save