From 9d82727c9bb9c17e0290e81a34abb4d9196954bb Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 10 Aug 2025 21:24:34 +0400 Subject: [PATCH] feat(gameui): add script events into CGTooltip class --- src/gameui/CGTooltip.cpp | 70 ++++++++++++++++++++++++++++++++++++++-- src/gameui/CGTooltip.hpp | 22 +++++++++++-- src/os/win/Debug.cpp | 2 +- src/util/CStatus.cpp | 21 +++++++++--- 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/src/gameui/CGTooltip.cpp b/src/gameui/CGTooltip.cpp index d4cd380..f298f8d 100644 --- a/src/gameui/CGTooltip.cpp +++ b/src/gameui/CGTooltip.cpp @@ -1,8 +1,10 @@ #include "gameui/CGTooltip.hpp" #include "gameui/CGTooltipScript.hpp" +#include "util/Lua.hpp" #include int32_t CGTooltip::s_metatable; +int32_t CGTooltip::s_objectType; CSimpleFrame* CGTooltip::Create(CSimpleFrame* parent) { // TODO: Data = CDataAllocator__GetData(0, ".?AVCGTooltip@@", -2); @@ -15,15 +17,79 @@ void CGTooltip::CreateScriptMetaTable() { CGTooltip::s_metatable = ref; } +int32_t CGTooltip::GetObjectType() { + if (!CGTooltip::s_objectType) { + CGTooltip::s_objectType = ++FrameScript_Object::s_objectTypes; + } + + return CGTooltip::s_objectType; +} + void CGTooltip::RegisterScriptMethods(lua_State* L) { CSimpleFrame::RegisterScriptMethods(L); FrameScript_Object::FillScriptMethodTable(L, CGTooltipMethods, NUM_CGTOOLTIP_SCRIPT_METHODS); } +CGTooltip::CGTooltip(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} + +bool CGTooltip::IsA(int32_t type) { + return type == CGTooltip::s_objectType + || type == CSimpleFrame::s_objectType + || type == CScriptRegion::s_objectType + || type == CScriptObject::s_objectType; +} + int32_t CGTooltip::GetScriptMetaTable() { return CGTooltip::s_metatable; } -CGTooltip::CGTooltip(CSimpleFrame* parent) - : CSimpleFrame(parent) { +FrameScript_Object::ScriptIx* CGTooltip::GetScriptByName(const char* name, ScriptData& data) { + auto result = this->CSimpleFrame::GetScriptByName(name, data); + if (result) + return result; + + if (!SStrCmpI(name, "OnTooltipSetDefaultAnchor", STORM_MAX_STR)) { + return &this->m_onTooltipSetDefaultAnchor; + } + + if (!SStrCmpI(name, "OnTooltipCleared", STORM_MAX_STR)) { + return &this->m_onTooltipCleared; + } + + if (!SStrCmpI(name, "OnTooltipAddMoney", STORM_MAX_STR)) { + data.wrapper = "return function(self,cost,maxcost) %s end"; + return &this->m_onTooltipAddMoney; + } + + if (!SStrCmpI(name, "OnTooltipSetUnit", STORM_MAX_STR)) { + return &this->m_onTooltipSetUnit; + } + + if (!SStrCmpI(name, "OnTooltipSetItem", STORM_MAX_STR)) { + return &this->m_onTooltipSetItem; + } + + if (!SStrCmpI(name, "OnTooltipSetSpell", STORM_MAX_STR)) { + return &this->m_onTooltipSetSpell; + } + + if (!SStrCmpI(name, "OnTooltipSetQuest", STORM_MAX_STR)) { + return &this->m_onTooltipSetQuest; + } + + if (!SStrCmpI(name, "OnTooltipSetAchievement", STORM_MAX_STR)) { + return &this->m_onTooltipSetAchievement; + } + + if (!SStrCmpI(name, "OnTooltipSetEquipmentSet", STORM_MAX_STR)) { + return &this->m_onTooltipSetEquipmentSet; + } + + if (!SStrCmpI(name, "OnTooltipSetFrameStack", STORM_MAX_STR)) { + return &this->m_onTooltipSetFrameStack; + } + + return nullptr; } diff --git a/src/gameui/CGTooltip.hpp b/src/gameui/CGTooltip.hpp index b532723..4c175da 100644 --- a/src/gameui/CGTooltip.hpp +++ b/src/gameui/CGTooltip.hpp @@ -8,17 +8,33 @@ class CGTooltip : public CSimpleFrame { public: // Static variables static int32_t s_metatable; + static int32_t s_objectType; // Static functions static CSimpleFrame* Create(CSimpleFrame* parent); static void CreateScriptMetaTable(); + static int32_t GetObjectType(); static void RegisterScriptMethods(lua_State* L); - // Virtual member functions - virtual int32_t GetScriptMetaTable(); - // Member functions CGTooltip(CSimpleFrame* parent); + + // Virtual member functions + virtual bool IsA(int32_t type); + virtual int32_t GetScriptMetaTable(); + virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); + + // Members + ScriptIx m_onTooltipSetDefaultAnchor; + ScriptIx m_onTooltipCleared; + ScriptIx m_onTooltipAddMoney; + ScriptIx m_onTooltipSetUnit; + ScriptIx m_onTooltipSetItem; + ScriptIx m_onTooltipSetSpell; + ScriptIx m_onTooltipSetQuest; + ScriptIx m_onTooltipSetAchievement; + ScriptIx m_onTooltipSetEquipmentSet; + ScriptIx m_onTooltipSetFrameStack; }; #endif // GAME_UI_CGTOOLTIP_HPP diff --git a/src/os/win/Debug.cpp b/src/os/win/Debug.cpp index 680200b..67583b0 100644 --- a/src/os/win/Debug.cpp +++ b/src/os/win/Debug.cpp @@ -4,7 +4,7 @@ #include void OsOutputDebugString(const char* format, ...) { - char buffer[256]; + char buffer[512]; va_list args; va_start(args, format); diff --git a/src/util/CStatus.cpp b/src/util/CStatus.cpp index 637bd73..3b757dc 100644 --- a/src/util/CStatus.cpp +++ b/src/util/CStatus.cpp @@ -1,4 +1,5 @@ #include "util/CStatus.hpp" +#include "os/Debug.hpp" #include #include @@ -19,9 +20,15 @@ void CStatus::Add(STATUS_TYPE severity, const char* format, ...) { // Remove temporary console debug logging va_list args; va_start(args, format); - vprintf(format, args); - printf("\n"); + + char output[490]; + auto length = vsnprintf(output, sizeof(output), format, args); + if (length >= sizeof(output)) { + output[sizeof(output) - 1] = '\0'; + } + va_end(args); + OsOutputDebugString("CStatus: %s\n", output); } void CStatus::Prepend(STATUS_TYPE severity, const char* format, ...) { @@ -29,9 +36,15 @@ void CStatus::Prepend(STATUS_TYPE severity, const char* format, ...) { // Remove temporary console debug logging va_list args; va_start(args, format); - vprintf(format, args); - printf("\n"); + + char output[490]; + auto length = vsnprintf(output, sizeof(output), format, args); + if (length >= sizeof(output)) { + output[sizeof(output) - 1] = '\0'; + } + va_end(args); + OsOutputDebugString("CStatus: %s\n", output); } CStatus& GetGlobalStatusObj() {