diff --git a/src/gameui/CGTooltipScript.cpp b/src/gameui/CGTooltipScript.cpp index a9482ae..a26a188 100644 --- a/src/gameui/CGTooltipScript.cpp +++ b/src/gameui/CGTooltipScript.cpp @@ -1,4 +1,5 @@ #include "gameui/CGTooltipScript.hpp" +#include "gameui/CGTooltip.hpp" #include "util/Lua.hpp" #include "util/Unimplemented.hpp" @@ -23,11 +24,40 @@ static int32_t Script_GetPadding(lua_State* L) { } static int32_t Script_IsOwned(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CGTooltip::GetObjectType(); + auto tooltip = static_cast(FrameScript_GetObjectThis(L, type)); + + if (lua_type(L, 2) != LUA_TTABLE) { + return luaL_error(L, "Usage: %s:IsOwned(frame)", tooltip->GetDisplayName()); + } + + lua_rawgeti(L, 2, 0); + auto frame = static_cast(lua_touserdata(L, -1)); + lua_settop(L, -2); + + if (!frame) { + return luaL_error(L, "%s:IsOwned(): Couldn't find 'this' in frame object", tooltip->GetDisplayName()); + } + + if (!frame->IsA(CSimpleFrame::GetObjectType())) { + return luaL_error(L, "%s:IsOwned(): Wrong object type, expected frame", tooltip->GetDisplayName()); + } + + if (tooltip->m_parent == frame) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } static int32_t Script_GetOwner(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CGTooltip::GetObjectType(); + auto tooltip = static_cast(FrameScript_GetObjectThis(L, type)); + + // TODO + lua_pushnil(L); + return 1; } static int32_t Script_SetOwner(lua_State* L) { diff --git a/src/gameui/GameScriptFunctions.cpp b/src/gameui/GameScriptFunctions.cpp index 1dc6fe3..614d3b9 100644 --- a/src/gameui/GameScriptFunctions.cpp +++ b/src/gameui/GameScriptFunctions.cpp @@ -20,6 +20,7 @@ void RegisterSimpleFrameScriptMethods(); int32_t Script_GetScreenWidth(lua_State* L); int32_t Script_GetScreenHeight(lua_State* L); +int32_t Script_GetCursorPosition(lua_State* L); static int32_t Script_FrameXML_Debug(lua_State* L) { @@ -741,10 +742,6 @@ static int32_t Script_CancelSummon(lua_State* L) { WHOA_UNIMPLEMENTED(0); } -static int32_t Script_GetCursorPosition(lua_State* L) { - WHOA_UNIMPLEMENTED(0); -} - static int32_t Script_GetNetStats(lua_State* L) { // v1 = ClientServices__Connection(); // NetClient__GetNetStats(v1, &v5, &v4, (int*)&v3); @@ -1153,11 +1150,17 @@ static int32_t Script_IsAddOnLoadOnDemand(lua_State* L) { } static int32_t Script_IsAddOnLoaded(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + lua_pushnil(L); + return 2; } static int32_t Script_LoadAddOn(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + lua_pushstring(L, "UNKNOWN_ERROR"); + return 2; } static int32_t Script_PartialPlayTime(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsBattlefieldInfo.cpp b/src/gameui/scripts/GameScriptFunctionsBattlefieldInfo.cpp index 34476c0..7931aaf 100644 --- a/src/gameui/scripts/GameScriptFunctionsBattlefieldInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsBattlefieldInfo.cpp @@ -105,7 +105,8 @@ static int32_t Script_GetBattlefieldStatData(lua_State* L) { } static int32_t Script_RequestBattlefieldPositions(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO: sub_54CF60 + return 0; } static int32_t Script_GetNumBattlefieldPositions(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp b/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp index 5110dd3..165627d 100644 --- a/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsCharacterInfo.cpp @@ -161,7 +161,14 @@ static int32_t Script_ClearInspectPlayer(lua_State* L) { } static int32_t Script_GetWeaponEnchantInfo(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + lua_pushnil(L); + lua_pushnil(L); + lua_pushnil(L); + lua_pushnil(L); + lua_pushnil(L); + return 6; } static int32_t Script_HasWandEquipped(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp index 7174dd2..e9224d4 100644 --- a/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp +++ b/src/gameui/scripts/GameScriptFunctionsScriptEvents.cpp @@ -257,7 +257,9 @@ static int32_t Script_UnitIsDeadOrGhost(lua_State* L) { } static int32_t Script_UnitIsConnected(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + return 1; } static int32_t Script_UnitAffectingCombat(lua_State* L) { diff --git a/src/ui/CScriptRegion.cpp b/src/ui/CScriptRegion.cpp index 6fe36be..19facee 100644 --- a/src/ui/CScriptRegion.cpp +++ b/src/ui/CScriptRegion.cpp @@ -64,6 +64,10 @@ bool CScriptRegion::IsDragging() { return false; } +bool CScriptRegion::IsMouseOver(float a1, float a2, float a3, float a4) { + return false; +} + void CScriptRegion::LoadXML(XMLNode* node, CStatus* status) { CLayoutFrame::LoadXML(node, status); diff --git a/src/ui/CScriptRegion.hpp b/src/ui/CScriptRegion.hpp index fc68977..2714d37 100644 --- a/src/ui/CScriptRegion.hpp +++ b/src/ui/CScriptRegion.hpp @@ -29,6 +29,7 @@ class CScriptRegion : public CScriptObject, public CLayoutFrame { virtual bool IsA(const char* typeName); virtual const char* GetObjectTypeName(); virtual bool IsDragging(); + virtual bool IsMouseOver(float a1, float a2, float a3, float a4); virtual void PreOnAnimUpdate() {}; virtual void OnLayerUpdate(float elapsedSec); virtual void NotifyAnimBegin(CSimpleAnimGroup* animGroup); diff --git a/src/ui/CScriptRegionScript.cpp b/src/ui/CScriptRegionScript.cpp index ff56269..5abcd14 100644 --- a/src/ui/CScriptRegionScript.cpp +++ b/src/ui/CScriptRegionScript.cpp @@ -518,7 +518,23 @@ int32_t CScriptRegion_IsDragging(lua_State* L) { } int32_t CScriptRegion_IsMouseOver(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + int32_t type = CScriptRegion::GetObjectType(); + auto region = static_cast(FrameScript_GetObjectThis(L, type)); + + float rect[4]; + for (int32_t i = 0; i < 4; ++i) { + if (lua_isnumber(L, i + 2)) { + rect[i] = lua_tonumber(L, i + 2); + rect[i] /= CoordinateGetAspectCompensation() * 1024.0f; + rect[i] = NDCToDDCWidth(rect[i]); + } else { + rect[i] = 0.0f; + } + } + + auto result = region->IsMouseOver(rect[0], rect[1], rect[2], rect[3]); + lua_pushboolean(L, result); + return 1; } FrameScript_Method ScriptRegionMethods[NUM_SCRIPT_REGION_SCRIPT_METHODS] = { diff --git a/src/ui/CSimpleButtonScript.cpp b/src/ui/CSimpleButtonScript.cpp index 8010475..2fa05fc 100644 --- a/src/ui/CSimpleButtonScript.cpp +++ b/src/ui/CSimpleButtonScript.cpp @@ -71,7 +71,10 @@ int32_t CSimpleButton_Disable(lua_State* L) { } int32_t CSimpleButton_IsEnabled(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleButton::GetObjectType(); + auto button = static_cast(FrameScript_GetObjectThis(L, type)); + lua_pushnumber(L, button->GetButtonState() != BUTTONSTATE_DISABLED); + return 1; } int32_t CSimpleButton_GetButtonState(lua_State* L) { diff --git a/src/ui/CSimpleFontStringScript.cpp b/src/ui/CSimpleFontStringScript.cpp index f7b5594..0032ef2 100644 --- a/src/ui/CSimpleFontStringScript.cpp +++ b/src/ui/CSimpleFontStringScript.cpp @@ -56,11 +56,25 @@ int32_t CSimpleFontString_Hide(lua_State* L) { } int32_t CSimpleFontString_IsVisible(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + if (string->m_visible) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleFontString_IsShown(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleFontString::GetObjectType(); + auto string = static_cast(FrameScript_GetObjectThis(L, type)); + if (string->m_shown) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleFontString_GetFontObject(lua_State* L) { diff --git a/src/ui/CSimpleTextureScript.cpp b/src/ui/CSimpleTextureScript.cpp index c5536db..b1ecc61 100644 --- a/src/ui/CSimpleTextureScript.cpp +++ b/src/ui/CSimpleTextureScript.cpp @@ -96,11 +96,25 @@ int32_t CSimpleTexture_Hide(lua_State* L) { } int32_t CSimpleTexture_IsVisible(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleTexture::GetObjectType(); + auto texture = static_cast(FrameScript_GetObjectThis(L, type)); + if (texture->m_visible) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleTexture_IsShown(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleTexture::GetObjectType(); + auto texture = static_cast(FrameScript_GetObjectThis(L, type)); + if (texture->m_shown) { + lua_pushnumber(L, 1.0); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleTexture_GetTexture(lua_State* L) { @@ -211,11 +225,15 @@ int32_t CSimpleTexture_SetRotation(lua_State* L) { } int32_t CSimpleTexture_SetDesaturated(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + return 1; } int32_t CSimpleTexture_IsDesaturated(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + return 1; } int32_t CSimpleTexture_SetNonBlocking(lua_State* L) { diff --git a/src/ui/LuaExtraFuncs.cpp b/src/ui/LuaExtraFuncs.cpp index 9bde9ef..4720a7b 100644 --- a/src/ui/LuaExtraFuncs.cpp +++ b/src/ui/LuaExtraFuncs.cpp @@ -106,7 +106,9 @@ int32_t strlenutf8(lua_State* L) { } int32_t issecure(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnil(L); + return 1; } int32_t issecurevariable(lua_State* L) {