X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg%2Fvg_steamworks.h;h=b14e9eaf63decf3916e97911584b291499a39941;hb=8f89e6bd64229500954908e79ce500f80dda774d;hp=d4b797bacfea4c9663fb6205954e47f39a7ad1ad;hpb=4e217c7bc7d079364a999ee39773fa70ca25733a;p=fishladder.git diff --git a/vg/vg_steamworks.h b/vg/vg_steamworks.h index d4b797b..b14e9ea 100644 --- a/vg/vg_steamworks.h +++ b/vg/vg_steamworks.h @@ -301,6 +301,17 @@ typedef struct GameID_t #define SW_CBID_SteamAPICallCompleted (k_iSteamUtilsCallbacks + 3) +typedef enum ESteamAPICallFailure +{ + k_ESteamAPICallFailureNone = -1, // no failure + k_ESteamAPICallFailureSteamGone = 0, // the local Steam process has gone away + k_ESteamAPICallFailureNetworkFailure = 1, // the network connection to Steam has been broken, or was already broken + // SteamServersDisconnected_t callback will be sent around the same time + // SteamServersConnected_t will be sent when the client is able to talk to the Steam servers again + k_ESteamAPICallFailureInvalidHandle = 2, // the SteamAPICall_t handle passed in no longer exists + k_ESteamAPICallFailureMismatchedCallback = 3,// GetAPICallResult() was called with the wrong callback type for this API call +} ESteamAPICallFailure; + typedef u64 UGCHandle_t; typedef u64 PublishedFileUpdateHandle_t; typedef u64 PublishedFileId_t; @@ -534,6 +545,8 @@ void SteamAPI_ReleaseCurrentThreadMemory(); int SteamAPI_ISteamUserStats_SetAchievement( ISteamUserStats *self, const char *pchName ); +ESteamAPICallFailure SteamAPI_ISteamUtils_GetAPICallFailureReason( ISteamUtils* self, SteamAPICall_t hSteamAPICall ); + // Leaderboards SteamAPICall_t SteamAPI_ISteamUserStats_FindOrCreateLeaderboard( ISteamUserStats* self, const char * pchLeaderboardName, ELeaderboardSortMethod eLeaderboardSortMethod, ELeaderboardDisplayType eLeaderboardDisplayType ); SteamAPICall_t SteamAPI_ISteamUserStats_FindLeaderboard( ISteamUserStats* self, const char * pchLeaderboardName ); @@ -556,14 +569,17 @@ struct ISteamUser *user; ISteamUserStats *stats; ISteamNetworking *net; + ISteamUtils *utils; HSteamPipe pipe; + } steam_api_classes; ISteamFriends *SteamAPI_SteamFriends_v017(); ISteamUser *SteamAPI_SteamUser_v021(); ISteamUserStats *SteamAPI_SteamUserStats_v012(); ISteamNetworking *SteamAPI_SteamNetworking_v006(); +ISteamUtils *SteamAPI_SteamUtils_v010(); static void sw_exit(void) { @@ -604,8 +620,9 @@ static int sw_init(void) steam_api_classes.user = SteamAPI_SteamUser_v021(); steam_api_classes.stats = SteamAPI_SteamUserStats_v012(); steam_api_classes.net = SteamAPI_SteamNetworking_v006(); + steam_api_classes.utils = SteamAPI_SteamUtils_v010(); - if( !steam_api_classes.friends || !steam_api_classes.user || !steam_api_classes.stats || !steam_api_classes.net ) + if( !steam_api_classes.friends || !steam_api_classes.user || !steam_api_classes.stats || !steam_api_classes.net || !steam_api_classes.utils ) { vg_error( "Steamworks interface pointers failed. Steamworks DLL may be old\n" ); SteamAPI_Shutdown(); @@ -619,6 +636,9 @@ static int sw_init(void) return 1; } + +void (*sw_leaderboard_found)( LeaderboardFindResult_t *pCallback ); + static void sw_event_loop(void) { SteamAPI_ManualDispatch_RunFrame( steam_api_classes.pipe ); @@ -626,10 +646,12 @@ static void sw_event_loop(void) while( SteamAPI_ManualDispatch_GetNextCallback( steam_api_classes.pipe, &callback ) ) { + vg_info( "steamworks_event::callback( %i )\n", callback.m_iCallback ); + // Check for dispatching API call results if( callback.m_iCallback == SW_CBID_SteamAPICallCompleted ){ - SteamAPICallCompleted_t *pCallCompleted = (SteamAPICallCompleted_t *)&callback; + SteamAPICallCompleted_t *pCallCompleted = (SteamAPICallCompleted_t *)callback.m_pubParam; void *pTmpCallResult = malloc( pCallCompleted->m_cubParam ); int bFailed; @@ -644,6 +666,34 @@ static void sw_event_loop(void) { // Dispatch the call result to the registered handler(s) for the // call identified by pCallCompleted->m_hAsyncCall + + vg_info( "steamworks_event::api_call_completed( %lu )\n", pCallCompleted->m_hAsyncCall ); + + switch( pCallCompleted->m_iCallback ) + { + case SW_CBID_LeaderboardFindResult: + if( sw_leaderboard_found ) sw_leaderboard_found( (LeaderboardFindResult_t*)pTmpCallResult ); + break; + default:break; + } + } + else + { + typedef enum ESteamAPICallFailure + { + k_ESteamAPICallFailureNone = -1, // no failure + k_ESteamAPICallFailureSteamGone = 0, // the local Steam process has gone away + k_ESteamAPICallFailureNetworkFailure = 1, // the network connection to Steam has been broken, or was already broken + // SteamServersDisconnected_t callback will be sent around the same time + // SteamServersConnected_t will be sent when the client is able to talk to the Steam servers again + k_ESteamAPICallFailureInvalidHandle = 2, // the SteamAPICall_t handle passed in no longer exists + k_ESteamAPICallFailureMismatchedCallback = 3,// GetAPICallResult() was called with the wrong callback type for this API call + } ESteamAPICallFailure; + + ESteamAPICallFailure fail_why = + SteamAPI_ISteamUtils_GetAPICallFailureReason( steam_api_classes.utils, pCallCompleted->m_hAsyncCall ); + + vg_error( "steamworks_event: error getting call result on %lu (code %d)\n", pCallCompleted->m_hAsyncCall, fail_why ); } free( pTmpCallResult ); @@ -652,9 +702,6 @@ static void sw_event_loop(void) { // Look at callback.m_iCallback to see what kind of callback it is, // and dispatch to appropriate handler(s) - - vg_info( "steamworks_event::callback( %i )\n", callback.m_iCallback ); - //void *data = callback.m_pubParam; switch( callback.m_iCallback ) @@ -682,3 +729,13 @@ static void sw_set_achievement( const char *vg_ach_name ) vg_success( "Achievement set: '%s'\n", vg_ach_name ); } } + +static void sw_find_leaderboard( const char *name ) +{ + SteamAPI_ISteamUserStats_FindLeaderboard( steam_api_classes.stats, name ); +} + +static const char *sw_get_leaderboard_name( SteamLeaderboard_t hSteamLeaderboard ) +{ + return SteamAPI_ISteamUserStats_GetLeaderboardName( steam_api_classes.stats, hSteamLeaderboard ); +}