From dbfa204944646664bf1b4a71797025b626ec0d0a Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 2 Nov 2023 09:24:30 +0000 Subject: [PATCH] Lua: Set `warn` function Previously, warnings went nowhere. --- CMake/Assets.cmake | 1 + .../assets/fonts/gamedialogyellow.trn | Bin 0 -> 256 bytes Source/DiabloUI/ui_flags.hpp | 49 +++++++++--------- Source/engine/render/text_render.cpp | 7 ++- Source/engine/render/text_render.hpp | 5 +- Source/lua/lua.cpp | 11 ++++ Source/lua/repl.cpp | 11 ++++ Source/panels/console.cpp | 13 ++++- Source/panels/console.hpp | 1 + 9 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 Packaging/resources/assets/fonts/gamedialogyellow.trn diff --git a/CMake/Assets.cmake b/CMake/Assets.cmake index b8ff81a6f83..4c9d11f23cd 100644 --- a/CMake/Assets.cmake +++ b/CMake/Assets.cmake @@ -115,6 +115,7 @@ set(devilutionx_assets fonts/buttonface.trn fonts/buttonpushed.trn fonts/gamedialogwhite.trn + fonts/gamedialogyellow.trn fonts/gamedialogred.trn fonts/golduis.trn fonts/goldui.trn diff --git a/Packaging/resources/assets/fonts/gamedialogyellow.trn b/Packaging/resources/assets/fonts/gamedialogyellow.trn new file mode 100644 index 0000000000000000000000000000000000000000..23d06dd308830172edbf471e60f1f060ce10f60b GIT binary patch literal 256 zcmV+b0ssC00RjUA1qKHQ2?`4g4Gs?w5fT#=6&4p585$cL9UdPbAtECrB_<~*DJm;0 zEiNxGF)}kWH8wXmIXXK$Jw87`K|(`BMMg(RNlHshO-@fxQBqS>RaRG6Sz23MU0z>c zVPa!sWoBn+X=-b1ZEkOHadLBXb#`}nd3t+%eSUv{fr5jCg@%WSiHeJijgF6yk&=^? zm6n&7nVOrNot~edp`xRtrKYE-sj922t*)=Iv9hzYwYImoxw^Z&y}rM|!NSAD#m2|T z$;!*j&Cbuz(bCh@)z;V8+1lIO-QM4m;o{@u<>u$;>FVq3?e6dJ@$&QZ_4fDp`TG0( G{r>-?R(~`A literal 0 HcmV?d00001 diff --git a/Source/DiabloUI/ui_flags.hpp b/Source/DiabloUI/ui_flags.hpp index ae02f8c9941..9a84d8939c6 100644 --- a/Source/DiabloUI/ui_flags.hpp +++ b/Source/DiabloUI/ui_flags.hpp @@ -22,32 +22,33 @@ enum class UiFlags : uint32_t { ColorUiGoldDark = 1 << 8, ColorUiSilverDark = 1 << 9, ColorDialogWhite = 1 << 10, - ColorDialogRed = 1 << 11, - ColorYellow = 1 << 12, - ColorGold = 1 << 13, - ColorBlack = 1 << 14, - ColorWhite = 1 << 15, - ColorWhitegold = 1 << 16, - ColorRed = 1 << 17, - ColorBlue = 1 << 18, - ColorOrange = 1 << 19, - ColorButtonface = 1 << 20, - ColorButtonpushed = 1 << 21, - - AlignCenter = 1 << 22, - AlignRight = 1 << 23, - VerticalCenter = 1 << 24, - - KerningFitSpacing = 1 << 25, - - ElementDisabled = 1 << 26, - ElementHidden = 1 << 27, - - PentaCursor = 1 << 28, - Outlined = 1 << 29, + ColorDialogYellow = 1 << 11, + ColorDialogRed = 1 << 12, + ColorYellow = 1 << 13, + ColorGold = 1 << 14, + ColorBlack = 1 << 15, + ColorWhite = 1 << 16, + ColorWhitegold = 1 << 17, + ColorRed = 1 << 18, + ColorBlue = 1 << 19, + ColorOrange = 1 << 20, + ColorButtonface = 1 << 21, + ColorButtonpushed = 1 << 22, + + AlignCenter = 1 << 23, + AlignRight = 1 << 24, + VerticalCenter = 1 << 25, + + KerningFitSpacing = 1 << 26, + + ElementDisabled = 1 << 27, + ElementHidden = 1 << 28, + + PentaCursor = 1 << 29, + Outlined = 1 << 30, /** @brief Ensures that the if current element is active that the next element is also visible. */ - NeedsNextElement = 1 << 30, + NeedsNextElement = 1U << 31U, // clang-format on }; use_enum_as_flags(UiFlags); diff --git a/Source/engine/render/text_render.cpp b/Source/engine/render/text_render.cpp index 5af788f7bb8..db364a72998 100644 --- a/Source/engine/render/text_render.cpp +++ b/Source/engine/render/text_render.cpp @@ -46,7 +46,7 @@ constexpr std::array LineHeights = { 12, 26, 38, 42, 50, 22 }; constexpr int SmallFontTallLineHeight = 16; std::array BaseLineOffset = { -3, -2, -3, -6, -7, 3 }; -std::array ColorTranslations = { +std::array ColorTranslations = { "fonts\\goldui.trn", "fonts\\grayui.trn", "fonts\\golduis.trn", @@ -68,10 +68,11 @@ std::array ColorTranslations = { "fonts\\buttonface.trn", "fonts\\buttonpushed.trn", "fonts\\gamedialogwhite.trn", + "fonts\\gamedialogyellow.trn", "fonts\\gamedialogred.trn", }; -std::array>, 18> ColorTranslationsData; +std::array>, 19> ColorTranslationsData; text_color GetColorFromFlags(UiFlags flags) { @@ -97,6 +98,8 @@ text_color GetColorFromFlags(UiFlags flags) return ColorUiSilverDark; if (HasAnyOf(flags, UiFlags::ColorDialogWhite)) return gbRunGame ? ColorInGameDialogWhite : ColorDialogWhite; + if (HasAnyOf(flags, UiFlags::ColorDialogYellow)) + return ColorInGameDialogYellow; if (HasAnyOf(flags, UiFlags::ColorDialogRed)) return ColorInGameDialogRed; if (HasAnyOf(flags, UiFlags::ColorYellow)) diff --git a/Source/engine/render/text_render.hpp b/Source/engine/render/text_render.hpp index 3724b7ef7bb..324d7422d02 100644 --- a/Source/engine/render/text_render.hpp +++ b/Source/engine/render/text_render.hpp @@ -55,8 +55,9 @@ enum text_color : uint8_t { ColorButtonface, ColorButtonpushed, - ColorInGameDialogWhite, // Dialog white in-game - ColorInGameDialogRed, // Dialog red in-game + ColorInGameDialogWhite, // Dialog white in-game + ColorInGameDialogYellow, // Dialog yellow in-game + ColorInGameDialogRed, // Dialog red in-game }; constexpr GameFontTables GetFontSizeFromUiFlags(UiFlags flags) diff --git a/Source/lua/lua.cpp b/Source/lua/lua.cpp index 7b8af675c66..695c1b593ed 100644 --- a/Source/lua/lua.cpp +++ b/Source/lua/lua.cpp @@ -89,6 +89,16 @@ int LuaPrint(lua_State *state) return 0; } +void LuaWarn(void *userData, const char *message, int continued) +{ + static std::string warnBuffer; + warnBuffer.append(message); + if (continued != 0) + return; + LogWarn("{}", warnBuffer); + warnBuffer.clear(); +} + bool CheckResult(sol::protected_function_result result, bool optional) { const bool valid = result.valid(); @@ -141,6 +151,7 @@ void LuaInitialize() .compiledScripts = {}, }); sol::state &lua = CurrentLuaState->sol; + lua_setwarnf(lua.lua_state(), LuaWarn, /*ud=*/nullptr); lua.open_libraries( sol::lib::base, sol::lib::package, diff --git a/Source/lua/repl.cpp b/Source/lua/repl.cpp index dd578fbd420..fbf2e22abb0 100644 --- a/Source/lua/repl.cpp +++ b/Source/lua/repl.cpp @@ -20,6 +20,16 @@ namespace { std::optional replEnv; +void LuaConsoleWarn(void *userData, const char *message, int continued) +{ + static std::string warnBuffer; + warnBuffer.append(message); + if (continued != 0) + return; + PrintWarningToConsole(warnBuffer); + warnBuffer.clear(); +} + int LuaPrintToConsole(lua_State *state) { std::string result; @@ -41,6 +51,7 @@ void CreateReplEnvironment() sol::state &lua = GetLuaState(); replEnv.emplace(lua, sol::create, lua.globals()); replEnv->set("print", LuaPrintToConsole); + lua_setwarnf(replEnv->lua_state(), LuaConsoleWarn, /*ud=*/nullptr); } sol::environment &ReplEnvironment() diff --git a/Source/panels/console.cpp b/Source/panels/console.cpp index 2dcd8bd1a17..2457fd04ce7 100644 --- a/Source/panels/console.cpp +++ b/Source/panels/console.cpp @@ -58,6 +58,7 @@ struct ConsoleLine { Help, Input, Output, + Warning, Error }; @@ -98,6 +99,7 @@ bool FirstRender; constexpr UiFlags TextUiFlags = UiFlags::FontSizeDialog; constexpr UiFlags InputTextUiFlags = TextUiFlags | UiFlags::ColorDialogWhite; constexpr UiFlags OutputTextUiFlags = TextUiFlags | UiFlags::ColorDialogWhite; +constexpr UiFlags WarningTextUiFlags = TextUiFlags | UiFlags::ColorDialogYellow; constexpr UiFlags ErrorTextUiFlags = TextUiFlags | UiFlags::ColorDialogRed; constexpr int TextSpacing = 0; @@ -210,6 +212,10 @@ void DrawConsoleLines(const Surface &out) DrawString(out, line, { 0, lineYEnd }, TextRenderOptions { .flags = OutputTextUiFlags, .spacing = TextSpacing }); break; + case ConsoleLine::Warning: + DrawString(out, line, { 0, lineYEnd }, + TextRenderOptions { .flags = WarningTextUiFlags, .spacing = TextSpacing }); + break; case ConsoleLine::Error: DrawString(out, line, { 0, lineYEnd }, TextRenderOptions { .flags = ErrorTextUiFlags, .spacing = TextSpacing }); @@ -292,7 +298,7 @@ void NextInput() bool IsHistoryOutputLine(const ConsoleLine &line) { return !line.text.empty() - && (line.type == ConsoleLine::Output || line.type == ConsoleLine::Error) + && (line.type == ConsoleLine::Output || line.type == ConsoleLine::Warning || line.type == ConsoleLine::Error) && (HistoryIndex == -1 || GetConsoleLineFromEnd(HistoryIndex).textWithoutPrompt() != line.text); } @@ -471,5 +477,10 @@ void PrintToConsole(std::string_view text) AddConsoleLine(ConsoleLine { .type = ConsoleLine::Output, .text = std::string(text) }); } +void PrintWarningToConsole(std::string_view text) +{ + AddConsoleLine(ConsoleLine { .type = ConsoleLine::Warning, .text = std::string(text) }); +} + } // namespace devilution #endif // _DEBUG diff --git a/Source/panels/console.hpp b/Source/panels/console.hpp index ccaaf8383de..401d50204fc 100644 --- a/Source/panels/console.hpp +++ b/Source/panels/console.hpp @@ -14,6 +14,7 @@ void OpenConsole(); bool ConsoleHandleEvent(const SDL_Event &event); void DrawConsole(const Surface &out); void PrintToConsole(std::string_view text); +void PrintWarningToConsole(std::string_view text); } // namespace devilution #endif // _DEBUG