Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions external/steam_api/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ if((LINK_STEAM_API OR LUASTG_LINK_STEAM_API) AND (TARGET steam_api)) # LINK_STEA
binding/lua_steam_SteamAPI.inl
binding/lua_steam_SteamInput.inl
binding/lua_steam_SteamUserStats.inl
binding/lua_steam_SteamUtils.inl
binding/lua_steam_SteamFriends.inl
binding/lua_steam_SteamUGC.inl
binding/lua_steam_SteamUser.inl
binding/lua_steam_SteamApps.inl
binding/lua_steam.cpp
)
target_link_libraries(lua_steam_api PUBLIC
Expand Down
65 changes: 35 additions & 30 deletions external/steam_api/binding/lua_steam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,44 +68,30 @@ uint32_t lua_to_uint32(lua_State* L, const int n)
}
int lua_push_uint64(lua_State* L, const uint64_t v)
{
const int a = (0xFFFF000000000000 & v) >> 48;
const int b = (0x0000FFFF00000000 & v) >> 32;
const int c = (0x00000000FFFF0000 & v) >> 16;
const int d = (0x000000000000FFFF & v);
lua_createtable(L, 4, 0); // ? t
lua_pushinteger(L, a); // ? t a
lua_pushinteger(L, b); // ? t a b
lua_pushinteger(L, c); // ? t a b c
lua_pushinteger(L, d); // ? t a b c d
lua_rawseti(L, -5, 1); // ? t a b c
lua_rawseti(L, -4, 2); // ? t a b
lua_rawseti(L, -3, 3); // ? t a
lua_rawseti(L, -2, 4); // ? t
char buffer[21];
int len = snprintf(buffer, sizeof(buffer), "%llu", static_cast<unsigned long long>(v));
if (len < 0 || len >= static_cast<int>(sizeof(buffer))) {
return luaL_error(L, "uint64_t to string conversion failed");
}
lua_pushlstring(L, buffer, len);
return 1;
};
uint64_t lua_to_uint64(lua_State* L, const int n, const char* name)
{
if (!lua_istable(L, n))
if (!lua_isstring(L, n))
{
luaL_typerror(L, n, name);
return 0;
}
lua_rawgeti(L, n, 4); // ? t a
lua_rawgeti(L, n, 3); // ? t a b
lua_rawgeti(L, n, 2); // ? t a b c
lua_rawgeti(L, n, 1); // ? t a b c d
if (!lua_isnumber(L, -4) || !lua_isnumber(L, -3) || !lua_isnumber(L, -2) || !lua_isnumber(L, -1))
{
lua_pop(L, 4);
luaL_typerror(L, n, name);
const char* str = lua_tostring(L, n);
uint64_t result = 0;

if (sscanf(str, "%llu", &result) != 1) {
luaL_error(L, "Invalid uint64_t value: '%s'", str);
return 0;
}
const uint64_t a = (uint64_t)(lua_tointeger(L, -4) & 0xFFFF);
const uint64_t b = (uint64_t)(lua_tointeger(L, -3) & 0xFFFF);
const uint64_t c = (uint64_t)(lua_tointeger(L, -2) & 0xFFFF);
const uint64_t d = (uint64_t)(lua_tointeger(L, -1) & 0xFFFF);
lua_pop(L, 4);
return (a << 48) | (b << 32) | (c << 16) | d;

return result;
};

#define lua_push_to_uin64_t(_T)\
Expand All @@ -119,6 +105,15 @@ lua_push_to_uin64_t(InputAnalogActionHandle_t);
lua_push_to_uin64_t(InputDigitalActionHandle_t);
lua_push_to_uin64_t(InputHandle_t);

lua_push_to_uin64_t(PublishedFileId_t);

lua_push_to_uin64_t(UGCQueryHandle_t);
lua_push_to_uin64_t(UGCUpdateHandle_t);
lua_push_to_uin64_t(UGCHandle_t);

lua_push_to_uin64_t(SteamLeaderboard_t);
lua_push_to_uin64_t(SteamLeaderboardEntries_t);

#define xfbinding(_X) { #_X , & _X }

static void* xSteamLuaKey = nullptr;
Expand All @@ -127,6 +122,11 @@ static void* xSteamLuaKey = nullptr;
#include "lua_steam_SteamAPI.inl"
#include "lua_steam_SteamInput.inl"
#include "lua_steam_SteamUserStats.inl"
#include "lua_steam_SteamUtils.inl"
#include "lua_steam_SteamFriends.inl"
#include "lua_steam_SteamUGC.inl"
#include "lua_steam_SteamUser.inl"
#include "lua_steam_SteamApps.inl"

bool lua_steam_check(uint32_t appid)
{
Expand All @@ -135,7 +135,7 @@ bool lua_steam_check(uint32_t appid)
int lua_steam_open(lua_State* L)
{
// create and register steam lib
const luaL_Reg lib[] = {{NULL, NULL}};
const luaL_Reg lib[] = { {NULL, NULL} };
luaL_register(L, "steam", lib); // t
lua_pushlightuserdata(L, &xSteamLuaKey); // t k
lua_pushvalue(L, -2); // t k t
Expand All @@ -145,5 +145,10 @@ int lua_steam_open(lua_State* L)
xSteamAPI::xRegister(L);
xSteamInput::xRegister(L);
xSteamUserStats::xRegister(L);
xSteamUtils::xRegister(L);
xSteamFriends::xRegister(L);
xSteamUGC::xRegister(L);
xSteamUser::xRegister(L);
xSteamApps::xRegister(L);
return 1;
}
}
22 changes: 22 additions & 0 deletions external/steam_api/binding/lua_steam_SteamApps.inl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

struct xSteamApps {
static int GetCurrentGameLanguage(lua_State* L) {
const char* lang = SteamApps()->GetCurrentGameLanguage();
lua_pushstring(L, lang);
return 1;
}
static int xRegister(lua_State* L)
{
static const luaL_Reg lib[] = {
xfbinding(GetCurrentGameLanguage),
{NULL, NULL},
};
lua_pushstring(L, "SteamApps");
lua_createtable(L, 0, 2);
luaL_register(L, NULL, lib);
lua_settable(L, -3);
return 0;
};
};

33 changes: 33 additions & 0 deletions external/steam_api/binding/lua_steam_SteamFriends.inl
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

struct xSteamFriends {
static int ActivateGameOverlay(lua_State* L) {
const char* pchDialog = luaL_checkstring(L, 1);
SteamFriends()->ActivateGameOverlay(pchDialog);
return 0;
}
static int ActivateGameOverlayToWebPage(lua_State* L) {
const char* pchURL = luaL_checkstring(L, 1);
SteamFriends()->ActivateGameOverlayToWebPage(pchURL);
return 0;
}
static int GetPersonaName(lua_State* L) {
lua_pushstring(L, SteamFriends()->GetPersonaName());
return 1;
}

static int xRegister(lua_State* L)
{
static const luaL_Reg lib[] = {
xfbinding(ActivateGameOverlay),
xfbinding(ActivateGameOverlayToWebPage),
xfbinding(GetPersonaName),
{NULL, NULL},
};
lua_pushstring(L, "SteamFriends");
lua_createtable(L, 0, 3);
luaL_register(L, NULL, lib);
lua_settable(L, -3);
return 0;
};
};
Loading