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:
@@ -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
|
||||
|
15
src/gfx.cpp
15
src/gfx.cpp
@@ -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 */
|
||||
|
@@ -20,7 +20,7 @@ extern SignPool _sign_pool;
|
||||
|
||||
struct Sign : SignPool::PoolItem<&_sign_pool> {
|
||||
char *name;
|
||||
ViewportSign sign;
|
||||
TrackedViewportSign sign;
|
||||
int32 x;
|
||||
int32 y;
|
||||
int32 z;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user