added basic leaderboard fetching
authorhgn <hgodden00@gmail.com>
Mon, 6 Dec 2021 03:20:50 +0000 (03:20 +0000)
committerhgn <hgodden00@gmail.com>
Mon, 6 Dec 2021 03:20:50 +0000 (03:20 +0000)
fishladder.c
vg/vg_steamworks.h

index 12666a8158ffcf80eb4aa165fabc5d5341c704cb..7f47fdb54a49c96a1a5e9cfe8a913f88ef590861 100644 (file)
@@ -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;
+}
index d4b797bacfea4c9663fb6205954e47f39a7ad1ad..b14e9eaf63decf3916e97911584b291499a39941 100644 (file)
@@ -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 );
+}