diff --git a/src/ui/CSimpleMovieFrame.cpp b/src/ui/CSimpleMovieFrame.cpp new file mode 100644 index 0000000..2c41fd6 --- /dev/null +++ b/src/ui/CSimpleMovieFrame.cpp @@ -0,0 +1,72 @@ +#include "ui/CSimpleMovieFrame.hpp" +#include "ui/CSimpleMovieFrameScript.hpp" + +int32_t CSimpleMovieFrame::s_metatable; +int32_t CSimpleMovieFrame::s_objectType; + +void CSimpleMovieFrame::CreateScriptMetaTable() { + lua_State* L = FrameScript_GetContext(); + int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleMovieFrame::RegisterScriptMethods); + CSimpleMovieFrame::s_metatable = ref; +} + +int32_t CSimpleMovieFrame::GetObjectType() { + if (!CSimpleMovieFrame::s_objectType) { + CSimpleMovieFrame::s_objectType = ++FrameScript_Object::s_objectTypes; + } + + return CSimpleMovieFrame::s_objectType; +} + +void CSimpleMovieFrame::RegisterScriptMethods(lua_State* L) { + CSimpleFrame::RegisterScriptMethods(L); + FrameScript_Object::FillScriptMethodTable(L, SimpleMovieFrameMethods, NUM_SIMPLE_MOVIE_FRAME_SCRIPT_METHODS); +} + +FrameScript_Object::ScriptIx* CSimpleMovieFrame::GetScriptByName(const char* name, ScriptData& data) { + auto parentScript = CSimpleFrame::GetScriptByName(name, data); + + if (parentScript) { + return parentScript; + } + + if (!SStrCmpI(name, "OnMovieFinished", STORM_MAX_STR)) { + //return (int)this + 948; + } + + if (!SStrCmpI(name, "OnMovieShowSubtitle", STORM_MAX_STR)) { + data.wrapper = "return function(self,text) %s end"; + //return (int)this + 956; + } + + if (!SStrCmpI(name, "OnMovieHideSubtitle", STORM_MAX_STR)) { + //return (int)this + 964; + } + + return nullptr; +} + +bool CSimpleMovieFrame::IsA(int32_t type) { + return type == CSimpleMovieFrame::s_objectType + || type == CSimpleFrame::s_objectType + || type == CScriptRegion::s_objectType + || type == CScriptObject::s_objectType; +} + +int32_t CSimpleMovieFrame::GetScriptMetaTable() { + return CSimpleMovieFrame::s_metatable; +} + +void CSimpleMovieFrame::OnFrameRender(CRenderBatch* batch, uint32_t layer) { +} + +CSimpleMovieFrame::CSimpleMovieFrame(CSimpleFrame* parent) + : CSimpleFrame(parent) { +} + +int32_t CSimpleMovieFrame::StartMovie(const char* filename, int32_t volume) { + return 0; +} + +void CSimpleMovieFrame::StopMovie() { +} diff --git a/src/ui/CSimpleMovieFrame.hpp b/src/ui/CSimpleMovieFrame.hpp new file mode 100644 index 0000000..0f9318f --- /dev/null +++ b/src/ui/CSimpleMovieFrame.hpp @@ -0,0 +1,35 @@ +#ifndef UI_C_SIMPLE_MOVIE_FRAME_HPP +#define UI_C_SIMPLE_MOVIE_FRAME_HPP + +#include "ui/CSimpleFrame.hpp" +#include + +class CRect; +class CRenderBatch; + +class CSimpleMovieFrame : 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 variables + + // Virtual member functions + virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); + virtual bool IsA(int32_t type); + virtual int32_t GetScriptMetaTable(); + virtual void OnFrameRender(CRenderBatch* batch, uint32_t layer); + + // Member functions + CSimpleMovieFrame(CSimpleFrame* parent); + int32_t StartMovie(const char* filename, int32_t volume); + void StopMovie(); +}; + +#endif diff --git a/src/ui/CSimpleMovieFrameScript.cpp b/src/ui/CSimpleMovieFrameScript.cpp new file mode 100644 index 0000000..99dd403 --- /dev/null +++ b/src/ui/CSimpleMovieFrameScript.cpp @@ -0,0 +1,48 @@ +#include "ui/CSimpleMovieFrameScript.hpp" +#include "ui/CSimpleMovieFrame.hpp" +#include "util/Lua.hpp" +#include "util/Unimplemented.hpp" +#include "util/StringTo.hpp" +#include + + +int32_t CSimpleMovieFrame_StartMovie(lua_State* L) { + auto type = CSimpleMovieFrame::GetObjectType(); + auto movieFrame = static_cast(FrameScript_GetObjectThis(L, type)); + + if (!lua_isstring(L, 2) || !lua_isnumber(L, 3)) { + return luaL_error(L, "Usage: %s:StartMovie(\"filename\", volume_0_to_255)", movieFrame->GetDisplayName()); + } + + int32_t volume = static_cast(lua_tointeger(L, 3)); + const char* filename = lua_tolstring(L, 2, nullptr); + + if (movieFrame->StartMovie(filename, volume)) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + + return 1; +} + +int32_t CSimpleMovieFrame_StopMovie(lua_State* L) { + auto type = CSimpleMovieFrame::GetObjectType(); + auto movieFrame = static_cast(FrameScript_GetObjectThis(L, type)); + movieFrame->StopMovie(); + return 0; +} + +int32_t CSimpleMovieFrame_EnableSubtitles(lua_State* L) { + auto type = CSimpleMovieFrame::GetObjectType(); + auto movieFrame = static_cast(FrameScript_GetObjectThis(L, type)); + bool enabled = StringToBOOL(L, 2, 1); + // *(movieFrame + 680) = enabled; + return 0; +} + +FrameScript_Method SimpleMovieFrameMethods[NUM_SIMPLE_MOVIE_FRAME_SCRIPT_METHODS] = { + { "StartMovie", &CSimpleMovieFrame_StartMovie }, + { "StopMovie", &CSimpleMovieFrame_StopMovie }, + { "EnableSubtitles", &CSimpleMovieFrame_EnableSubtitles } +}; diff --git a/src/ui/CSimpleMovieFrameScript.hpp b/src/ui/CSimpleMovieFrameScript.hpp new file mode 100644 index 0000000..cf62616 --- /dev/null +++ b/src/ui/CSimpleMovieFrameScript.hpp @@ -0,0 +1,10 @@ +#ifndef UI_C_SIMPLE_MOVIE_FRAME_SCRIPT_HPP +#define UI_C_SIMPLE_MOVIE_FRAME_SCRIPT_HPP + +#include "ui/FrameScript.hpp" + +#define NUM_SIMPLE_MOVIE_FRAME_SCRIPT_METHODS 3 + +extern FrameScript_Method SimpleMovieFrameMethods[NUM_SIMPLE_MOVIE_FRAME_SCRIPT_METHODS]; + +#endif diff --git a/src/ui/FrameXML.cpp b/src/ui/FrameXML.cpp index ed78c6a..7c3c799 100644 --- a/src/ui/FrameXML.cpp +++ b/src/ui/FrameXML.cpp @@ -6,6 +6,7 @@ #include "ui/CSimpleFrame.hpp" #include "ui/CSimpleHTML.hpp" #include "ui/CSimpleModel.hpp" +#include "ui/CSimpleMovieFrame.hpp" #include "ui/CSimpleScrollFrame.hpp" #include "ui/CSimpleSlider.hpp" #include "util/CStatus.hpp" @@ -109,8 +110,10 @@ CSimpleFrame* Create_SimpleColorSelect(CSimpleFrame* parent) { CSimpleFrame* Create_SimpleMovieFrame(CSimpleFrame* parent) { // TODO + // auto m = CDataAllocator::GetData(CSimpleMovie::s_simpleMovieHeap, 0, __FILE__, __LINE__); - return nullptr; + auto m = SMemAlloc(sizeof(CSimpleMovieFrame), __FILE__, __LINE__, 0x0); + return new (m) CSimpleMovieFrame(parent); } XMLNode* FrameXML_AcquireHashNode(const char* name, const char*& tainted, bool& locked) { diff --git a/src/ui/ScriptFunctions.cpp b/src/ui/ScriptFunctions.cpp index 3a16262..b5a3c2f 100644 --- a/src/ui/ScriptFunctions.cpp +++ b/src/ui/ScriptFunctions.cpp @@ -8,6 +8,7 @@ #include "ui/CSimpleHTML.hpp" #include "ui/CSimpleModel.hpp" #include "ui/CSimpleModelFFX.hpp" +#include "ui/CSimpleMovieFrame.hpp" #include "ui/CSimpleScrollFrame.hpp" #include "ui/CSimpleSlider.hpp" #include "ui/CSimpleTexture.hpp" @@ -88,7 +89,7 @@ void RegisterSimpleFrameScriptMethods() { // TODO // CSimpleStatusBar::CreateScriptMetaTable(); // CSimpleColorSelect::CreateScriptMetaTable(); - // CSimpleMovieFrame::CreateScriptMetaTable(); + CSimpleMovieFrame::CreateScriptMetaTable(); } void SystemRegisterFunctions() {