From 09b71c97aac902a2d7b47f4a4d8e73a0884031be Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 2 Feb 2022 18:47:18 +0000 Subject: [PATCH 1/6] Update: Translations from eints belarusian: 35 changes by KorneySan --- src/lang/belarusian.txt | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 1dbc92f0b1..1ea08e6e59 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1318,8 +1318,10 @@ STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Паме STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Абярыце памер шрыфта, выкарыстоўванага ў гульні STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Звычайны +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Падвоены +STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Чашчыня абнаўлення экрана STR_GAME_OPTIONS_BASE_GRF :{BLACK}Набор базавай ґрафікі STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Выбар базавага набору ґрафічных аб'ектаў @@ -1421,6 +1423,7 @@ STR_TERRAIN_TYPE_FLAT :Раўнінн STR_TERRAIN_TYPE_HILLY :Узгорастая STR_TERRAIN_TYPE_MOUNTAINOUS :Гарыстая STR_TERRAIN_TYPE_ALPINIST :Выключна горны +STR_TERRAIN_TYPE_CUSTOM :Усталяваць вышыню ўручную ###length 3 STR_CITY_APPROVAL_PERMISSIVE :Дазваляючае @@ -1504,6 +1507,7 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Задайце STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Множнік субсыдыяў: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Усталюйце множнік аплаты за перавозкі, якія субсыдуюцца +STR_CONFIG_SETTING_SUBSIDY_DURATION :Працягласць субсідый: {STRING} ###setting-zero-is-special @@ -1522,6 +1526,8 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Пераклю STR_CONFIG_SETTING_CITY_APPROVAL :Стаўленьне гарадзкой рады да рэструктурызацыі навакольляў: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Выберыце ўзровень шуму й забруджваньня навакольнага асяроддзя кампаніямі, які ўплывае на іх рэйтынґ у гарадах і магчымасьць далейшага будаўніцтва каля гарадоў +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Усталяваць максімальнае значэнне вышыні гор на карце. «(Аўтавылучэнне)» падбярэ прымальнае значэнне пасля стварэння ландшафту. +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} ###setting-zero-is-special STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Немагчыма зьмяніць максімальную вышыню. На мапе ёсць горы вышэй гэтага значэньня. @@ -1726,6 +1732,7 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Вышыня с STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Азначце, на якой вышыні ў субарктычным клімаце ўсталёўваецца снегавы полаг. Наяўнасьць снега ўплывае на расстаноўку прадпрыемстваў і на ўмовы росту гарадоў. +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Гэта значэнне вызначае прыкладны адносны плошчу сушы, пакрытай пяском у трапічным клімаце. Пустэльні ўплываюць на размяшчэнне прадпрыемстваў.{}Выкарыстоўваецца толькі пры стварэнні карты. STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Нароўнасьць ляндшафту: {STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Толькі для TerraGenesis){}Выберыце колькасьць гор і ўзгоркаў на карце. На гладкім ландшафце ўзгоркаў трохі і яны больш пакатыя. На грубым - шмат гор, і ландшафт можа здацца занадта аднастайным. @@ -1820,6 +1827,7 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Адзіноч STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :Адзіночная пстрычка (неадкладна) ###length 3 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_NEVER :не STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :Эмуляцыя правага кліка мышы: {STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :Выбаць мэтад імітацыі націсьненьня правай кнопкі мышы. @@ -2092,6 +2100,7 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :лінейна STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Расстаноўка дрэваў у гульні: {STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Кантроль адвольнага з'яўленьня дрэваў падчас гульні. Гэта можа закрануць прадпрыемствы, якія залежаць ад росту дрэваў, напрыклад, пільні. ###length 4 +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Растуць, але не распаўсюджваюцца {RED}(ломіцца пільня) STR_CONFIG_SETTING_TOOLBAR_POS :Разьмяшчэньне галоўнай панэлі: {STRING} STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Гарызантальнае разьмяшчэньне галоўнай панэлі інструмэнтаў зьверху экрана. @@ -2120,6 +2129,7 @@ STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x +STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT :Абмежаванне максімальнага разрознення спрайтаў адключае выкарыстанне графікі высокага разрознення, нават калі яна даступная. Гэта можна выкарыстоўваць для ўніфікацыі вонкавага выгляду гульні пры адначасовым выкарыстанні розных модуляў NewGRF, некаторыя з якіх утрымоўваюць графіку высокага разрознення, а іншыя - не. ###length 3 STR_CONFIG_SETTING_TOWN_GROWTH :Хуткасьць росту гарадоў: {STRING} @@ -2174,6 +2184,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Паказва STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :ангельскія (міль/г) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :мэтрычная (км/г) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :СІ (м/с) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :нутрагульнявая (клеткі ў дзень) STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Сыстэма адзінак для магутнасьці: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Паказваць магутнасьць рухавікоў транспартных сродкаў у выбранай сыстэме адзінак @@ -2438,6 +2449,7 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Зьмя # Matches ServerGameType ###length 3 +STR_NETWORK_SERVER_VISIBILITY_LOCAL :Лакальны # Network server list STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Сеткавая гульня @@ -2473,6 +2485,7 @@ STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Бяг STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Ахавана паролем! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}СЭРВЭР АДКЛЮЧАНЫ STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}СЭРВЭР ЗАПОЎНЕНЫ +STR_NETWORK_SERVER_LIST_SERVER_BANNED :{SILVER}ВЫ ЗАБЛАКАВАНЫ НА СЕРВЕРЫ STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}ВЭРСІЯ НЕ ПАДЫХОДЗІЦЬ STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}НЕ СУПАДАЕ НАБОР NEWGRF @@ -2480,6 +2493,7 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Далу STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Абнавіць сэрвэр STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Абнавіць iнфармацыю аб сэрвэры +STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Пошук агульнадаступных сервераў у інтэрнэце STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Дадаць сэрвэр STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Дадаць сэрвэр у сьпіс, які будзе аўтаматычна правярацца на ідучыя гульні STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Запуск сэрвэра @@ -2530,11 +2544,16 @@ STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Камп STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Сьпіс кліентаў # Network client list +STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Адправіць паведамленне гэтаму гульцу +STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Заснаваць новую транспартную кампанію й далучыцца да яе +STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Гэта арганізатар гульні # Matches ConnectionType ###length 5 +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Адключыць +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}Адключыць гульца «{STRING}»? STR_NETWORK_SPECTATORS :Назіральнікі @@ -2639,6 +2658,7 @@ STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} з STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Гэты сэрвэр закрыў сэсію STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Гэты сэрвэр перазапускаецца...{}Пачакайце, калі ласка +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Іншыя гульцы не змогуць далучыцца да вашага сервера # Content downloading window STR_CONTENT_TITLE :{WHITE}Кантэнт запампоўваецца @@ -2731,6 +2751,8 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Так, спампаваць ґрафiку STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Не, выйсьцi з OpenTTD +STR_MISSING_GRAPHICS_ERROR :{BLACK}Не атрымалася запампаваць графіку.{}Калі ласка, загрузіце графіку ўручную. +STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}Выйсці з OpenTTD # Transparency settings window STR_TRANSPARENCY_CAPTION :{WHITE}Наладкі празрыстасьці @@ -2774,6 +2796,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Аб'я STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Пабудаваць асобны пункт шляху # Generic toolbar +STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Адключана, бо няма прыдатных транспартных сродкаў для гэтай інфраструктуры # Rail construction toolbar STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Чыгунка @@ -3178,6 +3201,7 @@ STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Факт STR_FRAMERATE_DATA_POINTS :{BLACK}Дадзеныя па {COMMA} вымярэнь{P ню ям ям} STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} мс STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} мс +STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} мс STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL} кадр{P "" а аў}/с STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} кадр{P "" а аў}/с STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} @@ -3186,14 +3210,17 @@ STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COM ###length 15 STR_FRAMERATE_GAMELOOP :{BLACK}Разлік гульнявога цыклу: +STR_FRAMERATE_GL_ROADVEHS :{BLACK} Рух аўтамабіляў: STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Рух паветраных судоў: STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Затрымка ґрафа размеркаваньня: +STR_FRAMERATE_DRAWING :{BLACK}Адмалёўка адлюстравання: STR_FRAMERATE_ALLSCRIPTS :{BLACK}Усяго скрыптоў/ШІ: STR_FRAMERATE_GAMESCRIPT :{BLACK} Гульнявы скрыпт: STR_FRAMERATE_AI :{BLACK} ШІ {NUM} {STRING} ###length 15 STR_FRAMETIME_CAPTION_GAMELOOP :Разлік гульнявога цыклу +STR_FRAMETIME_CAPTION_GL_TRAINS :Рух цягнікоў STR_FRAMETIME_CAPTION_GL_ROADVEHS :Рух аўтамабіляў STR_FRAMETIME_CAPTION_GL_SHIPS :Рух караблёў STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Рух паветраных судоў @@ -3242,6 +3269,8 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Колькасьць гарадоў: STR_MAPGEN_DATE :{BLACK}Дата: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Колькасьць прадпрыемстваў: +STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% +STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Паменшыць плошчу пяшчанага пакрыцця на 10% STR_MAPGEN_LAND_GENERATOR :{BLACK}Ґенэратар ляндшафту: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тып ляндшафту: STR_MAPGEN_QUANTITY_OF_SEA_LAKES :{BLACK}Колькасьць азёраў/мораў: @@ -3403,6 +3432,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}Увага STR_NEWGRF_ERROR_MSG_ERROR :{RED}Памылка: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Крытычная памылка: {SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Памылка пры рабоце з NewGRF:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}Памылка, звязаная з модулем NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} ня будзе працаваць з вэрсіяй TTDPatch, паведламленай OpenTTD. STR_NEWGRF_ERROR_DOS_OR_WINDOWS :Файл {1:STRING} патрабуе {STRING}-вэрсію TTD. STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} зроблены для выкарыстаньня сумесна з {STRING} @@ -3480,6 +3510,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Пера # Sign window STR_EDIT_SIGN_CAPTION :{WHITE}Зьмяніць надпіс на таблічцы +STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Паказаць знак у асноўным акне. Ctrl+пстрычка - паказаць у дадатковым акне. STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Да наступнай таблічкi STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Да папярэдняй таблічкi @@ -3794,6 +3825,7 @@ STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUST STR_INDUSTRY_DIRECTORY_ITEM_PROD2 :{ORANGE}{INDUSTRY} {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_ITEM_PRODMORE :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} і яшчэ {NUM}... STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}Сьпіс прадпрыемстваў: пстрычка па назьве паказвае прадпрыемства ў асноўным вакне. Ctrl+клік - у дадатковым вакне. +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}Прыманы груз: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :Любы STR_INDUSTRY_DIRECTORY_FILTER_NONE :Адсутнічае @@ -3939,6 +3971,7 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Купі STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Купіць ###length VEHICLE_TYPES +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купіць і пераабсталяваць STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Купіць і пераабсталяваць ###length VEHICLE_TYPES @@ -4162,6 +4195,7 @@ STR_REPLACE_ROAD_VEHICLES :Аўтатра STR_REPLACE_TRAM_VEHICLES :Трамваі STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Дазволіць пры аўтазамене захоўваць даўжыню цягнікоў шляхам выдаленьня ваґонаў (пачынаючы з галавы цягніка), калі пры аўтазамене лякаматыва павялічыцца даўжыня цягніка. +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}{}Ctrl+пстрычка - ужыць таксама і да ўкладзеных груп. # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} @@ -4442,6 +4476,7 @@ STR_ORDER_REFIT_STOP_ORDER :(Пераабс STR_ORDER_STOP_ORDER :(Стоп) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} +STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(Няверны тып){POP_COLOUR} {STRING} {STATION} {STRING} STR_ORDER_IMPLICIT :(Аўтаматычна) From d9a37c915fd811877b2ffefa8b5453056a659566 Mon Sep 17 00:00:00 2001 From: J0anJosep Date: Sat, 8 Jan 2022 12:01:37 +0100 Subject: [PATCH 2/6] Cleanup #9725: Replace cmd_helper related functions and remove cmd_helper.h. --- src/CMakeLists.txt | 1 - src/bridge_gui.cpp | 1 - src/cmd_helper.h | 45 ---------------------------------------- src/company_cmd.cpp | 1 - src/gfx_func.h | 11 ++++++++++ src/group_cmd.cpp | 1 - src/industry_cmd.cpp | 1 - src/misc_cmd.cpp | 1 - src/order_cmd.cpp | 1 - src/rail_cmd.cpp | 3 +-- src/road_cmd.cpp | 9 ++++---- src/road_map.h | 11 ++++++++++ src/station_cmd.cpp | 5 ++--- src/story.cpp | 9 +++++--- src/story_base.h | 11 ++++++++++ src/timetable_cmd.cpp | 1 - src/town_cmd.cpp | 1 - src/tunnelbridge_cmd.cpp | 1 - src/vehicle_cmd.cpp | 1 - src/water_cmd.cpp | 5 ++--- src/water_map.h | 11 ++++++++++ src/waypoint_cmd.cpp | 3 +-- 22 files changed, 60 insertions(+), 74 deletions(-) delete mode 100644 src/cmd_helper.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dd3a6c2f06..5cc31d3188 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -87,7 +87,6 @@ add_files( clear_cmd.cpp clear_func.h clear_map.h - cmd_helper.h command.cpp command_func.h command_type.h diff --git a/src/bridge_gui.cpp b/src/bridge_gui.cpp index 99628e75c4..515a9318c3 100644 --- a/src/bridge_gui.cpp +++ b/src/bridge_gui.cpp @@ -20,7 +20,6 @@ #include "sortlist_type.h" #include "widgets/dropdown_func.h" #include "core/geometry_func.hpp" -#include "cmd_helper.h" #include "tunnelbridge_map.h" #include "road_gui.h" #include "tunnelbridge_cmd.h" diff --git a/src/cmd_helper.h b/src/cmd_helper.h deleted file mode 100644 index 03b6e8ea77..0000000000 --- a/src/cmd_helper.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. - * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - */ - -/** @file cmd_helper.h Helper functions to extract data from command parameters. */ - -#ifndef CMD_HELPER_H -#define CMD_HELPER_H - -#include "core/enum_type.hpp" -#include "core/bitmath_func.hpp" - -/** - * Extracts a given type from a value. - * @tparam T The type of data we're looking for. - * @tparam S The offset in the data. - * @tparam N The amount of bits to read. - * @tparam U The type of data passed to us. - * @param v The data to extract the value from. - */ -template static inline T Extract(U v) -{ - /* Check if there are enough bits in v */ - static_assert(N == EnumPropsT::num_bits); - static_assert(S + N <= sizeof(U) * 8); - static_assert(EnumPropsT::end <= (1 << N)); - U masked = GB(v, S, N); - return IsInsideMM(masked, EnumPropsT::begin, EnumPropsT::end) ? (T)masked : EnumPropsT::invalid; -} - -/** - * Check if an enum value is inside it's valid values. - * @tparam T Type of enum. - * @param v The value to validate - * @return True if enum is valid. - */ -template static constexpr inline bool IsEnumValid(T v) noexcept -{ - return IsInsideMM(v, EnumPropsT::begin, EnumPropsT::end); -} - -#endif /* CMD_HELPER_H */ diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 016a830bf9..c1f68d2b63 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -14,7 +14,6 @@ #include "core/backup_type.hpp" #include "town.h" #include "news_func.h" -#include "cmd_helper.h" #include "command_func.h" #include "network/network.h" #include "network/network_func.h" diff --git a/src/gfx_func.h b/src/gfx_func.h index 59b6b54f93..b811c089fe 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -174,6 +174,17 @@ int GetCharacterHeight(FontSize size); extern DrawPixelInfo *_cur_dpi; +/** + * Checks if a Colours value is valid. + * + * @param colours The value to check + * @return true if the given value is a valid Colours. + */ +static inline bool IsValidColours(Colours colours) +{ + return colours < COLOUR_END; +} + TextColour GetContrastColour(uint8 background, uint8 threshold = 128); /** diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index b087ead0aa..b6d1927097 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -8,7 +8,6 @@ /** @file group_cmd.cpp Handling of the engine groups */ #include "stdafx.h" -#include "cmd_helper.h" #include "command_func.h" #include "train.h" #include "vehiclelist.h" diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 41ee3ac06e..e6a01c097d 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -40,7 +40,6 @@ #include "object_base.h" #include "game/game.hpp" #include "error.h" -#include "cmd_helper.h" #include "string_func.h" #include "industry_cmd.h" #include "landscape_cmd.h" diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index fd8f79476e..6422bcf3ac 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -10,7 +10,6 @@ #include "stdafx.h" #include "command_func.h" #include "economy_func.h" -#include "cmd_helper.h" #include "window_func.h" #include "textbuf_gui.h" #include "network/network.h" diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index a6602fadb4..9c6b1a3fcd 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -9,7 +9,6 @@ #include "stdafx.h" #include "debug.h" -#include "cmd_helper.h" #include "command_func.h" #include "company_func.h" #include "news_func.h" diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 88f4adb0f6..6346730cc8 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -8,7 +8,6 @@ /** @file rail_cmd.cpp Handling of rail tiles. */ #include "stdafx.h" -#include "cmd_helper.h" #include "viewport_func.h" #include "command_func.h" #include "depot_base.h" @@ -966,7 +965,7 @@ CommandCost CmdRemoveRailroadTrack(DoCommandFlag flags, TileIndex tile, TileInde CommandCost CmdBuildTrainDepot(DoCommandFlag flags, TileIndex tile, RailType railtype, DiagDirection dir) { /* check railtype and valid direction for depot (0 through 3), 4 in total */ - if (!ValParamRailtype(railtype) || !IsEnumValid(dir)) return CMD_ERROR; + if (!ValParamRailtype(railtype) || !IsValidDiagDirection(dir)) return CMD_ERROR; Slope tileh = GetTileSlope(tile); diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 0701481119..796ad99c61 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -8,7 +8,6 @@ /** @file road_cmd.cpp Commands related to road tiles. */ #include "stdafx.h" -#include "cmd_helper.h" #include "road.h" #include "road_internal.h" #include "viewport_func.h" @@ -638,7 +637,7 @@ CommandCost CmdBuildRoad(DoCommandFlag flags, TileIndex tile, RoadBits pieces, R } /* do not allow building 'zero' road bits, code wouldn't handle it */ - if (pieces == ROAD_NONE || !IsEnumValid(pieces) || !IsEnumValid(toggle_drd)) return CMD_ERROR; + if (pieces == ROAD_NONE || !IsValidRoadBits(pieces) || !IsValidDisallowedRoadDirections(toggle_drd)) return CMD_ERROR; if (!ValParamRoadType(rt)) return CMD_ERROR; Slope tileh = GetTileSlope(tile); @@ -979,7 +978,7 @@ CommandCost CmdBuildLongRoad(DoCommandFlag flags, TileIndex start_tile, TileInde { if (end_tile >= MapSize()) return CMD_ERROR; - if (!ValParamRoadType(rt) || !IsEnumValid(axis) || !IsEnumValid(drd)) return CMD_ERROR; + if (!ValParamRoadType(rt) || !IsValidAxis(axis) || !IsValidDisallowedRoadDirections(drd)) return CMD_ERROR; /* Only drag in X or Y direction dictated by the direction variable */ if (axis == AXIS_X && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis @@ -1075,7 +1074,7 @@ std::tuple CmdRemoveLongRoad(DoCommandFlag flags, TileIndex CommandCost cost(EXPENSES_CONSTRUCTION); if (end_tile >= MapSize()) return { CMD_ERROR, 0 }; - if (!ValParamRoadType(rt) || !IsEnumValid(axis)) return { CMD_ERROR, 0 }; + if (!ValParamRoadType(rt) || !IsValidAxis(axis)) return { CMD_ERROR, 0 }; /* Only drag in X or Y direction dictated by the direction variable */ if (axis == AXIS_X && TileY(start_tile) != TileY(end_tile)) return { CMD_ERROR, 0 }; // x-axis @@ -1140,7 +1139,7 @@ std::tuple CmdRemoveLongRoad(DoCommandFlag flags, TileIndex */ CommandCost CmdBuildRoadDepot(DoCommandFlag flags, TileIndex tile, RoadType rt, DiagDirection dir) { - if (!ValParamRoadType(rt) || !IsEnumValid(dir)) return CMD_ERROR; + if (!ValParamRoadType(rt) || !IsValidDiagDirection(dir)) return CMD_ERROR; CommandCost cost(EXPENSES_CONSTRUCTION); diff --git a/src/road_map.h b/src/road_map.h index 4cb9125ea6..6be02e42f6 100644 --- a/src/road_map.h +++ b/src/road_map.h @@ -282,6 +282,17 @@ static inline bool HasTownOwnedRoad(TileIndex t) return HasTileRoadType(t, RTT_ROAD) && IsRoadOwner(t, RTT_ROAD, OWNER_TOWN); } +/** + * Checks if a DisallowedRoadDirections is valid. + * + * @param wc The value to check + * @return true if the given value is a valid DisallowedRoadDirections. + */ +static inline bool IsValidDisallowedRoadDirections(DisallowedRoadDirections drt) +{ + return drt < DRD_END; +} + /** * Gets the disallowed directions * @param t the tile to get the directions from diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 5a91fa4742..0cc628629d 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -10,7 +10,6 @@ #include "stdafx.h" #include "aircraft.h" #include "bridge_map.h" -#include "cmd_helper.h" #include "viewport_func.h" #include "viewport_kdtree.h" #include "command_func.h" @@ -1257,7 +1256,7 @@ CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailTyp CommandCost ret = CheckIfAuthorityAllowsNewStation(tile_org, flags); if (ret.Failed()) return ret; - if (!ValParamRailtype(rt) || !IsEnumValid(axis)) return CMD_ERROR; + if (!ValParamRailtype(rt) || !IsValidAxis(axis)) return CMD_ERROR; /* Check if the given station class is valid */ if ((uint)spec_class >= StationClass::GetClassCount() || spec_class == STAT_CLASS_WAYP) return CMD_ERROR; @@ -1818,7 +1817,7 @@ static CommandCost FindJoiningRoadStop(StationID existing_stop, StationID statio */ CommandCost CmdBuildRoadStop(DoCommandFlag flags, TileIndex tile, uint8 width, uint8 length, RoadStopType stop_type, bool is_drive_through, DiagDirection ddir, RoadType rt, StationID station_to_join, bool adjacent) { - if (!ValParamRoadType(rt) || !IsEnumValid(ddir) || stop_type >= ROADSTOP_END) return CMD_ERROR; + if (!ValParamRoadType(rt) || !IsValidDiagDirection(ddir) || stop_type >= ROADSTOP_END) return CMD_ERROR; bool reuse = (station_to_join != NEW_STATION); if (!reuse) station_to_join = INVALID_STATION; bool distant_join = (station_to_join != INVALID_STATION); diff --git a/src/story.cpp b/src/story.cpp index 8de4df89fc..de04e69dba 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -10,7 +10,6 @@ #include "stdafx.h" #include "story_base.h" #include "core/pool_func.hpp" -#include "cmd_helper.h" #include "command_func.h" #include "company_base.h" #include "company_func.h" @@ -144,7 +143,9 @@ void StoryPageButtonData::SetVehicleType(VehicleType vehtype) /** Get the button background colour. */ Colours StoryPageButtonData::GetColour() const { - return Extract(this->referenced_id); + Colours colour = (Colours)GB(this->referenced_id, 0, 8); + if (!IsValidColours(colour)) return INVALID_COLOUR; + return colour; } StoryPageButtonFlags StoryPageButtonData::GetFlags() const @@ -155,7 +156,9 @@ StoryPageButtonFlags StoryPageButtonData::GetFlags() const /** Get the mouse cursor used while waiting for input for the button. */ StoryPageButtonCursor StoryPageButtonData::GetCursor() const { - return Extract(this->referenced_id); + StoryPageButtonCursor cursor = (StoryPageButtonCursor)GB(this->referenced_id, 8, 8); + if (!IsValidStoryPageButtonCursor(cursor)) return INVALID_SPBC; + return cursor; } /** Get the type of vehicles that are accepted by the button */ diff --git a/src/story_base.h b/src/story_base.h index e4d677cbf7..09a8291fb6 100644 --- a/src/story_base.h +++ b/src/story_base.h @@ -113,6 +113,17 @@ enum StoryPageButtonCursor : byte { /** Define basic enum properties */ template <> struct EnumPropsT : MakeEnumPropsT {}; +/** + * Checks if a StoryPageButtonCursor value is valid. + * + * @param wc The value to check + * @return true if the given value is a valid StoryPageButtonCursor. + */ +static inline bool IsValidStoryPageButtonCursor(StoryPageButtonCursor cursor) +{ + return cursor < SPBC_END; +} + /** Helper to construct packed "id" values for button-type StoryPageElement */ struct StoryPageButtonData { uint32 referenced_id; diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 3e5695b51a..fa8ecf51e3 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -13,7 +13,6 @@ #include "date_func.h" #include "window_func.h" #include "vehicle_base.h" -#include "cmd_helper.h" #include "timetable_cmd.h" #include "table/strings.h" diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 405a83ccee..62019e77d0 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -14,7 +14,6 @@ #include "landscape.h" #include "viewport_func.h" #include "viewport_kdtree.h" -#include "cmd_helper.h" #include "command_func.h" #include "industry.h" #include "station_base.h" diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 543ac8b284..dc345c8fee 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -14,7 +14,6 @@ #include "stdafx.h" #include "newgrf_object.h" #include "viewport_func.h" -#include "cmd_helper.h" #include "command_func.h" #include "town.h" #include "train.h" diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index dc7d66c837..11b8d9508b 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -11,7 +11,6 @@ #include "roadveh.h" #include "news_func.h" #include "airport.h" -#include "cmd_helper.h" #include "command_func.h" #include "company_func.h" #include "train.h" diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index c02a1e9b4f..b4bfa8d01f 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -8,7 +8,6 @@ /** @file water_cmd.cpp Handling of water tiles. */ #include "stdafx.h" -#include "cmd_helper.h" #include "landscape.h" #include "viewport_func.h" #include "command_func.h" @@ -100,7 +99,7 @@ static void MarkCanalsAndRiversAroundDirty(TileIndex tile) */ CommandCost CmdBuildShipDepot(DoCommandFlag flags, TileIndex tile, Axis axis) { - if (!IsEnumValid(axis)) return CMD_ERROR; + if (!IsValidAxis(axis)) return CMD_ERROR; TileIndex tile2 = tile + (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1)); if (!HasTileWaterGround(tile) || !HasTileWaterGround(tile2)) { @@ -439,7 +438,7 @@ bool RiverModifyDesertZone(TileIndex tile, void *) */ CommandCost CmdBuildCanal(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, WaterClass wc, bool diagonal) { - if (start_tile >= MapSize() || !IsEnumValid(wc)) return CMD_ERROR; + if (start_tile >= MapSize() || !IsValidWaterClass(wc)) return CMD_ERROR; /* Outside of the editor you can only build canals, not oceans */ if (wc != WATER_CLASS_CANAL && _game_mode != GM_EDITOR) return CMD_ERROR; diff --git a/src/water_map.h b/src/water_map.h index 793d07c8a2..ff2c38a7bc 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -53,6 +53,17 @@ enum WaterClass : byte { /** Helper information for extract tool. */ template <> struct EnumPropsT : MakeEnumPropsT {}; +/** + * Checks if a water class is valid. + * + * @param wc The value to check + * @return true if the given value is a valid water class. + */ +static inline bool IsValidWaterClass(WaterClass wc) +{ + return wc < WATER_CLASS_INVALID; +} + /** Sections of the water depot. */ enum DepotPart { DEPOT_PART_NORTH = 0, ///< Northern part of a depot. diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 56095a0796..da37a8b15a 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -9,7 +9,6 @@ #include "stdafx.h" -#include "cmd_helper.h" #include "command_func.h" #include "landscape.h" #include "bridge_map.h" @@ -175,7 +174,7 @@ extern CommandCost CanExpandRailStation(const BaseStation *st, TileArea &new_ta, */ CommandCost CmdBuildRailWaypoint(DoCommandFlag flags, TileIndex start_tile, Axis axis, byte width, byte height, StationClassID spec_class, byte spec_index, StationID station_to_join, bool adjacent) { - if (!IsEnumValid(axis)) return CMD_ERROR; + if (!IsValidAxis(axis)) return CMD_ERROR; /* Check if the given station class is valid */ if (spec_class != STAT_CLASS_WAYP) return CMD_ERROR; if (spec_index >= StationClass::Get(spec_class)->GetSpecCount()) return CMD_ERROR; From b6c5f4937932029d8ebfd1654ed8d264e0e66de0 Mon Sep 17 00:00:00 2001 From: glx22 Date: Wed, 22 Dec 2021 19:26:49 +0100 Subject: [PATCH 3/6] Change: add a timestamp in name of crash files --- src/crashlog.cpp | 27 ++++++++++++++++++++++++--- src/crashlog.h | 2 ++ src/os/macosx/crashlog_osx.cpp | 2 +- src/os/windows/crashlog_win.cpp | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/crashlog.cpp b/src/crashlog.cpp index b7c8c2bc49..b0cda0adf1 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -324,6 +324,25 @@ char *CrashLog::LogRecentNews(char *buffer, const char *last) const return buffer; } +/** + * Create a timestamped filename. + * @param filename The begin where to write at. + * @param filename_last The last position in the buffer to write to. + * @param ext The extension for the filename. + * @param with_dir Whether to prepend the filename with the personal directory. + * @return the number of added characters. + */ +int CrashLog::CreateFileName(char *filename, const char *filename_last, const char *ext, bool with_dir) const +{ + static std::string crashname; + + if (crashname.empty()) { + UTCTime::Format(filename, filename_last, "crash%Y%m%d%H%M%S"); + crashname = filename; + } + return seprintf(filename, filename_last, "%s%s%s", with_dir ? _personal_dir.c_str() : "", crashname.c_str(), ext); +} + /** * Fill the crash log buffer with all data of a crash log. * @param buffer The begin where to write at. @@ -366,7 +385,7 @@ char *CrashLog::FillCrashLog(char *buffer, const char *last) const */ bool CrashLog::WriteCrashLog(const char *buffer, char *filename, const char *filename_last) const { - seprintf(filename, filename_last, "%scrash.log", _personal_dir.c_str()); + this->CreateFileName(filename, filename_last, ".log"); FILE *file = FioFOpenFile(filename, "w", NO_DIRECTORY); if (file == nullptr) return false; @@ -401,7 +420,7 @@ bool CrashLog::WriteSavegame(char *filename, const char *filename_last) const try { GamelogEmergency(); - seprintf(filename, filename_last, "%scrash.sav", _personal_dir.c_str()); + this->CreateFileName(filename, filename_last, ".sav"); /* Don't do a threaded saveload. */ return SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY, false) == SL_OK; @@ -423,7 +442,9 @@ bool CrashLog::WriteScreenshot(char *filename, const char *filename_last) const /* Don't draw when we have invalid screen size */ if (_screen.width < 1 || _screen.height < 1 || _screen.dst_ptr == nullptr) return false; - bool res = MakeScreenshot(SC_CRASHLOG, "crash"); + this->CreateFileName(filename, filename_last, "", false); + bool res = MakeScreenshot(SC_CRASHLOG, filename); + filename[0] = '\0'; if (res) strecpy(filename, _full_screenshot_name, filename_last); return res; } diff --git a/src/crashlog.h b/src/crashlog.h index 7d15c3512f..b7945a9839 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -85,6 +85,8 @@ protected: char *LogGamelog(char *buffer, const char *last) const; char *LogRecentNews(char *buffer, const char *list) const; + int CreateFileName(char *filename, const char *filename_last, const char *ext, bool with_dir = true) const; + public: /** Stub destructor to silence some compilers. */ virtual ~CrashLog() {} diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index 7fcb672a81..682ed6d073 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -186,7 +186,7 @@ public: ret = false; } - printf("Writing crash savegame...\n"); + printf("Writing crash screenshot...\n"); if (!this->WriteScreenshot(filename_screenshot, lastof(filename_screenshot))) { filename_screenshot[0] = '\0'; ret = false; diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 5ce04e52ed..e1a05a8aaf 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -490,7 +490,7 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c CONST PMINIDUMP_CALLBACK_INFORMATION); MiniDumpWriteDump_t funcMiniDumpWriteDump = dbghelp.GetProcAddress("MiniDumpWriteDump"); if (funcMiniDumpWriteDump != nullptr) { - seprintf(filename, filename_last, "%scrash.dmp", _personal_dir.c_str()); + this->CreateFileName(filename, filename_last, ".dmp"); HANDLE file = CreateFile(OTTD2FS(filename).c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, 0, 0); HANDLE proc = GetCurrentProcess(); DWORD procid = GetCurrentProcessId(); From 25ae42ae8aeec9ddad6b9c9ee43e067a1d74193f Mon Sep 17 00:00:00 2001 From: Dave Shifflett Date: Wed, 2 Feb 2022 15:24:29 -0600 Subject: [PATCH 4/6] Feature: Add/extend console commands to enable screenshot automation (#9771) * Add: `zoomto` console command for main viewport Similar in spirit to `scrollto`, `zoomto` takes an absolute zoom level from the user and sets the main viewport to that level while respecting both the absolute minimum and maximum zoom levels supported by the game and any limitations imposed by the local client settings. * Add: optional `instant` flag for `scrollto` command Using this flag has two effects: - if the user has smooth scrolling enabled, the scroll action will take place as if it were not enabled - the viewport is redrawn immediately, so any successive `screenshot` command will actually work correctly The original positional arguments are processed like same before. --- src/console_cmds.cpp | 88 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 12 deletions(-) diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index 7f663fe863..426b501739 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -253,6 +253,59 @@ DEF_CONSOLE_CMD(ConResetTile) } #endif /* _DEBUG */ +/** + * Zoom map to given level. + * param level As defined by ZoomLevel and as limited by zoom_min/zoom_max from GUISettings. + * @return True when either console help was shown or a proper amount of parameters given. + */ +DEF_CONSOLE_CMD(ConZoomToLevel) +{ + switch (argc) { + case 0: + IConsolePrint(CC_HELP, "Set the current zoom level of the main viewport."); + IConsolePrint(CC_HELP, "Usage: 'zoomto '."); + IConsolePrint( + CC_HELP, + ZOOM_LVL_MIN < _settings_client.gui.zoom_min ? + "The lowest zoom-in level allowed by current client settings is {}." : + "The lowest supported zoom-in level is {}.", + std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min) + ); + IConsolePrint( + CC_HELP, + _settings_client.gui.zoom_max < ZOOM_LVL_MAX ? + "The highest zoom-out level allowed by current client settings is {}." : + "The highest supported zoom-out level is {}.", + std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX) + ); + return true; + + case 2: { + uint32 level; + if (GetArgumentInteger(&level, argv[1])) { + if (level < ZOOM_LVL_MIN) { + IConsolePrint(CC_ERROR, "Zoom-in levels below {} are not supported.", ZOOM_LVL_MIN); + } else if (level < _settings_client.gui.zoom_min) { + IConsolePrint(CC_ERROR, "Current client settings do not allow zooming in below level {}.", _settings_client.gui.zoom_min); + } else if (level > ZOOM_LVL_MAX) { + IConsolePrint(CC_ERROR, "Zoom-in levels above {} are not supported.", ZOOM_LVL_MAX); + } else if (level > _settings_client.gui.zoom_max) { + IConsolePrint(CC_ERROR, "Current client settings do not allow zooming out beyond level {}.", _settings_client.gui.zoom_max); + } else { + Window *w = FindWindowById(WC_MAIN_WINDOW, 0); + Viewport *vp = w->viewport; + while (vp->zoom > level) DoZoomInOutWindow(ZOOM_IN, w); + while (vp->zoom < level) DoZoomInOutWindow(ZOOM_OUT, w); + } + return true; + } + break; + } + } + + return false; +} + /** * Scroll to a tile on the map. * param x tile number or tile x coordinate. @@ -264,34 +317,44 @@ DEF_CONSOLE_CMD(ConResetTile) */ DEF_CONSOLE_CMD(ConScrollToTile) { - switch (argc) { - case 0: - IConsolePrint(CC_HELP, "Center the screen on a given tile."); - IConsolePrint(CC_HELP, "Usage: 'scrollto ' or 'scrollto '."); - IConsolePrint(CC_HELP, "Numbers can be either decimal (34161) or hexadecimal (0x4a5B)."); - return true; + if (argc == 0) { + IConsolePrint(CC_HELP, "Center the screen on a given tile."); + IConsolePrint(CC_HELP, "Usage: 'scrollto [instant] ' or 'scrollto [instant] '."); + IConsolePrint(CC_HELP, "Numbers can be either decimal (34161) or hexadecimal (0x4a5B)."); + IConsolePrint(CC_HELP, "'instant' will immediately move and redraw viewport without smooth scrolling."); + return true; + } + if (argc < 2) return false; - case 2: { + uint32 arg_index = 1; + bool instant = false; + if (strcmp(argv[arg_index], "instant") == 0) { + ++arg_index; + instant = true; + } + + switch (argc - arg_index) { + case 1: { uint32 result; - if (GetArgumentInteger(&result, argv[1])) { + if (GetArgumentInteger(&result, argv[arg_index])) { if (result >= MapSize()) { IConsolePrint(CC_ERROR, "Tile does not exist."); return true; } - ScrollMainWindowToTile((TileIndex)result); + ScrollMainWindowToTile((TileIndex)result, instant); return true; } break; } - case 3: { + case 2: { uint32 x, y; - if (GetArgumentInteger(&x, argv[1]) && GetArgumentInteger(&y, argv[2])) { + if (GetArgumentInteger(&x, argv[arg_index]) && GetArgumentInteger(&y, argv[arg_index + 1])) { if (x >= MapSizeX() || y >= MapSizeY()) { IConsolePrint(CC_ERROR, "Tile does not exist."); return true; } - ScrollMainWindowToTile(TileXY(x, y)); + ScrollMainWindowToTile(TileXY(x, y), instant); return true; } break; @@ -2396,6 +2459,7 @@ void IConsoleStdLibRegister() IConsole::CmdRegister("return", ConReturn); IConsole::CmdRegister("screenshot", ConScreenShot); IConsole::CmdRegister("script", ConScript); + IConsole::CmdRegister("zoomto", ConZoomToLevel); IConsole::CmdRegister("scrollto", ConScrollToTile); IConsole::CmdRegister("alias", ConAlias); IConsole::CmdRegister("load", ConLoad); From 7f0efbe00e3c100319a1633deb1d6bc9eeb8e86b Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 2 Feb 2022 14:26:46 -0700 Subject: [PATCH 5/6] Feature: Remember the last-used signal between games (#9792) --- src/rail_gui.cpp | 9 ++++++--- src/settings_type.h | 2 ++ src/table/settings/gui_settings.ini | 8 ++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 267caee17e..7bde44483f 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -250,7 +250,7 @@ static void GenericPlaceSignals(TileIndex tile) } else { SignalVariant sigvar = _cur_year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC; Command::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL, - tile, track, SIGTYPE_PBS_ONEWAY, sigvar, false, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0); + tile, track, _settings_client.gui.default_signal_type, sigvar, false, false, _ctrl_pressed, cycle_start, SIGTYPE_LAST, 0, 0); } } @@ -396,7 +396,7 @@ static void HandleAutoSignalPlacement() TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, _ctrl_pressed); } else { bool sig_gui = FindWindowById(WC_BUILD_SIGNAL, 0) != nullptr; - SignalType sigtype = sig_gui ? _cur_signal_type : SIGTYPE_PBS_ONEWAY; + SignalType sigtype = sig_gui ? _cur_signal_type : _settings_client.gui.default_signal_type; SignalVariant sigvar = sig_gui ? _cur_signal_variant : (_cur_year < _settings_client.gui.semaphore_build_before ? SIG_SEMAPHORE : SIG_ELECTRIC); Command::Post(STR_ERROR_CAN_T_BUILD_SIGNALS_HERE, CcPlaySound_CONSTRUCTION_RAIL, TileVirtXY(_thd.selstart.x, _thd.selstart.y), TileVirtXY(_thd.selend.x, _thd.selend.y), track, sigtype, sigvar, false, _ctrl_pressed, !_settings_client.gui.drag_signals_fixed_distance, _settings_client.gui.drag_signals_density); @@ -1793,6 +1793,9 @@ public: _cur_signal_type = (SignalType)((uint)((widget - WID_BS_SEMAPHORE_NORM) % (SIGTYPE_LAST + 1))); _cur_signal_variant = widget >= WID_BS_ELECTRIC_NORM ? SIG_ELECTRIC : SIG_SEMAPHORE; + /* Update default (last-used) signal type in config file. */ + _settings_client.gui.default_signal_type = _cur_signal_type; + /* If 'remove' button of rail build toolbar is active, disable it. */ if (_remove_button_clicked) { Window *w = FindWindowById(WC_BUILD_TOOLBAR, TRANSPORT_RAIL); @@ -2200,7 +2203,7 @@ void InitializeRailGUI() SetDefaultRailGui(); _convert_signal_button = false; - _cur_signal_type = SIGTYPE_PBS_ONEWAY; + _cur_signal_type = _settings_client.gui.default_signal_type; ResetSignalVariant(); } diff --git a/src/settings_type.h b/src/settings_type.h index 9da2655d6b..71f95142f9 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -21,6 +21,7 @@ #include "zoom_type.h" #include "openttd.h" #include "rail_gui.h" +#include "signal_type.h" /* Used to validate sizes of "max" value in settings. */ const size_t MAX_SLE_UINT8 = UINT8_MAX; @@ -146,6 +147,7 @@ struct GUISettings { bool pause_on_newgame; ///< whether to start new games paused or not SignalGUISettings signal_gui_mode; ///< select which signal types are shown in the signal GUI SignalCycleSettings cycle_signal_types; ///< Which signal types to cycle with the build signal tool. + SignalType default_signal_type; ///< The default signal type, which is set automatically by the last signal used. Not available in Settings. Year coloured_news_year; ///< when does newspaper become coloured? bool timetable_in_ticks; ///< whether to show the timetable in ticks rather than days bool quick_goto; ///< Allow quick access to 'goto button' in vehicle orders window diff --git a/src/table/settings/gui_settings.ini b/src/table/settings/gui_settings.ini index ad18f83188..27fe44dd0d 100644 --- a/src/table/settings/gui_settings.ini +++ b/src/table/settings/gui_settings.ini @@ -458,6 +458,14 @@ strval = STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH post_cb = [](auto) { CloseWindowByClass(WC_BUILD_SIGNAL); } cat = SC_ADVANCED +[SDTC_VAR] +var = gui.default_signal_type +type = SLE_UINT8 +flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC +def = 5 +min = 0 +max = 5 + [SDTC_VAR] var = gui.coloured_news_year type = SLE_INT32 From 83b6defbfb0fa649a854767ae7c8b5a18f917e80 Mon Sep 17 00:00:00 2001 From: translators Date: Sat, 5 Feb 2022 18:38:53 +0000 Subject: [PATCH 6/6] Update: Translations from eints korean: 1 change by telk5093 turkish: 5 changes by AlphenLLC --- src/lang/korean.txt | 2 +- src/lang/turkish.txt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lang/korean.txt b/src/lang/korean.txt index e42498f8a7..c321462067 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1376,7 +1376,7 @@ STR_CONFIG_SETTING_FREIGHT_TRAINS :화물 무게 STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :열차가 싣고 있는 화물이 열차 속력에 미치는 영향에 대해 설정합니다. 값을 높게 설정하면 화물을 수송하는데 더 큰 힘이 필요합니다. (특히 언덕을 오를 때 심해집니다) STR_CONFIG_SETTING_PLANE_SPEED :항공기 속력 조절: {STRING} -STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :항공 수송에 대한 수입을 제한하기 위해, 다른 운송 수단의 속력을 1로 보았을 때의 항공기의 속력 비율을 설정합니다. +STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :항공 수송에 대한 수입을 제한하기 위해, 다른 운송 수단의 속력을 1로 보았을 때 항공기의 상대 속력을 설정합니다. STR_CONFIG_SETTING_PLANE_SPEED_VALUE :(실제 속력) x {COMMA}분의 1 STR_CONFIG_SETTING_PLANE_CRASHES :항공기 추락 빈도수: {STRING} diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 0d35521c38..c535e3bf52 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1744,6 +1744,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Rakibe ait yeni STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Kazalar / felaketler: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Kazalar veya felaketler meydana geldiğinde gazete haberi olarak göster +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Rakip araçların yaptığı kazalar: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Rakiplerin kaza yapan araçlar hakkında bir gazete haberi göster STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Şirket bilgisi: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Yeni bir şirket oyuna başladığında veya şirketler iflas etme riski taşıdığında gazete haberi olarak göster @@ -2105,7 +2107,7 @@ STR_QUIT_NO :{BLACK}Hayır # Abandon game STR_ABANDON_GAME_CAPTION :{WHITE}Ana Menüye Dön -STR_ABANDON_GAME_QUERY :{YELLOW}Oyunu bitirmek istediğinizden emin misiniz? +STR_ABANDON_GAME_QUERY :{YELLOW}Oyunu bitirmek istediğinize emin misiniz? STR_ABANDON_SCENARIO_QUERY :{YELLOW}Bu senaryodan çıkmak istediğinizden emin misiniz? # Cheat window @@ -2259,6 +2261,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Yer yü STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Harita boyutu: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Sunucu sürümü: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Sunucu adresi: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Davet kodu: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Başlama tarihi: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Şimdiki tarih: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Oyun Betiği: {WHITE}{STRING} (v{NUM}) @@ -2675,6 +2678,7 @@ STR_STATION_CLASS_WAYP :Yerimleri # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Sinyal Seçimi +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Gelişmiş sinyal türlerini göster STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Blok Sinyali (semafor){}Bu en temel sinyal türüdür, bir blok içinde aynı anda yalnız bir tren bulunmasına izin verir STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Giriş-Sinyali (semafor){}Yolun devam eden bölümünde en az bir yeşil çıkış sinyali olduğu sürece yeşil yanar. Aksi halde kırmızı yanar STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Çıkış Sinyali (semafor){}Blok sinyali ile aynı şekilde çalışır ancak giriş ve karışık ön sinyaller ile doğru rengi tetiklemek gerekmektedir