2020-08-03 05:35:00 +02:00
|
|
|
#include "MakeAndPlay.h"
|
|
|
|
|
|
|
|
#ifndef MAKEANDPLAY
|
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <SDL.h>
|
|
|
|
|
2021-02-24 00:21:29 +01:00
|
|
|
#include "Vlogging.h"
|
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
/* Steamworks interface versions */
|
|
|
|
|
|
|
|
#define VVVVVV_STEAMCLIENT "SteamClient017"
|
|
|
|
#define VVVVVV_STEAMUSERSTATS "STEAMUSERSTATS_INTERFACE_VERSION011"
|
|
|
|
|
|
|
|
/* Shared object file name */
|
|
|
|
|
|
|
|
#if defined(_WIN32)
|
2020-01-13 17:15:17 +01:00
|
|
|
#define STEAM_LIBRARY "steam_api.dll"
|
2020-01-01 21:29:24 +01:00
|
|
|
#elif defined(__APPLE__)
|
2020-01-13 17:15:17 +01:00
|
|
|
#define STEAM_LIBRARY "libsteam_api.dylib"
|
2020-04-20 15:41:11 +02:00
|
|
|
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
2020-01-13 17:15:17 +01:00
|
|
|
#define STEAM_LIBRARY "libsteam_api.so"
|
2020-01-01 21:29:24 +01:00
|
|
|
#else
|
2020-01-13 17:15:17 +01:00
|
|
|
#error STEAM_LIBRARY: Unrecognized platform!
|
2020-01-01 21:29:24 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* DLL, Entry Points */
|
|
|
|
|
2021-09-18 06:11:25 +02:00
|
|
|
struct ISteamClient;
|
|
|
|
struct ISteamUserStats;
|
|
|
|
|
2021-09-17 22:53:52 +02:00
|
|
|
#define FUNC_LIST \
|
|
|
|
FOREACH_FUNC(uint8_t, SteamAPI_Init, (void)) \
|
|
|
|
FOREACH_FUNC(void, SteamAPI_Shutdown, (void)) \
|
|
|
|
FOREACH_FUNC(void, SteamAPI_RunCallbacks, (void)) \
|
2021-09-18 06:11:25 +02:00
|
|
|
FOREACH_FUNC(struct ISteamClient*, SteamInternal_CreateInterface, (const char*)) \
|
2021-09-17 22:53:52 +02:00
|
|
|
FOREACH_FUNC(int32_t, SteamAPI_GetHSteamUser, (void)) \
|
|
|
|
FOREACH_FUNC(int32_t, SteamAPI_GetHSteamPipe, (void)) \
|
2021-09-18 06:11:25 +02:00
|
|
|
FOREACH_FUNC(struct ISteamUserStats*, SteamAPI_ISteamClient_GetISteamUserStats, ( \
|
|
|
|
struct ISteamClient*, \
|
2021-09-17 22:53:52 +02:00
|
|
|
int32_t, \
|
|
|
|
int32_t, \
|
|
|
|
const char* \
|
|
|
|
)) \
|
2021-09-18 06:11:25 +02:00
|
|
|
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_RequestCurrentStats, (struct ISteamUserStats*)) \
|
|
|
|
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_StoreStats, (struct ISteamUserStats*)) \
|
2021-09-17 22:53:52 +02:00
|
|
|
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_SetAchievement, ( \
|
2021-09-18 06:11:25 +02:00
|
|
|
struct ISteamUserStats*, \
|
2021-09-17 22:53:52 +02:00
|
|
|
const char* \
|
|
|
|
))
|
|
|
|
|
2020-01-01 21:29:24 +01:00
|
|
|
static void *libHandle = NULL;
|
2021-09-18 06:11:25 +02:00
|
|
|
static struct ISteamUserStats *steamUserStats = NULL;
|
2020-01-01 21:29:24 +01:00
|
|
|
|
2021-09-17 22:58:44 +02:00
|
|
|
#define FOREACH_FUNC(rettype, name, params) static rettype (*name) params = NULL;
|
2021-09-17 22:53:52 +02:00
|
|
|
FUNC_LIST
|
|
|
|
#undef FOREACH_FUNC
|
2020-01-01 21:29:24 +01:00
|
|
|
|
|
|
|
/* Clean up after ourselves... */
|
|
|
|
|
Explicitly declare void for all void parameter functions (#628)
Apparently in C, if you have `void test();`, it's completely okay to do
`test(2);`. The function will take in the argument, but just discard it
and throw it away. It's like a trash can, and a rude one at that. If you
declare it like `void test(void);`, this is prevented.
This is not a problem in C++ - doing `void test();` and `test(2);` is
guaranteed to result in a compile error (this also means that right now,
at least in all `.cpp` files, nobody is ever calling a void parameter
function with arguments and having their arguments be thrown away).
However, we may not be using C++ in the future, so I just want to lay
down the precedent that if a function takes in no arguments, you must
explicitly declare it as such.
I would've added `-Wstrict-prototypes`, but it produces an annoying
warning message saying it doesn't work in C++ mode if you're compiling
in C++ mode. So it can be added later.
2021-02-25 23:23:59 +01:00
|
|
|
static void ClearPointers(void)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
2021-09-07 03:56:39 +02:00
|
|
|
SDL_UnloadObject(libHandle);
|
|
|
|
libHandle = NULL;
|
2021-09-18 06:11:25 +02:00
|
|
|
steamUserStats = NULL;
|
2021-09-17 22:58:44 +02:00
|
|
|
#define FOREACH_FUNC(rettype, name, params) name = NULL;
|
2021-09-17 22:53:52 +02:00
|
|
|
FUNC_LIST
|
|
|
|
#undef FOREACH_FUNC
|
2020-01-01 21:29:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* NETWORK API Implementation */
|
|
|
|
|
Explicitly declare void for all void parameter functions (#628)
Apparently in C, if you have `void test();`, it's completely okay to do
`test(2);`. The function will take in the argument, but just discard it
and throw it away. It's like a trash can, and a rude one at that. If you
declare it like `void test(void);`, this is prevented.
This is not a problem in C++ - doing `void test();` and `test(2);` is
guaranteed to result in a compile error (this also means that right now,
at least in all `.cpp` files, nobody is ever calling a void parameter
function with arguments and having their arguments be thrown away).
However, we may not be using C++ in the future, so I just want to lay
down the precedent that if a function takes in no arguments, you must
explicitly declare it as such.
I would've added `-Wstrict-prototypes`, but it produces an annoying
warning message saying it doesn't work in C++ mode if you're compiling
in C++ mode. So it can be added later.
2021-02-25 23:23:59 +01:00
|
|
|
int32_t STEAM_init(void)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
2020-04-20 15:41:11 +02:00
|
|
|
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__)
|
2021-09-07 03:56:39 +02:00
|
|
|
return 0;
|
2020-01-10 22:38:33 +01:00
|
|
|
#endif
|
2021-09-18 06:11:25 +02:00
|
|
|
struct ISteamClient *steamClient;
|
2021-09-07 03:56:39 +02:00
|
|
|
int32_t steamUser, steamPipe;
|
|
|
|
|
|
|
|
libHandle = SDL_LoadObject(STEAM_LIBRARY);
|
|
|
|
if (!libHandle)
|
|
|
|
{
|
2021-09-17 23:05:23 +02:00
|
|
|
vlog_info(STEAM_LIBRARY " not found!");
|
2021-09-07 03:56:39 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-09-17 22:58:44 +02:00
|
|
|
#define FOREACH_FUNC(rettype, name, params) \
|
|
|
|
name = (rettype (*) params) SDL_LoadFunction(libHandle, #name); \
|
2021-09-17 22:53:52 +02:00
|
|
|
if (!name) \
|
|
|
|
{ \
|
2021-09-17 23:05:23 +02:00
|
|
|
vlog_error(STEAM_LIBRARY " symbol " #name " not found!"); \
|
2021-09-17 22:53:52 +02:00
|
|
|
ClearPointers(); \
|
|
|
|
return 0; \
|
|
|
|
}
|
|
|
|
FUNC_LIST
|
|
|
|
#undef FOREACH_FUNC
|
2021-09-07 03:56:39 +02:00
|
|
|
|
|
|
|
if (!SteamAPI_Init())
|
|
|
|
{
|
|
|
|
vlog_error("Steamworks not initialized!");
|
|
|
|
ClearPointers();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
steamClient = SteamInternal_CreateInterface(VVVVVV_STEAMCLIENT);
|
|
|
|
steamUser = SteamAPI_GetHSteamUser();
|
|
|
|
steamPipe = SteamAPI_GetHSteamPipe();
|
|
|
|
if (!steamClient || !steamUser || !steamPipe)
|
|
|
|
{
|
|
|
|
SteamAPI_Shutdown();
|
|
|
|
vlog_error(VVVVVV_STEAMCLIENT " not created!");
|
|
|
|
ClearPointers();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
steamUserStats = SteamAPI_ISteamClient_GetISteamUserStats(
|
|
|
|
steamClient,
|
|
|
|
steamUser,
|
|
|
|
steamPipe,
|
|
|
|
VVVVVV_STEAMUSERSTATS
|
|
|
|
);
|
|
|
|
if (!steamUserStats)
|
|
|
|
{
|
|
|
|
SteamAPI_Shutdown();
|
|
|
|
vlog_error(VVVVVV_STEAMUSERSTATS " not created!");
|
|
|
|
ClearPointers();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
SteamAPI_ISteamUserStats_RequestCurrentStats(steamUserStats);
|
|
|
|
return 1;
|
2020-01-01 21:29:24 +01:00
|
|
|
}
|
|
|
|
|
Explicitly declare void for all void parameter functions (#628)
Apparently in C, if you have `void test();`, it's completely okay to do
`test(2);`. The function will take in the argument, but just discard it
and throw it away. It's like a trash can, and a rude one at that. If you
declare it like `void test(void);`, this is prevented.
This is not a problem in C++ - doing `void test();` and `test(2);` is
guaranteed to result in a compile error (this also means that right now,
at least in all `.cpp` files, nobody is ever calling a void parameter
function with arguments and having their arguments be thrown away).
However, we may not be using C++ in the future, so I just want to lay
down the precedent that if a function takes in no arguments, you must
explicitly declare it as such.
I would've added `-Wstrict-prototypes`, but it produces an annoying
warning message saying it doesn't work in C++ mode if you're compiling
in C++ mode. So it can be added later.
2021-02-25 23:23:59 +01:00
|
|
|
void STEAM_shutdown(void)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
2021-09-07 03:56:39 +02:00
|
|
|
if (libHandle)
|
|
|
|
{
|
|
|
|
SteamAPI_Shutdown();
|
|
|
|
ClearPointers();
|
|
|
|
}
|
2020-01-01 21:29:24 +01:00
|
|
|
}
|
|
|
|
|
Explicitly declare void for all void parameter functions (#628)
Apparently in C, if you have `void test();`, it's completely okay to do
`test(2);`. The function will take in the argument, but just discard it
and throw it away. It's like a trash can, and a rude one at that. If you
declare it like `void test(void);`, this is prevented.
This is not a problem in C++ - doing `void test();` and `test(2);` is
guaranteed to result in a compile error (this also means that right now,
at least in all `.cpp` files, nobody is ever calling a void parameter
function with arguments and having their arguments be thrown away).
However, we may not be using C++ in the future, so I just want to lay
down the precedent that if a function takes in no arguments, you must
explicitly declare it as such.
I would've added `-Wstrict-prototypes`, but it produces an annoying
warning message saying it doesn't work in C++ mode if you're compiling
in C++ mode. So it can be added later.
2021-02-25 23:23:59 +01:00
|
|
|
void STEAM_update(void)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
2021-09-07 03:56:39 +02:00
|
|
|
if (libHandle)
|
|
|
|
{
|
|
|
|
SteamAPI_RunCallbacks();
|
|
|
|
}
|
2020-01-01 21:29:24 +01:00
|
|
|
}
|
|
|
|
|
2020-01-13 17:15:17 +01:00
|
|
|
void STEAM_unlockAchievement(const char *name)
|
2020-01-01 21:29:24 +01:00
|
|
|
{
|
2021-09-07 03:56:39 +02:00
|
|
|
if (libHandle)
|
|
|
|
{
|
|
|
|
SteamAPI_ISteamUserStats_SetAchievement(
|
|
|
|
steamUserStats,
|
|
|
|
name
|
|
|
|
);
|
|
|
|
SteamAPI_ISteamUserStats_StoreStats(steamUserStats);
|
|
|
|
}
|
2020-01-01 21:29:24 +01:00
|
|
|
}
|
|
|
|
|
2020-08-03 05:35:00 +02:00
|
|
|
#endif /* MAKEANDPLAY */
|