diff --git a/src/ui/CSimpleFontStringScript.cpp b/src/ui/CSimpleFontStringScript.cpp index 21b8a66..5fd1fd7 100644 --- a/src/ui/CSimpleFontStringScript.cpp +++ b/src/ui/CSimpleFontStringScript.cpp @@ -6,7 +6,7 @@ #include "util/Unimplemented.hpp" #include "util/StringTo.hpp" #include "gx/Coordinate.hpp" -#include + int32_t CSimpleFontString_IsObjectType(lua_State* L) { auto type = CSimpleFontString::GetObjectType(); @@ -222,15 +222,49 @@ int32_t CSimpleFontString_GetFont(lua_State* L) { } int32_t CSimpleFontString_SetFont(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!lua_isstring(L, 2) || !lua_isnumber(L, 3)) { + return luaL_error(L, "Usage: %s:SetFont(\"font\", fontHeight [, flags])", string->GetDisplayName()); + } + + auto fontName = lua_tostring(L, 2); + auto fontHeight = lua_tonumber(L, 3); + fontHeight /= CoordinateGetAspectCompensation() * 1024.0; + fontHeight = NDCToDDCWidth(fontHeight); + if (fontHeight <= 0.00000011920929) { + return luaL_error(L, "ERROR: %s:SetFont(): invalid fontHeight: %f, height must be > 0", string->GetDisplayName(), fontHeight); + } + + if (!*fontName) { + return 0; + } + + uint32_t fontFlags = 0; + if (lua_isstring(L, 4)) { + fontFlags = StringToFontFlags(lua_tostring(L, 4)); + } + + if (string->SetFont(fontName, fontHeight, fontFlags, false)) { + // TODO: Set some object flag + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleFontString_GetText(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + lua_pushstring(L, string->m_text); + return 1; } int32_t CSimpleFontString_GetFieldSize(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + lua_pushnumber(L, 8191.0); + return 1; } int32_t CSimpleFontString_SetText(lua_State* L) { diff --git a/src/util/StringTo.cpp b/src/util/StringTo.cpp index edcd744..5630ca9 100644 --- a/src/util/StringTo.cpp +++ b/src/util/StringTo.cpp @@ -199,3 +199,20 @@ bool StringToAnchorPoint(const char* string, int32_t& point) { return false; } + +uint32_t StringToFontFlags(const char* string) { + static std::pair table[3] = { + { 1, "OUTLINE" }, + { 4, "THICKOUTLINE" }, + { 2, "MONOCHROME" } + }; + + uint32_t result = 0; + for (size_t i = 0; i < 3; ++i) { + if (!SStrCmpI(string, table[i].second, STORM_MAX_STR)) { + result |= table[i].first; + } + } + + return result; +} diff --git a/src/util/StringTo.hpp b/src/util/StringTo.hpp index 4b698ae..1a50593 100644 --- a/src/util/StringTo.hpp +++ b/src/util/StringTo.hpp @@ -21,4 +21,6 @@ bool StringToOrientation(const char* string, uint32_t& orientation); bool StringToAnchorPoint(const char* string, int32_t& point); +uint32_t StringToFontFlags(const char* string); + #endif