diff --git a/src/console/CMakeLists.txt b/src/console/CMakeLists.txt index e17ebf9..eb8e56b 100644 --- a/src/console/CMakeLists.txt +++ b/src/console/CMakeLists.txt @@ -17,6 +17,7 @@ target_link_libraries(console PUBLIC common gx + ui storm PRIVATE client diff --git a/src/console/Command.cpp b/src/console/Command.cpp index cb5baba..fda37cb 100644 --- a/src/console/Command.cpp +++ b/src/console/Command.cpp @@ -231,7 +231,7 @@ void ConsoleInitializeCommonCommand() { } void ConsoleInitializeDebugCommand() { - // TODO + ConsoleCommandRegister("script", ConsoleCommand_Script, DEFAULT, nullptr); } int32_t ConsoleCommandComplete(const char* partial, const char** previous, int32_t direction) { diff --git a/src/console/command/Commands.hpp b/src/console/command/Commands.hpp index 93a427f..d439bc0 100644 --- a/src/console/command/Commands.hpp +++ b/src/console/command/Commands.hpp @@ -12,6 +12,7 @@ int32_t CCGxRestart(const char* command, const char* argument); DECLARE_COMMAND(Quit); DECLARE_COMMAND(Ver); DECLARE_COMMAND(SetMap); +DECLARE_COMMAND(Script); DECLARE_COMMAND(Help); DECLARE_COMMAND(FontColor); diff --git a/src/console/command/default/Script.cpp b/src/console/command/default/Script.cpp new file mode 100644 index 0000000..a8f8651 --- /dev/null +++ b/src/console/command/default/Script.cpp @@ -0,0 +1,8 @@ +#include "console/Command.hpp" +#include "console/command/Commands.hpp" +#include "ui/FrameScript.hpp" + +DECLARE_COMMAND(Script) { + FrameScript_Execute(arguments, "CONSOLE", nullptr); + return 1; +} diff --git a/src/gameui/CGCharacterModelBase.cpp b/src/gameui/CGCharacterModelBase.cpp new file mode 100644 index 0000000..9965b6a --- /dev/null +++ b/src/gameui/CGCharacterModelBase.cpp @@ -0,0 +1,28 @@ +#include "gameui/CGCharacterModelBase.hpp" +#include "gameui/CGCharacterModelBaseScript.hpp" +#include + +int32_t CGCharacterModelBase::s_metatable; + +CSimpleFrame* CGCharacterModelBase::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGCharacterModelBase@@", -2); + return NEW(CGCharacterModelBase, parent); +} + +void CGCharacterModelBase::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGCharacterModelBase::RegisterScriptMethods); + CGCharacterModelBase::s_metatable = ref; +} + +void CGCharacterModelBase::RegisterScriptMethods(lua_State* L) { + CSimpleModel::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGCharacterModelBaseMethods, NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS); +} + +int32_t CGCharacterModelBase::GetScriptMetaTable() { + return CGCharacterModelBase::s_metatable; +} + +CGCharacterModelBase::CGCharacterModelBase(CSimpleFrame* parent) : CSimpleModel(parent) { +} diff --git a/src/gameui/CGCharacterModelBase.hpp b/src/gameui/CGCharacterModelBase.hpp new file mode 100644 index 0000000..09da17e --- /dev/null +++ b/src/gameui/CGCharacterModelBase.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGCHARACTER_MODEL_BASE_HPP +#define GAME_UI_CGCHARACTER_MODEL_BASE_HPP + +#include "ui/CSimpleModel.hpp" +#include "ui/CSimpleTop.hpp" + +class CGCharacterModelBase : public CSimpleModel { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGCharacterModelBase(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGCHARACTER_MODEL_BASE_HPP diff --git a/src/gameui/CGCharacterModelBaseScript.cpp b/src/gameui/CGCharacterModelBaseScript.cpp new file mode 100644 index 0000000..6b3b9cd --- /dev/null +++ b/src/gameui/CGCharacterModelBaseScript.cpp @@ -0,0 +1,27 @@ +#include "gameui/CGCharacterModelBaseScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_SetUnit(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetCreature(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_RefreshUnit(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetRotation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGCharacterModelBaseMethods[NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS] = { + { "SetUnit", &Script_SetUnit }, + { "SetCreature", &Script_SetCreature }, + { "RefreshUnit", &Script_RefreshUnit }, + { "SetRotation", &Script_SetRotation } +}; diff --git a/src/gameui/CGCharacterModelBaseScript.hpp b/src/gameui/CGCharacterModelBaseScript.hpp new file mode 100644 index 0000000..298f44b --- /dev/null +++ b/src/gameui/CGCharacterModelBaseScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGCHARACTER_MODEL_BASE_SCRIPT_HPP +#define GAME_UI_CGCHARACTER_MODEL_BASE_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS 4 + +extern FrameScript_Method CGCharacterModelBaseMethods[NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGCooldown.cpp b/src/gameui/CGCooldown.cpp new file mode 100644 index 0000000..ba07917 --- /dev/null +++ b/src/gameui/CGCooldown.cpp @@ -0,0 +1,29 @@ +#include "gameui/CGCooldown.hpp" +#include "gameui/CGCooldownScript.hpp" +#include + +int32_t CGCooldown::s_metatable; + +CSimpleFrame* CGCooldown::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGCooldown@@", -2); + return NEW(CGCooldown, parent); +} + +void CGCooldown::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGCooldown::RegisterScriptMethods); + CGCooldown::s_metatable = ref; +} + +void CGCooldown::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGCooldownMethods, NUM_CGCOOLDOWN_SCRIPT_METHODS); +} + +int32_t CGCooldown::GetScriptMetaTable() { + return CGCooldown::s_metatable; +} + +CGCooldown::CGCooldown(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} diff --git a/src/gameui/CGCooldown.hpp b/src/gameui/CGCooldown.hpp new file mode 100644 index 0000000..3455e70 --- /dev/null +++ b/src/gameui/CGCooldown.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGCOOLDOWN_HPP +#define GAME_UI_CGCOOLDOWN_HPP + +#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleTop.hpp" + +class CGCooldown : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGCooldown(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGCOOLDOWN_HPP diff --git a/src/gameui/CGCooldownScript.cpp b/src/gameui/CGCooldownScript.cpp new file mode 100644 index 0000000..24002bd --- /dev/null +++ b/src/gameui/CGCooldownScript.cpp @@ -0,0 +1,32 @@ +#include "gameui/CGCooldownScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_SetCooldown(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetReverse(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetReverse(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetDrawEdge(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetDrawEdge(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGCooldownMethods[NUM_CGCOOLDOWN_SCRIPT_METHODS] = { + { "SetCooldown", &Script_SetCooldown }, + { "SetReverse", &Script_SetReverse }, + { "GetReverse", &Script_GetReverse }, + { "SetDrawEdge", &Script_SetDrawEdge }, + { "GetDrawEdge", &Script_GetDrawEdge } +}; diff --git a/src/gameui/CGCooldownScript.hpp b/src/gameui/CGCooldownScript.hpp new file mode 100644 index 0000000..3bc43ae --- /dev/null +++ b/src/gameui/CGCooldownScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGCOOLDOWN_SCRIPT_HPP +#define GAME_UI_CGCOOLDOWN_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGCOOLDOWN_SCRIPT_METHODS 5 + +extern FrameScript_Method CGCooldownMethods[NUM_CGCOOLDOWN_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGDressUpModelFrame.cpp b/src/gameui/CGDressUpModelFrame.cpp new file mode 100644 index 0000000..32e18d0 --- /dev/null +++ b/src/gameui/CGDressUpModelFrame.cpp @@ -0,0 +1,29 @@ +#include "gameui/CGDressUpModelFrame.hpp" +#include "gameui/CGDressUpModelFrameScript.hpp" +#include + +int32_t CGDressUpModelFrame::s_metatable; + +CSimpleFrame* CGDressUpModelFrame::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGDressUpModelFrame@@", -2); + return NEW(CGDressUpModelFrame, parent); +} + +void CGDressUpModelFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGDressUpModelFrame::RegisterScriptMethods); + CGDressUpModelFrame::s_metatable = ref; +} + +void CGDressUpModelFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGDressUpModelFrameMethods, NUM_CGDRESS_UP_MODEL_FRAME_SCRIPT_METHODS); +} + +int32_t CGDressUpModelFrame::GetScriptMetaTable() { + return CGDressUpModelFrame::s_metatable; +} + +CGDressUpModelFrame::CGDressUpModelFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} diff --git a/src/gameui/CGDressUpModelFrame.hpp b/src/gameui/CGDressUpModelFrame.hpp new file mode 100644 index 0000000..dffbeab --- /dev/null +++ b/src/gameui/CGDressUpModelFrame.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGDRESS_UP_MODEL_FRAME_HPP +#define GAME_UI_CGDRESS_UP_MODEL_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleTop.hpp" + +class CGDressUpModelFrame : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGDressUpModelFrame(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGDRESS_UP_MODEL_FRAME_HPP diff --git a/src/gameui/CGDressUpModelFrameScript.cpp b/src/gameui/CGDressUpModelFrameScript.cpp new file mode 100644 index 0000000..2a35b5a --- /dev/null +++ b/src/gameui/CGDressUpModelFrameScript.cpp @@ -0,0 +1,22 @@ +#include "gameui/CGDressUpModelFrameScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_Undress(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_Dress(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_TryOn(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGDressUpModelFrameMethods[NUM_CGDRESS_UP_MODEL_FRAME_SCRIPT_METHODS] = { + { "Undress", &Script_Undress }, + { "Dress", &Script_Dress }, + { "TryOn", &Script_TryOn } +}; diff --git a/src/gameui/CGDressUpModelFrameScript.hpp b/src/gameui/CGDressUpModelFrameScript.hpp new file mode 100644 index 0000000..e119de5 --- /dev/null +++ b/src/gameui/CGDressUpModelFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGDRESS_UP_MODEL_FRAME_SCRIPT_HPP +#define GAME_UI_CGDRESS_UP_MODEL_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGDRESS_UP_MODEL_FRAME_SCRIPT_METHODS 3 + +extern FrameScript_Method CGDressUpModelFrameMethods[NUM_CGDRESS_UP_MODEL_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGGameUI.cpp b/src/gameui/CGGameUI.cpp index 0588430..9728515 100644 --- a/src/gameui/CGGameUI.cpp +++ b/src/gameui/CGGameUI.cpp @@ -4,9 +4,15 @@ #include #include "client/Client.hpp" +#include "gameui/GameScriptFunctions.hpp" #include "gameui/CGWorldFrame.hpp" #include "gameui/CGTooltip.hpp" -#include "gameui/GameScriptFunctions.hpp" +#include "gameui/CGCooldown.hpp" +#include "gameui/CGMinimapFrame.hpp" +#include "gameui/CGCharacterModelBase.hpp" +#include "gameui/CGDressUpModelFrame.hpp" +#include "gameui/CGTabardModelFrame.hpp" +#include "gameui/CGQuestPOIFrame.hpp" #include "gx/Coordinate.hpp" #include "gx/Device.hpp" #include "ui/FrameScript.hpp" @@ -181,12 +187,12 @@ void CGGameUI::Initialize() { void CGGameUI::RegisterFrameFactories() { FrameXML_RegisterFactory("WorldFrame", CGWorldFrame::Create, 1); FrameXML_RegisterFactory("GameTooltip", CGTooltip::Create, 0); - //FrameXML_RegisterFactory("Cooldown", (int)sub_51A380, 0); - //FrameXML_RegisterFactory("Minimap", (int)CGMinimapFrame::Create, 0); - //FrameXML_RegisterFactory("PlayerModel", (int)CGCharacterModelBase::Create, 0); - //FrameXML_RegisterFactory("DressUpModel", (int)sub_514300, 0); - //FrameXML_RegisterFactory("TabardModel", (int)CGTabardModelFrame::Create, 0); - //FrameXML_RegisterFactory("QuestPOIFrame", (int)sub_514260, 0); + FrameXML_RegisterFactory("Cooldown", CGCooldown::Create, 0); + FrameXML_RegisterFactory("Minimap", CGMinimapFrame::Create, 0); + FrameXML_RegisterFactory("PlayerModel", CGCharacterModelBase::Create, 0); + FrameXML_RegisterFactory("DressUpModel", CGDressUpModelFrame::Create, 0); + FrameXML_RegisterFactory("TabardModel", CGTabardModelFrame::Create, 0); + FrameXML_RegisterFactory("QuestPOIFrame", CGQuestPOIFrame::Create, 0); } void CGGameUI::Reload() { diff --git a/src/gameui/CGMinimapFrame.cpp b/src/gameui/CGMinimapFrame.cpp new file mode 100644 index 0000000..ae4297b --- /dev/null +++ b/src/gameui/CGMinimapFrame.cpp @@ -0,0 +1,29 @@ +#include "gameui/CGMinimapFrame.hpp" +#include "gameui/CGMinimapFrameScript.hpp" +#include + +int32_t CGMinimapFrame::s_metatable; + +CSimpleFrame* CGMinimapFrame::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGMinimapFrame@@", -2); + return NEW(CGMinimapFrame, parent); +} + +void CGMinimapFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGMinimapFrame::RegisterScriptMethods); + CGMinimapFrame::s_metatable = ref; +} + +void CGMinimapFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGMinimapFrameMethods, NUM_CGMINIMAP_FRAME_SCRIPT_METHODS); +} + +int32_t CGMinimapFrame::GetScriptMetaTable() { + return CGMinimapFrame::s_metatable; +} + +CGMinimapFrame::CGMinimapFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} diff --git a/src/gameui/CGMinimapFrame.hpp b/src/gameui/CGMinimapFrame.hpp new file mode 100644 index 0000000..95817c2 --- /dev/null +++ b/src/gameui/CGMinimapFrame.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGMINIMAP_FRAME_HPP +#define GAME_UI_CGMINIMAP_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleTop.hpp" + +class CGMinimapFrame : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGMinimapFrame(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGMINIMAP_FRAME_HPP diff --git a/src/gameui/CGMinimapFrameScript.cpp b/src/gameui/CGMinimapFrameScript.cpp new file mode 100644 index 0000000..830e518 --- /dev/null +++ b/src/gameui/CGMinimapFrameScript.cpp @@ -0,0 +1,82 @@ +#include "gameui/CGMinimapFrameScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_SetMaskTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetIconTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetBlipTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetClassBlipTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetPOIArrowTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetStaticPOIArrowTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetCorpsePOIArrowTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetPlayerTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetPlayerTextureHeight(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetPlayerTextureWidth(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetZoomLevels(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetZoom(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetZoom(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_PingLocation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetPingPosition(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGMinimapFrameMethods[NUM_CGMINIMAP_FRAME_SCRIPT_METHODS] = { + { "SetMaskTexture", &Script_SetMaskTexture }, + { "SetIconTexture", &Script_SetIconTexture }, + { "SetBlipTexture", &Script_SetBlipTexture }, + { "SetClassBlipTexture", &Script_SetClassBlipTexture }, + { "SetPOIArrowTexture", &Script_SetPOIArrowTexture }, + { "SetStaticPOIArrowTexture", &Script_SetStaticPOIArrowTexture }, + { "SetCorpsePOIArrowTexture", &Script_SetCorpsePOIArrowTexture }, + { "SetPlayerTexture", &Script_SetPlayerTexture }, + { "SetPlayerTextureHeight", &Script_SetPlayerTextureHeight }, + { "SetPlayerTextureWidth", &Script_SetPlayerTextureWidth }, + { "GetZoomLevels", &Script_GetZoomLevels }, + { "GetZoom", &Script_GetZoom }, + { "SetZoom", &Script_SetZoom }, + { "PingLocation", &Script_PingLocation }, + { "GetPingPosition", &Script_GetPingPosition } +}; diff --git a/src/gameui/CGMinimapFrameScript.hpp b/src/gameui/CGMinimapFrameScript.hpp new file mode 100644 index 0000000..a21b648 --- /dev/null +++ b/src/gameui/CGMinimapFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGMINIMAP_FRAME_SCRIPT_HPP +#define GAME_UI_CGMINIMAP_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGMINIMAP_FRAME_SCRIPT_METHODS 15 + +extern FrameScript_Method CGMinimapFrameMethods[NUM_CGMINIMAP_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGQuestPOIFrame.cpp b/src/gameui/CGQuestPOIFrame.cpp new file mode 100644 index 0000000..991c447 --- /dev/null +++ b/src/gameui/CGQuestPOIFrame.cpp @@ -0,0 +1,29 @@ +#include "gameui/CGQuestPOIFrame.hpp" +#include "gameui/CGQuestPOIFrameScript.hpp" +#include + +int32_t CGQuestPOIFrame::s_metatable; + +CSimpleFrame* CGQuestPOIFrame::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGQuestPOIFrame@@", -2); + return NEW(CGQuestPOIFrame, parent); +} + +void CGQuestPOIFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGQuestPOIFrame::RegisterScriptMethods); + CGQuestPOIFrame::s_metatable = ref; +} + +void CGQuestPOIFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGQuestPOIFrameMethods, NUM_CGQUEST_POI_FRAME_SCRIPT_METHODS); +} + +int32_t CGQuestPOIFrame::GetScriptMetaTable() { + return CGQuestPOIFrame::s_metatable; +} + +CGQuestPOIFrame::CGQuestPOIFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} diff --git a/src/gameui/CGQuestPOIFrame.hpp b/src/gameui/CGQuestPOIFrame.hpp new file mode 100644 index 0000000..7c4fa35 --- /dev/null +++ b/src/gameui/CGQuestPOIFrame.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGQUEST_POI_FRAME_HPP +#define GAME_UI_CGQUEST_POI_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleTop.hpp" + +class CGQuestPOIFrame : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGQuestPOIFrame(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGQUEST_POI_FRAME_HPP diff --git a/src/gameui/CGQuestPOIFrameScript.cpp b/src/gameui/CGQuestPOIFrameScript.cpp new file mode 100644 index 0000000..611136c --- /dev/null +++ b/src/gameui/CGQuestPOIFrameScript.cpp @@ -0,0 +1,77 @@ +#include "gameui/CGQuestPOIFrameScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_SetFillTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetFillAlpha(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetBorderTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetBorderAlpha(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetBorderScalar(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_DrawQuestBlob(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_EnableSmoothing(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_EnableMerging(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetMergeThreshold(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_SetNumSplinePoints(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_UpdateQuestPOI(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_UpdateMouseOverTooltip(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetTooltipIndex(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetNumTooltips(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGQuestPOIFrameMethods[NUM_CGQUEST_POI_FRAME_SCRIPT_METHODS] = { + { "SetFillTexture", &Script_SetFillTexture }, + { "SetFillAlpha", &Script_SetFillAlpha }, + { "SetBorderTexture", &Script_SetBorderTexture }, + { "SetBorderAlpha", &Script_SetBorderAlpha }, + { "SetBorderScalar", &Script_SetBorderScalar }, + { "DrawQuestBlob", &Script_DrawQuestBlob }, + { "EnableSmoothing", &Script_EnableSmoothing }, + { "EnableMerging", &Script_EnableMerging }, + { "SetMergeThreshold", &Script_SetMergeThreshold }, + { "SetNumSplinePoints", &Script_SetNumSplinePoints }, + { "UpdateQuestPOI", &Script_UpdateQuestPOI }, + { "UpdateMouseOverTooltip", &Script_UpdateMouseOverTooltip }, + { "GetTooltipIndex", &Script_GetTooltipIndex }, + { "GetNumTooltips", &Script_GetNumTooltips } +}; diff --git a/src/gameui/CGQuestPOIFrameScript.hpp b/src/gameui/CGQuestPOIFrameScript.hpp new file mode 100644 index 0000000..42c518e --- /dev/null +++ b/src/gameui/CGQuestPOIFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGQUEST_POI_FRAME_SCRIPT_HPP +#define GAME_UI_CGQUEST_POI_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGQUEST_POI_FRAME_SCRIPT_METHODS 14 + +extern FrameScript_Method CGQuestPOIFrameMethods[NUM_CGQUEST_POI_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGTabardModelFrame.cpp b/src/gameui/CGTabardModelFrame.cpp new file mode 100644 index 0000000..8f9d3a4 --- /dev/null +++ b/src/gameui/CGTabardModelFrame.cpp @@ -0,0 +1,29 @@ +#include "gameui/CGTabardModelFrame.hpp" +#include "gameui/CGTabardModelFrameScript.hpp" +#include + +int32_t CGTabardModelFrame::s_metatable; + +CSimpleFrame* CGTabardModelFrame::Create(CSimpleFrame* parent) { + // TODO: Data = CDataAllocator__GetData(0, ".?AVCGTabardModelFrame@@", -2); + return NEW(CGTabardModelFrame, parent); +} + +void CGTabardModelFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CGTabardModelFrame::RegisterScriptMethods); + CGTabardModelFrame::s_metatable = ref; +} + +void CGTabardModelFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, CGTabardModelFrameMethods, NUM_CGTABARD_MODEL_FRAME_SCRIPT_METHODS); +} + +int32_t CGTabardModelFrame::GetScriptMetaTable() { + return CGTabardModelFrame::s_metatable; +} + +CGTabardModelFrame::CGTabardModelFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} diff --git a/src/gameui/CGTabardModelFrame.hpp b/src/gameui/CGTabardModelFrame.hpp new file mode 100644 index 0000000..20d9dd1 --- /dev/null +++ b/src/gameui/CGTabardModelFrame.hpp @@ -0,0 +1,24 @@ +#ifndef GAME_UI_CGTABARD_MODEL_FRAME_HPP +#define GAME_UI_CGTABARD_MODEL_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" +#include "ui/CSimpleTop.hpp" + +class CGTabardModelFrame : public CSimpleFrame { + public: + // Static variables + static int32_t s_metatable; + + // Static functions + static CSimpleFrame* Create(CSimpleFrame* parent); + static void CreateScriptMetaTable(); + static void RegisterScriptMethods(lua_State* L); + + // Virtual member functions + virtual int32_t GetScriptMetaTable(); + + // Member functions + CGTabardModelFrame(CSimpleFrame* parent); +}; + +#endif // GAME_UI_CGTABARD_MODEL_FRAME_HPP diff --git a/src/gameui/CGTabardModelFrameScript.cpp b/src/gameui/CGTabardModelFrameScript.cpp new file mode 100644 index 0000000..2ae5b30 --- /dev/null +++ b/src/gameui/CGTabardModelFrameScript.cpp @@ -0,0 +1,57 @@ +#include "gameui/CGTabardModelFrameScript.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" + +static int32_t Script_InitializeTabardColors(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_Save(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_CycleVariation(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetUpperBackgroundFileName(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetLowerBackgroundFileName(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetUpperEmblemFileName(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetLowerEmblemFileName(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetUpperEmblemTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_GetLowerEmblemTexture(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + +static int32_t Script_CanSaveTabardNow(lua_State* L) { + WHOA_UNIMPLEMENTED(0); +} + + +FrameScript_Method CGTabardModelFrameMethods[NUM_CGTABARD_MODEL_FRAME_SCRIPT_METHODS] = { + { "InitializeTabardColors", &Script_InitializeTabardColors }, + { "Save", &Script_Save }, + { "CycleVariation", &Script_CycleVariation }, + { "GetUpperBackgroundFileName", &Script_GetUpperBackgroundFileName }, + { "GetLowerBackgroundFileName", &Script_GetLowerBackgroundFileName }, + { "GetUpperEmblemFileName", &Script_GetUpperEmblemFileName }, + { "GetLowerEmblemFileName", &Script_GetLowerEmblemFileName }, + { "GetUpperEmblemTexture", &Script_GetUpperEmblemTexture }, + { "GetLowerEmblemTexture", &Script_GetLowerEmblemTexture }, + { "CanSaveTabardNow", &Script_CanSaveTabardNow } +}; diff --git a/src/gameui/CGTabardModelFrameScript.hpp b/src/gameui/CGTabardModelFrameScript.hpp new file mode 100644 index 0000000..28b0f0f --- /dev/null +++ b/src/gameui/CGTabardModelFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef GAME_UI_CGTABARD_MODEL_FRAME_SCRIPT_HPP +#define GAME_UI_CGTABARD_MODEL_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_CGTABARD_MODEL_FRAME_SCRIPT_METHODS 10 + +extern FrameScript_Method CGTabardModelFrameMethods[NUM_CGTABARD_MODEL_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/gameui/CGWorldFrame.cpp b/src/gameui/CGWorldFrame.cpp index f9b2b28..d5fe728 100644 --- a/src/gameui/CGWorldFrame.cpp +++ b/src/gameui/CGWorldFrame.cpp @@ -9,6 +9,7 @@ #include "world/CWorldScene.hpp" #include "gameui/camera/CGCamera.hpp" #include "event/EvtKeyDown.hpp" +#include "console/Console.hpp" #include "model/Model2.hpp" diff --git a/src/gameui/GameScriptFunctions.cpp b/src/gameui/GameScriptFunctions.cpp index 28e27a9..c674e1a 100644 --- a/src/gameui/GameScriptFunctions.cpp +++ b/src/gameui/GameScriptFunctions.cpp @@ -1,6 +1,13 @@ #include "gameui/GameScriptFunctions.hpp" #include "gameui/CGGameUI.hpp" #include "gameui/CGTooltip.hpp" +#include "gameui/CGCooldown.hpp" +#include "gameui/CGMinimapFrame.hpp" +#include "gameui/CGCharacterModelBase.hpp" +#include "gameui/CGDressUpModelFrame.hpp" +#include "gameui/CGTabardModelFrame.hpp" +#include "gameui/CGQuestPOIFrame.hpp" +#include "console/Console.hpp" #include "ui/FrameXML.hpp" #include "ui/FrameScript.hpp" #include "util/Lua.hpp" @@ -8,6 +15,8 @@ // External from "ui/ScriptFunctions.hpp" void RegisterSimpleFrameScriptMethods(); +int32_t Script_GetScreenWidth(lua_State* L); +int32_t Script_GetScreenHeight(lua_State* L); static int32_t Script_FrameXML_Debug(lua_State* L) { @@ -574,14 +583,6 @@ static int32_t Script_ArenaTeamDisband(lua_State* L) { WHOA_UNIMPLEMENTED(0); } -static int32_t Script_GetScreenWidth(lua_State* L) { - WHOA_UNIMPLEMENTED(0); -} - -static int32_t Script_GetScreenHeight(lua_State* L) { - WHOA_UNIMPLEMENTED(0); -} - static int32_t Script_GetDamageBonusStat(lua_State* L) { WHOA_UNIMPLEMENTED(0); } @@ -1262,7 +1263,14 @@ static int32_t Script_IsThreatWarningEnabled(lua_State* L) { } static int32_t Script_ConsoleAddMessage(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + if (!lua_isstring(L, 1)) { + return luaL_error(L, "Usage: ConsoleAddMessage(string)"); + } + auto text = lua_tolstring(L, 1, 0); + if (text && *text) { + ConsolePrintf("%s", text); + } + return 0; } static int32_t Script_GetItemUniqueness(lua_State* L) { @@ -1609,8 +1617,12 @@ FrameScript_Method GameScript::s_ScriptFunctions_Game[NUM_SCRIPT_FUNCTIONS_GAME] void LoadScriptFunctions() { RegisterSimpleFrameScriptMethods(); CGTooltip::CreateScriptMetaTable(); - - // TODO + CGCooldown::CreateScriptMetaTable(); + CGMinimapFrame::CreateScriptMetaTable(); + CGCharacterModelBase::CreateScriptMetaTable(); + CGDressUpModelFrame::CreateScriptMetaTable(); + CGTabardModelFrame::CreateScriptMetaTable(); + CGQuestPOIFrame::CreateScriptMetaTable(); for (int32_t i = 0; i < NUM_SCRIPT_FUNCTIONS_GAME; ++i) { FrameScript_RegisterFunction( diff --git a/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp b/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp index 6f0a498..3458c56 100644 --- a/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp +++ b/src/gameui/scripts/GameScriptFunctionsBattlenetUI.cpp @@ -9,7 +9,10 @@ static int32_t Script_BNGetInfo(lua_State* L) { } static int32_t Script_BNGetNumFriends(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + lua_pushnumber(L, 0.0); + return 2; } static int32_t Script_BNGetFriendInfo(lua_State* L) { @@ -49,7 +52,9 @@ static int32_t Script_BNGetSelectedFriend(lua_State* L) { } static int32_t Script_BNGetNumFriendInvites(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_BNGetFriendInviteInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsContainer.cpp b/src/gameui/scripts/GameScriptFunctionsContainer.cpp index 9b32114..da643bd 100644 --- a/src/gameui/scripts/GameScriptFunctionsContainer.cpp +++ b/src/gameui/scripts/GameScriptFunctionsContainer.cpp @@ -9,7 +9,9 @@ static int32_t Script_ContainerIDToInventoryID(lua_State* L) { } static int32_t Script_GetContainerNumSlots(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 16.0); + return 1; } static int32_t Script_GetContainerItemInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsFriendList.cpp b/src/gameui/scripts/GameScriptFunctionsFriendList.cpp index 6d9aa40..1c674ea 100644 --- a/src/gameui/scripts/GameScriptFunctionsFriendList.cpp +++ b/src/gameui/scripts/GameScriptFunctionsFriendList.cpp @@ -5,7 +5,10 @@ static int32_t Script_GetNumFriends(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 10.0); + lua_pushnumber(L, 0.0); + return 2; } static int32_t Script_GetFriendInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsMinimap.cpp b/src/gameui/scripts/GameScriptFunctionsMinimap.cpp index a160eba..f4fb89c 100644 --- a/src/gameui/scripts/GameScriptFunctionsMinimap.cpp +++ b/src/gameui/scripts/GameScriptFunctionsMinimap.cpp @@ -5,7 +5,9 @@ static int32_t Script_GetNumTrackingTypes(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetTrackingInfo(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp index 5435459..e92432e 100644 --- a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp +++ b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp @@ -2,6 +2,7 @@ #include "ui/FrameScript.hpp" #include "util/Lua.hpp" #include "util/Unimplemented.hpp" +#include "client/ClientServices.hpp" #include static int32_t Script_GetTime(lua_State* L) { @@ -33,7 +34,8 @@ static int32_t Script_AppendToFile(lua_State* L) { } static int32_t Script_GetAccountExpansionLevel(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + lua_pushnumber(L, ClientServices::GetExpansionLevel()); + return 1; } static int32_t Script_UnitExists(lua_State* L) { @@ -245,7 +247,7 @@ static int32_t Script_UnitSex(lua_State* L) { static int32_t Script_UnitLevel(lua_State* L) { // TODO - lua_pushnumber(L, 1.0); + lua_pushnumber(L, 25.0); return 1; } diff --git a/src/ui/CLayoutFrame.cpp b/src/ui/CLayoutFrame.cpp index bea0ec0..b144b4c 100644 --- a/src/ui/CLayoutFrame.cpp +++ b/src/ui/CLayoutFrame.cpp @@ -815,6 +815,13 @@ void CLayoutFrame::SetProtectFlag(uint32_t flag) { // TODO } +void CLayoutFrame::SetSize(float width, float height) { + this->m_flags &= ~0x8; + this->m_width = width; + this->m_height = height; + this->Resize(0); +} + void CLayoutFrame::SetWidth(float width) { this->m_flags &= ~0x8; this->m_width = width; diff --git a/src/ui/CLayoutFrame.hpp b/src/ui/CLayoutFrame.hpp index 19fe973..7ac39ef 100644 --- a/src/ui/CLayoutFrame.hpp +++ b/src/ui/CLayoutFrame.hpp @@ -46,6 +46,7 @@ class CLayoutFrame { virtual ~CLayoutFrame(); virtual CLayoutFrame* GetLayoutParent(); virtual bool SetLayoutScale(float scale, bool force); + virtual void SetSize(float width, float height); virtual void SetWidth(float width); virtual void SetHeight(float height); virtual float GetWidth(); diff --git a/src/ui/CScriptRegionScript.cpp b/src/ui/CScriptRegionScript.cpp index 6a3233e..ff56269 100644 --- a/src/ui/CScriptRegionScript.cpp +++ b/src/ui/CScriptRegionScript.cpp @@ -3,6 +3,7 @@ #include "ui/FrameScript_Object.hpp" #include "ui/CScriptRegion.hpp" #include "ui/CSimpleTop.hpp" +#include "ui/CFramePoint.hpp" #include "util/Lua.hpp" #include "util/StringTo.hpp" #include "util/Unimplemented.hpp" @@ -10,11 +11,20 @@ #include int32_t CScriptRegion_IsProtected(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + // TODO + lua_pushnil(L); + lua_pushnil(L); + return 2; } int32_t CScriptRegion_CanChangeProtectedState(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + // TODO + lua_pushnil(L); + return 1; } int32_t CScriptRegion_SetParent(lua_State* L) { @@ -22,7 +32,31 @@ int32_t CScriptRegion_SetParent(lua_State* L) { } int32_t CScriptRegion_GetRect(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (!region->GetRect(&rect)) { + return 0; + } + float left = CoordinateGetAspectCompensation() * 1024.0f * rect.minX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(left)); + + float top = CoordinateGetAspectCompensation() * 1024.0f * rect.minY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(top)); + + float width = CoordinateGetAspectCompensation() * 1024.0f * (rect.maxX - rect.minX) / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(width)); + + float height = CoordinateGetAspectCompensation() * 1024.0f * (rect.maxY - rect.minY) / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(height)); + + return 4; } int32_t CScriptRegion_GetCenter(lua_State* L) { @@ -54,19 +88,83 @@ int32_t CScriptRegion_GetCenter(lua_State* L) { } int32_t CScriptRegion_GetLeft(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.minX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetRight(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.maxX / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetTop(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.maxY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetBottom(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect; + + if (region->GetRect(&rect)) { + float value = CoordinateGetAspectCompensation() * 1024.0f * rect.minY / region->m_layoutScale; + lua_pushnumber(L, DDCToNDCWidth(value)); + } else { + lua_pushnil(L); + } + + return 1; } int32_t CScriptRegion_GetWidth(lua_State* L) { @@ -168,15 +266,80 @@ int32_t CScriptRegion_SetHeight(lua_State* L) { } int32_t CScriptRegion_SetSize(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!region->ProtectedFunctionsAllowed()) { + // TODO + // - disallowed logic + + return 0; + } + + if (!lua_isnumber(L, 2) || !lua_isnumber(L, 3)) { + return luaL_error(L, "Usage: %s:SetSize(width, height)", region->GetDisplayName()); + } + + float width = lua_tonumber(L, 2); + float ndcWidth = width / (CoordinateGetAspectCompensation() * 1024.0f); + float ddcWidth = NDCToDDCWidth(ndcWidth); + + float height = lua_tonumber(L, 3); + float ndcHeight = height / (CoordinateGetAspectCompensation() * 1024.0f); + float ddcHeight = NDCToDDCWidth(ndcHeight); + + region->SetSize(width, height); + + return 0; } int32_t CScriptRegion_GetSize(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + float width = region->GetWidth(); + float height = region->GetHeight(); + + if ((width == 0.0f || height == 0.0f) && !StringToBOOL(L, 2, 0)) { + if (region->IsResizePending()) { + region->Resize(1); + } + + CRect rect = { 0.0f, 0.0f, 0.0f, 0.0f }; + + if (region->GetRect(&rect)) { + width = (rect.maxX - rect.minX) / region->m_layoutScale; + height = (rect.maxY - rect.minY) / region->m_layoutScale; + } + } + + float ddcWidth = CoordinateGetAspectCompensation() * 1024.0f * width; + float ndcWidth = DDCToNDCWidth(ddcWidth); + lua_pushnumber(L, ndcWidth); + + float ddcHeight = CoordinateGetAspectCompensation() * 1024.0f * height; + float ndcHeight = DDCToNDCWidth(ddcHeight); + lua_pushnumber(L, ndcHeight); + + return 2; } int32_t CScriptRegion_GetNumPoints(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + int32_t count = 0; + + for (int32_t i = 0; i < FRAMEPOINT_NUMPOINTS; i++) { + auto point = region->m_points[i]; + + if (point && !(point->m_flags & 0x8)) { + ++count; + } + } + + lua_pushnumber(L, count); + return 1; } int32_t CScriptRegion_GetPoint(lua_State* L) { diff --git a/src/ui/LuaExtraFuncs.cpp b/src/ui/LuaExtraFuncs.cpp index f7362a3..9bde9ef 100644 --- a/src/ui/LuaExtraFuncs.cpp +++ b/src/ui/LuaExtraFuncs.cpp @@ -60,7 +60,37 @@ int32_t strsplit(lua_State* L) { } int32_t strjoin(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + size_t length = 0; + auto v9 = luaL_checklstring(L, 1, &length); + int32_t v1 = lua_gettop(L); + int32_t v2 = v1 - 1; + if (length) { + if (v1 == 1) { + lua_pushstring(L, ""); + return 1; + } else { + int32_t v4 = 2 * v2; + int32_t v8 = 2 * v2; + if (!lua_checkstack(L, 2 * v2)) + return luaL_error(L, "strjoin(): Stack overflow"); + if (v2 > 1) { + int32_t v5 = 3; + int32_t v6 = v2 - 1; + do { + lua_pushlstring(L, v9, length); + lua_insert(L, v5); + v5 += 2; + --v6; + } while (v6); + v4 = v8; + } + lua_concat(L, v4 - 1); + return 1; + } + } else { + lua_concat(L, v1); + return 1; + } } int32_t sub_816C40(lua_State* L) {