From 9758290cf31b259d7af8b4d1943b25f0f38183ec Mon Sep 17 00:00:00 2001 From: Ethan Lee Date: Mon, 13 Jan 2020 11:15:17 -0500 Subject: [PATCH] Add support for multiple Network backends, stub in GOGNetwork --- desktop_version/CMakeLists.txt | 2 + desktop_version/src/GOGNetwork.c | 29 ++++++++ desktop_version/src/Network.c | 105 +++++++++++++++++++++++++++++ desktop_version/src/Network.h | 4 +- desktop_version/src/SteamNetwork.c | 30 ++++----- 5 files changed, 151 insertions(+), 19 deletions(-) create mode 100644 desktop_version/src/GOGNetwork.c create mode 100644 desktop_version/src/Network.c diff --git a/desktop_version/CMakeLists.txt b/desktop_version/CMakeLists.txt index 0d7099e6..daf5927e 100644 --- a/desktop_version/CMakeLists.txt +++ b/desktop_version/CMakeLists.txt @@ -91,7 +91,9 @@ SET(VVV_SRC src/UtilityClass.cpp src/WarpClass.cpp src/main.cpp + src/Network.c src/SteamNetwork.c + src/GOGNetwork.c ) SET(XML_SRC ../third_party/tinyxml/tinystr.cpp diff --git a/desktop_version/src/GOGNetwork.c b/desktop_version/src/GOGNetwork.c new file mode 100644 index 00000000..b3d72b4c --- /dev/null +++ b/desktop_version/src/GOGNetwork.c @@ -0,0 +1,29 @@ +#include + +/* Totally unimplemented right now! */ + +int32_t GOG_init() +{ + return 0; +} + +void GOG_shutdown() +{ +} + +void GOG_update() +{ +} + +void GOG_unlockAchievement(const char *name) +{ +} + +int32_t GOG_getAchievementProgress(const char *name) +{ + return 0; +} + +void GOG_setAchievementProgress(const char *name, int32_t stat) +{ +} diff --git a/desktop_version/src/Network.c b/desktop_version/src/Network.c new file mode 100644 index 00000000..2277c801 --- /dev/null +++ b/desktop_version/src/Network.c @@ -0,0 +1,105 @@ +#include "Network.h" + +#define NUM_BACKENDS 2 +#define DECLARE_BACKEND(name) \ + extern int name##_init(); \ + extern void name##_shutdown(); \ + extern void name##_update(); \ + extern void name##_unlockAchievement(); \ + extern void name##_getAchievementProgress(const char *name); \ + extern void name##_setAchievementProgress(const char *name, int32_t stat); +DECLARE_BACKEND(STEAM) +DECLARE_BACKEND(GOG) +#undef DECLARE_BACKEND + +typedef intptr_t (*SteamInternal_CreateInterfaceFunc)(const char*); + +typedef struct NetworkBackend +{ + int32_t IsInit; + int32_t (*Init)(); + void (*Shutdown)(); + void (*Update)(); + void (*UnlockAchievement)(); + int32_t (*GetAchievementProgress)(const char*); + void (*SetAchievementProgress)(const char*, int32_t); +} NetworkBackend; + +static NetworkBackend backends[NUM_BACKENDS]; + +int NETWORK_init() +{ + int32_t i, any = 0; + #define ASSIGN_BACKEND(name, index) \ + backends[index].Init = name##_init; \ + backends[index].Init = name##_init; \ + backends[index].Init = name##_init; \ + backends[index].Init = name##_init; \ + backends[index].Init = name##_init; \ + backends[index].Init = name##_init; + ASSIGN_BACKEND(STEAM, 0) + ASSIGN_BACKEND(GOG, 1) + #undef ASSIGN_BACKEND + for (i = 0; i < NUM_BACKENDS; i += 1) + { + backends[i].IsInit = backends[i].Init(); + any |= backends[i].IsInit; + } + return any; +} + +void NETWORK_shutdown() +{ + int32_t i; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + backends[i].Shutdown(); + } +} + +void NETWORK_update() +{ + int32_t i; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + backends[i].Update(); + } +} + +void NETWORK_unlockAchievement(const char *name) +{ + int32_t i; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + backends[i].UnlockAchievement(name); + } +} + +int32_t NETWORK_getAchievementProgress(const char *name) +{ + /* The highest stat gets priority, will eventually pass to the others */ + int32_t i, stat, max = 0; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + stat = backends[i].GetAchievementProgress(name); + if (stat > max) + { + max = stat; + } + } + return max; +} + +void NETWORK_setAchievementProgress(const char *name, int32_t stat) +{ + int32_t i; + for (i = 0; i < NUM_BACKENDS; i += 1) + if (backends[i].IsInit) + { + backends[i].SetAchievementProgress(name, stat); + } +} diff --git a/desktop_version/src/Network.h b/desktop_version/src/Network.h index 93771e1b..e50added 100644 --- a/desktop_version/src/Network.h +++ b/desktop_version/src/Network.h @@ -7,7 +7,7 @@ extern "C" { #endif -int NETWORK_init(); +int32_t NETWORK_init(); void NETWORK_shutdown(); @@ -19,8 +19,6 @@ int32_t NETWORK_getAchievementProgress(const char *name); void NETWORK_setAchievementProgress(const char *name, int32_t stat); -/* TODO: Steam Workshop? */ - #ifdef __cplusplus } #endif diff --git a/desktop_version/src/SteamNetwork.c b/desktop_version/src/SteamNetwork.c index 5f06ffa6..ce047e5d 100644 --- a/desktop_version/src/SteamNetwork.c +++ b/desktop_version/src/SteamNetwork.c @@ -1,5 +1,3 @@ -#include "Network.h" - #include #include #include @@ -12,13 +10,13 @@ /* Shared object file name */ #if defined(_WIN32) -#define NETWORK_LIBRARY "steam_api.dll" +#define STEAM_LIBRARY "steam_api.dll" #elif defined(__APPLE__) -#define NETWORK_LIBRARY "libsteam_api.dylib" +#define STEAM_LIBRARY "libsteam_api.dylib" #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) -#define NETWORK_LIBRARY "libsteam_api.so" +#define STEAM_LIBRARY "libsteam_api.so" #else -#error NETWORK_LIBRARY: Unrecognized platform! +#error STEAM_LIBRARY: Unrecognized platform! #endif /* Function Pointer Types */ @@ -95,18 +93,18 @@ static void ClearPointers() /* NETWORK API Implementation */ -int NETWORK_init() +int32_t STEAM_init() { #if defined(__FreeBSD__) || defined(__OpenBSD__) - return 1; + return 0; #endif intptr_t steamClient; int32_t steamUser, steamPipe; - libHandle = SDL_LoadObject(NETWORK_LIBRARY); + libHandle = SDL_LoadObject(STEAM_LIBRARY); if (!libHandle) { - printf("%s not found!\n", NETWORK_LIBRARY); + printf("%s not found!\n", STEAM_LIBRARY); return 0; } @@ -114,7 +112,7 @@ int NETWORK_init() name = (name##Func) SDL_LoadFunction(libHandle, #name); \ if (!name) \ { \ - printf("%s symbol %s not found!\n", NETWORK_LIBRARY, #name); \ + printf("%s symbol %s not found!\n", STEAM_LIBRARY, #name); \ ClearPointers(); \ return 0; \ } @@ -165,7 +163,7 @@ int NETWORK_init() return 1; } -void NETWORK_shutdown() +void STEAM_shutdown() { if (libHandle) { @@ -174,7 +172,7 @@ void NETWORK_shutdown() } } -void NETWORK_update() +void STEAM_update() { if (libHandle) { @@ -182,7 +180,7 @@ void NETWORK_update() } } -void NETWORK_unlockAchievement(const char *name) +void STEAM_unlockAchievement(const char *name) { if (libHandle) { @@ -194,7 +192,7 @@ void NETWORK_unlockAchievement(const char *name) } } -int32_t NETWORK_getAchievementProgress(const char *name) +int32_t STEAM_getAchievementProgress(const char *name) { int32_t result = -1; if (libHandle) @@ -208,7 +206,7 @@ int32_t NETWORK_getAchievementProgress(const char *name) return result; } -void NETWORK_setAchievementProgress(const char *name, int32_t stat) +void STEAM_setAchievementProgress(const char *name, int32_t stat) { if (libHandle) {