From bc1ce52f7dd2ca49abb29b387889e5a1f05384c6 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Mon, 17 Apr 2023 16:52:11 -0500 Subject: [PATCH 1/4] chore(gx): use uint32_t union member in CGxStateBom when appropriate --- src/gx/CGxStateBom.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gx/CGxStateBom.cpp b/src/gx/CGxStateBom.cpp index 0527190..28137e6 100644 --- a/src/gx/CGxStateBom.cpp +++ b/src/gx/CGxStateBom.cpp @@ -8,7 +8,7 @@ const CGxStateBom& CGxStateBom::operator=(int32_t value) { } const CGxStateBom& CGxStateBom::operator=(uint32_t value) { - this->m_data.i[0] = value; + this->m_data.u[0] = value; return *this; } @@ -86,7 +86,7 @@ bool CGxStateBom::operator!=(CGxStateBom& value) { CGxStateBom::operator CImVector() const { CImVector color; - color.value = this->m_data.i[0]; + color.value = this->m_data.u[0]; return color; } @@ -99,7 +99,7 @@ CGxStateBom::operator int32_t() const { } CGxStateBom::operator uint32_t() const { - return this->m_data.i[0]; + return this->m_data.u[0]; } CGxStateBom::operator void*() const { From 884e491b25278718b770f593273533057924c420 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Mon, 17 Apr 2023 18:15:40 -0500 Subject: [PATCH 2/4] chore(ui): clean up script handlers for CScriptObject --- src/ui/CScriptObject.cpp | 8 ++++++ src/ui/CScriptObject.hpp | 1 + src/ui/CScriptObjectScript.cpp | 45 ++++++++-------------------------- 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/src/ui/CScriptObject.cpp b/src/ui/CScriptObject.cpp index a30cee0..5962ef5 100644 --- a/src/ui/CScriptObject.cpp +++ b/src/ui/CScriptObject.cpp @@ -13,6 +13,14 @@ void CScriptObject::RegisterScriptMethods(lua_State* L) { FrameScript_Object::FillScriptMethodTable(L, ScriptObjectMethods, NUM_SCRIPT_OBJECT_SCRIPT_METHODS); } +int32_t CScriptObject::GetObjectType() { + if (!CScriptObject::s_objectType) { + CScriptObject::s_objectType = ++FrameScript_Object::s_objectTypes; + } + + return CScriptObject::s_objectType; +} + CScriptObject* CScriptObject::GetScriptObjectByName(const char* name, int32_t type) { lua_State* L = FrameScript_GetContext(); diff --git a/src/ui/CScriptObject.hpp b/src/ui/CScriptObject.hpp index be2a64a..bf984c1 100644 --- a/src/ui/CScriptObject.hpp +++ b/src/ui/CScriptObject.hpp @@ -15,6 +15,7 @@ class CScriptObject : public FrameScript_Object { static const char* s_objectTypeName; // Static functions + static int32_t GetObjectType(); static void RegisterScriptMethods(lua_State* L); static CScriptObject* GetScriptObjectByName(const char* name, int32_t type); diff --git a/src/ui/CScriptObjectScript.cpp b/src/ui/CScriptObjectScript.cpp index 4974bdf..ec30c07 100644 --- a/src/ui/CScriptObjectScript.cpp +++ b/src/ui/CScriptObjectScript.cpp @@ -4,13 +4,8 @@ #include int32_t CScriptObject_GetObjectType(lua_State* L) { - if (!CScriptObject::s_objectType) { - CScriptObject::s_objectType = ++FrameScript_Object::s_objectTypes; - } - - CScriptObject* object = (CScriptObject*)FrameScript_GetObjectThis(L, CScriptObject::s_objectType); - - const char* type = object->GetObjectTypeName(); + auto object = static_cast(FrameScript_GetObjectThis(L, CScriptObject::GetObjectType())); + auto type = object->GetObjectTypeName(); lua_pushstring(L, type); @@ -18,24 +13,14 @@ int32_t CScriptObject_GetObjectType(lua_State* L) { } int32_t CScriptObject_IsObjectType(lua_State* L) { - if (!CScriptObject::s_objectType) { - CScriptObject::s_objectType = ++FrameScript_Object::s_objectTypes; - } - - CScriptObject* object = (CScriptObject*)FrameScript_GetObjectThis(L, CScriptObject::s_objectType); + auto object = static_cast(FrameScript_GetObjectThis(L, CScriptObject::GetObjectType())); if (!lua_isstring(L, 2)) { - const char* name = object->GetName(); - - if (!name) { - name = ""; - } - - luaL_error(L, "Usage: %s:IsObjectType(\"type\")", name); - return 0; + auto name = object->GetDisplayName(); + return luaL_error(L, "Usage: %s:IsObjectType(\"type\")", name); } - const char* type = lua_tolstring(L, 2, 0); + auto type = lua_tolstring(L, 2, nullptr); if (object->IsA(type)) { lua_pushnumber(L, 1.0); @@ -47,13 +32,8 @@ int32_t CScriptObject_IsObjectType(lua_State* L) { } int32_t CScriptObject_GetName(lua_State* L) { - if (!CScriptObject::s_objectType) { - CScriptObject::s_objectType = ++FrameScript_Object::s_objectTypes; - } - - CScriptObject* object = (CScriptObject*)FrameScript_GetObjectThis(L, CScriptObject::s_objectType); - - char* name = object->GetName(); + auto object = static_cast(FrameScript_GetObjectThis(L, CScriptObject::GetObjectType())); + auto name = object->GetName(); if (name && *name) { lua_pushstring(L, name); @@ -65,17 +45,12 @@ int32_t CScriptObject_GetName(lua_State* L) { } int32_t CScriptObject_GetParent(lua_State* L) { - if (!CScriptObject::s_objectType) { - CScriptObject::s_objectType = ++FrameScript_Object::s_objectTypes; - } - - CScriptObject* object = (CScriptObject*)FrameScript_GetObjectThis(L, CScriptObject::s_objectType); - + auto object = static_cast(FrameScript_GetObjectThis(L, CScriptObject::GetObjectType())); CScriptObject* parent = object->GetScriptObjectParent(); if (parent) { if (!parent->lua_registered) { - parent->RegisterScriptObject(0); + parent->RegisterScriptObject(nullptr); } lua_rawgeti(L, LUA_REGISTRYINDEX, parent->lua_objectRef); From 56092c67005e2a823339eb671629e4d2d807fc60 Mon Sep 17 00:00:00 2001 From: Tristan 'Natrist' Cormier Date: Mon, 17 Apr 2023 22:10:10 -0400 Subject: [PATCH 3/4] feat(console): partially implement console key down handler --- src/console/Handlers.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/console/Handlers.cpp b/src/console/Handlers.cpp index 4f5a3bc..ac1d248 100644 --- a/src/console/Handlers.cpp +++ b/src/console/Handlers.cpp @@ -1,4 +1,5 @@ #include "console/Handlers.hpp" +#include "console/Console.hpp" #include "event/Event.hpp" #include @@ -15,8 +16,25 @@ int32_t OnIdle(const EVENT_DATA_IDLE* data, void* param) { } int32_t OnKeyDown(const EVENT_DATA_KEY* data, void* param) { + if (data->key == ConsoleGetHotKey() && ConsoleAccessGetEnabled()) { + // Toggle the console on/off if the console hotkey is pressed down + // and the console access is enabled for the client + ConsoleSetActive(!ConsoleGetActive()); + + // Reset the highlight when toggled off + if (!ConsoleGetActive()) { + // TODO ResetHighlight(); + } + + return 0; + } + + if (EventIsKeyDown(ConsoleGetHotKey()) || !ConsoleGetActive()) { + return 1; + } + // TODO - return 1; + return 0; } int32_t OnKeyDownRepeat(const EVENT_DATA_KEY* data, void* param) { From df1ab322670cfa1b380ff3b9a872a6df7491c127 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Mon, 17 Apr 2023 22:44:44 -0500 Subject: [PATCH 4/4] feat(console): animate console open and close --- src/console/Console.cpp | 9 +++++++++ src/console/Console.hpp | 5 +++++ src/console/Handlers.cpp | 8 ++++++-- src/console/Screen.cpp | 27 +++++++++++++++++++++++++++ src/console/Screen.hpp | 2 ++ src/console/Types.hpp | 6 ++++++ 6 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/console/Console.cpp b/src/console/Console.cpp index 1609c64..9ceb7f8 100644 --- a/src/console/Console.cpp +++ b/src/console/Console.cpp @@ -3,6 +3,7 @@ static int32_t s_active; static int32_t s_consoleAccessEnabled; static KEY s_consoleKey = KEY_TILDE; +static CONSOLERESIZESTATE s_consoleResizeState = CS_NONE; int32_t ConsoleAccessGetEnabled() { return s_consoleAccessEnabled; @@ -20,6 +21,10 @@ KEY ConsoleGetHotKey() { return s_consoleKey; } +CONSOLERESIZESTATE ConsoleGetResizeState() { + return s_consoleResizeState; +} + void ConsoleSetActive(int32_t active) { s_active = active; } @@ -27,3 +32,7 @@ void ConsoleSetActive(int32_t active) { void ConsoleSetHotKey(KEY hotkey) { s_consoleKey = hotkey; } + +void ConsoleSetResizeState(CONSOLERESIZESTATE state) { + s_consoleResizeState = state; +} diff --git a/src/console/Console.hpp b/src/console/Console.hpp index e9bfac8..82d967c 100644 --- a/src/console/Console.hpp +++ b/src/console/Console.hpp @@ -1,6 +1,7 @@ #ifndef CONSOLE_CONSOLE_HPP #define CONSOLE_CONSOLE_HPP +#include "console/Types.hpp" #include "event/Types.hpp" #include @@ -12,8 +13,12 @@ int32_t ConsoleGetActive(); KEY ConsoleGetHotKey(); +CONSOLERESIZESTATE ConsoleGetResizeState(); + void ConsoleSetActive(int32_t active); void ConsoleSetHotKey(KEY hotkey); +void ConsoleSetResizeState(CONSOLERESIZESTATE state); + #endif // ifndef CONSOLE_CONSOLE_HPP diff --git a/src/console/Handlers.cpp b/src/console/Handlers.cpp index ac1d248..38880bb 100644 --- a/src/console/Handlers.cpp +++ b/src/console/Handlers.cpp @@ -1,5 +1,6 @@ #include "console/Handlers.hpp" #include "console/Console.hpp" +#include "console/Screen.hpp" #include "event/Event.hpp" #include @@ -11,7 +12,10 @@ int32_t OnChar(const EVENT_DATA_CHAR* data, void* param) { } int32_t OnIdle(const EVENT_DATA_IDLE* data, void* param) { - // TODO + // TODO repeat buffer logic + + ConsoleScreenAnimate(data->elapsedSec); + return 1; } @@ -28,7 +32,7 @@ int32_t OnKeyDown(const EVENT_DATA_KEY* data, void* param) { return 0; } - + if (EventIsKeyDown(ConsoleGetHotKey()) || !ConsoleGetActive()) { return 1; } diff --git a/src/console/Screen.cpp b/src/console/Screen.cpp index 2e2844c..63b3821 100644 --- a/src/console/Screen.cpp +++ b/src/console/Screen.cpp @@ -1,4 +1,5 @@ #include "console/Screen.hpp" +#include "console/Console.hpp" #include "console/Handlers.hpp" #include "console/Types.hpp" #include "gx/Buffer.hpp" @@ -11,11 +12,14 @@ #include "gx/Screen.hpp" #include #include +#include static CGxStringBatch* s_batch; static float s_caretpixwidth; static float s_caretpixheight; +static float s_consoleLines = 10.0f; static float s_fontHeight = 0.02f; +static float s_consoleHeight = s_consoleLines * s_fontHeight; static char s_fontName[STORM_MAX_PATH]; static int32_t s_highlightState; static HLAYER s_layerBackground; @@ -83,6 +87,29 @@ void PaintText(void* param, const RECTF* rect, const RECTF* visible, float elaps // TODO } +void ConsoleScreenAnimate(float elapsedSec) { + auto finalPos = ConsoleGetActive() ? std::min(1.0f - s_consoleHeight, 1.0f) : 1.0f; + finalPos = std::max(finalPos, 0.0f); + + if (s_rect.bottom == finalPos) { + return; + } + + auto currentPos = finalPos; + + if (ConsoleGetResizeState() == CS_NONE) { + auto direction = s_rect.bottom <= finalPos ? 1.0f : -1.0f; + + currentPos = s_rect.bottom + direction * elapsedSec * 5.0f; + currentPos = ConsoleGetActive() ? std::max(currentPos, finalPos) : std::min(currentPos, finalPos); + } + + s_rect.bottom = currentPos; + + ScrnLayerSetRect(s_layerBackground, &s_rect); + ScrnLayerSetRect(s_layerText, &s_rect); +} + void ConsoleScreenInitialize(const char* title) { CRect windowSize; GxCapsWindowSize(windowSize); diff --git a/src/console/Screen.hpp b/src/console/Screen.hpp index 709ec75..e065fb1 100644 --- a/src/console/Screen.hpp +++ b/src/console/Screen.hpp @@ -1,6 +1,8 @@ #ifndef CONSOLE_SCREEN_HPP #define CONSOLE_SCREEN_HPP +void ConsoleScreenAnimate(float elapsedSec); + void ConsoleScreenInitialize(const char* title); #endif diff --git a/src/console/Types.hpp b/src/console/Types.hpp index 0099be2..a66edb1 100644 --- a/src/console/Types.hpp +++ b/src/console/Types.hpp @@ -14,4 +14,10 @@ enum COLOR_T { NUM_COLORTYPES, }; +enum CONSOLERESIZESTATE { + CS_NONE, + CS_STRETCH, + NUM_CONSOLERESIZESTATES, +}; + #endif