From: hgn Date: Mon, 6 Dec 2021 03:20:50 +0000 (+0000) Subject: added basic leaderboard fetching X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=commitdiff_plain;h=8f89e6bd64229500954908e79ce500f80dda774d added basic leaderboard fetching --- diff --git a/fishladder.c b/fishladder.c index 12666a8..7f47fdb 100644 --- a/fishladder.c +++ b/fishladder.c @@ -874,8 +874,12 @@ static int console_changelevel( int argc, char const *argv[] ) return 0; } +void leaderboard_found( LeaderboardFindResult_t *pCallback ); void vg_start(void) { + // Steamworks callbacks + sw_leaderboard_found = &leaderboard_found; + vg_function_push( (struct vg_cmd){ .name = "_map_write", .function = console_save_map @@ -2270,6 +2274,16 @@ static ui_colourset flcol_list_locked = { .hover = 0xff655959, .active = 0xff655959 }; + +static struct +{ + SteamLeaderboard_t steam_leaderboard; + int leaderboard_matches; + + struct cmp_level *level_selected; +} +ui_data; + void vg_ui(void) { // UI memory @@ -2299,8 +2313,6 @@ void vg_ui(void) } }; - static struct cmp_level *level_selected = NULL; - // UI Code ui_global_ctx.cursor[0] = 0; ui_global_ctx.cursor[1] = 0; @@ -2398,8 +2410,12 @@ void vg_ui(void) if( i < unlocked ) { if( gui_button( 2 + i ) == k_button_click ) - level_selected = &levels[i]; - + { + ui_data.level_selected = &levels[i]; + ui_data.leaderboard_matches = 0; + sw_find_leaderboard( ui_data.level_selected->map_name ); + } + ui_global_ctx.override_colour = 0xffffffff; gui_text( lvl_info->title, 6, 0 ); ui_global_ctx.cursor[1] += 18; @@ -2429,7 +2445,7 @@ void vg_ui(void) // Selected level UI // ============================================================ - if( level_selected ) + if( ui_data.level_selected ) { ui_global_ctx.cursor[0] += 16; ui_global_ctx.cursor[1] += 16; @@ -2442,7 +2458,7 @@ void vg_ui(void) gui_fill_rect( ui_global_ctx.cursor, 0xff5a4e4d ); ui_global_ctx.cursor[1] += 4; - gui_text( level_selected->title, 6, 0 ); + gui_text( ui_data.level_selected->title, 6, 0 ); ui_global_ctx.cursor[1] += 30; ui_rect_pad( ui_global_ctx.cursor, 8 ); @@ -2457,7 +2473,7 @@ void vg_ui(void) ui_text_use_paragraph( &ui_global_ctx ); ui_global_ctx.cursor[1] += 2; - gui_text( level_selected->description, 5, 0 ); + gui_text( ui_data.level_selected->description, 5, 0 ); ui_text_use_title( &ui_global_ctx ); // Buttons at the bottom @@ -2469,7 +2485,7 @@ void vg_ui(void) if( gui_button( 3000 ) == k_button_click ) { - level_selected = NULL; + ui_data.level_selected = NULL; } gui_text( "Back", 6, 0 ); gui_end(); @@ -2493,7 +2509,11 @@ void vg_ui(void) { gui_override_colours( &flcol_list_complete_a ); if( gui_button( 3002 ) == k_button_click ) - console_changelevel( 1, &level_selected->map_name ); + { + console_changelevel( 1, &ui_data.level_selected->map_name ); + ui_data.level_selected = NULL; + ui_data.leaderboard_matches = 0; + } gui_text( "Play", 6, 0 ); gui_end(); } @@ -2502,14 +2522,30 @@ void vg_ui(void) } gui_end_right(); - ui_global_ctx.cursor[0] += 16; - ui_global_ctx.cursor[3] = 250; - - // If has results - gui_new_node(); + if( ui_data.leaderboard_matches ) { - gui_fill_rect( ui_global_ctx.cursor, 0xff5a4e4d ); + ui_global_ctx.cursor[0] += 16; + ui_global_ctx.cursor[3] = 250; + + // If has results + gui_new_node(); + { + gui_fill_rect( ui_global_ctx.cursor, 0xff5a4e4d ); + } + gui_end(); } - gui_end(); } } + +void leaderboard_found( LeaderboardFindResult_t *pCallback ) +{ + if( !pCallback->m_bLeaderboardFound ) + vg_error( "Leaderboard could not be found\n" ); + + ui_data.steam_leaderboard = pCallback->m_hSteamLeaderboard; + ui_data.leaderboard_matches = 0; + + if( ui_data.level_selected ) + if( !strcmp( sw_get_leaderboard_name( ui_data.steam_leaderboard ), ui_data.level_selected->map_name ) ) + ui_data.leaderboard_matches = 1; +} 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 ); +}