From f0634dded2511118d8b1363f902d7668fc061018 Mon Sep 17 00:00:00 2001 From: VDm Date: Sat, 16 Aug 2025 00:01:44 +0400 Subject: [PATCH] feat(ui): implement type-related CSimpleFontString script methods --- src/ui/CSimpleFontScript.cpp | 1 + src/ui/CSimpleFontString.cpp | 11 ++++++ src/ui/CSimpleFontString.hpp | 3 ++ src/ui/CSimpleFontStringScript.cpp | 56 +++++++++++++++++++++++++++--- src/ui/CSimpleFrame.cpp | 11 ++++++ src/ui/CSimpleFrame.hpp | 3 ++ src/ui/Util.cpp | 17 +++++++++ src/ui/Util.hpp | 2 ++ 8 files changed, 99 insertions(+), 5 deletions(-) diff --git a/src/ui/CSimpleFontScript.cpp b/src/ui/CSimpleFontScript.cpp index f8068a2..5b0030c 100644 --- a/src/ui/CSimpleFontScript.cpp +++ b/src/ui/CSimpleFontScript.cpp @@ -1,4 +1,5 @@ #include "ui/CSimpleFontScript.hpp" +#include "ui/CSimpleFontString.hpp" #include "util/Unimplemented.hpp" #include diff --git a/src/ui/CSimpleFontString.cpp b/src/ui/CSimpleFontString.cpp index 5d58631..969e17f 100644 --- a/src/ui/CSimpleFontString.cpp +++ b/src/ui/CSimpleFontString.cpp @@ -19,6 +19,7 @@ int32_t CSimpleFontString::s_count; int32_t CSimpleFontString::s_metatable; int32_t CSimpleFontString::s_objectType; +const char* CSimpleFontString::s_objectTypeName = "FontString"; void CSimpleFontString::CreateScriptMetaTable() { lua_State* L = FrameScript_GetContext(); @@ -127,6 +128,16 @@ bool CSimpleFontString::IsA(int32_t type) { || type == CScriptObject::s_objectType; } +bool CSimpleFontString::IsA(const char* typeName) { + return !SStrCmpI(typeName, CSimpleFontString::s_objectTypeName, STORM_MAX_STR) + || !SStrCmpI(typeName, CScriptRegion::s_objectTypeName, STORM_MAX_STR) + || !SStrCmpI(typeName, CScriptObject::s_objectTypeName, STORM_MAX_STR); +} + +const char* CSimpleFontString::GetObjectTypeName() { + return CSimpleFontString::s_objectTypeName; +} + void CSimpleFontString::FontObjectUpdated(CSimpleFontStringAttributes& attributes) { attributes.Update(this, this->m_fontableFlags); } diff --git a/src/ui/CSimpleFontString.hpp b/src/ui/CSimpleFontString.hpp index a8a538d..030346e 100644 --- a/src/ui/CSimpleFontString.hpp +++ b/src/ui/CSimpleFontString.hpp @@ -14,6 +14,7 @@ class CSimpleFontString : public CSimpleRegion, public CSimpleFontable { static int32_t s_count; static int32_t s_metatable; static int32_t s_objectType; + static const char* s_objectTypeName; // Static functions static void CreateScriptMetaTable(); @@ -43,6 +44,8 @@ class CSimpleFontString : public CSimpleRegion, public CSimpleFontable { // Virtual member functions virtual ~CSimpleFontString(); virtual bool IsA(int32_t type); + virtual bool IsA(const char* typeName); + virtual const char* GetObjectTypeName(); virtual int32_t GetScriptMetaTable(); virtual void LoadXML(XMLNode* node, CStatus* status); virtual void OnColorChanged(bool a2); diff --git a/src/ui/CSimpleFontStringScript.cpp b/src/ui/CSimpleFontStringScript.cpp index 0032ef2..0618946 100644 --- a/src/ui/CSimpleFontStringScript.cpp +++ b/src/ui/CSimpleFontStringScript.cpp @@ -1,28 +1,74 @@ #include "ui/CSimpleFontStringScript.hpp" #include "ui/CSimpleFont.hpp" #include "ui/CSimpleFontString.hpp" +#include "ui/Util.hpp" #include "util/Lua.hpp" #include "util/Unimplemented.hpp" +#include "util/StringTo.hpp" #include int32_t CSimpleFontString_IsObjectType(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!lua_isstring(L, 2)) { + return luaL_error(L, "Usage: %s:IsObjectType(\"TYPE\")", string->GetDisplayName()); + } + + if (string->IsA(lua_tolstring(L, 2, nullptr))) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleFontString_GetObjectType(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + lua_pushstring(L, string->GetObjectTypeName()); + return 1; } int32_t CSimpleFontString_GetDrawLayer(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + auto layer = DrawLayerToString(string->m_drawlayer); + lua_pushstring(L, layer); + return 1; } int32_t CSimpleFontString_SetDrawLayer(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + + const char* strlayer = lua_isstring(L, 2) ? lua_tostring(L, 2) : nullptr; + + int32_t layer = 0; + if (!strlayer || !StringToDrawLayer(strlayer, layer)) { + return luaL_error(L, "Usage: %s:SetDrawLayer(\"layer\")", string->GetDisplayName()); + } + + string->SetFrame(string->m_parent, layer, string->m_shown); + return 0; } int32_t CSimpleFontString_SetVertexColor(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + + CImVector color; + string->GetVertexColor(color); + + CImVector newColor; + FrameScript_GetColor(L, 2, newColor); + if (!lua_isnumber(L, 5)) { + newColor.a = color.a; + } + + string->SetVertexColor(color); + // TODO: Some flag should be set + return 0; } int32_t CSimpleFontString_GetAlpha(lua_State* L) { diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index 6859567..53e5cbe 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -25,6 +25,7 @@ int32_t CSimpleFrame::s_metatable; int32_t CSimpleFrame::s_objectType; +const char* CSimpleFrame::s_objectTypeName = "Frame"; int32_t CSimpleFrame::GetObjectType() { if (!CSimpleFrame::s_objectType) { @@ -654,6 +655,16 @@ bool CSimpleFrame::IsA(int32_t type) { || type == CScriptObject::s_objectType; } +bool CSimpleFrame::IsA(const char* typeName) { + return !SStrCmpI(typeName, CSimpleFrame::s_objectTypeName, STORM_MAX_STR) + || !SStrCmpI(typeName, CScriptRegion::s_objectTypeName, STORM_MAX_STR) + || !SStrCmpI(typeName, CScriptObject::s_objectTypeName, STORM_MAX_STR); +} + +const char* CSimpleFrame::GetObjectTypeName() { + return CSimpleFrame::s_objectTypeName; +} + void CSimpleFrame::EnableEvent(CSimpleEventType eventType, int32_t priority) { if ((1 << eventType) & this->m_eventmask) { return; diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index fcc9d55..cf895f2 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -27,6 +27,7 @@ class CSimpleFrame : public CScriptRegion { // Static members static int32_t s_metatable; static int32_t s_objectType; + static const char* s_objectTypeName; // Static functions static void CreateScriptMetaTable(); @@ -91,6 +92,8 @@ class CSimpleFrame : public CScriptRegion { virtual ~CSimpleFrame(); virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); virtual bool IsA(int32_t type); + virtual bool IsA(const char* typeName); + virtual const char* GetObjectTypeName(); virtual int32_t GetScriptMetaTable(); virtual void LoadXML(XMLNode* node, CStatus* status); virtual void PreOnAnimUpdate(); diff --git a/src/ui/Util.cpp b/src/ui/Util.cpp index 837a3ee..a941d0f 100644 --- a/src/ui/Util.cpp +++ b/src/ui/Util.cpp @@ -126,3 +126,20 @@ const char* AnchorPointToString(int32_t point) { return "ANCHOR_NONE"; } } + +const char* DrawLayerToString(int32_t layer) { + switch (layer) { + case 0: + return "BACKGROUND"; + case 1: + return "BORDER"; + case 2: + return "ARTWORK"; + case 3: + return "OVERLAY"; + case 4: + return "HIGHLIGHT"; + default: + return "UNKNOWN"; + } +} diff --git a/src/ui/Util.hpp b/src/ui/Util.hpp index cdbd2a4..5c973ff 100644 --- a/src/ui/Util.hpp +++ b/src/ui/Util.hpp @@ -17,4 +17,6 @@ const char* OrientationToString(uint32_t orientation); const char* AnchorPointToString(int32_t point); +const char* DrawLayerToString(int32_t layer); + #endif