broken ui system
This commit is contained in:
320
src/luaapi.cpp
320
src/luaapi.cpp
@@ -4,6 +4,7 @@
|
||||
#include "controls.hh"
|
||||
#include "camera.hh"
|
||||
#include "cutscene.hh"
|
||||
#include "uisystem.hh"
|
||||
|
||||
#include <psyqo/soft-math.hh>
|
||||
#include <psyqo/trigonometry.hh>
|
||||
@@ -15,6 +16,7 @@ namespace psxsplash {
|
||||
// Static member
|
||||
SceneManager* LuaAPI::s_sceneManager = nullptr;
|
||||
CutscenePlayer* LuaAPI::s_cutscenePlayer = nullptr;
|
||||
UISystem* LuaAPI::s_uiSystem = nullptr;
|
||||
|
||||
// Scale factor: FixedPoint<12> stores 1.0 as raw 4096.
|
||||
// Lua scripts work in world-space units (1 = one unit), so we convert.
|
||||
@@ -36,9 +38,10 @@ static psyqo::Trig<> s_trig;
|
||||
// REGISTRATION
|
||||
// ============================================================================
|
||||
|
||||
void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cutscenePlayer) {
|
||||
void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cutscenePlayer, UISystem* uiSystem) {
|
||||
s_sceneManager = scene;
|
||||
s_cutscenePlayer = cutscenePlayer;
|
||||
s_uiSystem = uiSystem;
|
||||
|
||||
// ========================================================================
|
||||
// ENTITY API
|
||||
@@ -281,6 +284,73 @@ void LuaAPI::RegisterAll(psyqo::Lua& L, SceneManager* scene, CutscenePlayer* cut
|
||||
L.setField(-2, "IsPlaying");
|
||||
|
||||
L.setGlobal("Cutscene");
|
||||
|
||||
// ========================================================================
|
||||
// UI API
|
||||
// ========================================================================
|
||||
L.newTable(); // UI table
|
||||
|
||||
L.push(UI_FindCanvas);
|
||||
L.setField(-2, "FindCanvas");
|
||||
|
||||
L.push(UI_SetCanvasVisible);
|
||||
L.setField(-2, "SetCanvasVisible");
|
||||
|
||||
L.push(UI_IsCanvasVisible);
|
||||
L.setField(-2, "IsCanvasVisible");
|
||||
|
||||
L.push(UI_FindElement);
|
||||
L.setField(-2, "FindElement");
|
||||
|
||||
L.push(UI_SetVisible);
|
||||
L.setField(-2, "SetVisible");
|
||||
|
||||
L.push(UI_IsVisible);
|
||||
L.setField(-2, "IsVisible");
|
||||
|
||||
L.push(UI_SetText);
|
||||
L.setField(-2, "SetText");
|
||||
|
||||
L.push(UI_GetText);
|
||||
L.setField(-2, "GetText");
|
||||
|
||||
L.push(UI_SetProgress);
|
||||
L.setField(-2, "SetProgress");
|
||||
|
||||
L.push(UI_GetProgress);
|
||||
L.setField(-2, "GetProgress");
|
||||
|
||||
L.push(UI_SetColor);
|
||||
L.setField(-2, "SetColor");
|
||||
|
||||
L.push(UI_GetColor);
|
||||
L.setField(-2, "GetColor");
|
||||
|
||||
L.push(UI_SetPosition);
|
||||
L.setField(-2, "SetPosition");
|
||||
|
||||
L.push(UI_GetPosition);
|
||||
L.setField(-2, "GetPosition");
|
||||
|
||||
L.push(UI_SetSize);
|
||||
L.setField(-2, "SetSize");
|
||||
|
||||
L.push(UI_GetSize);
|
||||
L.setField(-2, "GetSize");
|
||||
|
||||
L.push(UI_SetProgressColors);
|
||||
L.setField(-2, "SetProgressColors");
|
||||
|
||||
L.push(UI_GetElementType);
|
||||
L.setField(-2, "GetElementType");
|
||||
|
||||
L.push(UI_GetElementCount);
|
||||
L.setField(-2, "GetElementCount");
|
||||
|
||||
L.push(UI_GetElementByIndex);
|
||||
L.setField(-2, "GetElementByIndex");
|
||||
|
||||
L.setGlobal("UI");
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
@@ -1437,4 +1507,252 @@ int LuaAPI::Cutscene_IsPlaying(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// UI API IMPLEMENTATION
|
||||
// ============================================================================
|
||||
|
||||
int LuaAPI::UI_FindCanvas(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isString(1)) {
|
||||
lua.pushNumber(-1);
|
||||
return 1;
|
||||
}
|
||||
const char* name = lua.toString(1);
|
||||
int idx = s_uiSystem->findCanvas(name);
|
||||
lua.pushNumber(static_cast<lua_Number>(idx));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetCanvasVisible(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem) return 0;
|
||||
int idx;
|
||||
// Accept number (index) or string (name)
|
||||
if (lua.isNumber(1)) {
|
||||
idx = static_cast<int>(lua.toNumber(1));
|
||||
} else if (lua.isString(1)) {
|
||||
idx = s_uiSystem->findCanvas(lua.toString(1));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
bool visible = lua.toBoolean(2);
|
||||
s_uiSystem->setCanvasVisible(idx, visible);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_IsCanvasVisible(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem) {
|
||||
lua.push(false);
|
||||
return 1;
|
||||
}
|
||||
int idx;
|
||||
if (lua.isNumber(1)) {
|
||||
idx = static_cast<int>(lua.toNumber(1));
|
||||
} else if (lua.isString(1)) {
|
||||
idx = s_uiSystem->findCanvas(lua.toString(1));
|
||||
} else {
|
||||
lua.push(false);
|
||||
return 1;
|
||||
}
|
||||
lua.push(s_uiSystem->isCanvasVisible(idx));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_FindElement(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1) || !lua.isString(2)) {
|
||||
lua.pushNumber(-1);
|
||||
return 1;
|
||||
}
|
||||
int canvasIdx = static_cast<int>(lua.toNumber(1));
|
||||
const char* name = lua.toString(2);
|
||||
int handle = s_uiSystem->findElement(canvasIdx, name);
|
||||
lua.pushNumber(static_cast<lua_Number>(handle));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetVisible(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
bool visible = lua.toBoolean(2);
|
||||
s_uiSystem->setElementVisible(handle, visible);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_IsVisible(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.push(false);
|
||||
return 1;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
lua.push(s_uiSystem->isElementVisible(handle));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetText(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
const char* text = lua.isString(2) ? lua.toString(2) : "";
|
||||
s_uiSystem->setText(handle, text);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetProgress(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
int value = static_cast<int>(lua.toNumber(2));
|
||||
if (value < 0) value = 0;
|
||||
if (value > 100) value = 100;
|
||||
s_uiSystem->setProgress(handle, (uint8_t)value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetProgress(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(0);
|
||||
return 1;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
lua.pushNumber(static_cast<lua_Number>(s_uiSystem->getProgress(handle)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetColor(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
uint8_t r = static_cast<uint8_t>(lua.toNumber(2));
|
||||
uint8_t g = static_cast<uint8_t>(lua.toNumber(3));
|
||||
uint8_t b = static_cast<uint8_t>(lua.toNumber(4));
|
||||
s_uiSystem->setColor(handle, r, g, b);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetPosition(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
int16_t x = static_cast<int16_t>(lua.toNumber(2));
|
||||
int16_t y = static_cast<int16_t>(lua.toNumber(3));
|
||||
s_uiSystem->setPosition(handle, x, y);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetText(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.push("");
|
||||
return 1;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
lua.push(s_uiSystem->getText(handle));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetColor(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(0); lua.pushNumber(0); lua.pushNumber(0);
|
||||
return 3;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
uint8_t r, g, b;
|
||||
s_uiSystem->getColor(handle, r, g, b);
|
||||
lua.pushNumber(r); lua.pushNumber(g); lua.pushNumber(b);
|
||||
return 3;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetPosition(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(0); lua.pushNumber(0);
|
||||
return 2;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
int16_t x, y;
|
||||
s_uiSystem->getPosition(handle, x, y);
|
||||
lua.pushNumber(static_cast<lua_Number>(x));
|
||||
lua.pushNumber(static_cast<lua_Number>(y));
|
||||
return 2;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetSize(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
int16_t w = static_cast<int16_t>(lua.toNumber(2));
|
||||
int16_t h = static_cast<int16_t>(lua.toNumber(3));
|
||||
s_uiSystem->setSize(handle, w, h);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetSize(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(0); lua.pushNumber(0);
|
||||
return 2;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
int16_t w, h;
|
||||
s_uiSystem->getSize(handle, w, h);
|
||||
lua.pushNumber(static_cast<lua_Number>(w));
|
||||
lua.pushNumber(static_cast<lua_Number>(h));
|
||||
return 2;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_SetProgressColors(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) return 0;
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
uint8_t bgR = static_cast<uint8_t>(lua.toNumber(2));
|
||||
uint8_t bgG = static_cast<uint8_t>(lua.toNumber(3));
|
||||
uint8_t bgB = static_cast<uint8_t>(lua.toNumber(4));
|
||||
uint8_t fR = static_cast<uint8_t>(lua.toNumber(5));
|
||||
uint8_t fG = static_cast<uint8_t>(lua.toNumber(6));
|
||||
uint8_t fB = static_cast<uint8_t>(lua.toNumber(7));
|
||||
s_uiSystem->setProgressColors(handle, bgR, bgG, bgB, fR, fG, fB);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetElementType(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(-1);
|
||||
return 1;
|
||||
}
|
||||
int handle = static_cast<int>(lua.toNumber(1));
|
||||
lua.pushNumber(static_cast<lua_Number>(static_cast<uint8_t>(s_uiSystem->getElementType(handle))));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetElementCount(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1)) {
|
||||
lua.pushNumber(0);
|
||||
return 1;
|
||||
}
|
||||
int canvasIdx = static_cast<int>(lua.toNumber(1));
|
||||
lua.pushNumber(static_cast<lua_Number>(s_uiSystem->getCanvasElementCount(canvasIdx)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LuaAPI::UI_GetElementByIndex(lua_State* L) {
|
||||
psyqo::Lua lua(L);
|
||||
if (!s_uiSystem || !lua.isNumber(1) || !lua.isNumber(2)) {
|
||||
lua.pushNumber(-1);
|
||||
return 1;
|
||||
}
|
||||
int canvasIdx = static_cast<int>(lua.toNumber(1));
|
||||
int elemIdx = static_cast<int>(lua.toNumber(2));
|
||||
int handle = s_uiSystem->getCanvasElementHandle(canvasIdx, elemIdx);
|
||||
lua.pushNumber(static_cast<lua_Number>(handle));
|
||||
return 1;
|
||||
}
|
||||
|
||||
} // namespace psxsplash
|
||||
|
||||
Reference in New Issue
Block a user