feat(ui): implement CScriptRegion LUA methods

This commit is contained in:
VDm 2025-08-05 22:05:19 +04:00
parent 8c442f5a82
commit d63ebf7696
11 changed files with 208 additions and 30 deletions

View file

@ -16,7 +16,7 @@ void CGCharacterModelBase::CreateScriptMetaTable() {
} }
void CGCharacterModelBase::RegisterScriptMethods(lua_State* L) { void CGCharacterModelBase::RegisterScriptMethods(lua_State* L) {
CSimpleFrame::RegisterScriptMethods(L); CSimpleModel::RegisterScriptMethods(L);
FrameScript_Object::FillScriptMethodTable(L, CGCharacterModelBaseMethods, NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS); FrameScript_Object::FillScriptMethodTable(L, CGCharacterModelBaseMethods, NUM_CGCHARACTER_MODEL_BASE_SCRIPT_METHODS);
} }
@ -24,6 +24,5 @@ int32_t CGCharacterModelBase::GetScriptMetaTable() {
return CGCharacterModelBase::s_metatable; return CGCharacterModelBase::s_metatable;
} }
CGCharacterModelBase::CGCharacterModelBase(CSimpleFrame* parent) CGCharacterModelBase::CGCharacterModelBase(CSimpleFrame* parent) : CSimpleModel(parent) {
: CSimpleFrame(parent) {
} }

View file

@ -1,10 +1,10 @@
#ifndef GAME_UI_CGCHARACTER_MODEL_BASE_HPP #ifndef GAME_UI_CGCHARACTER_MODEL_BASE_HPP
#define GAME_UI_CGCHARACTER_MODEL_BASE_HPP #define GAME_UI_CGCHARACTER_MODEL_BASE_HPP
#include "ui/CSimpleFrame.hpp" #include "ui/CSimpleModel.hpp"
#include "ui/CSimpleTop.hpp" #include "ui/CSimpleTop.hpp"
class CGCharacterModelBase : public CSimpleFrame { class CGCharacterModelBase : public CSimpleModel {
public: public:
// Static variables // Static variables
static int32_t s_metatable; static int32_t s_metatable;

View file

@ -14,6 +14,8 @@
// External from "ui/ScriptFunctions.hpp" // External from "ui/ScriptFunctions.hpp"
void RegisterSimpleFrameScriptMethods(); 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) { static int32_t Script_FrameXML_Debug(lua_State* L) {
@ -580,14 +582,6 @@ static int32_t Script_ArenaTeamDisband(lua_State* L) {
WHOA_UNIMPLEMENTED(0); 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) { static int32_t Script_GetDamageBonusStat(lua_State* L) {
WHOA_UNIMPLEMENTED(0); WHOA_UNIMPLEMENTED(0);
} }

View file

@ -9,7 +9,10 @@ static int32_t Script_BNGetInfo(lua_State* L) {
} }
static int32_t Script_BNGetNumFriends(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) { 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) { 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) { static int32_t Script_BNGetFriendInviteInfo(lua_State* L) {

View file

@ -9,7 +9,9 @@ static int32_t Script_ContainerIDToInventoryID(lua_State* L) {
} }
static int32_t Script_GetContainerNumSlots(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) { static int32_t Script_GetContainerItemInfo(lua_State* L) {

View file

@ -5,7 +5,10 @@
static int32_t Script_GetNumFriends(lua_State* L) { 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) { static int32_t Script_GetFriendInfo(lua_State* L) {

View file

@ -5,7 +5,9 @@
static int32_t Script_GetNumTrackingTypes(lua_State* L) { 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) { static int32_t Script_GetTrackingInfo(lua_State* L) {

View file

@ -2,6 +2,7 @@
#include "ui/FrameScript.hpp" #include "ui/FrameScript.hpp"
#include "util/Lua.hpp" #include "util/Lua.hpp"
#include "util/Unimplemented.hpp" #include "util/Unimplemented.hpp"
#include "client/ClientServices.hpp"
#include <common/Time.hpp> #include <common/Time.hpp>
static int32_t Script_GetTime(lua_State* L) { 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) { 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) { 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) { static int32_t Script_UnitLevel(lua_State* L) {
// TODO // TODO
lua_pushnumber(L, 1.0); lua_pushnumber(L, 25.0);
return 1; return 1;
} }

View file

@ -815,6 +815,13 @@ void CLayoutFrame::SetProtectFlag(uint32_t flag) {
// TODO // 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) { void CLayoutFrame::SetWidth(float width) {
this->m_flags &= ~0x8; this->m_flags &= ~0x8;
this->m_width = width; this->m_width = width;

View file

@ -46,6 +46,7 @@ class CLayoutFrame {
virtual ~CLayoutFrame(); virtual ~CLayoutFrame();
virtual CLayoutFrame* GetLayoutParent(); virtual CLayoutFrame* GetLayoutParent();
virtual bool SetLayoutScale(float scale, bool force); virtual bool SetLayoutScale(float scale, bool force);
virtual void SetSize(float width, float height);
virtual void SetWidth(float width); virtual void SetWidth(float width);
virtual void SetHeight(float height); virtual void SetHeight(float height);
virtual float GetWidth(); virtual float GetWidth();

View file

@ -3,6 +3,7 @@
#include "ui/FrameScript_Object.hpp" #include "ui/FrameScript_Object.hpp"
#include "ui/CScriptRegion.hpp" #include "ui/CScriptRegion.hpp"
#include "ui/CSimpleTop.hpp" #include "ui/CSimpleTop.hpp"
#include "ui/CFramePoint.hpp"
#include "util/Lua.hpp" #include "util/Lua.hpp"
#include "util/StringTo.hpp" #include "util/StringTo.hpp"
#include "util/Unimplemented.hpp" #include "util/Unimplemented.hpp"
@ -10,11 +11,20 @@
#include <tempest/Rect.hpp> #include <tempest/Rect.hpp>
int32_t CScriptRegion_IsProtected(lua_State* L) { int32_t CScriptRegion_IsProtected(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(FrameScript_GetObjectThis(L, type));
// TODO
lua_pushnil(L);
lua_pushnil(L);
return 2;
} }
int32_t CScriptRegion_CanChangeProtectedState(lua_State* L) { int32_t CScriptRegion_CanChangeProtectedState(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(FrameScript_GetObjectThis(L, type));
// TODO
lua_pushnil(L);
return 1;
} }
int32_t CScriptRegion_SetParent(lua_State* L) { 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) { int32_t CScriptRegion_GetRect(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { 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) { int32_t CScriptRegion_GetLeft(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetRight(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetTop(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetBottom(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { 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) { int32_t CScriptRegion_SetSize(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetSize(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetNumPoints(lua_State* L) {
WHOA_UNIMPLEMENTED(0); int32_t type = CScriptRegion::GetObjectType();
auto region = static_cast<CScriptRegion*>(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) { int32_t CScriptRegion_GetPoint(lua_State* L) {