From 568afa1c1b5602c48261b47c66d632fb0ac82ce0 Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 10 Aug 2025 21:48:58 +0400 Subject: [PATCH 1/7] feat(ui): add CSimpleStatusBar skeleton --- src/ui/CSimpleStatusBar.cpp | 39 ++++++++++++++++++ src/ui/CSimpleStatusBar.hpp | 25 ++++++++++++ src/ui/CSimpleStatusBarScript.cpp | 68 +++++++++++++++++++++++++++++++ src/ui/CSimpleStatusBarScript.hpp | 10 +++++ src/ui/FrameXML.cpp | 4 +- src/ui/ScriptFunctions.cpp | 3 +- 6 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 src/ui/CSimpleStatusBar.cpp create mode 100644 src/ui/CSimpleStatusBar.hpp create mode 100644 src/ui/CSimpleStatusBarScript.cpp create mode 100644 src/ui/CSimpleStatusBarScript.hpp diff --git a/src/ui/CSimpleStatusBar.cpp b/src/ui/CSimpleStatusBar.cpp new file mode 100644 index 0000000..24aba74 --- /dev/null +++ b/src/ui/CSimpleStatusBar.cpp @@ -0,0 +1,39 @@ +#include "ui/CSimpleStatusBar.hpp" +#include "ui/CSimpleStatusBarScript.hpp" + +int32_t CSimpleStatusBar::s_metatable = 0; +int32_t CSimpleStatusBar::s_objectType = 0; + +void CSimpleStatusBar::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleStatusBar::RegisterScriptMethods); + CSimpleStatusBar::s_metatable = ref; +} + +int32_t CSimpleStatusBar::GetObjectType() { + if (!CSimpleStatusBar::s_objectType) { + CSimpleStatusBar::s_objectType = ++FrameScript_Object::s_objectTypes; + } + + return CSimpleStatusBar::s_objectType; +} + +void CSimpleStatusBar::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, SimpleStatusBarMethods, NUM_SIMPLE_STATUS_BAR_SCRIPT_METHODS); +} + +CSimpleStatusBar::CSimpleStatusBar(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} + +bool CSimpleStatusBar::IsA(int32_t type) { + return type == CSimpleStatusBar::s_objectType + || type == CSimpleFrame::s_objectType + || type == CScriptRegion::s_objectType + || type == CScriptObject::s_objectType; +} + +int32_t CSimpleStatusBar::GetScriptMetaTable() { + return CSimpleStatusBar::s_metatable; +} diff --git a/src/ui/CSimpleStatusBar.hpp b/src/ui/CSimpleStatusBar.hpp new file mode 100644 index 0000000..6328186 --- /dev/null +++ b/src/ui/CSimpleStatusBar.hpp @@ -0,0 +1,25 @@ +#ifndef UI_C_SIMPLE_STATUS_BAR_HPP +#define UI_C_SIMPLE_STATUS_BAR_HPP + +#include "ui/CSimpleFrame.hpp" + +class CSimpleStatusBar : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + static int32_t s_objectType; + + // Static functions + static void CreateScriptMetaTable(); + static int32_t GetObjectType(); + static void RegisterScriptMethods(lua_State* L); + + // Member functions + CSimpleStatusBar(CSimpleFrame* parent); + + // Virtual member functions + virtual bool IsA(int32_t type); + virtual int32_t GetScriptMetaTable(); +}; + +#endif diff --git a/src/ui/CSimpleStatusBarScript.cpp b/src/ui/CSimpleStatusBarScript.cpp new file mode 100644 index 0000000..1172af4 --- /dev/null +++ b/src/ui/CSimpleStatusBarScript.cpp @@ -0,0 +1,68 @@ +#include "ui/CSimpleStatusBarScript.hpp" +#include "ui/CSimpleStatusBar.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_GetOrientation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetOrientation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetMinMaxValues(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetMinMaxValues(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetValue(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetValue(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetStatusBarTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetStatusBarTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetStatusBarColor(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetStatusBarColor(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetRotatesTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetRotatesTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method SimpleStatusBarMethods[NUM_SIMPLE_STATUS_BAR_SCRIPT_METHODS] = { + { "GetOrientation", &Script_GetOrientation }, + { "SetOrientation", &Script_SetOrientation }, + { "GetMinMaxValues", &Script_GetMinMaxValues }, + { "SetMinMaxValues", &Script_SetMinMaxValues }, + { "GetValue", &Script_GetValue }, + { "SetValue", &Script_SetValue }, + { "GetStatusBarTexture", &Script_GetStatusBarTexture }, + { "SetStatusBarTexture", &Script_SetStatusBarTexture }, + { "GetStatusBarColor", &Script_GetStatusBarColor }, + { "SetStatusBarColor", &Script_SetStatusBarColor }, + { "GetRotatesTexture", &Script_GetRotatesTexture }, + { "SetRotatesTexture", &Script_SetRotatesTexture } +}; diff --git a/src/ui/CSimpleStatusBarScript.hpp b/src/ui/CSimpleStatusBarScript.hpp new file mode 100644 index 0000000..f440cc2 --- /dev/null +++ b/src/ui/CSimpleStatusBarScript.hpp @@ -0,0 +1,10 @@ +#ifndef UI_C_SIMPLE_STATUS_BAR_SCRIPT_HPP +#define UI_C_SIMPLE_STATUS_BAR_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_SIMPLE_STATUS_BAR_SCRIPT_METHODS 12 + +extern FrameScript_Method SimpleStatusBarMethods[NUM_SIMPLE_STATUS_BAR_SCRIPT_METHODS]; + +#endif diff --git a/src/ui/FrameXML.cpp b/src/ui/FrameXML.cpp index 30b6d54..9a14b08 100644 --- a/src/ui/FrameXML.cpp +++ b/src/ui/FrameXML.cpp @@ -10,6 +10,7 @@ #include "ui/CSimpleScrollFrame.hpp" #include "ui/CSimpleMessageScrollFrame.hpp" #include "ui/CSimpleSlider.hpp" +#include "ui/CSimpleStatusBar.hpp" #include "util/CStatus.hpp" #include "util/SFile.hpp" #include @@ -101,7 +102,8 @@ CSimpleFrame* Create_SimpleHTML(CSimpleFrame* parent) { CSimpleFrame* Create_SimpleStatusBar(CSimpleFrame* parent) { // TODO - return nullptr; + auto m = SMemAlloc(sizeof(CSimpleStatusBar), __FILE__, __LINE__, 0x0); + return new (m) CSimpleStatusBar(parent); } CSimpleFrame* Create_SimpleColorSelect(CSimpleFrame* parent) { diff --git a/src/ui/ScriptFunctions.cpp b/src/ui/ScriptFunctions.cpp index 56fda65..1b9780f 100644 --- a/src/ui/ScriptFunctions.cpp +++ b/src/ui/ScriptFunctions.cpp @@ -13,6 +13,7 @@ #include "ui/CSimpleSlider.hpp" #include "ui/CSimpleTexture.hpp" #include "ui/CSimpleMessageScrollFrame.hpp" +#include "ui/CSimpleStatusBar.hpp" #include "ui/FrameScript.hpp" void CharacterCreateRegisterScriptFunctions() { @@ -88,7 +89,7 @@ void RegisterSimpleFrameScriptMethods() { CSimpleSlider::CreateScriptMetaTable(); // TODO - // CSimpleStatusBar::CreateScriptMetaTable(); + CSimpleStatusBar::CreateScriptMetaTable(); // CSimpleColorSelect::CreateScriptMetaTable(); CSimpleMovieFrame::CreateScriptMetaTable(); } From b76a9fed82c3e9e88e5d09e9f5d53bcf3713b7a8 Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 10 Aug 2025 22:31:18 +0400 Subject: [PATCH 2/7] feat(ui): add CSimpleMessageFrame skeleton --- .../GameScriptFunctionsScriptEvents.cpp | 1 - src/ui/CSimpleMessageFrame.cpp | 39 +++++++++++ src/ui/CSimpleMessageFrame.hpp | 25 +++++++ src/ui/CSimpleMessageFrameScript.cpp | 68 +++++++++++++++++++ src/ui/CSimpleMessageFrameScript.hpp | 10 +++ src/ui/FrameXML.cpp | 4 +- src/ui/ScriptFunctions.cpp | 4 +- 7 files changed, 147 insertions(+), 4 deletions(-) create mode 100644 src/ui/CSimpleMessageFrame.cpp create mode 100644 src/ui/CSimpleMessageFrame.hpp create mode 100644 src/ui/CSimpleMessageFrameScript.cpp create mode 100644 src/ui/CSimpleMessageFrameScript.hpp diff --git a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp index e92432e..81af2c6 100644 --- a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp +++ b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp @@ -52,7 +52,6 @@ static int32_t Script_UnitIsUnit(lua_State* L) { static int32_t Script_UnitIsPlayer(lua_State* L) { // TODO - __debugbreak(); lua_pushnil(L); return 1; } diff --git a/src/ui/CSimpleMessageFrame.cpp b/src/ui/CSimpleMessageFrame.cpp new file mode 100644 index 0000000..ea4e0a3 --- /dev/null +++ b/src/ui/CSimpleMessageFrame.cpp @@ -0,0 +1,39 @@ +#include "ui/CSimpleMessageFrame.hpp" +#include "ui/CSimpleMessageFrameScript.hpp" + +int32_t CSimpleMessageFrame::s_metatable = 0; +int32_t CSimpleMessageFrame::s_objectType = 0; + +void CSimpleMessageFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleMessageFrame::RegisterScriptMethods); + CSimpleMessageFrame::s_metatable = ref; +} + +int32_t CSimpleMessageFrame::GetObjectType() { + if (!CSimpleMessageFrame::s_objectType) { + CSimpleMessageFrame::s_objectType = ++FrameScript_Object::s_objectTypes; + } + + return CSimpleMessageFrame::s_objectType; +} + +void CSimpleMessageFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, SimpleMessageFrameMethods, NUM_SIMPLE_MESSAGE_FRAME_SCRIPT_METHODS); +} + +CSimpleMessageFrame::CSimpleMessageFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} + +bool CSimpleMessageFrame::IsA(int32_t type) { + return type == CSimpleMessageFrame::s_objectType + || type == CSimpleFrame::s_objectType + || type == CScriptRegion::s_objectType + || type == CScriptObject::s_objectType; +} + +int32_t CSimpleMessageFrame::GetScriptMetaTable() { + return CSimpleMessageFrame::s_metatable; +} diff --git a/src/ui/CSimpleMessageFrame.hpp b/src/ui/CSimpleMessageFrame.hpp new file mode 100644 index 0000000..2029db0 --- /dev/null +++ b/src/ui/CSimpleMessageFrame.hpp @@ -0,0 +1,25 @@ +#ifndef UI_C_SIMPLE_MESSAGE_FRAME_HPP +#define UI_C_SIMPLE_MESSAGE_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" + +class CSimpleMessageFrame : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + static int32_t s_objectType; + + // Static functions + static void CreateScriptMetaTable(); + static int32_t GetObjectType(); + static void RegisterScriptMethods(lua_State* L); + + // Member functions + CSimpleMessageFrame(CSimpleFrame* parent); + + // Virtual member functions + virtual bool IsA(int32_t type); + virtual int32_t GetScriptMetaTable(); +}; + +#endif diff --git a/src/ui/CSimpleMessageFrameScript.cpp b/src/ui/CSimpleMessageFrameScript.cpp new file mode 100644 index 0000000..8ca78d7 --- /dev/null +++ b/src/ui/CSimpleMessageFrameScript.cpp @@ -0,0 +1,68 @@ +#include "ui/CSimpleMessageFrameScript.hpp" +#include "ui/CSimpleMessageFrame.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_GetOrientation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetOrientation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetMinMaxValues(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetMinMaxValues(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetValue(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetValue(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetStatusBarTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetStatusBarTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetStatusBarColor(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetStatusBarColor(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetRotatesTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetRotatesTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method SimpleMessageFrameMethods[NUM_SIMPLE_MESSAGE_FRAME_SCRIPT_METHODS] = { + { "GetOrientation", &Script_GetOrientation }, + { "SetOrientation", &Script_SetOrientation }, + { "GetMinMaxValues", &Script_GetMinMaxValues }, + { "SetMinMaxValues", &Script_SetMinMaxValues }, + { "GetValue", &Script_GetValue }, + { "SetValue", &Script_SetValue }, + { "GetStatusBarTexture", &Script_GetStatusBarTexture }, + { "SetStatusBarTexture", &Script_SetStatusBarTexture }, + { "GetStatusBarColor", &Script_GetStatusBarColor }, + { "SetStatusBarColor", &Script_SetStatusBarColor }, + { "GetRotatesTexture", &Script_GetRotatesTexture }, + { "SetRotatesTexture", &Script_SetRotatesTexture } +}; diff --git a/src/ui/CSimpleMessageFrameScript.hpp b/src/ui/CSimpleMessageFrameScript.hpp new file mode 100644 index 0000000..bf01acd --- /dev/null +++ b/src/ui/CSimpleMessageFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef UI_C_SIMPLE_MESSAGE_FRAME_SCRIPT_HPP +#define UI_C_SIMPLE_MESSAGE_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_SIMPLE_MESSAGE_FRAME_SCRIPT_METHODS 12 + +extern FrameScript_Method SimpleMessageFrameMethods[NUM_SIMPLE_MESSAGE_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/ui/FrameXML.cpp b/src/ui/FrameXML.cpp index 9a14b08..763e60a 100644 --- a/src/ui/FrameXML.cpp +++ b/src/ui/FrameXML.cpp @@ -8,6 +8,7 @@ #include "ui/CSimpleModel.hpp" #include "ui/CSimpleMovieFrame.hpp" #include "ui/CSimpleScrollFrame.hpp" +#include "ui/CSimpleMessageFrame.hpp" #include "ui/CSimpleMessageScrollFrame.hpp" #include "ui/CSimpleSlider.hpp" #include "ui/CSimpleStatusBar.hpp" @@ -57,7 +58,8 @@ CSimpleFrame* Create_SimpleFrame(CSimpleFrame* parent) { CSimpleFrame* Create_SimpleMessageFrame(CSimpleFrame* parent) { // TODO - return nullptr; + auto m = SMemAlloc(sizeof(CSimpleMessageFrame), __FILE__, __LINE__, 0x0); + return new (m) CSimpleMessageFrame(parent); } CSimpleFrame* Create_SimpleModel(CSimpleFrame* parent) { diff --git a/src/ui/ScriptFunctions.cpp b/src/ui/ScriptFunctions.cpp index 1b9780f..466d271 100644 --- a/src/ui/ScriptFunctions.cpp +++ b/src/ui/ScriptFunctions.cpp @@ -12,6 +12,7 @@ #include "ui/CSimpleScrollFrame.hpp" #include "ui/CSimpleSlider.hpp" #include "ui/CSimpleTexture.hpp" +#include "ui/CSimpleMessageFrame.hpp" #include "ui/CSimpleMessageScrollFrame.hpp" #include "ui/CSimpleStatusBar.hpp" #include "ui/FrameScript.hpp" @@ -79,8 +80,7 @@ void RegisterSimpleFrameScriptMethods() { CSimpleEditBox::CreateScriptMetaTable(); CSimpleHTML::CreateScriptMetaTable(); - // TODO - // CSimpleMessageFrame::CreateScriptMetaTable(); + CSimpleMessageFrame::CreateScriptMetaTable(); CSimpleMessageScrollFrame::CreateScriptMetaTable(); CSimpleModel::CreateScriptMetaTable(); From 88f2cb7e5f0d1151980263844f97f4e52a2370a6 Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 10 Aug 2025 23:49:54 +0400 Subject: [PATCH 3/7] feat(ui): implement CSimpleFrame::LoadXML_Attributes --- src/gameui/CGTooltip.hpp | 2 +- src/gameui/GameScriptFunctions.cpp | 2 + .../scripts/GameScriptFunctionsPartyInfo.cpp | 8 ++- .../scripts/GameScriptFunctionsRaidInfo.cpp | 8 ++- src/ui/CSimpleButtonScript.cpp | 13 +++- src/ui/CSimpleFrame.cpp | 65 ++++++++++++++++++- src/ui/CSimpleFrame.hpp | 7 ++ src/ui/CSimpleStatusBar.cpp | 20 ++++++ src/ui/CSimpleStatusBar.hpp | 5 ++ 9 files changed, 123 insertions(+), 7 deletions(-) diff --git a/src/gameui/CGTooltip.hpp b/src/gameui/CGTooltip.hpp index 4c175da..dd64fca 100644 --- a/src/gameui/CGTooltip.hpp +++ b/src/gameui/CGTooltip.hpp @@ -24,7 +24,7 @@ class CGTooltip : public CSimpleFrame { virtual int32_t GetScriptMetaTable(); virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); - // Members + // Member variables ScriptIx m_onTooltipSetDefaultAnchor; ScriptIx m_onTooltipCleared; ScriptIx m_onTooltipAddMoney; diff --git a/src/gameui/GameScriptFunctions.cpp b/src/gameui/GameScriptFunctions.cpp index c674e1a..2480b7f 100644 --- a/src/gameui/GameScriptFunctions.cpp +++ b/src/gameui/GameScriptFunctions.cpp @@ -8,6 +8,7 @@ #include "gameui/CGTabardModelFrame.hpp" #include "gameui/CGQuestPOIFrame.hpp" #include "console/Console.hpp" +#include "gx/CGVideoOptions.hpp" #include "ui/FrameXML.hpp" #include "ui/FrameScript.hpp" #include "util/Lua.hpp" @@ -1690,6 +1691,7 @@ void LoadScriptFunctions() { GlyphInfoRegisterScriptFunctions(); AchievementInfoRegisterScriptFunctions(); CurrencyTypesRegisterScriptFunctions(); + CGVideoOptions::RegisterScriptFunctions(); EquipmentManagerRegisterScriptFunctions(); GMTicketInfoRegisterScriptFunctions(); BattlenetUIRegisterScriptFunctions(); diff --git a/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp b/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp index 1a7f8fe..0c33c4f 100644 --- a/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp @@ -5,11 +5,15 @@ static int32_t Script_GetNumPartyMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRealNumPartyMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetPartyMember(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp b/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp index d69ebda..ff27784 100644 --- a/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp @@ -5,11 +5,15 @@ static int32_t Script_GetNumRaidMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRealNumRaidMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRaidRosterInfo(lua_State* L) { diff --git a/src/ui/CSimpleButtonScript.cpp b/src/ui/CSimpleButtonScript.cpp index 46a2420..8010475 100644 --- a/src/ui/CSimpleButtonScript.cpp +++ b/src/ui/CSimpleButtonScript.cpp @@ -128,7 +128,18 @@ int32_t CSimpleButton_SetFontString(lua_State* L) { } int32_t CSimpleButton_GetFontString(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleButton::GetObjectType(); + auto button = static_cast(FrameScript_GetObjectThis(L, type)); + auto fontString = button->m_text; + if (fontString) { + if (!fontString->lua_registered) { + fontString->RegisterScriptObject(nullptr); + } + lua_rawgeti(L, LUA_REGISTRYINDEX, fontString->lua_objectRef); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleButton_SetText(lua_State* L) { diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index e610bca..1441a58 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -700,7 +700,70 @@ int32_t CSimpleFrame::HideThis() { } void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { - // TODO + auto L = FrameScript_GetContext(); + + auto child = node->m_child; + while (child) { + auto childName = child->m_name.GetString(); + if (SStrCmpI(childName, "Attribute", STORM_MAX_STR)) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: Unknown attributes element %s", frameName, childName); + child = child->m_next; + continue; + } + + auto name = child->GetAttributeByName("name"); + if (!name) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: unnamed attribute element", frameName); + child = child->m_next; + continue; + } + + auto type = child->GetAttributeByName("type"); + if (!type) { + type = "string"; + } + + auto value = child->GetAttributeByName("value"); + if (!value || !SStrCmpI(value, "nil", STORM_MAX_STR)) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: attribute element named %s missing value", frameName, name); + child = child->m_next; + continue; + } + + if (!SStrCmpI(type, "nil", STORM_MAX_STR)) { + lua_pushnil(L); + } else if (!SStrCmpI(type, "boolean", STORM_MAX_STR)) { + lua_pushboolean(L, StringToBOOL(value)); + } else if (!SStrCmpI(type, "number", STORM_MAX_STR)) { + lua_pushnumber(L, SStrToFloat(value)); + } else { + lua_pushstring(L, value); + } + + auto attribute = this->m_attributes.Ptr(name); + if (attribute) { + luaL_unref(L, LUA_REGISTRYINDEX, attribute->luaRef); + } else { + attribute = this->m_attributes.New(name, 0, 0); + } + + // TODO: LUA Tainted Logic + attribute->luaRef = luaL_ref(L, LUA_REGISTRYINDEX); + + child = child->m_next; + } } void CSimpleFrame::LoadXML_Backdrop(XMLNode* node, CStatus* status) { diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index 40abe7d..a477e37 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -7,6 +7,7 @@ #include "ui/Types.hpp" #include #include +#include class CBackdropGenerator; class CCharEvent; @@ -16,6 +17,11 @@ class CSimpleTitleRegion; class CSimpleTop; struct lua_State; +class FRAMEATTR : public TSHashObject { + public: + int32_t luaRef; +}; + class CSimpleFrame : public CScriptRegion { public: // Static members @@ -79,6 +85,7 @@ class CSimpleFrame : public CScriptRegion { TSLink m_framesLink; TSLink m_destroyedLink; TSLink m_strataLink; + TSHashTable m_attributes; // Virtual member functions virtual ~CSimpleFrame(); diff --git a/src/ui/CSimpleStatusBar.cpp b/src/ui/CSimpleStatusBar.cpp index 24aba74..b07e28d 100644 --- a/src/ui/CSimpleStatusBar.cpp +++ b/src/ui/CSimpleStatusBar.cpp @@ -37,3 +37,23 @@ bool CSimpleStatusBar::IsA(int32_t type) { int32_t CSimpleStatusBar::GetScriptMetaTable() { return CSimpleStatusBar::s_metatable; } + +FrameScript_Object::ScriptIx* CSimpleStatusBar::GetScriptByName(const char* name, ScriptData& data) { + auto parentScript = CSimpleFrame::GetScriptByName(name, data); + + if (parentScript) { + return parentScript; + } + + if (!SStrCmpI(name, "OnValueChanged", STORM_MAX_STR)) { + data.wrapper = "return function(self,value) %s end"; + return &this->m_onValueChanged; + } + + if (!SStrCmpI(name, "OnMinMaxChanged", STORM_MAX_STR)) { + data.wrapper = "return function(self,min,max) %s end"; + return &this->m_onMinMaxChanged; + } + + return nullptr; +} diff --git a/src/ui/CSimpleStatusBar.hpp b/src/ui/CSimpleStatusBar.hpp index 6328186..e7973b3 100644 --- a/src/ui/CSimpleStatusBar.hpp +++ b/src/ui/CSimpleStatusBar.hpp @@ -20,6 +20,11 @@ class CSimpleStatusBar : public CSimpleFrame { // Virtual member functions virtual bool IsA(int32_t type); virtual int32_t GetScriptMetaTable(); + virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); + + // Member variables + ScriptIx m_onValueChanged; + ScriptIx m_onMinMaxChanged; }; #endif From 19feaf57d31d204249e70b1babdfe78fcead8389 Mon Sep 17 00:00:00 2001 From: VDm Date: Mon, 11 Aug 2025 00:56:29 +0400 Subject: [PATCH 4/7] feat(ui): implement CSimpleFrame_GetAttribute script method --- src/ui/CSimpleFrame.cpp | 27 +++++++-------- src/ui/CSimpleFrame.hpp | 3 +- src/ui/CSimpleFrameScript.cpp | 62 ++++++++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index 1441a58..71dcc3f 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -706,22 +706,14 @@ void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { while (child) { auto childName = child->m_name.GetString(); if (SStrCmpI(childName, "Attribute", STORM_MAX_STR)) { - const char* frameName = this->GetName(); - if (!frameName) { - frameName = ""; - } - status->Add(STATUS_WARNING, "Frame %s: Unknown attributes element %s", frameName, childName); + status->Add(STATUS_WARNING, "Frame %s: Unknown attributes element %s", this->GetDisplayName(), childName); child = child->m_next; continue; } auto name = child->GetAttributeByName("name"); if (!name) { - const char* frameName = this->GetName(); - if (!frameName) { - frameName = ""; - } - status->Add(STATUS_WARNING, "Frame %s: unnamed attribute element", frameName); + status->Add(STATUS_WARNING, "Frame %s: unnamed attribute element", this->GetDisplayName()); child = child->m_next; continue; } @@ -733,11 +725,7 @@ void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { auto value = child->GetAttributeByName("value"); if (!value || !SStrCmpI(value, "nil", STORM_MAX_STR)) { - const char* frameName = this->GetName(); - if (!frameName) { - frameName = ""; - } - status->Add(STATUS_WARNING, "Frame %s: attribute element named %s missing value", frameName, name); + status->Add(STATUS_WARNING, "Frame %s: attribute element named %s missing value", this->GetDisplayName(), name); child = child->m_next; continue; } @@ -1651,3 +1639,12 @@ void CSimpleFrame::UnregisterRegion(CSimpleRegion* region) { this->m_regions.UnlinkNode(region); } + +bool CSimpleFrame::GetAttribute(const char* name, int32_t& luaRef) { + auto attribute = this->m_attributes.Ptr(name); + if (!attribute || attribute->luaRef == -1) { + return false; + } + luaRef = attribute->luaRef; + return true; +} diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index a477e37..e25d1e5 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -19,7 +19,7 @@ struct lua_State; class FRAMEATTR : public TSHashObject { public: - int32_t luaRef; + int32_t luaRef = -1; }; class CSimpleFrame : public CScriptRegion { @@ -165,6 +165,7 @@ class CSimpleFrame : public CScriptRegion { void Show(); int32_t TestHitRect(const C2Vector& pt); void UnregisterForEvents(int32_t a2); + bool GetAttribute(const char* name, int32_t& luaRef); }; #endif diff --git a/src/ui/CSimpleFrameScript.cpp b/src/ui/CSimpleFrameScript.cpp index 739e317..e50e569 100644 --- a/src/ui/CSimpleFrameScript.cpp +++ b/src/ui/CSimpleFrameScript.cpp @@ -231,7 +231,67 @@ int32_t CSimpleFrame_CanChangeAttributes(lua_State* L) { } int32_t CSimpleFrame_GetAttribute(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFrame::GetObjectType(); + auto frame = static_cast(FrameScript_GetObjectThis(L, type)); + + if (lua_gettop(L) == 4 && lua_isstring(L, 3)) { + size_t prefixLength; + size_t nameLength; + size_t suffixLength; + auto prefix = lua_tolstring(L, 2, &prefixLength); + auto name = lua_tolstring(L, 3, &nameLength); + auto suffix = lua_tolstring(L, 4, &suffixLength); + + int32_t luaRef = -1; + char fullName[256]; + + size_t offset = 0; + offset += SStrNCopy(&fullName[offset], prefix, prefixLength, sizeof(fullName) - offset); + offset += SStrNCopy(&fullName[offset], name, nameLength, sizeof(fullName) - offset); + offset += SStrNCopy(&fullName[offset], suffix, suffixLength, sizeof(fullName) - offset); + + if (frame->GetAttribute(fullName, luaRef)) { + lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef); + return 1; + } + + offset = 0; + offset += SStrNCopy(&fullName[offset], prefix, prefixLength, sizeof(fullName) - offset - 1); + offset += SStrNCopy(&fullName[offset], name, nameLength, sizeof(fullName) - offset - 1); + fullName[offset++] = '*'; + fullName[offset++] = '\0'; + + if (frame->GetAttribute(fullName, luaRef)) { + lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef); + return 1; + } + + offset = 0; + fullName[offset++] = '*'; + offset += SStrNCopy(&fullName[offset], name, nameLength, sizeof(fullName) - offset - 1); + fullName[offset++] = '*'; + fullName[offset++] = '\0'; + + if (frame->GetAttribute(fullName, luaRef) || frame->GetAttribute(name, luaRef)) { + lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef); + return 1; + } + + lua_pushnil(L); + } else { + if (!lua_isstring(L, 2)) { + return luaL_error(L, "Usage: %s:GetAttribute(\"name\")", frame->GetDisplayName()); + } + + auto name = lua_tolstring(L, 2, nullptr); + int32_t luaRef = -1; + if (frame->GetAttribute(name, luaRef)) { + lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef); + } else { + lua_pushnil(L); + } + } + return 1; } int32_t CSimpleFrame_SetAttribute(lua_State* L) { From 28e931928a55757e10d001bfe3573c4af4a5ea10 Mon Sep 17 00:00:00 2001 From: VDm Date: Mon, 11 Aug 2025 01:32:21 +0400 Subject: [PATCH 5/7] feat(ui): implement CSimpleFrame_SetAttribute --- src/ui/CSimpleFrame.cpp | 28 ++++++++++++++++++++++++++++ src/ui/CSimpleFrame.hpp | 3 +++ src/ui/CSimpleFrameScript.cpp | 26 +++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index 71dcc3f..7a5e945 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -450,6 +450,19 @@ void CSimpleFrame::RunOnUpdateScript(float elapsedSec) { } } +void CSimpleFrame::RunOnAttributeChangedScript(const char* name, int32_t luaRef) { + if (this->m_onAttributeChange.luaRef) { + auto L = FrameScript_GetContext(); + // TODO: LUA Tainted + auto loweredName = static_cast(alloca(SStrLen(name) + 1)); + SStrCopy(loweredName, name, STORM_MAX_STR); + SStrLower(loweredName); + lua_pushstring(L, loweredName); + lua_rawgeti(L, LUA_REGISTRYINDEX, luaRef); + this->RunScript(this->m_onAttributeChange, 2, nullptr); + } +} + void CSimpleFrame::PreLoadXML(XMLNode* node, CStatus* status) { const char* name = node->GetAttributeByName("name"); @@ -749,6 +762,7 @@ void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { // TODO: LUA Tainted Logic attribute->luaRef = luaL_ref(L, LUA_REGISTRYINDEX); + s_testMap[name] = attribute->luaRef; child = child->m_next; } @@ -1648,3 +1662,17 @@ bool CSimpleFrame::GetAttribute(const char* name, int32_t& luaRef) { luaRef = attribute->luaRef; return true; } + +void CSimpleFrame::SetAttribute(const char* name, int32_t luaRef) { + auto attribute = this->m_attributes.Ptr(name); + if (!attribute) { + attribute = this->m_attributes.New(name, 0, 0); + } + attribute->luaRef = luaRef; + this->RunOnAttributeChangedScript(name, luaRef); +} + +bool CSimpleFrame::AttributeChangesAllowed() const { + // TODO + return true; +} diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index e25d1e5..fcc9d55 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -153,6 +153,7 @@ class CSimpleFrame : public CScriptRegion { void RunOnShowScript(); void RunOnSizeChangedScript(float width, float height); void RunOnUpdateScript(float elapsedSec); + void RunOnAttributeChangedScript(const char* name, int32_t luaRef); void SetBackdrop(CBackdropGenerator* backdrop); void SetBeingScrolled(int32_t a2, int32_t a3); void SetFrameAlpha(uint8_t alpha); @@ -166,6 +167,8 @@ class CSimpleFrame : public CScriptRegion { int32_t TestHitRect(const C2Vector& pt); void UnregisterForEvents(int32_t a2); bool GetAttribute(const char* name, int32_t& luaRef); + void SetAttribute(const char* name, int32_t luaRef); + bool AttributeChangesAllowed() const; }; #endif diff --git a/src/ui/CSimpleFrameScript.cpp b/src/ui/CSimpleFrameScript.cpp index e50e569..2b68e78 100644 --- a/src/ui/CSimpleFrameScript.cpp +++ b/src/ui/CSimpleFrameScript.cpp @@ -295,7 +295,31 @@ int32_t CSimpleFrame_GetAttribute(lua_State* L) { } int32_t CSimpleFrame_SetAttribute(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFrame::GetObjectType(); + auto frame = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!frame->ProtectedFunctionsAllowed() && !frame->AttributeChangesAllowed()) { + // TODO: CSimpleTop::s_instance->dword1254(); // fptr call + return 0; + } + + lua_settop(L, 3); + if (!lua_isstring(L, 2) || lua_type(L, 3) == LUA_TNONE) { + return luaL_error(L, "Usage: %s:SetAttribute(\"name\", value)", frame->GetDisplayName()); + } + + int32_t luaRef = -1; + + auto name = lua_tolstring(L, 2, nullptr); + if (frame->GetAttribute(name, luaRef)) { + luaL_unref(L, LUA_REGISTRYINDEX, luaRef); + } + + // TODO: LUA Tainted + luaRef = luaL_ref(L, LUA_REGISTRYINDEX); + frame->SetAttribute(name, luaRef); + + return 0; } int32_t CSimpleFrame_GetEffectiveScale(lua_State* L) { From b554cf9d9e75434b82da4bc0847de44c639f91fc Mon Sep 17 00:00:00 2001 From: VDm Date: Mon, 11 Aug 2025 01:33:20 +0400 Subject: [PATCH 6/7] fix(ui): remove testing artifact --- src/ui/CSimpleFrame.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index 7a5e945..6859567 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -762,7 +762,6 @@ void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { // TODO: LUA Tainted Logic attribute->luaRef = luaL_ref(L, LUA_REGISTRYINDEX); - s_testMap[name] = attribute->luaRef; child = child->m_next; } From 9d88498809ece4680317adc58f51450d62fd25e7 Mon Sep 17 00:00:00 2001 From: VDm Date: Mon, 11 Aug 2025 02:13:18 +0400 Subject: [PATCH 7/7] feat(gameui): implement Script_GetInventorySlotInfo --- .../scripts/GameScriptFunctionsActionBar.cpp | 15 ++++-- .../GameScriptFunctionsCharacterInfo.cpp | 34 ++++++++++++- .../GameScriptFunctionsScriptEvents.cpp | 48 ++++++++++++++----- .../scripts/GameScriptFunctionsSound.cpp | 16 +++++-- 4 files changed, 92 insertions(+), 21 deletions(-) diff --git a/src/gameui/scripts/GameScriptFunctionsActionBar.cpp b/src/gameui/scripts/GameScriptFunctionsActionBar.cpp index bc3edef..8a398b2 100644 --- a/src/gameui/scripts/GameScriptFunctionsActionBar.cpp +++ b/src/gameui/scripts/GameScriptFunctionsActionBar.cpp @@ -13,7 +13,9 @@ static int32_t Script_GetActionTexture(lua_State* L) { } static int32_t Script_GetActionCount(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetActionCooldown(lua_State* L) { @@ -29,7 +31,9 @@ static int32_t Script_GetActionText(lua_State* L) { } static int32_t Script_HasAction(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + return 1; } static int32_t Script_UseAction(lua_State* L) { @@ -81,11 +85,14 @@ static int32_t Script_IsActionInRange(lua_State* L) { } static int32_t Script_GetBonusBarOffset(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetMultiCastBarOffset(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + lua_pushnumber(L, 6.0); + return 1; } static int32_t Script_ChangeActionBarPage(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp b/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp index 9ff1b34..5110dd3 100644 --- a/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp @@ -1,11 +1,43 @@ #include "gameui/GameScriptFunctions.hpp" #include "ui/FrameScript.hpp" +#include "db/Db.hpp" #include "util/Lua.hpp" #include "util/Unimplemented.hpp" static int32_t Script_GetInventorySlotInfo(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + const char* buttonName = nullptr; + + if (lua_isstring(L, 1)) { + buttonName = lua_tolstring(L, 1, nullptr); + } + + if (!buttonName || g_paperDollItemFrameDB.GetNumRecords() < 1) { + return luaL_error(L, "Invalid inventory slot in GetInventorySlotInfo"); + } + + PaperDollItemFrameRec* record = nullptr; + bool found = false; + for (int32_t i = 0; i < g_paperDollItemFrameDB.GetNumRecords(); ++i) { + record = g_paperDollItemFrameDB.GetRecordByIndex(i); + if (!SStrCmpI(record->m_itemButtonName, buttonName, STORM_MAX_STR)) { + found = true; + break; + } + } + + if (!found) { + return luaL_error(L, "Invalid inventory slot in GetInventorySlotInfo"); + } + + lua_pushnumber(L, record->m_slotNumber); + lua_pushstring(L, record->m_slotIcon); + if (record->m_slotNumber == 18) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 3; } static int32_t Script_GetInventoryItemsForSlot(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp index 81af2c6..7174dd2 100644 --- a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp +++ b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp @@ -177,39 +177,57 @@ static int32_t Script_UnitPVPName(lua_State* L) { } static int32_t Script_UnitXP(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 50.0); + return 1; } static int32_t Script_UnitXPMax(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 100.0); + return 1; } static int32_t Script_UnitHealth(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 50.0); + return 1; } static int32_t Script_UnitHealthMax(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 100.0); + return 1; } static int32_t Script_UnitMana(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 50.0); + return 1; } static int32_t Script_UnitManaMax(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 100.0); + return 1; } static int32_t Script_UnitPower(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 50.0); + return 1; } static int32_t Script_UnitPowerMax(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 100.0); + return 1; } static int32_t Script_UnitPowerType(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_UnitOnTaxi(lua_State* L) { @@ -221,15 +239,21 @@ static int32_t Script_UnitIsFeignDeath(lua_State* L) { } static int32_t Script_UnitIsDead(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushboolean(L, 0); + return 1; } static int32_t Script_UnitIsGhost(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushboolean(L, 0); + return 1; } static int32_t Script_UnitIsDeadOrGhost(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushboolean(L, 0); + return 1; } static int32_t Script_UnitIsConnected(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsSound.cpp b/src/gameui/scripts/GameScriptFunctionsSound.cpp index 7c16fea..6ce97e0 100644 --- a/src/gameui/scripts/GameScriptFunctionsSound.cpp +++ b/src/gameui/scripts/GameScriptFunctionsSound.cpp @@ -21,7 +21,9 @@ static int32_t Script_StopMusic(lua_State* L) { } static int32_t Script_Sound_GameSystem_GetNumInputDrivers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_Sound_GameSystem_GetInputDriverNameByIndex(lua_State* L) { @@ -29,7 +31,9 @@ static int32_t Script_Sound_GameSystem_GetInputDriverNameByIndex(lua_State* L) { } static int32_t Script_Sound_GameSystem_GetNumOutputDrivers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_Sound_GameSystem_GetOutputDriverNameByIndex(lua_State* L) { @@ -41,7 +45,9 @@ static int32_t Script_Sound_GameSystem_RestartSoundSystem(lua_State* L) { } static int32_t Script_Sound_ChatSystem_GetNumInputDrivers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_Sound_ChatSystem_GetInputDriverNameByIndex(lua_State* L) { @@ -49,7 +55,9 @@ static int32_t Script_Sound_ChatSystem_GetInputDriverNameByIndex(lua_State* L) { } static int32_t Script_Sound_ChatSystem_GetNumOutputDrivers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_Sound_ChatSystem_GetOutputDriverNameByIndex(lua_State* L) {